微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > CC2541连接微信的封包教程

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) ;  
}  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top