微信藍牙外設協(xié)議_第1頁
微信藍牙外設協(xié)議_第2頁
微信藍牙外設協(xié)議_第3頁
微信藍牙外設協(xié)議_第4頁
微信藍牙外設協(xié)議_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、.:.;微信藍牙外設協(xié)議Project BlueShadow V1.0.3Tencent Confidential文檔變卦日志版本變卦日期01初稿2021/10/902針對常見問題,添加闡明2021/10/1803針對常見問題,添加闡明。修正包頭構(gòu)造。2021/11/504第二期初稿添加17條protobuf協(xié)議,廢棄1條,修正1條2021/11/2605暫時去掉二期的內(nèi)容17條protobuf,在一期的根底上添加三條協(xié)議,并修正auth協(xié)議。參與加密解密部分闡明。2021/2/1206修正uuid的規(guī)定。補充協(xié)議字段和錯誤碼。補充加密部分細節(jié)。2021/2/2707修正加密協(xié)議,添加例子。補

2、充不加密的協(xié)議。補充錯誤碼。2021/3/407 . 1修正proto里的UserId,Challeange字段。2021/3/707 . 2規(guī)定低功耗藍牙廣播包必需包含mac地址。InitResp添加可選字段以支持自動同步方式,修正解碼失敗錯誤碼。2021/4/307 . 3修正SendData, SendDataPush兩條協(xié)議,添加type字段,用來區(qū)分是發(fā)送給廠商效力器,還是發(fā)送給公眾平臺效力器。2021/4/240 . 7 . 4修正ble藍牙service uuid的值。2021/4/250 . 7 . 5公眾平臺協(xié)議手環(huán)修正:添加BaseResponse字段。2021/4/301

3、 . 0 . 1提升版本號為1.0.1 Beta2021/6/91 . 0 . 2添加Read Characteristics,以支持ios多app銜接。添加html jsapi支持。公眾平臺協(xié)議手環(huán)修正:添加rtc時間支持。廢棄一些字段,修正協(xié)議名字為SendData,RecvData等。2021/7/151 . 0 . 3添加藍牙掃描綁定相關(guān)規(guī)范。2021/8/18目錄 TOC o 1-3 h z u HYPERLINK l _Toc396142795 概要 PAGEREF _Toc396142795 h 5 HYPERLINK l _Toc396142796 整體架構(gòu) PAGEREF _

4、Toc396142796 h 5 HYPERLINK l _Toc396142797 主要功能 PAGEREF _Toc396142797 h 5 HYPERLINK l _Toc396142798 藍牙BLE模擬成流 PAGEREF _Toc396142798 h 6 HYPERLINK l _Toc396142799 協(xié)議 PAGEREF _Toc396142799 h 7 HYPERLINK l _Toc396142800 1 綁定 PAGEREF _Toc396142800 h 7 HYPERLINK l _Toc396142801 掃碼綁定 PAGEREF _Toc396142801

5、 h 8 HYPERLINK l _Toc396142802 藍牙掃描綁定 PAGEREF _Toc396142802 h 8 HYPERLINK l _Toc396142803 2 掃描和銜接 PAGEREF _Toc396142803 h 9 HYPERLINK l _Toc396142804 3 流 PAGEREF _Toc396142804 h 9 HYPERLINK l _Toc396142805 4 包 PAGEREF _Toc396142805 h 10 HYPERLINK l _Toc396142806 4 包構(gòu)造 PAGEREF _Toc396142806 h 10 HYPE

6、RLINK l _Toc396142807 5 定長包頭 PAGEREF _Toc396142807 h 11 HYPERLINK l _Toc396142808 6 變長包體 PAGEREF _Toc396142808 h 11 HYPERLINK l _Toc396142809 7 身份驗證和加密 PAGEREF _Toc396142809 h 12 HYPERLINK l _Toc396142810 8 不加密的方法 PAGEREF _Toc396142810 h 14 HYPERLINK l _Toc396142811 9 會話商定 PAGEREF _Toc396142811 h 15

7、 HYPERLINK l _Toc396142812 10 時序 PAGEREF _Toc396142812 h 15 HYPERLINK l _Toc396142813 11 Read Characteristics PAGEREF _Toc396142813 h 15 HYPERLINK l _Toc396142814 12 其他 PAGEREF _Toc396142814 h 16 HYPERLINK l _Toc396142815 微信的Protobuf協(xié)議 PAGEREF _Toc396142815 h 16 HYPERLINK l _Toc396142816 1 概述 PAGERE

