(2020年)(网络营销)微信蓝牙外设协议03beta

上传人:精****库 文档编号:135488944 上传时间:2020-06-16 格式:DOC 页数:40 大小:543KB
返回 下载 相关 举报
(2020年)(网络营销)微信蓝牙外设协议03beta_第1页
第1页 / 共40页
(2020年)(网络营销)微信蓝牙外设协议03beta_第2页
第2页 / 共40页
(2020年)(网络营销)微信蓝牙外设协议03beta_第3页
第3页 / 共40页
(2020年)(网络营销)微信蓝牙外设协议03beta_第4页
第4页 / 共40页
(2020年)(网络营销)微信蓝牙外设协议03beta_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《(2020年)(网络营销)微信蓝牙外设协议03beta》由会员分享,可在线阅读,更多相关《(2020年)(网络营销)微信蓝牙外设协议03beta(40页珍藏版)》请在金锄头文库上搜索。

1、微信蓝牙外设协议Project BlueShadow V1.0.3Tencent Confidential文档变更日志版本变更日期01初稿2013/10/902针对常见问题,增加说明2013/10/1803针对常见问题,增加说明。修改包头结构。2013/11/504第二期初稿增加17条protobuf协议,废弃1条,修改1条2013/11/2605暂时去掉二期的内容(17条protobuf),在一期的基础上增加三条协议,并修改auth协议。加入加密解密部分说明。2014/2/1206修改uuid的规定。补充协议字段和错误码。补充加密部分细节。2014/2/2707修改加密协议,增加例子。补充不

2、加密的协议。补充错误码。2014/3/407 . 1修改proto里的UserId,Challeange字段。2014/3/707 . 2规定低功耗蓝牙广播包必须包含mac地址。InitResp增加可选字段以支持自动同步模式,修改解码失败错误码。2014/4/307 . 3修改SendData, SendDataPush两条协议,增加type字段,用来区分是发送给厂商服务器,还是发送给公众平台服务器。2014/4/240 . 7 . 4修改ble蓝牙service uuid的值。2014/4/250 . 7 . 5公众平台协议手环修改:增加BaseResponse字段。2014/4/301 .

3、 0 . 1提升版本号为1.0.1 Beta2014/6/91 . 0 . 2增加Read Characteristics,以支持ios多app连接。增加html jsapi支持。公众平台协议手环修改:增加rtc时间支持。废弃一些字段,修改协议名字为SendData,RecvData等。2014/7/151 . 0 . 3增加蓝牙扫描绑定相关规范。2014/8/18目录概要5整体架构5主要功能5蓝牙BLE模拟成流6协议71 绑定7扫码绑定8蓝牙扫描绑定82 扫描和连接93 流94 包104 包结构105 定长包头116 变长包体117 身份验证和加密128 不加密的方法149 会话约定1510

4、 时序1511 Read Characteristics1512 其他16微信的Protobuf协议161 概述162 命令列表163 错误码174 JSAPI19函数19事件21附录221 ProtoBuf协议介绍222 蓝牙硬件一些规定233 Ios BLE设备的截图234 包的二进制例子255 包的数据流图266 包的时序图277 加解密字段288 Md5DeviceTypeAndDeviceId的例子299 CBC例子3010 CRC32例子3111 微信蓝牙外设proto文件3112 微信公众平台proto文件3513 JsApi例子37概要该文档规范了蓝牙设备和手机上的微信的通信协

5、议协议支持经典蓝牙和4.0 BLE蓝牙,目前支持ios和andriod两个系统,后续会扩展到其他系统。整体架构厂商服务器和外设,由厂商开发完成。微信会提供服务器的接口以对接厂商的服务器,会提供手机的接口(如本文规定的蓝牙协议)以对接厂商的外设。主要功能该协议打通了设备和厂商服务器之间的数据链路,也就是支持将设备上的数据发送到厂商的服务器上,也支持将厂商的数据发送到设备。厂商的数据对于微信来说,是黑盒,微信不对设备数据做分析。该协议也打通了设备和微信服务器之间的数据链路。设备和微信服务器之间的数据格式由微信规定,例如登录,新消息通知等。蓝牙BLE模拟成流微信支持蓝牙BLE。微信规定了蓝牙BLE设

6、备需要先模拟成流(即stream,输入输出流)。经典蓝牙的RFCOMM,就是一个流。流具有的特性有:a. 可以传输无限长度的数据 b. 双工,读写可以并发,互不干扰。显然,蓝牙BLE无法传输无限长度的数据,为了实现这个目的,需要定义一个规范。蓝牙设备需暴露两个特征值(Characteristics):Write特征值,Indication特征值。蓝牙设备从Write特征值接受数据,从Indication特征值发送数据。Indication特征值类型是bytes。这里我们约定,把一个特征值一次传输的数据,称为一帧(不同类型的特征值一次传输的数据长度是不一样的)。注意:应用层上的数据包(例如1k大

7、小),会分散成许多帧来传输。蓝牙设备写过程:1. 分帧:假设蓝牙手环上有1k数据,要发给手机微信。由于一个特征值长度有限(如20个字节),显然需要分多次才能传输完成。1k数据,要分成1024字节/ 20字节=51 个帧。剩下的4个字节,不足一帧(20个字节),需补齐为一帧并对剩下的16个字节赋0。总共是52帧。2. 发送第一个帧:把第一个帧的内容放入特征值里面。然后通知手机读取数据,通知有两种方式,Indication 和notify,这里使用Indication方式,即带响应的通知。当通知完成的时候,可以认为手机已经读完数据。这就完成了发送第一个帧。3. 按照2的步骤,依次发送剩下的帧。蓝牙

