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接入调试指引 硬件篇的更多相关文章

  1. 微信蓝牙ble记录

    参加了一个简单的微信蓝牙ble项目,做一些记录 首先按网站上面的各种配置 简单的说就是,软件上面,生成deviceid->绑定设备和deviceid. 几点注意: 1>deviceid是唯 ...

  2. 玩转BLE(3)_使用微信蓝牙精简协议伪造记步数据

    1. 前言 在物联网时代,有一个问题肯定会让人头疼(现在已经初露端倪了): 物联网中的IOT设备有两个主要特点: 1)简单小巧(不具备复杂的人机交互接口,需要手机等终端设备辅助完成配置.控制等功能). ...

  3. 全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗

    号称全球最低功耗蓝牙单芯片DA14580在可穿戴市场.健康医疗.ibeacon定位等市场得到广泛的应用,但是因为其较为封闭的技术/资料支持导致开发人员有较高的技术门槛,网络上也极少看到有关DA1458 ...

  4. ESP32:蓝牙BLE控制M3508电机

    ESP32:蓝牙BLE控制M3508电机 先给各位朋友拜个年,祝大家新春快乐,事事顺利,身体健康啊! 还是熟悉的3508,内容概述: ESP32主控 蓝牙BLE通信 使用实时系统(FreeRTOS) ...

  5. 蓝牙BLE传输性能及延迟分析

    BLE传输性能主要受以下几个因素影响:操作类型,Connection Interval,每个Connection Event内发送的帧数.每一帧数据的长度.具体参见如下链接: https://devz ...

  6. 蓝牙BLE实用教程

    蓝牙BLE实用教程 Bluetooth BLE 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过 设置 里的修改模板来改变新建文章的内容. 1.蓝牙BLE常见问答 Q: Smart Re ...

  7. [蓝牙] 2、蓝牙BLE协议及架构浅析&&基于广播超时待机说广播事件

    第一章 BLE基本概念了解 一.蓝牙4.0和BLE区别   蓝牙4.0是一种应用非常广泛.基于2.4G射频的低功耗无线通讯技术.蓝牙低功耗(Bluetooth Low Energy ),人们又常称之为 ...

  8. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

    本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...

  9. Protocol buffer序列化及其在微信蓝牙协议中的应用

    Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提 ...

随机推荐

  1. Docker(linux container) 所依赖的底层技术

    1 Namespace 用来做PID的隔离,有了namespace,在docker container里头看来,就是一个完整的linux的世界.在host看来,container里的进程,就是一个普通 ...

  2. Singleton模式——对象创建型模式

    Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...

  3. iOS学习28之UITabBarController

    1. 标签视图控制器 -- UITabBarController 视图(UIView) ---> 图层 ---> 子视图 视图控制器(UIViewController) ---> 管 ...

  4. BZOJ3569 : DZY Loves Chinese II

    这回是真·强制在线了,首先这道题就是AHOI2013连通图的加强版,那道题k最大只有4 那道题的做法是: 取一个生成树,对每条非树边取一个随机权值, 对每条树边设为“覆盖它的所有非树边”的权值的xor ...

  5. Storm-166:Nimbus HA solution based on Zookeeper

    Nimbus HA feature is quite important for our application running on the storm cluster. So, we've bee ...

  6. 163源报错Hash Sum mismatch 解决方法

    Ubuntu server 用的163的源,报错: W: Failed to fetch http://mirrors.163.com/ubuntu/dists/precise-updates/mai ...

  7. VR教育旋风来袭,各大公司争先进军虚拟现实教育

    根据国内一份最新的报告显示,VR技术对于提高学生的学习成绩有非常积极的作用,并且通过测试结果来看,无论是对知识的认知还是成绩测试,VR都起到了非常有效的效果. 2016成为VR元年,虚拟现实技术除了在 ...

  8. BZOJ 3223 & 区间翻转

    题意: 就是贴个代码,这是我入门题的弱化版..然而一共还是写了40分钟,不专注(一边看比赛一边打)是一个问题,splay每个操作的细节确实有点多(什么时候updata啊..什么时候pushdown啊. ...

  9. Spring MVC过滤器-字符集过滤器(CharacterEncodingFilter)

    spring的字符集过滤通过用于处理项目中的乱码问题,该过滤器位于org.springframework.web.filter包中,指向类CharacterEncodingFilter,Charact ...

  10. windows2008 IIS下配置FTP服务

    一.服务器管理器 1.2008的系统使用服务器管理器,选择角色,因为我之前已经开启了IIS服务器角色,所以我现在只要添加角色服务即可,如果你没有开启过的话,直接添加角色即可. 2.选择WEB服务器,打 ...