8、F _Toc396142816 h 16 HYPERLINK l _Toc396142817 2 命令列表 PAGEREF _Toc396142817 h 16 HYPERLINK l _Toc396142818 3 錯誤碼 PAGEREF _Toc396142818 h 17 HYPERLINK l _Toc396142819 4 JSAPI PAGEREF _Toc396142819 h 19 HYPERLINK l _Toc396142820 函數(shù) PAGEREF _Toc396142820 h 19 HYPERLINK l _Toc396142821 事件 PAGEREF _Toc39

9、6142821 h 21 HYPERLINK l _Toc396142822 附錄 PAGEREF _Toc396142822 h 22 HYPERLINK l _Toc396142823 1 ProtoBuf協(xié)議引見 PAGEREF _Toc396142823 h 22 HYPERLINK l _Toc396142824 2 藍牙硬件一些規(guī)定 PAGEREF _Toc396142824 h 23 HYPERLINK l _Toc396142825 3 Ios BLE設備的截圖 PAGEREF _Toc396142825 h 23 HYPERLINK l _Toc396142826 4 包的二

10、進制例子 PAGEREF _Toc396142826 h 25 HYPERLINK l _Toc396142827 5 包的數(shù)據(jù)流圖 PAGEREF _Toc396142827 h 26 HYPERLINK l _Toc396142828 6 包的時序圖 PAGEREF _Toc396142828 h 27 HYPERLINK l _Toc396142829 7 加解密字段 PAGEREF _Toc396142829 h 28 HYPERLINK l _Toc396142830 8 Md5DeviceTypeAndDeviceId的例子 PAGEREF _Toc396142830 h 29 H

11、YPERLINK l _Toc396142831 9 CBC例子 PAGEREF _Toc396142831 h 30 HYPERLINK l _Toc396142832 10 CRC32例子 PAGEREF _Toc396142832 h 31 HYPERLINK l _Toc396142833 11 微信藍牙外設proto文件 PAGEREF _Toc396142833 h 31 HYPERLINK l _Toc396142834 12 微信公眾平臺proto文件 PAGEREF _Toc396142834 h 35 HYPERLINK l _Toc396142835 13 JsApi例子

12、 PAGEREF _Toc396142835 h 37概要該文檔規(guī)范了藍牙設備和手機上的微信的通訊協(xié)議協(xié)議支持經(jīng)典藍牙和4.0 BLE藍牙,目前支持ios和andriod兩個系統(tǒng),后續(xù)會擴展到其他系統(tǒng)。整體架構(gòu)廠商效力器和外設,由廠商開發(fā)完成。微信會提供效力器的接口以對接廠商的效力器,會提供手機的接口如本文規(guī)定的藍牙協(xié)議以對接廠商的外設。主要功能該協(xié)議打通了設備和廠商效力器之間的數(shù)據(jù)鏈路,也就是支持將設備上的數(shù)據(jù)發(fā)送到廠商的效力器上,也支持將廠商的數(shù)據(jù)發(fā)送到設備。廠商的數(shù)據(jù)對于微信來說,是黑盒,微信不對設備數(shù)據(jù)做分析。該協(xié)議也打通了設備和微信效力器之間的數(shù)據(jù)鏈路。設備和微信效力器之間的數(shù)據(jù)格式

13、由微信規(guī)定,例如登錄,新音訊通知等。藍牙BLE模擬成流微信支持藍牙BLE。微信規(guī)定了藍牙BLE設備需求先模擬成流(即stream,輸入輸出流)。經(jīng)典藍牙的RFCOMM,就是一個流。流具有的特性有:可以傳輸無限長度的數(shù)據(jù) 雙工,讀寫可以并發(fā),互不干擾。顯然,藍牙BLE無法傳輸無限長度的數(shù)據(jù),為了實現(xiàn)這個目的,需求定義一個規(guī)范。藍牙設備需暴露兩個特征值Characteristics:Write特征值,Indication特征值。藍牙設備從Write特征值接受數(shù)據(jù),從Indication特征值發(fā)送數(shù)據(jù)。Indication特征值類型是bytes。這里我們商定,把一個特征值一次傳輸?shù)臄?shù)據(jù),稱為一幀不同

14、類型的特征值一次傳輸?shù)臄?shù)據(jù)長度是不一樣的。留意:運用層上的數(shù)據(jù)包例如1k大小,會分散成許多幀來傳輸。藍牙設備寫過程:分幀:假設藍牙手環(huán)上有1k數(shù)據(jù),要發(fā)給手機微信。由于一個特征值長度有限如20個字節(jié),顯然需求分多次才干傳輸完成。1k數(shù)據(jù),要分成1024字節(jié)/ 20字節(jié)=51 個幀。剩下的4個字節(jié),缺乏一幀20個字節(jié),需補齊為一幀并對剩下的16個字節(jié)賦0。總共是52幀。發(fā)送第一個幀:把第一個幀的內(nèi)容放入特征值里面。然后通知手機讀取數(shù)據(jù),通知有兩種方式,Indication 和notify,這里運用Indication方式,即帶呼應的通知。當通知完成的時候,可以以為手機曾經(jīng)讀完數(shù)據(jù)。這就完成了發(fā)送

