基于Ti CC2541 SDK自带的simpleBLEPeripheral工程实现微信蓝牙Airsync协议,同时支持微信串口透传和一般APP串口透传。相关源码和开发资料请阅读《微信蓝牙开发板体验和开发指引》。
嵌入式企鹅圈以lib库(lib_wehat.lib)的形式提供微信蓝牙Airsync协议,这里介绍如何在simpleBLEPeripheral工程中添加lib_wehat.lib,并通过简单的修改即可实现微信串口透传功能。
1. simpleBLEPeripheral工程添加微信库和包含微信profile头文件
1)在simpleBLEPeripheral.C中添加:
#include"ble_wechat_profile.h"
2)工程添加lib_wehat.lib。
2. 修改默认广播数据
红色部分是蓝牙的MAC地址,第3步会自动更新。广播中需要说明支持微信airsync协议的UUID和设备的唯一MAC地址。
static uint8advertData[] =
{
0x02,
GAP_ADTYPE_FLAGS,
DEFAULT_DISCOVERABLE_MODE |GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
// service UUID--wechat service
0x03, // length of this data
GAP_ADTYPE_16BIT_MORE,
LO_UINT16( WECHAT_SERV_UUID ),
HI_UINT16( WECHAT_SERV_UUID ),
//self data
0x11,
GAP_ADTYPE_MANUFACTURER_SPECIFIC,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};
3. 根据实际的MAC地址配置广播数据
即修改默认广播数据中红色标注的MAC地址信息。xDATA中的0x780E到0x7813存储MAC地址。在SimpleBLEPeripheral_Init函数中添加:
advertData[19]= *((uint8*)0x7813);
advertData[20]= *((uint8*)0x7812);
advertData[21]= *((uint8*)0x7811);
advertData[22]= *((uint8*)0x7810);
advertData[23]= *((uint8*)0x780F);
advertData[24]= *((uint8*)0x780E);
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof(advertData ), advertData );
4. 添加微信Airsync profile服务
在SimpleBLEPeripheral_Init函数中添加:
WechatProfile_AddService(GATT_ALL_SERVICES);
5. 初始化微信Airsync服务的各个特性值
在SimpleBLEPeripheral_Init函数中添加:
uint8charValueRead[WECHATPROFILE_CHAR_READ_LEN];
charValueRead[0] = *((uint8*)0x7813);
charValueRead[1] = *((uint8*)0x7812);
charValueRead[2] = *((uint8*)0x7811);
charValueRead[3] = *((uint8*)0x7810);
charValueRead[4] = *((uint8*)0x780F);
charValueRead[5] = *((uint8*)0x780E);
uint8charValueIndicate[WECHATPROFILE_CHAR_INDICATE_LEN] = {10,11,12,13,0};
uint8charValueWrite[WECHATPROFILE_CHAR_WRITE_LEN] = { 1, 2, 3, 4, 5 };
//微信Airsync协议的READ characteristics 初始化,读MAC地址
WechatProfile_SetParameter(WECHATPROFILE_CHAR_READ,WECHATPROFILE_CHAR_READ_LEN, charValueRead );
//微信Airsync协议的Indicate characteristics 初始化,设备主动发送消息数据
WechatProfile_SetParameter(WECHATPROFILE_CHAR_INDICATE,WECHATPROFILE_CHAR_INDICATE_LEN, charValueIndicate );
//微信Airsync协议的write characteristics 初始化,设备被动接受写数据
WechatProfile_SetParameter(WECHATPROFILE_CHAR_WRITE,WECHATPROFILE_CHAR_WRITE_LEN, charValueWrite );
6. 初始化微信Airsync服务状态机
在SimpleBLEPeripheral_Init函数的最后添加:
wechat_init();
7. SimpleBLEPeripheral_ProcessEvent应用事件处理函数中增加微信服务事件处理
if ( events& SBP_START_AUTH_CONNECTION_EVT ) {
//登录授权
wechat_main_process(NULL);
return (events ^SBP_START_AUTH_CONNECTION_EVT);
}
if ( events &SBP_START_INIT_CONNECTION_EVT ) {
//初始化
wechat_main_process(NULL);
return (events ^ SBP_START_INIT_CONNECTION_EVT);
}
8. simpleBLEPeripheral_ProcessOSALMsg系统消息处理函数中增加APP手机蓝牙连接后订阅微信indicate服务的处理。
caseGATT_MSG_EVENT:
if ( ((gattMsgEvent_t *)pMsg)->method== ATT_HANDLE_VALUE_CFM )
{
on_indicate_comfirm();
}
break;
9. peripheralStateNotificationCB连接状态变化时重置微信服务状态机
GAPROLE_CONNECTED连接时调用wechat_init();
GAPROLE_WAITING断开连接时调用wechat_init();
10. simpleProfileChangeCB特性值变化(客户端写操作)时的回调
case WECHATPROFILE_CHAR_WRITE:
WechatProfile_GetParameter(WECHATPROFILE_CHAR_WRITE, newChar5Value );
on_write(newChar5Value, 20);
break;
此时读到的数据是经过protobuf打包的数据格式,在on_write中会解包,并会回调以下接口:
void on_write_user_hook(unsigned char*str, unsigned char len);
该接口由用户实现,str即是客户端透传的数据,len是长度。可以选择输出到串口。str的数据格式是微信官方后台demo(rose_blue)定义的应用自定义数据格式。
11. 设备主动发消息(indicate)的接口
int32wechat_indicate_handler(void *dataBuf, uint8 len);
该接口中会将用户的dataBuf以微信官方后台demo(发送515获得,roseblue_anichips.zip)定义的应用自定义数据格式进行protobuf打包,并发送给手机微信,最终到达厂商后台。
12. 用户如何基于微信Airsync协议定制自己的应用
1) 微信官方后台demo定义的应用自定义数据格式有头部HEAD和包体body。用户可以自行定义body的数据格式,并修改后台服务和蓝牙设备端的处理过程。
2) 设备主动发送数据使用第11步的wechat_indicate_handler接口。
3) 设备收到数据会回调第10步的on_write_user_hook接口,用户的处理代码添加到该接口即可。
目前微信串口透传和APP透传的设备端源码工程、微信后台源码工程、android APK均已经提供。微信Airsync协议跟MAC绑定,用户需要根据《微信蓝牙开发板体验和开发指引》获取蓝牙的MAC地址,发送到邮件[email protected],即会获得一个可用的微信Airsync协议库(lib_wehat.lib)。如果你没有开发板,也可以加入嵌入式企鹅圈来获取源码资源,并自行获取已有2541板子的MAC地址,发邮件来获取lib_wechat.lib.也可以考虑购买嵌入式企鹅圈微信蓝牙开发板(体验价68元包邮)。
更多嵌入式和物联网原创技术分享敬请关注微信公众号:嵌入式企鹅圈