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. 快学Java NIO

    Java NIO Tutorial 地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO系列教程译文地址:http://ifeve.c ...

  2. HIT2715 Matrix3(最小费用最大流)

    题目大概说有一个n×n的矩阵,每个格子都有权值和高度,在这个矩阵中进行最多k次旅行,每次旅行能从当前格子走到相邻且高度更小的格子,走到格子边界就能出去完成这次旅行.每走到一个格子就累加格子的权值然后把 ...

  3. BZOJ3555 [Ctsc2014]企鹅QQ 题解

    题目大意: 有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数. 思路: Hash大法好!正着倒着各来一遍(底数不同),之后枚举不同的那一位,前后两段拼起来之后为了有区分前面一部分再乘一个数 ...

  4. dom事件不求甚解,色解事件捕获和冒泡

    以前对事件只会用jq的bind绑定一下,脑海里留着书中的事件循环,一直认为事件就是这儿循环的,最近看园子里的文章,对事件的了解更模糊了 所以我做了个小实验,总结一下看的这些零零碎碎的文章,如果总结错了 ...

  5. 【BZOJ】2659: [Beijing wc2012]算不出的算式

    题意 给两个奇质数\(p, q(p, q < 2^{31})\),求\(\sum_{k=1}^{\frac{p-1}{2}} \left \lfloor \frac{kq}{p} \right ...

  6. [LintCode] Add and Search Word 添加和查找单词

    Design a data structure that supports the following two operations: addWord(word) and search(word) s ...

  7. java设计模式。。。转载

    maowang I am a slow walker,but I never walk backwards! 博客园 首页 新随笔 联系 订阅 管理 随笔 - 125  文章 - 0  评论 - 12 ...

  8. Hive_进阶

    回顾: hive 优点 1. 类sql语句靠近关系型数据库,可自定义函数,增加了扩展性,易于开发,减少mapreduce学习成本 2. hive转换sql语句为mapreduce程序以mapreduc ...

  9. android获取系统通讯录

    package com.example.administrator.yunphone.View; import android.app.Fragment; import android.databas ...

  10. attrs 中的 uid

        Odoo View视图默认是不认识attrs中的uid的,其原因在于后台将xml转化为html的过程中对attrs调用了python的eval方法,而对于eval函数来说,我们传入的形如[(' ...