15、第一個幀。按照2的步驟,依次發(fā)送剩下的幀。藍牙設備讀過程:當藍牙設備發(fā)現(xiàn)讀特征值收到數(shù)據(jù)的時候,就接納數(shù)據(jù),并追加到設備的buf里。留意:藍牙設備必需等微信app訂閱了Characteristics之后,才干indicate數(shù)據(jù),否者會呵斥設備發(fā)送數(shù)據(jù)喪失的問題。協(xié)議1 綁定用戶綁定設備有兩種方式:掃碼和藍牙掃描。這兩種方式都需求先向微信公眾平臺注冊授權(quán)設備詳細api參見公眾平臺文檔。掃碼綁定用戶經(jīng)過掃描設備二維碼綁定設備獲取二維碼的方法見公眾平臺文檔。用戶場景:用戶翻開掃一掃界面,掃碼設備二維碼,出現(xiàn)公眾號頁面。用戶點擊關(guān)注,進展綁定設備。掃碼綁定并不需求設備在身邊。藍牙掃描綁定用戶經(jīng)過掃描

16、周邊的藍牙設備進展綁定。用戶場景可確認設備:用戶先關(guān)注公眾號,點擊綁定設備,進入綁定闡明頁。同時,微信開場掃描設備。用戶操作設備確認如點擊設備上的按鈕,或者雙擊設備,設備廣播特殊的包稱為確認包,微信監(jiān)聽到包之后,開場關(guān)注并綁定。藍牙掃描綁定需求設備在身邊。藍牙掃描綁定的設備分為兩種:可確認如有按鈕,或者可以雙擊的設備。大部分設備屬于可確認設備。無法確認的設備無法確認的設備,出于平安性的思索,可用掃碼綁定可確認的設備,當用戶進展設備確認時如雙擊手環(huán),或者按按鈕,需求廣播特殊的包稱為確認包,詳細格式見附錄。2 掃描和銜接進入特定界面后,微信會開場掃描設備。低功耗藍牙設備需求在廣播包里廣播:微信規(guī)定

17、的service uuid詳細見附錄。廠商自定義字段里,包含mac地址詳細見附錄。并且需求包含指定的Characteristics詳細見附錄。Andriod經(jīng)典藍牙設備需求暴露一個指定uuid的rfcomm效力詳細見附錄。Ios經(jīng)典藍牙需求經(jīng)過mfi認證,并且SerialNumber需為mac地址字符串方式。掃描到設備后,微信會銜接設備Ios經(jīng)典藍牙需求用戶手動在設置界面里面銜接上設備。3 流經(jīng)典藍牙運用RFCOMM通訊是個流,藍牙BLE也模擬成流。4 包流之上運載的是一個緊接著一個的業(yè)務邏輯的數(shù)據(jù)包。數(shù)據(jù)包的發(fā)送方和接受方:設備廠商效力器,或者設備微信效力器。把設備-廠商效力器/微信效力器的

18、懇求稱為Req,回包稱為Resp。一個懇求,對應著一個回包。把廠商效力器/微信效力器-設備的懇求稱為PushReq,沒有回包即沒有PushResp這樣的包。4 包構(gòu)造由定長包頭和變長包體組成。變長包體Protoalbuf打包的二進制數(shù)據(jù)定長包頭struct BpFixHeadunsigned char bMagicNumber;unsigned char bVer;unsigned short nLength;unsigned short nCmdId;unsigned short nSeq;包包的二進制例子見附錄。5 定長包頭字段類型闡明bMagicNumberunsigned char填0

19、 xFEbVerunsigned char包格式版本號,填1nLengthunsigned short為包頭+包體的長度nCmdIdunsigned short命令號,如ECI_req_auth,ECI_resp_sendDataToManufacturerSvr等nSequnsigned short遞增。一個Req對應一個Resp,并且它們的nSeq一樣,并且永不為0。Push的nSeq永遠為0;6 變長包體為Protobufprotobuf的引見見附錄打包的構(gòu)造。例如AuthReq。一個包體里面只需一個Req,或者一個Resp,或者一個PushReq。每個Req/Resp/PushReq都

