微信airSync的指定UUID如下:
#define WE_CHAT_SRV_UUID 0xFEE7 //服务
#define WE_CHAT_WIRTE_UUID 0xFEC7 //写特性
#define WE_CHAT_INDICATE_UUID 0xFEC8 //提示特性
#define WE_READ_UUID 0xFEC9 //读特性
数据接收:微信app向设备push数据通过write特性,在on_write函数中调用data_consume。
数据发送:设备从indicate特性发送数据。在data_produce打包完成后发送数据。
read特性用于暴露自身mac。
协议测试过程中需要依次处理三步:auth、init、sendata。
auth、init在主函数的main_process函数中被调用,senddata在auth、init处理完成之后在data_consume中被调用。数据准备过程需要调用data_produce函数。数据包头有固定的格式,如下:
typedef struct
{
unsigned char bMagicNumber;
unsigned char bVer;
unsigned short nLength;
unsigned short nCmdId;
unsigned short nSeq;
} WeChat_fixHead_t;
其中魔鬼数字为0xFE,版本为0x01,长度为包头和包体之和,命令码内容为:CMD_AUTH / CMD_INIT / CMD_SENDDAT,序列号不能为0,对应的request和response必须保持一致。封包过程注意对包头中的命令码、长度、序列号转码,解包过程中注意对包头中的长度、命令码转码。
数据准备好之后进行发送,每包数据长度不能超过20字节。多包数据进行发送的时候需要使用到indi_confirm,即通过indicate发送数据,每收到一个确认信息后发送下一包数据。组包过程就是对request进行回应。
data_consume函数被调用在系统抛上来的write事件中。