平台介绍:
DA14681 + 一个安卓手机
前期工作:
1. 下载AirSync调试工具:http://iot.weixin.qq.com/wiki/new/index.html?page=4-2-3
2. 精简协议介绍
1. AirSync协议介绍
全在代码里面了,自己看吧。。。很简单的。
开发工作:
1. 蓝牙服务添加
#defineBLE_UUID_WECHAT_SERVICE 0xFEE7
#defineBLE_UUID_WECHAT_WRITE_CHARACTERISTICS 0xFEC7
#define BLE_UUID_WECHAT_INDICATE_CHARACTERISTICS 0xFEC8
#define BLE_UUID_WECHAT_READ_CHARACTERISTICS 0xFEC9
#defineBLE_UUID_WECHAT_STEP_CHARACTERISTICS 0xFEA1
#defineBLE_UUID_WECHAT_TARGET_CHARACTERISTICS 0xFEA2
微信蓝牙的UUID是 0Xfee7,该服务已经通过蓝牙认证(据说)。
其中Air Sync协议所需要的特性有:0xFEC7(write)0xFEC8(indicate) 0xFEC9(read)
这三个特性是必须要的否则AirSync检测服务会失败。
0xfea1是计步精简协议中的计步数据上报特性,0xfea2是运动目标特性,其中0xfea1需要有
Read,write,indicate三个权限,0xfea2也一样。
2. 广播数据添加
广播数据中有如下条件:
a. 必须要有uuid 0xfee在广播数据中,也就是说0x03, 0x03, 0xE7, 0xFE,这几个值必须在广播数据中。(解释:第一个0x03表示数据长度(从第二个0x03开始算正好三个长度) ,第二个0x03表示数据描述 16位uuid 0x03,后面两个表示uuid的值(为什么倒过来,不解释))
b. 必须要有厂商自定义数据描述中有mac地址,也就是说如下数据必须在广播数据里面
0x09, 0xff,0x00,0x0A,0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC.
(解释:0x09表示数据长度;0xff 表示厂商自定义数据;0x00,0x0a表示公司id(自己随便写);0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC 表示mac地址)
3. 添加微信ble auth的代码置工程中(由于这是小弟第一次写博客,还不知道如何添加附件,这部分代码在dailog的官方网站里面可以下载得到)
https://support.dialog-semiconductor.com/connectivity/reference-design/wechat-iot-software-development-kit
1. 在系统初始化初添加如下代码:
externdata_handler*m_mpbledemo2_handler;
staticvoidregister_all_products(void)
{
REGISTER(mpbledemo2);
}
void app_wechat_SetDatahandler(data_handler* pHandler)
{
pDataHandler = pHandler;
}
void app_wechat_init(void)
{
register_all_products();
data_handler_init(&m_mpbledemo2_handler,PRODUCT_TYPE_MPBLEDEMO2);
m_mpbledemo2_handler->m_data_init_func();
m_mpbledemo2_handler->m_data_init_peripheral_func();
app_wechat_SetDatahandler(m_mpbledemo2_handler);
}
(解释:系统初始化时调用 app_wechat_init(),理由不解释,看代码)
2. 在蓝牙通知enable 处添加device_auth()(解释:手机使用AirSync协议连接上设备之后,在使能通知结束之后,设备端需要立刻请求认证。故在此添加device_auth())
3. 在蓝牙收数据处添加如下代码:
typedefstruct
{
uint8_t *data;
uint16_tlen;
uint16_toffset;
} data_info;
staticdata_infog_rcv_data ;
void ble_wechat_process_received_data(uint8_t* pData, uint32_t length)
{
int error_code;
int chunk_size = 0;
if (length <= 20)
{
if (g_rcv_data.len == 0)
{
BpFixHead *fix_head = (BpFixHead *)pData;
g_rcv_data.len = ntohs(fix_head->nLength);
g_rcv_data.offset = 0;
g_rcv_data.data = (uint8_t*)ke_malloc(g_rcv_data.len, KE_MEM_NON_RETENTION);
}
chunk_size = g_rcv_data.len - g_rcv_data.offset;
chunk_size = chunk_size <length ? chunk_size : length;
memcpy(g_rcv_data.data + g_rcv_data.offset, pData, chunk_size);
g_rcv_data.offset += chunk_size;
if (g_rcv_data.len <= g_rcv_data.offset)
{
error_code = m_mpbledemo2_handler->m_data_consume_func(g_rcv_data.data, g_rcv_data.len);
m_mpbledemo2_handler->m_data_free_func(g_rcv_data.data,g_rcv_data.len);
wechat_error_chack(m_mpbledemo2_handler, error_code);
g_rcv_data.len = 0;
g_rcv_data.offset = 0;
m_mpbledemo2_handler->m_data_main_process_func();
}
}
}
(ble一次收20个字节,所以需要分开收数据,收到数据之后,m_mpbledemo2_handler会把数据分发给各个callback,故只需要添加这部分代码就可以了(简单无脑有木有^_^))
4. 在读者自己系统里面的某个按键中断处(或者别的什么中断),添加如下代码
mpbledemo2_sendData(SEND_HELLO_WECHAT,sizeof(SEND_HELLO_WECHAT));
(解释:因为需要测试设备主动上报数据这一功能,故需添加此代码)
5. 到这里,我们设备端的开发工作已经全部完成了(绝对简单有木有!!!)。
调试结果:微信设备认证
1. 登陆“微信公众平台接口测试帐号”
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
其中微信号,appID,appsecret需要记下来,后面要用的!!!
2. 获取设备
3. 添加产品
4. 接入方案设置
5. 产品能力登记
得到产品,记下来那个id 是product_id。后面要用
1. 设备授权
1.1. 进入这个连接,来获取access_token
在红线出添加刚才获取到的appID和secret 。来获取你的access_token。
1.2. 获取设备二维码
在这里获得的qritcket可以使用在线二维码工具来转换成二维码,后续使用手机微信扫一扫连接。 Deviceid是你的设备id,这个ID需要和你代码里面的id一致,并且记下来这个ID,设备授权要用。
1.3 . 设备授权
在body中填入如下内容
{
"device_num": "1",
"device_list": [
{
"id": "gh_fabe14ce2bda_492344d89dba1ca4",
"mac": "123456789ABC",
"connect_protocol": "3",
"auth_key": "",
"close_strategy": "2",
"conn_strategy": "4",
"crypt_method": "0",
"auth_ver": "0",
"manu_mac_pos": "-1",
"ser_mac_pos": "-2"
}
],
"op_type": "1",
"product_id": "29933"
}
字段解释如下:
获得设备授权。
好了,到了这一步,所有的工作已经完成了,可以开始玩一玩了。
1. 微信扫一扫刚才得到的那个二维码,关注一下。2. 打开手机蓝牙。
3. 连接设备。
目前作者只能做到在公众号界面连接上设备,但是还没办法同步运动数据。。。。
希望读者们可以提建议,帮忙看看如何实现同步运动数据。
作者邮箱:517204655@qq.com
姓名:Jun