8、设备读过程:当蓝牙设备发现读特征值收到数据的时候,就接收数据,并追加到设备的buf里。注意:蓝牙设备必须等微信app订阅了Characteristics之后,才能indicate数据,否者会造成设备发送数据丢失的问题。协议1 绑定用户绑定设备有两种方式:扫码和蓝牙扫描。这两种方式都需要先向微信公众平台注册授权设备(具体api参见公众平台文档)。扫码绑定用户通过扫描设备二维码绑定设备(获取二维码的方法见公众平台文档)。用户场景:用户打开扫一扫界面,扫码设备二维码,出现公众号页面。用户点击关注,进行绑定设备。扫码绑定并不需要设备在身边。蓝牙扫描绑定用户通过扫描周边的蓝牙设备进行绑定。用户场景(可确

9、认设备):用户先关注公众号,点击绑定设备,进入绑定说明页。同时,微信开始扫描设备。用户操作设备确认(如点击设备上的按钮,或者双击设备),设备广播特殊的包(称为确认包),微信监听到包之后,开始关注并绑定。蓝牙扫描绑定需要设备在身边。蓝牙扫描绑定的设备分为两种:可确认(如有按钮,或者可以双击)的设备。大部分设备属于可确认设备。无法确认的设备(无法确认的设备,出于安全性的考虑,可用扫码绑定)可确认的设备,当用户进行设备确认时(如双击手环,或者按按钮),需要广播特殊的包(称为确认包,具体格式见附录)。2 扫描和连接进入特定界面后,微信会开始扫描设备。低功耗蓝牙设备需要在广播包里广播:a. 微信规定的s

10、ervice uuid(具体见附录)。b. 厂商自定义字段里,包含mac地址(具体见附录)。并且需要包含指定的Characteristics(具体见附录)。Andriod经典蓝牙设备需要暴露一个指定uuid的rfcomm服务(具体见附录)。Ios经典蓝牙需要通过mfi认证,并且SerialNumber需为mac地址(字符串形式)。扫描到设备后,微信会连接设备(Ios经典蓝牙需要用户手动在设置界面里面连接上设备)。3 流经典蓝牙使用RFCOMM通信(是个流),蓝牙BLE也模拟成流。4 包流之上运载的是一个紧接着一个的业务逻辑的数据包。数据包的发送方和接受方:设备厂商服务器,或者设备微信服务器。把

11、设备-厂商服务器/微信服务器的请求称为Req,回包称为Resp。一个请求,对应着一个回包。把厂商服务器/微信服务器-设备的请求称为PushReq,没有回包(即没有PushResp这样的包)。4 包结构由定长包头和变长包体组成。变长包体Protoalbuf打包的二进制数据定长包头struct BpFixHeadunsigned char bMagicNumber;unsigned char bVer;unsigned short nLength;unsigned short nCmdId;unsigned short nSeq;包包的二进制例子见附录。5 定长包头字段类型说明bMagicNumb

12、erunsigned char填0xFEbVerunsigned char包格式版本号,填1nLengthunsigned short为包头+包体的长度nCmdIdunsigned short命令号,如ECI_req_auth,ECI_resp_sendDataToManufacturerSvr等nSequnsigned short递增。一个Req对应一个Resp,并且它们的nSeq相同,并且永不为0。Push的nSeq永远为0;6 变长包体为Protobuf(protobuf的介绍见附录)打包的结构。例如AuthReq。一个包体里面只有一个Req,或者一个Resp,或者一个PushReq。每

13、个Req/Resp/PushReq都有对应的EmCmdId,例如AuthReq的命令号为ECI_req_auth。具体的定义见附录。7 身份验证和加密为保证数据安全,所有命令都需要加密。加密算法选用aes 128位,并使用cbc模式,pkcs7填充。初始向量为密钥。具体验证和加密的步骤如下:a. 设备需要烧一个Key(128位)到硬件上,微信服务器也要记录下这个Key。一个设备(deiveId+deviceType唯一确定一个设备),对应一个Key。key要保护好(类似用户密码,银行卡账号密码),千万不要印刷出来或者打印出来。b. 对于设备来说,手机和服务器可看成一个黑盒。设备和手机服务器之间

14、,通过Auth命令,使用key,最终,把sessionKey下发给到设备。Auth的步骤为:设备发送AuthReq,里面的字段有MD5(deviceType+deviceId)(如果设备算md5很麻烦的话,建议先算好,直接烧进设备里面),另一个字段为AES加密的一段buffer(具体字段细节在附录描叙)。微信发送回包AuthResp,里面的字段有用AES加密的含有sessionkey的一段buffer(具体字段细节在附录描叙)。设备解密这段buffer可得到SessionKey。c. 设备和手机之间,就通过sessionKey来加解密包。AuthReq, AuthResp之后的所有命令,例如InitReq, InitResponse,SendDataToManufaturSvrReq,SendDataToManufacturerSvrResponse,ManufacturerSvrSendDataPush等都需要加解密。d. 加密只针对变长包体,不需要加密定长包头。e. 为了提高安全性,设备可再进一步的验证手机是否可信。设备在InitReq里填入Challeange(一个4字节的随机数random4),手机将在InitResp里面

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号