20、有對應的EmCmdId,例如AuthReq的命令號為ECI_req_auth。詳細的定義見附錄。7 身份驗證和加密為保證數(shù)據(jù)平安,一切命令都需求加密。加密算法選用aes 128位,并運用cbc方式,pkcs7填充。初始向量為密鑰。詳細驗證和加密的步驟如下:設備需求燒一個Key128位到硬件上,微信效力器也要記錄下這個Key。一個設備deiveId+deviceType獨一確定一個設備,對應一個Key。key要維護好類似用戶密碼,銀行卡賬號密碼,千萬不要印刷出來或者打印出來。對于設備來說,手機和效力器可看成一個黑盒。設備和手機效力器之間,經(jīng)過Auth命令,運用key,最終,把sessionKey

21、下發(fā)給到設備。Auth的步驟為:設備發(fā)送AuthReq,里面的字段有MD5(deviceType+deviceId)假設設備算md5很費事的話,建議先算好,直接燒進設備里面,另一個字段為AES加密的一段buffer詳細字段細節(jié)在附錄描敘。微信發(fā)送回包AuthResp,里面的字段有用AES加密的含有sessionkey的一段buffer詳細字段細節(jié)在附錄描敘。設備解密這段buffer可得到SessionKey。設備和手機之間,就經(jīng)過sessionKey來加解密包。AuthReq, AuthResp之后的一切命令,例如InitReq, InitResponse,SendDataToManufatu

22、rSvrReq,SendDataToManufacturerSvrResponse,ManufacturerSvrSendDataPush等都需求加解密。加密只針對變長包體,不需求加密定長包頭。為了提高平安性,設備可再進一步的驗證手機能否可信。設備在InitReq里填入Challeange一個4字節(jié)的隨機數(shù)random4,手機將在InitResp里面前往ChalleangeAnswer一個4字節(jié)的數(shù),值為crc32(random4)。設備驗證ChalleangeAnswer能否正確。假設是,闡明手機是可信的。身份驗證和加解密大體的流程圖為:另外有一些細節(jié):當sessionKey過期,手機對設備

23、的一切懇求都前往錯誤碼 EEC_sessionTimeout,要求設備重做一次auth。當發(fā)現(xiàn)解密設備的包失敗時,前往 EEC_decode。這種情況下,通常是sessionkey過期,或者是設備程序有問題。8 不加密的方法為了降低設備廠商的接入難度,加快產(chǎn)品進程,微信客戶端同時支持不加密的方式。但是,這個只是在測試階段可用,正式的設備發(fā)布出去的時候,都要求加密。步驟如下:將AuthReq里的AesSign字段付空。發(fā)送AuthReq。收到AuthResp之后,忽略掉AesSessionKey字段。將InitReq里的Challeange字段隨意付一個值。發(fā)送InitReq。收到InitRes

24、p,忽略掉ChalleangeAnswer字段。隨后的包都不需求加解密。9 會話商定設備連上微信之后,需求發(fā)送AuthReq,等收到勝利的回包之后,接著還要發(fā)送InitReq,并收到勝利的回包之后,才干正常發(fā)送數(shù)據(jù)。假設設備沒有auth,手機對設備的一切懇求都前往錯誤碼 EEC_needAuth。當出現(xiàn)解包異常的時候,直接斷開銜接。Push類的包seq永遠為0。Req類和Resp類的包的seq永不為0。效力器可隨時發(fā)送Push包。廠商效力器發(fā)送的Push包留意Push包是沒有回包的,即沒有PushResp,假設需求設備的回包,需求由廠商本人實現(xiàn)。詳細方法如:廠商發(fā)送ManufacturerSv

25、rSendDataPush給設備,設備收到push后,向廠商效力器發(fā)送一個SendDataToManufatureSvrReq。這時廠商效力器可知道設備收到了push,并且可以從Req里獲得設備的回應數(shù)據(jù)。10 時序時序圖請見附錄。11 Read Characteristics設備需求再微信的service下面,暴露一個read character,內(nèi)容為6字節(jié)的mac地址。當ios上的其他app銜接上設備時,設備不會再廣播,微信會讀取該特征值,以確定能否要銜接該設備。12 其他目前規(guī)定了一些根底的協(xié)議,更多的協(xié)議等待補充。微信的Protobuf協(xié)議1 概述變長包體部分,運用的是Protobu

26、f定義的協(xié)議。Protobuf文件見附錄。里面規(guī)定了設備和微信客戶端之間的命令。2 命令列表稱號描敘Auth登錄Init初始化SendData設備發(fā)送數(shù)據(jù)給廠商或微信公眾平臺或微信客戶端。當type為空或者等于0時,表示發(fā)送給廠商效力器。當type為10001時,表示發(fā)送給微信客戶端html5設備會話界面。當type為其他時,表示發(fā)送給公眾平臺效力器。詳細的定義請看 附錄:微信公眾平臺proto文件。舉個例子,type等于1時,表示手環(huán)數(shù)據(jù)。RecvDataPush廠商或微信客戶端或微信公眾平臺發(fā)送數(shù)據(jù)給設備當type為空或者等于0時,表示廠商發(fā)送設備。當type為10001時,表示收到微信客

