一、前言

本尊自诩为IOT小能手,一直没涉足蓝牙实在说不过去。刚好上个月底的时候计划做个BLE设备,这阵子利用业余时间自学了BLE协议栈,了解了GATT,磕磕绊绊完成CC254x(cc2540/cc2541)的微信AirSync。就在今晚,听着Coldplay的“Be my mirror, my sword and shield”雄心万丈,大千世界和AirSync都被我征服,终于完成了最后一步的测试。

二、常见问题及措施

我把自己遇到的几个问题及解决方案都记录在这边,应该会让一些朋友少走一些弯路。

1. 广播包中没有 manufacture specific data 字段,或不以MAC地址结尾。

 
措施:广播包中必须带上0xFF的厂商自定义字段,09+ FF + 厂商ID(2 Bytes) + MAC(6 Bytes)。

2. Mac address 校验失败!

这是我之前调试的错误提示:

***** onTestIsValidAuthReqPack *****
result = false, is an invalid auth request pack: AuthRequestPack: FE 01 00 32 27 11 00 01 0A 00 18 84 80 04 20 01 28 02 3A 06 57 65 43 68 61 74 62 16 57 65 43 68 61 74 42 6C 75 65 74 6F 6F 74 68 44 65 76 69 63 65 00
has BaseRequest
no Md5DeviceTypeAndDeviceId field!
has MacAddress field, Mac Address = 57 65 43 68 61 74
MacAddress BitLength = 48bit
Mac Address from broadcast record = 90:59:AF:0E:62:88
Mac address 校验失败!
has ProtoVersion field, ProtoVersion = 65540
has AuthProto field, AuthProto = 1
has AuthMethod field, AuthMethod = EAM_macNoEncrypt
no AesSign field!
has DeviceName field, DeviceName = WeChatBluetoothDevice

措施:在AUTH REQ中也有Mac字段,需要保证MAC地址和广播包中的一样。

3. Read Characteristic is not read able!

4. Can not Start Indicate permision:Can not get configure descriptor

措施:这两个处理,要保证Read Characteristic有可读权限,然后Read Char的值必须为MAC地址。

5. async write data error

措施:这个问题很多,但是解决思路都固定,就是在https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#GATT_FAILURE 
找错误码。

我的错误码是03,说是手机没有写权限。

public static final int GATT_WRITE_NOT_PERMITTED
Added in API level 18 GATT write operation is not permitted 

Constant Value: 3 (0x00000003)

后来一查,果然我的Write CHAR没有write权限。

三、AirSync的完整日志

这边把完整的LOG日志提供出来,希望对其他调试AirSync的朋友有所帮助。

*****************BLE: TwoWinter******************

***** onTestBroadcastRecord *****
result = true, Has 0xfee7 or standard service in broadcast record

广播包:     E7 FE  FF 0D    AF 0E   0A    6F   6E           0A                           

***** onTestManufatureData *****
resut= true, 广播包中 manufacture specific data 字段中MAC地址校验成功.

***** onDiscoverService *****
result = true, DiscoverService success
Discovered Services
ServiceUUID: ----00805f9b34fb
ServiceUUID: ----00805f9b34fb
ServiceUUID: 0000180a----00805f9b34fb
ServiceUUID: 0000fee7----00805f9b34fb

***** onTestHasWeChatService *****
result = true, has WeChatService or standard service

***** onTestHasIndicateCharacteristic *****
result = true, has WeChat Indicate Characteristic

***** onTestHasWriteCharacteristic *****
result = true, has Wechat Write Characteristic

***** onTestHasReadCharacteristic *****
result = true, Has WeChat read characteristic

***** onTestWriteCharacteristicPermisson *****
result = true, has Write permission

***** onTestIndicateCharacteristicPermisson *****
result = true, has Indication permission

***** onTestReadCharacteristicPermisson *****
result = true, Read Characteristic is read able

***** onTestStartIndicating *****
result = true, can Start Indicate

***** onConnected *****
result = true, connected

------onDataReceived------
data length =
data dump = FE        0A          3A
data receive seq = 

------onDataReceived------
data length =
data dump =   AF 0E     6D
data receive seq = 

***** onTestRecvAuthReqtWhenStartedIndicating *****
result = true, received auth request pack

***** onTestIsValidAuthReqPack *****
result = true, is a valid auth request pack
AuthRequestPack: FE        0A          3A    AF 0E     6D
has BaseRequest
no Md5DeviceTypeAndDeviceId field!
has MacAddress field, Mac Address =   AF 0E
MacAddress BitLength = 48bit
Mac Address ::AF:0E::
Mac address checkout success
has ProtoVersion field, ProtoVersion =
has AuthProto field, AuthProto =
has AuthMethod field, AuthMethod = EAM_macNoEncrypt
no AesSign field!
has DeviceName field, DeviceName = mydevice

**** send auth response ****
data len =
data dump = FE   0E 4E    0A      

------onDataReceived------
data length =
data dump = FE        0A  1A
data receive seq = 

***** onTestRecvInitReqPack *****
result = true, received init request pack

***** onTestIsValidInitReqPack *****
result = true, valid init request pack: has BaseRequest
has Challenge field, Challenge =     

**** send init request response ****
data len =
data dump = FE    4E    0A     B4   F8 AC   D1 BB CA BF  

------onDataReceived------
data length =
data dump = FE        0A   0C FE CF
data receive seq = 

------onDataReceived------
data length =
data dump =
data receive seq = 

*** receive SendDataRequest ****
date type = manufactureSvr data
data len =
data dump = 0A   0C FE CF           

