微信蓝牙协议一:协议文档查阅方法和空中数据解析示例

一、概述

本文主要是记录下微信蓝牙数据的分析过程。需要使用两份文档:

《微信蓝牙外设协议104.pdf》
《Protocol buffer.pdf》

在《Protocol buffer.pdf》一文中解析了一组数据作为示例。这篇文章主要是通过一组数据,记录下两篇文章的使用方法。

二、抓取数据

首先使用监听工具抓取一组空中数据:
在这里插入图片描述
可以看到APP发送到空中的蓝牙数据为:

fe010014753100000a00120633008001a2231800

而这里真正要传输的数据是33008001a223,其余均是微信协议相关。我们就通过这组数据看下微信蓝牙协议是如何组包的。

三、包头解析

在《微信蓝牙外设协议104.pdf》一文协议部分第7小节,说明了微信蓝牙数据包由包头和包体组成:
在这里插入图片描述
那么我们抓取的数据就可以先拆分成

//包头
fe
01
0014	//FE01...1800的总长度
7531	//命令,下面内容详解
0000	//序号
//包体
0a00120633008001a2231800

在《微信蓝牙外设协议104.pdf》一文附录部分第11小节,可以看到命令编码:
在这里插入图片描述
也就可以看出此处的7531正表明了数据是从APP发给我们的蓝牙设备。

四、包体解析

从包头中我们得到了命令号7531,之后根据7531查到了这是APP发送给蓝牙设备。现在我们再对包体进行解析。
回到《微信蓝牙外设协议104.pdf》一文微信的 Protobuf 协议部分第2小节,可以看出APP发送给蓝牙设备对应RecvDataPush命令:
在这里插入图片描述
接下来全文搜索RecvDataPush命令,得到以下定义:
在这里插入图片描述
那么这个定义如何使用呢?这时就需要看我们的第二篇文章《Protocol buffer.pdf》。到这里才发现,抓取的数据和第二篇文章示例的数据类型正好一样,推荐直接看原文即可。


为了加深理解,我转化为自己的话再描述下。
变长包体分为三个部分,正好与我们查到的定义里三个内容相对应。
要使用这三个内容,需要用到两个东西。一是数据类型表:
在这里插入图片描述
二是计算公式

key = field<<3 | type

利用这两个东西,最终将结构体定义的三部分变为

key1 value1  key2 value2  key3 value3

4.1 第一部分

required BasePush BasePush = 1;

首先可以看出索引值是1,也就是field=1。
required在文中给出了如下描述:

Required前缀表示该字段必须在序列化之前赋值,optional前缀表示可以不赋值。

后面两个BasePush相当于char a,也就是说需要根据数据类型BasePush在表中查找对应的type一栏的值。发现表中没有BasePush,我们回到《微信蓝牙外设协议104》全局搜索BasePush,查到如下定义:

message BasePush {
}

这里可以得到两个信息,BasePush真正的数据类型为message,而内容为空,也就是value=0来处理。
表中可以找到,type=2:
在这里插入图片描述
于是就可以计算

key = field<<3 | type
    = 1<<3 | 2 = 10 = 0x0A

所以得到第一部分的最终结果:

0A 00

4.2 第二部分

required bytes Data = 2;

Data索引值也就是field为2,类型为bytes,查表得到对应的type为2,那么

key = field<<3 | type
    = 2<<3 | 2 = 18 = 0x12

而我们要传输的数据33008001a223,长度为6字节。所以得到第二部分的最终结果:

12 06 33 00 80 01 a2 23

注意当要传输的数据长度大于128字节时,不能直接填充,需要使用Varint算法。可以查看下一篇笔记。

4.3 第三部分

第三部分与第一部分的方法相同,需要先回到《微信蓝牙外设协议104》中查找EmDeviceDataType
在这里插入图片描述
真实数据类型为enum,值我们使用的是0,即厂商自定义数据。
在表中查找enum数据类型,得到type=0。

key = field<<3 | type
    = 3<<3 | 0 = 24 = 0x18

所以得到第三部分的最终结果:

18 00

到这里就解析完一整包数据。文中描述的逻辑有些跳跃,有些是从解析的角度讲,有些是从组包的角度讲。不过总归是为了说明协议嘛,有时间再回过头来重新梳理下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值