27、戶端html5設備會話界面的數(shù)據(jù)。當type為其他時,表示公眾平臺發(fā)送給設備。詳細的定義請看 附錄:微信公眾平臺proto文件。舉個例子,type等于1時,表示手環(huán)數(shù)據(jù)。SwitchViewPush微信客戶端進入退出界面的通知SwitchBackgroudPush微信客戶端進入退出后臺的通知3 錯誤碼Proto里的錯誤碼EEC_system微信客戶端普通的錯誤EEC_needAuth設備未登錄。需求登錄。EEC_sessionTimeoutsessionKey超時。需求重新登錄。EEC_decode微信客戶端解proto失敗。能夠是設備端打包代碼有bug。EEC_deviceIsBlock微信

28、客戶端一段時間之內(nèi)制止設備的懇求。通常是設備某些異常行為引起,如短時間多次登錄,大量發(fā)送數(shù)據(jù)等。EEC_serviceUnAvalibleInBackgroundios處于后臺方式,無法正常效力EEC_deviceProtoVersionNeedUpdate設備的proto版本過老,需求更新EEC_phoneProtoVersionNeedUpdate微信客戶端的proto版本過老,需求更新EEC_maxReqInQueue設備發(fā)送了多個懇求,并且沒有收到回包。微信客戶端懇求隊列擁塞。EEC_userExitWxAccount用戶退出微信帳號。為正數(shù)時詳細見微信公眾平臺。固定包頭里的錯誤碼:固

29、定包頭里的錯誤碼放在cmdid字段里。當設備收到這樣的錯誤碼后,可以經(jīng)過seq查出是那個命令失敗。目前只需一個錯誤碼。ECI_err_decode微信客戶端解密包體失敗。通常是由于sessionKey過時,需求重新做一次auth,也能夠是設備加密代碼有bug。4 JSAPI微信提供javascript api,允許從Html頁面直接獲取設備形狀,并收發(fā)設備的數(shù)據(jù),而不需求經(jīng)過效力器。實時性要求高的藍牙設備例如遙控汽車可采用這種方式。當SendData的type為EDDT_wxDeviceHtmlChatView時,表示設備發(fā)送數(shù)據(jù)給Html頁面。當RecvDataPush的type為EDDT_

30、wxDeviceHtmlChatView設備收到html發(fā)過來的數(shù)據(jù)。Jsapi包括函數(shù)和事件兩部分。詳細如下:函數(shù)函數(shù)名hdInit描敘初始化設備庫參數(shù)無前往值err_msg: hdInit:ok 勝利, hdInit:fail 失敗minVersion:當前微信客戶端支持的最小jsapi版本maxVersion:當前微信客戶端支持的最大jsapi版本函數(shù)名hdRelease描敘封鎖設備庫參數(shù)無前往值err_msg:hdRelease:ok 勝利, hdRelease:fail 失敗。函數(shù)名hdGetDeviceInfos描敘獲取設備信息參數(shù)無前往值err_msg:hdGetDeviceIn

31、fos:ok 勝利, hdGetDeviceInfos:fail 失敗。deviceInfos:deviceInfos : deviceId:myDevice1, state:connected, deviceId:myDevice2, state:connected deviceInfos包含多個deviceInfo,每個deviceInfo形如:deviceId:myDevice1, state:connected。函數(shù)名hdSendDataToDevice描敘發(fā)送數(shù)據(jù)給設備參數(shù)deviceId必填:設備iddata必填:數(shù)據(jù),經(jīng)過base64編碼后的字符串。前往值err_msg:hdSe

32、ndDataToDevice:ok 勝利, hdSendDataToDevice:fail 失敗。事件 事件名hdOnReceveDataFromDevice描敘接納到設備數(shù)據(jù)參數(shù)deviceId:設備iddata:數(shù)據(jù),經(jīng)過base64編碼后的字符串。事件名hdOnDeviceStateChanged描敘接納到設備數(shù)據(jù)參數(shù)deviceId:設備idstate:connecting 銜接中, connected 銜接上,disconnected 銜接斷開。運用例子見附錄。附錄1 ProtoBuf協(xié)議引見ProtoBuf是google提供的一套開源的軟件協(xié)議。它主要作用是把c/c+的struct

