SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.sydtek.com/
本文转载于:http://blog.csdn.net/skdev/article/details/50974343
只为了学习使用
微信蓝牙BLE接入调试指引
Author: Thornton,447116230@qq.com
硬件篇
1 平台框架简介
微信蓝牙BLE由三个模块组成,分别是蓝牙设备、微信和第三方服务器,如下图:
蓝牙设备与微信之间的通信是通过蓝牙GATT协议进行。
微信与第三方服器之间的通信是通过网络http 接口进行。
调试流程:
2蓝牙BLE固件调试
2.1 需要的资料和工具
以上资料都可以在下面网址下载:
http://iot.weixin.qq.com/wiki/new/index.html?page=6-1
2.2 微信BLE协议介绍
微信定义了三种与BLE通信的协议,分别为:AirSync协议、计步profile和防丢器profile。另外,计步和防丢器由于协议简单,又合称精简协议。
AirSync协议,有握手过程,可加密数据,适用于大数据、多数据、自定义数据等场合,主要是与第三方服务器通信。
精简协议,没有握手过程,简单的数据传输,无需第三方服务器配合,只与微信通信。
2.3 AirSync固件调试
先移植“蓝牙demo开发板源代码v0.2”的代码,过程不写了,对调试过程中需要注意的写一下。
微信是通过广播数据,来决定要不要建立连接,所以广播数据的格式要按要求来。广播包分两种,一种是“普通广播包”,这种在建立连接时不需要蓝牙设备确认;另一种是“确认广播包”,它在建立连接时则需要蓝牙设备确认。我在使用“确认广播包”时没发现哪里需要确认,跟“普通广播包”没有什么不同,这里有些不理解。
微信的广播包规定了厂商数据格式以及SERVICE UUID。在厂商数据里,前两个字节是设备版本号,最后6个字节必须是MAC地址,中间无要求,可有可无,另外,“确认广播包”要求MAC地址之前的3个字节,必须是0xfe 0x01 0x01。广播包包含的服务UUID必须有0xFEE7。
普通广播包数据格式:
确认广播包格式:
广播包的格式是:LEN + TYPE + DATA,LEN是指TYPE + DATA的长度,TYPE值对应的意如下:
#define BLE_GAP_AD_TYPE_FLAGS 0x01
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07
#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08
#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09
#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A
#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11
#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15
#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16
#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17
#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18
#define BLE_GAP_AD_TYPE_APPEARANCE 0x19
#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF
可以看到,0xFF表示MANUFACTURER_SPECIFIC_DATA,即厂商自定义数据;0x03表示16BIT_SERVICE_UUID_COMPLETE,即16位的SERVICE UUID。
下面是用BLE读写器APK测到的一个微信BLE设备:
我们来分析一下它的广播包,
020102,长度2,TYPE 1表示FLAGS,它的FLAGS值为2
0303E7FE,长度3,TYPE 3表示16位SERVICE UUID,值为0xFEE7
09FF0000F4E6F41549F2,长度9,TYPE FF 表示厂商自定义数据,值为0000F4E6F41549F2,0000表示版本号,F4E6F41549F2对应MAC地址F4:E6:F4:15:49:F2,这表示它是一个普通包。
完成广播包后,在ANDROID手机上打开AirSyncDebugger工具,先扫描设备,找到设备后点击进入,选择“AirSync协议”,选择“手动测试”,第一步会对广播数据进行检测,如果通过就会打勾,出错则显示错误信息:
AirSync是微信自定义的PROFILE,有经典蓝牙和BLE两种,我们这里介绍的是BLE。AirSync定义了一个SERVICE以及它包含的三个特征,如下:
Write Characteristic 是微信向BLE设备发数据的通道。
Indicate Characteristic 是BLE设备向微信发数据的通道。
Read Characteristic 返回MAC地址
通信主要由Writet和Indicate 两个特征来完成。
AirSync的通信过程:
微信扫到BLE设备发出的广播包,如果广播包符合微信配置的设备要求,则微信会请求建立与BLE设备的连接,连接建立后,通过读Indicate Descriptor确认Indicate Characteristic是否有Indicate属性,有的话会往Indicate Descriptor写值,BLE设备收到Deiscriptor写操作后,通过Indicate Characteristic往微信发Auth请求,微信通过Write Characteristic回应Auth请求,BLE设备收到Auth回应合,接着发Init请求,微信则回应Init请求,至此,连接就建立了,后面就可以不分先后往对方发数据了。
固件移植好后,将BLE设备开机,处于广播状态,然后打开ANDROID手机里的AirSyncDebugger工具,扫描设备,选中BLE设备,再选“AirSync协议”,点击右上角的“设置”,如现如图:
在这里设置DeviceID、DeviceType、加密等。
首先,确保设置与固件里的DeviceID、DeviceType是一致的。下面是固件的定义:
#define DEVICE_TYPE "gh_4437ba7b488b"
#define DEVICE_ID "device1"
调试时先调不加密的,即设置里不勾选AES加密模式,固件里选择EAM_md5AndNoEnrypt 或 EAM_macNoEncrypt;不加密调完可以接着调加密模式,勾选上AES加密模式,然后AES密钥要与固件里的DEVICE_KEY一致,SessionKey的值可以随便写。
#define DEVICE_KEY {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
设置完成,选择“手动测试”,它会一项一项的检测,先检测广播包格式,再检测SERVICE和CHARACTERISTIC等格式,然后等待接Auth请求,Auth请求合格会发Auth应答,然后等待Init请求,Init请求合格会发Init应答,这样握手基本完成了。“手动测试”通过再去选择“自动测试”,主要是测试SendData的功能。哪一项出问题都有提示及LOG。
2.4 计步固件调试
计步的代码比较简单,QQ没出SAMPLE CODE,自己写写就行了。
计步和AirSync是同一个服务,广播包和AirSync是一样的,如果已支持AirSync,则无需再写,如果只是计步功能,则按2.3.1的格式要求写。
计步Profile与AirSync共用一个Service,计步由两个特征组成,一个是Measure,用于上报微信当前的计步值;另一个是Target,微信可以设置这个目标值,目标值改变时也上报微信。
计步Profile没有握手过程,只是简单的读、写、通知等操作,所以只要将各个特征的回调写好就行了。
Measuer和Target值的格式:
Measuer的值由4部分组成
值 | 类型 | 说明 |
Flag | Uint8 | 0x01:步数(必选) 0x02:距离(可选) 0x04:卡路里(可选) 如0x05表示含有步数和卡路里 |
StepCount | Uint24 | 步数 |
StepDistancer | Uint24 | 走了多远,单位米 |
StepCalorie | Uint24 | 卡路里 |
说明:
1. 距离和卡路里是可选的,可能出现也可能不出现
如果只有步数,那么值为:0x01 (步数)0x10 0x27 0x00(1万步),也就是说上报4个字节。
如果有步数和距离,那么值为:0x03(步数,距离)0x10 0x27 0x00(1万步)0x70 0x17 0x00(6公里),也就是说上报7个字节。
其他情况以此类推。
2. 时间值以手机时间为标准,即手机收到数据的那一刻就认为是这个数据的时间。
Target的值为
值 | 类型 | 说明 |
Flag | Uint8 | 0x01:步数(必选) |
StepCount | Uint24 | 步数 |
说明:
1. 如目标为一万步,那么值为:0x01(步数) 0x10 0x27 0x00 0x00(1万步),上报5个字节
2. 如果手机往设备写入目标值,设备要更新。如果设备更新了目标值,要通知手机。
打开AirSyncDebugger,进入“精简协义”-》“计步器测试”,主要测试下面几项:
① 广播包,检查广播包格式是否符合要求。
② 连接设备,检查Measure和Target两个特征值是否存在,以及是否符合要求。
③ 设备上报计步数据,BLE设备通过Measure特征,向微信发一个Indicate,上报计步数据。
④ 设备通知目标变化,BLE设备通过Target特征,向微信发一个Indicate,上报目标数据。
⑤ 读取实时计步数据,微信读Measure特征值
⑥ 读取运动目标,微信读Target特征值
⑦ 设置运动目标,微信写Target特征值