CC2541连接微信的封包教程
时间:10-02
整理:3721RD
点击:
CC2541连接微信的封包教程
在微信官方给的程序中,CC2541连接微信规定了主要的操作,包括登录,对应着登录包,初始化对应着初始化包,发数据给厂商当然也对应着一个数据包。一个是在发数据给微信是用的,要把数据按照微信协议的规定打包,一个是收到微信发来的数据用的,把数据解包。这些操作都是基于 BLE 设备与微信连接之后的数据传输,虽说有这么多特定的包,但是传输过程和原理当然都是蓝牙 BLE 传输,使用的也都是 Indicate 和 Notify 了。比较复杂的就是微信对于包的规定,这些在手册里都能找到,有定长包头和变长包体,这些就不说了,文档里都有,而且很详细。
epb_MmBp.h 中有以下程序:
typedef enum{
ECI_none = 0,
// Req: 藍牙設備 -> 微信/廠商服务器
ECI_req_auth = 10001, // 登錄
ECI_req_sendDataToManufacturerSvr = 10002, // 發送數據給廠商
ECI_req_init = 10003, // 初始化
// Resp: 微信/廠商服務器 -> 蓝牙設備
ECI_resp_auth = 20001,
ECI_resp_sendDataToManufacturerSvr = 20002,
ECI_resp_init = 20003,
// Push: 微信/廠商服务器 -> 蓝牙设備
ECI_push_manufacturerSvrSendData = 30001, // 廠商發送数據给蓝牙設備
ECI_push_switchView = 30002, // 進入/退出界面
ECI_push_switchBackgroud = 30003, // 切换后台
ECI_err_decode = 29999 // 解密失败的錯誤碼。注意:這不是cmdid。為節省固定包頭大小,這種特殊的錯誤碼放在包頭的 cmdid 字段。
} EmCmdId ;
我这里要写的是如何按照规定来打包,也就是封包。
pb_example 中有两个程序,uint8_t Pack_Data(uint16 EmCmdIDData) 和 uint8_t UnPack_Data(uint8_t *buf, int buf_len),一个是在发数据给微信是用的,要把数据按照微信协议的规定打包,一个是收到微信发来的数据用的,把数据解包。
uint8_t UnPack_Data(uint8_t *buf, int buf_len){
ICount = 0 ;
LenReg = 0 ;
//﹍秆
if(UnPackStatus==0)
{
UnPackProtobufLen = 0 ;
UnPackProtobufAllLen = 0 ;
StartUnPack = 0 ;
if(buf[0]!=MagicNumber)
{
return(ERR_MAGICNUMBER) ; //岿粇秨繷
}
if(buf[1]!=bVer)
{
return(ERR_BVER) ; //岿粇セ
}
//ъ羆
UnPackProtobufAllLen = buf[2] ;
UnPackProtobufAllLen = (UnPackProtobufAllLen << 8) | buf[3] ;
if(UnPackProtobufAllLen < 8)
{
return(ERR_UNPACKLEN) ; //岿粇
}
//秆 EmCmdID
UnPackEmCmdID = buf[4] ;
UnPackEmCmdID = (UnPackEmCmdID << 8) | buf[5] ;
//秆 nSeg
UnPacknSeq = buf[6] ;
UnPacknSeq = (UnPacknSeq << 8) | buf[7] ;
//-----耞
if(buf_len == UnPackProtobufAllLen)//ボ掸戈碞
{
for(ICount = 8 ; ICount < buf_len ; ICount++ )
{
UnPackProtobufData[ICount-8] = buf[ICount] ;
}
UnPackProtobufLen = UnPackProtobufAllLen - 8 ;
StartUnPack = 1 ;
}
else if(buf_len > UnPackProtobufAllLen )//戈ぃ癸
{
UnPackStatus = 0 ;
return(ERR_UNPACKLEN) ; //岿粇秆絏
}
else//璶掸戈︽
{
for(ICount = 8 ; ICount < buf_len ; ICount++ )
{
UnPackProtobufData[ICount-8] = buf[ICount] ;
}
UnPackProtobufConLen = buf_len ;
UnPackStatus = 1 ;
return(UNPACK_CONTINUOUS) ; //
}
}
else if(UnPackStatus == 1)//材掸
{
LenReg = UnPackProtobufConLen - 8 ;
UnPackProtobufConLen = UnPackProtobufConLen + buf_len ;
if(UnPackProtobufConLen == UnPackProtobufAllLen)//ボ戈掸计タ絋
{
for(ICount = 0 ; ICount < buf_len ; ICount++ )
{
UnPackProtobufData [LenReg + ICount] = buf[ICount] ;
}
UnPackProtobufLen = UnPackProtobufAllLen - 8 ;
StartUnPack = 1 ;
UnPackStatus = 0 ;
}
else if(UnPackProtobufConLen > UnPackProtobufAllLen )//戈ぃ癸
{
UnPackStatus = 0 ;
return(ERR_UNPACKLEN) ;
}
else//璶掸戈︽
{
for(ICount = 0 ; ICount < buf_len ; ICount++ )
{
UnPackProtobufData[LenReg + ICount] = buf[ICount] ;
}
return(UNPACK_CONTINUOUS) ;
}
}
if(StartUnPack==1)
{
StartUnPack = 0 ;
if(UnPackEmCmdID==ECI_resp_auth)//秆祅魁
{
#ifdef UART_DEBUG //printf more have timeout
print_msg("unpack_authRep\r\n");
#endif
unpack_auth_response( ) ;
}
else if(UnPackEmCmdID==ECI_resp_sendDataToManufacturerSvr)//秆戈
{
#ifdef UART_DEBUG //printf more have timeout
print_msg("unpack_SendDataRep\r\n");
#endif
unpack_SendData_response( ) ;
}
else if(UnPackEmCmdID==ECI_resp_init)//秆﹍
{
#ifdef UART_DEBUG //printf more have timeout
print_msg("unpack_initRep\r\n");
#endif
unpack_init_response( ) ;
}
else if(UnPackEmCmdID==ECI_push_manufacturerSvrSendData)//紅坝祇癳计沮倒屡砞称
{
#ifdef UART_DEBUG //printf more have timeout
print_msg("unpack_PushRecvDataRep\r\n");
#endif
unpack_PushRecvData_response( ) ;
return(PUSH_REC_DATA) ;
}
else if(UnPackEmCmdID==ECI_push_switchView)//秈/癶ざ
{
#ifdef UART_DEBUG //printf more have timeout
print_msg("unpack_PushSWViewRep\r\n");
#endif
RetData = unpack_PushSwitchView_response( ) ;
if(RetData==2)
{
return(PUSH_SWITCHVIEW) ;
}
else
{
return(UNPACK_OK) ;
}
}
else if(UnPackEmCmdID==ECI_push_switchBackgroud)//ち传
{
#ifdef UART_DEBUG //printf more have timeout
print_msg("unpack_PushSW_BgRep\r\n");
#endif
unpack_PushSwitchBackgroud_response( ) ;
return(PUSH_SWITCHBACKGROUD) ;
}
else
{
}
}
return(UNPACK_OK) ;
}