33、打包成為二進制數(shù)據(jù),或者把二進制數(shù)據(jù)解包成c/c+的struct。詳細運用過程為:1. 定義proto文件2. 經(jīng)過工具把.proto文件編譯成.h, .c文件里面包含struct和函數(shù) 3 調(diào)用.h文件里的封包解包函數(shù)官方網(wǎng)站為: HYPERLINK httpsdevelopers.google/protocol-buffers/docs/overview httpsdevelopers.google/protocol-buffers/docs/overview HYPERLINK code.google/p/protobuf/ code.google/p/protobuf/ HYPERLI

34、NK code.google/p/protobuf-c/ code.google/p/protobuf-c/其他相關(guān)例子和工具見附件。2 藍牙硬件一些規(guī)定稱號值ServiceUUID0 xFEE7該uuid經(jīng)藍牙官方授權(quán)Write Characteristics UUID0 xFEC7Indicate Characteristics UUID0 xFEC8Read Characteristics UUID0 xFEC9Andriod RFCOMM UUIDe5b152ed-6b46-09e9-4678-665e9a972cbcIos經(jīng)典藍牙的iap層的SerialNumber必需賦值,且等于m

35、ac地址字符串方式。低功耗藍牙的廣播包的manufature specific data里必需包含mac地址6字節(jié),并且以mac地址結(jié)尾。并且manufature specific data長度需大于等于8字節(jié)最前兩個字節(jié)為company id,沒有的話隨意填??纱_認設備確實認包的manufature specific data需以下面格式結(jié)尾:0 xfe 0 x01 0 x01 + mac地址6字節(jié)3 Ios BLE設備的截圖LightBlue是一個Iphone上的app。這是設備的截屏。請下載App并檢查: 1. serviceId能否正確 2. characteristics能否正確包括

36、uuid和屬性 3. 能否在manufature data最尾部帶上了mac地址。 4 包的二進制例子Req接受兩種格式:20字節(jié)對齊補零格式,不對齊格式。以AuthReq為例子不加密:20字節(jié)對齊補零ble特征值有些芯片只能發(fā)送固定20個字節(jié),20字節(jié)剩下的部分補零feMagicNumber01版本號00 3b總長度 2711命令號0001Seq變長包體:0a 00 12 10 b4 3f 12 04 2a 02 e0 1c 2b dd 7d 02 90 62 13 a3 18 80 80 04 20 01 28 01 32 10 00 00 00 00 00 00 00 00 00 00

37、00 00 00 00 00 00 62 03 41 4d 33補齊:00留意:這里的包長度為003b(即59字節(jié)),由于20字節(jié)對齊,導致總長為60字節(jié)。不對齊經(jīng)典藍牙沒有對齊問題,某些ble芯片也沒有對齊問題feMagicNumber01版本號00 3b總長度 2711命令號 0001Seq 變長包體:0a 00 12 10 b4 3f 12 04 2a 02 e0 1c 2b dd 7d 02 90 62 13 a3 18 80 80 04 20 01 28 01 32 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 03 41

38、 4d 33以AuthResp為例子:feMagicNumber01版本號000e總長度 4e21命令號0001Seq 包體:0a020800 12005 包的數(shù)據(jù)流圖6 包的時序圖最簡單的時序圖:Push包插入的時序圖多Req包并且有push包插入的時序圖:留意:多個Req包時,到達廠商效力器的先后順序不能保證。同樣多Resp包的情況下,到達外設的順序也不能保證。7 加解密字段AuthReq里的AesSign字段 = AESRan | Seq | CRC32 ( DeviceId | Ran | Seq )設備消費一個隨機數(shù)Ran ( 4字節(jié) ),留意:隨機數(shù)應盡量隨機假設設備有才干獲得當前

39、的時間戳,那么運用時間戳作為Seq ( 4字節(jié) ),否那么,運用一個從0開場遞增的序列號,保證每次auth的Seq遞增將Ran和Seq拼接到DeviceId不含DeviceType后得到二進制串1變長計算二進制串1的CRC32 ( 4字節(jié) )將Ran、Seq、CRC值按順序拼接得到12字節(jié)的二進制串2,運用設備key對二進制傳2進展AES加密,得到16字節(jié)的AesSignAuthResp里的AesSessionKey字段 = AES (SessionKey )設備auth勝利后將獲得一個32字節(jié)的AesSessionKey字段,運用設備key做AES解密后可得到16字節(jié)的明文內(nèi)容.該內(nèi)容為se