**** send SendData Response(echo request) ****
data len =
data dump = FE   1E 4E    0A      0A   0C FE CF           

***** onTestIsValidSendDataRequest *****
result = true, is a valid SendDataRequest pack: has BaseRequest field
has Data field, data = FE CF
no Type field, use default manufactureSvr data type

**** send ManufactureSvr Push ****
data len =
data dump = FE        0A              

**** send Html Push ****
data len =
data dump = FE        0A              4E 

**** send wxWristBand Push ****
data len =
data dump = FE   0E     0A      

**** send EnterDeviceChatView Push ****
data len =
data dump = FE   0E     0A      

**** send Exit ChatView Push ****
data len =
data dump = FE   0E     0A      

**** send Enter HtmlChatView Push ****
data len =
data dump = FE   0E     0A      

**** send Exit HtmlChatView Push ****
data len =
data dump = FE   0E     0A      

**** send enterBackground Push ****
data len =
data dump = FE   0C     0A    

**** send enterForground Push ****
data len =
data dump = FE   0C     0A    

**** send enterSleep Push ****
data len =
data dump = FE   0C     0A    

*****Disconnected Device*****
 

CC254x(cc2540/cc2541)的微信AirSync调试笔记的更多相关文章

  1. CC254x/CC2540/CC2541库函数速查(转)

    hci.h 转自:http://blog.csdn.net/xiaoleiacmer/article/details/44036607#t1 //分配内存,应用程序不应该调用这个函数. void *H ...

  2. 以蓝牙开发的视觉解读微信Airsync协议

    微信硬件平台使用蓝牙作为近场控制的连接件,并拟定了<微信蓝牙外设协议>.这份协议更像一个标准,用于规范微信和蓝牙外设之间的数据交互场景和接口.但从开发者来看,要完全读懂这份协议,恐怕需要熟 ...

  3. cc2540 cc2541 开发板资料更新日志

    经过多次PCB打样和全面调试.已经完毕了cc2540 cc2541的开发板的批量贴片.硬件告一段落, 接下来是全面完好软件方面的工作.眼下已经针对没有开发经验的用户编写完毕0基础基础实验代码和教程.接 ...

  4. Tomcat调试笔记

    调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...

  5. JavaScript特效(调试笔记)

    JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...

  6. USB wifi调试笔记

    本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...

  7. 蓝牙4.0BLE cc2540 cc2541 ios OAD课程(空中固件升级)[原版的,多图]

           蓝牙4.0BLE cc2540 cc2541 ios OAD课程(件) 为阿莫单片机论坛  www.AmoMcu.com 原创.仅仅公布于csdn博客, 如需转载,请注明出处,谢谢!   ...

  8. 蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现

           蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现        尽管蓝牙4.0 BLE芯片CC2540 是单芯片(即用户能够对它进行芯片级代码编写), 是80 ...

  9. ida动态调试笔记

    ida动态调试笔记 目标文件:阿里安全挑战赛的第二题 点击打开链接 使用环境:ida6.8点击打开链接,adt bundle点击打开链接 首先打开avd安卓模拟器,界面如下: 在dos下运行adb命令 ...

随机推荐

  1. 分享Kali Linux 2016.2第36周镜像虚拟机

    分享Kali Linux 2016.2第36周镜像虚拟机   9月9日,Kali Linux官方发布Kali Linux 2016.2周更新镜像.今天以64位镜像安装了一个虚拟机,分享给大家.该虚拟机 ...

  2. Rightmost Digit

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  3. 简单几何(求划分区域) LA 3263 That Nice Euler Circuit

    题目传送门 题意:一笔画,问该图形将平面分成多少个区域 分析:训练指南P260,欧拉定理:平面图定点数V,边数E,面数F,则V + F - E =  2.那么找出新增的点和边就可以了.用到了判断线段相 ...

  4. 模拟 Coder-Strike 2014 - Round 1 A. Poster

    题目地址:http://codeforces.com/problemset/problem/412/A /* 模拟:题目没看懂,但操作很简单,从最近的一头(如果不在一端要先移动到一端)往另一头移动,顺 ...

  5. WCF 采用net.tcp协议实践

    概述 与Socket相比,WCF真是爽得不得了,其基本指导思想为SOA——面向服务. 其基本配置在于ABC(Address,Binding,Contract),通常,只要这三个因素配置对了,那么,基本 ...

  6. CentOS6.4 配置DNS服务器

    1.安装bind yum install -y bind bind-chroot bind-utis 2.配置named.conf [root@dns /]# vi /etc/named.conf 注 ...

  7. HDU 4671 Partition(定理题)

    题目链接 这题,明显考察搜索能力...在中文版的维基百科中找到了公式. #include <cstdio> #include <cstring> #include <st ...

  8. 地球上最大的PHP站点 后端技术解密

    Facebook的扩展性挑战 在我们讨论细节之前,这里有一些Facebook已经做的软件规模: ◆Facebook有570000000000每月页面浏览量 (据Google Ad Planner) ◆ ...

  9. Scala - Spark Lambda“goesto“ => 分析

    /// 定义一个函数AddNoise,参数分别为rdd,Fraction.其中rdd为(BreezeDenseMatrix, BreezeDenseMatrix)元组构成的RDD.Fraction为一 ...

  10. hdu-acm stepsHumble Numbers

    这是我做的第六道动态规划水题,对动态规划差不多有了一个大致的概念.动态规划有几个关键因素,第一是最优子结构,第二是状态和状态转移方程.整个过程都是以  最优  为中心的.因此在状态转移方程中常涉及到几 ...