微信蓝牙BLE接入调试指引 硬件篇
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”的代码,过程不写了,对调试过程中需要注意的写一下。
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记录
参加了一个简单的微信蓝牙ble项目,做一些记录 首先按网站上面的各种配置 简单的说就是,软件上面,生成deviceid->绑定设备和deviceid. 几点注意: 1>deviceid是唯 ...
- 玩转BLE(3)_使用微信蓝牙精简协议伪造记步数据
1. 前言 在物联网时代,有一个问题肯定会让人头疼(现在已经初露端倪了): 物联网中的IOT设备有两个主要特点: 1)简单小巧(不具备复杂的人机交互接口,需要手机等终端设备辅助完成配置.控制等功能). ...
- 全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗
号称全球最低功耗蓝牙单芯片DA14580在可穿戴市场.健康医疗.ibeacon定位等市场得到广泛的应用,但是因为其较为封闭的技术/资料支持导致开发人员有较高的技术门槛,网络上也极少看到有关DA1458 ...
- ESP32:蓝牙BLE控制M3508电机
ESP32:蓝牙BLE控制M3508电机 先给各位朋友拜个年,祝大家新春快乐,事事顺利,身体健康啊! 还是熟悉的3508,内容概述: ESP32主控 蓝牙BLE通信 使用实时系统(FreeRTOS) ...
- 蓝牙BLE传输性能及延迟分析
BLE传输性能主要受以下几个因素影响:操作类型,Connection Interval,每个Connection Event内发送的帧数.每一帧数据的长度.具体参见如下链接: https://devz ...
- 蓝牙BLE实用教程
蓝牙BLE实用教程 Bluetooth BLE 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过 设置 里的修改模板来改变新建文章的内容. 1.蓝牙BLE常见问答 Q: Smart Re ...
- [蓝牙] 2、蓝牙BLE协议及架构浅析&&基于广播超时待机说广播事件
第一章 BLE基本概念了解 一.蓝牙4.0和BLE区别 蓝牙4.0是一种应用非常广泛.基于2.4G射频的低功耗无线通讯技术.蓝牙低功耗(Bluetooth Low Energy ),人们又常称之为 ...
- 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...
- Protocol buffer序列化及其在微信蓝牙协议中的应用
Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提 ...
随机推荐
- 快学Java NIO
Java NIO Tutorial 地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO系列教程译文地址:http://ifeve.c ...
- HIT2715 Matrix3(最小费用最大流)
题目大概说有一个n×n的矩阵,每个格子都有权值和高度,在这个矩阵中进行最多k次旅行,每次旅行能从当前格子走到相邻且高度更小的格子,走到格子边界就能出去完成这次旅行.每走到一个格子就累加格子的权值然后把 ...
- BZOJ3555 [Ctsc2014]企鹅QQ 题解
题目大意: 有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数. 思路: Hash大法好!正着倒着各来一遍(底数不同),之后枚举不同的那一位,前后两段拼起来之后为了有区分前面一部分再乘一个数 ...
- dom事件不求甚解,色解事件捕获和冒泡
以前对事件只会用jq的bind绑定一下,脑海里留着书中的事件循环,一直认为事件就是这儿循环的,最近看园子里的文章,对事件的了解更模糊了 所以我做了个小实验,总结一下看的这些零零碎碎的文章,如果总结错了 ...
- 【BZOJ】2659: [Beijing wc2012]算不出的算式
题意 给两个奇质数\(p, q(p, q < 2^{31})\),求\(\sum_{k=1}^{\frac{p-1}{2}} \left \lfloor \frac{kq}{p} \right ...
- [LintCode] Add and Search Word 添加和查找单词
Design a data structure that supports the following two operations: addWord(word) and search(word) s ...
- java设计模式。。。转载
maowang I am a slow walker,but I never walk backwards! 博客园 首页 新随笔 联系 订阅 管理 随笔 - 125 文章 - 0 评论 - 12 ...
- Hive_进阶
回顾: hive 优点 1. 类sql语句靠近关系型数据库,可自定义函数,增加了扩展性,易于开发,减少mapreduce学习成本 2. hive转换sql语句为mapreduce程序以mapreduc ...
- android获取系统通讯录
package com.example.administrator.yunphone.View; import android.app.Fragment; import android.databas ...
- attrs 中的 uid
Odoo View视图默认是不认识attrs中的uid的,其原因在于后台将xml转化为html的过程中对attrs调用了python的eval方法,而对于eval函数来说,我们传入的形如[(' ...