40、ssionKey。InitReq里的Challeange字段為隨機數(shù)(4字節(jié),記為Random3)InitResp里的ChalleangeAnswer字段為CRC32(Random3)。上述身份認證和加密的方式為0 x1版本,對應AuthReq里面的AuthMethod字段。該版本未來能夠晉級。8 Md5DeviceTypeAndDeviceId的例子Md5DeviceTypeAndDeviceId為16字節(jié)二進制數(shù)據(jù)。假設deviceType為:gh_d53f87f298e5,deviceId為:test_device。將deviceType+deviceId拼起來,不算0:md5(gh_d

41、53f87f298e5test_device,32) = 0 x26cdd942b8ee68b022cc53bba16c70399 CBC例子Key 為字符串 “3141592653589793Iv和Key一樣。數(shù)據(jù) : CBCpkcs7結(jié)果 : 數(shù)據(jù): CBCpkcs7結(jié)果 : 數(shù)據(jù): CBCpkcs7 結(jié)果:10 CRC32例子多項式為:0 xedb88320L字符串test_device_ios的crc32為:0 x02e312f3。11 微信藍牙外設proto文件/ proto version: 1.0.2package MmBp;enum EmCmdId ECI_none = 0;

42、/ req: 藍牙設備 - 微信/廠商效力器 ECI_req_auth = 10001; / 登錄 ECI_req_sendData = 10002; / 藍牙設備發(fā)送數(shù)據(jù)給微信或廠商 ECI_req_init = 10003; / 初始化 / resp:微信/廠商效力器 - 藍牙設備 ECI_resp_auth = 20001; ECI_resp_sendData = 20002; ECI_resp_init = 20003; / push:微信/廠商效力器 - 藍牙設備 ECI_push_recvData = 30001; / 微信或廠商發(fā)送數(shù)據(jù)給藍牙設備 ECI_push_switchV

43、iew = 30002; / 進入/退出界面 ECI_push_switchBackgroud = 30003; / 切換后臺 ECI_err_decode = 29999; / 解密失敗的錯誤碼。留意:這不是cmdid。為節(jié)省固定包頭大小,這種特殊的錯誤碼放在包頭的cmdid字段。enum EmErrorCode EEC_system = -1; / 通用的錯誤 EEC_needAuth = -2; / 設備未登錄 EEC_sessionTimeout = -3; / session超時,需求重新登錄 EEC_decode = -4; / proto解碼失敗 EEC_deviceIsBloc

44、k = -5; / 設備出現(xiàn)異常,導致被微信暫時性制止登錄 EEC_serviceUnAvalibleInBackground = -6; / ios處于后臺方式,無法正常效力 EEC_deviceProtoVersionNeedUpdate = -7; / 設備的proto版本過老,需求更新 EEC_phoneProtoVersionNeedUpdate = -8; / 微信客戶端的proto版本過老,需求更新 EEC_maxReqInQueue = -9; / 設備發(fā)送了多個懇求,并且沒有收到回包。微信客戶端懇求隊列擁塞。 EEC_userExitWxAccount = -10; / 用戶

45、退出微信帳號。message BaseRequest message BaseResponse required int32 ErrCode = 1; optional string ErrMsg = 2;message BasePush / req, resp =/ 登錄 message AuthRequest required BaseRequest BaseRequest = 1; required bytes Md5DeviceTypeAndDeviceId = 2; / deviceType加deviceId的md5,16字節(jié)的二進制數(shù)據(jù) required int32 ProtoVe

46、rsion = 3; / 設備支持的本proto文件的版本號,第一個字節(jié)表示最小版本,第二個字節(jié)表示小版本,第三字節(jié)表示大版本。版本號為1.0.0的話,應該填:0 x010000;1.2.3的話,填成0 x010203。 required int32 AuthProto = 4; / 填1 required int32 AuthMethod = 5; / 驗證和加密的版本號,當前填1 required bytes AesSign = 6; / 詳細生成方法見文檔 optional string TimeZone = 10; / 廢棄 optional string Language = 11;

47、 / 廢棄 optional string DeviceName = 12; / 廢棄message AuthResponse required BaseResponse BaseResponse = 1; required bytes AesSessionKey = 2;/ 初始化 enum EmInitRespFieldFilter EIRFF_userNickName = 0 x1; EIRFF_platformType = 0 x2; EIRFF_model = 0 x4; EIRFF_os = 0 x8; EIRFF_time = 0 x10; EIRFF_timeZone = 0

48、x20; EIRFF_timeString = 0 x40;/ 微信銜接上設備時,處于什么情景enum EmInitScence EIS_deviceChat = 1; / 聊天 EIS_autoSync = 2; / 自動同步message InitRequest required BaseRequest BaseRequest = 1; optional bytes RespFieldFilter = 2; / 當一個bit被設置就表示要resp的某個字段:見EmInitRespFieldFilter。 optional bytes Challenge = 3; / 設備用來驗證手機能否平

