微信蓝牙BLE接入调试指引 硬件篇

2022-12-03,,,,

1 平台框架简介

微信蓝牙BLE由三个模块组成,分别是蓝牙设备、微信和第三方服务器,如下图:

蓝牙设备与微信之间的通信是通过蓝牙GATT协议进行。

微信与第三方服器之间的通信是通过网络http 接口进行。

调试流程:

2蓝牙BLE固件调试

2.1 需要的资料和工具

《微信蓝牙外设协议》

微信蓝牙协议调试工具AirSyncDebugger

《微信蓝牙计步Profile协议》

Nordic nRF51822接入教程芯片源代码v0.2

以上资料都可以在下面网址下载: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”的代码,过程不写了,对调试过程中需要注意的写一下。

2.3.1广播包格式

微信是通过广播数据,来决定要不要建立连接,所以广播数据的格式要按要求来。广播包分两种,一种是“普通广播包”,这种在建立连接时不需要蓝牙设备确认;另一种是“确认广播包”,它在建立连接时则需要蓝牙设备确认。我在使用“确认广播包”时没发现哪里需要确认,跟“普通广播包”没有什么不同,这里有些不理解。

微信的广播包规定了厂商数据格式以及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协议”,选择“手动测试”,第一步会对广播数据进行检测,如果通过就会打勾,出错则显示错误信息:

2.3.2 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请求,至此,连接就建立了,后面就可以不分先后往对方发数据了。

2.3.3 调试

固件移植好后,将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,自己写写就行了。

2.4.1 广播包

计步和AirSync是同一个服务,广播包和AirSync是一样的,如果已支持AirSync,则无需再写,如果只是计步功能,则按2.3.1的格式要求写。

2.4.2 计步Profile

计步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. 如果手机往设备写入目标值,设备要更新。如果设备更新了目标值,要通知手机。

2.4.3 调试

打开AirSyncDebugger,进入“精简协义”-》“计步器测试”,主要测试下面几项:

① 广播包,检查广播包格式是否符合要求。

② 连接设备,检查Measure和Target两个特征值是否存在,以及是否符合要求。

③ 设备上报计步数据,BLE设备通过Measure特征,向微信发一个Indicate,上报计步数据。

④ 设备通知目标变化,BLE设备通过Target特征,向微信发一个Indicate,上报目标数据。

⑤ 读取实时计步数据,微信读Measure特征值

⑥ 读取运动目标,微信读Target特征值

⑦ 设置运动目标,微信写Target特征值

微信蓝牙BLE接入调试指引 硬件篇的相关教程结束。

《微信蓝牙BLE接入调试指引 硬件篇.doc》

下载本文的Word格式文档,以方便收藏与打印。