49、安。為設備隨機生成的四個字節(jié)。enum EmPlatformType EPT_ios = 1; EPT_andriod = 2; EPT_wp = 3; EPT_s60v3 = 4; EPT_s60v5 = 5; EPT_s40 = 6; EPT_bb = 7;message InitResponse required BaseResponse BaseResponse = 1; required uint32 UserIdHigh = 2; / 微信譽戶Id高32位 required uint32 UserIdLow = 3; / 微信譽戶Id低32位 optional uint32 Cha

50、lleangeAnswer = 4; / 手機回復設備的挑戰(zhàn)。為設備生成的字節(jié)的crc32。 optional EmInitScence InitScence = 5; / 微信銜接上設備時,處于什么情景。假設該字段為空,表示處于EIS_deviceChat下。 optional uint32 AutoSyncMaxDurationSecond = 6; / 自動同步最多繼續(xù)多長,微信就會封鎖銜接。0 xffffffff表示無限長。 optional string UserNickName = 11; / 微信譽戶昵稱 optional EmPlatformType PlatformType

51、= 12; / 手機平臺 optional string Model = 13; / 手機硬件型號 optional string Os = 14; / 手機os版本 optional int32 Time = 15; / 手機當前時間 optional int32 TimeZone = 16; / 手機當前時區(qū) optional string TimeString = 17; / 手機當前時間,格式如202102281005285,詳細字段意義為2021年022月2828號10點05分鐘28秒5星期五。星期一為1,星期天為7。/ 設備發(fā)送數(shù)據(jù)給微信或廠商 / 設備數(shù)據(jù)類型enum EmDev

52、iceDataType EDDT_manufatureSvr = 0; / 廠商自定義數(shù)據(jù) EDDT_wxWristBand = 1; / 微信公眾平臺手環(huán)數(shù)據(jù) EDDT_wxDeviceHtmlChatView = 10001; / 微信客戶端設備html5會話界面數(shù)據(jù)message SendDataRequest required BaseRequest BaseRequest = 1; required bytes Data = 2; optional EmDeviceDataType Type = 3; / 數(shù)據(jù)類型(如廠商自定義數(shù)據(jù),或公眾平臺規(guī)定的手環(huán)數(shù)據(jù),或微信客戶端設備html

53、5會話界面數(shù)據(jù)等。不填,或者等于0的時候,表示設備發(fā)送廠商自定義數(shù)據(jù)到廠商效力器。message SendDataResponse required BaseResponse BaseResponse = 1; optional bytes Data = 2;/ push =/ 微信或廠商發(fā)送數(shù)據(jù)給藍牙設備 message RecvDataPush required BasePush BasePush = 1; required bytes Data = 2; optional EmDeviceDataType Type = 3; / 數(shù)據(jù)類型(如廠商自定義數(shù)據(jù),或公眾平臺規(guī)定的手環(huán)數(shù)據(jù),或微

54、信客戶端設備html5會話界面數(shù)據(jù)等。不填,或者等于0的時候,表示設備收到廠商自定義數(shù)據(jù)。/ 微信客戶端進入退出界面的通知 enum EmSwitchViewOp ESVO_enter = 1; ESVO_exit = 2;enum EmViewId EVI_deviceChatView = 1; / 微信客戶端設備號會話界面 EVI_deviceChatHtmlView = 2; / 微信客戶端設備號Html5會話界面。留意:只需當H5界面自動和設備銜接上之后,才會發(fā)送push。message SwitchViewPush required BasePush BasePush = 1; re

55、quired EmSwitchViewOp SwitchViewOp = 2; / 進入或者退出View required EmViewId ViewId = 3; / view的idenum EmSwitchBackgroundOp ESBO_enterBackground = 1; / 進入后臺 ESBO_enterForground = 2; / 進入前臺 ESBO_sleep = 3; / 后臺休眠/ 微信客戶端進入退出后臺的通知 message SwitchBackgroudPush required BasePush BasePush = 1; required EmSwitchB

56、ackgroundOp SwitchBackgroundOp = 2;12 微信公眾平臺proto文件/ type=1,手環(huán)類package mmbp_open;message BaseResponseoptional int32 errcode = 1;optional string errmsg = 2;message WristbandRequest message StepDataItemoptional uint32 Step = 1;optional uint32 Timestamp = 2;optional uint32 TimeStampRtcYear = 3;optional uint32 TimeStampRtcMonth = 4;optional uint32 TimeStampRtcDay = 5;optional uint32 TimeStampRtcHour = 6;optional uint32 TimeStampRtcMinute = 7;optional uint32 TimeStampRtcSecond = 8;repeated StepDataItem

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論