版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.:.;微信藍(lán)牙外設(shè)協(xié)議Project BlueShadow V1.0.3Tencent Confidential文檔變卦日志版本變卦日期01初稿2021/10/902針對(duì)常見問(wèn)題,添加闡明2021/10/1803針對(duì)常見問(wèn)題,添加闡明。修正包頭構(gòu)造。2021/11/504第二期初稿添加17條protobuf協(xié)議,廢棄1條,修正1條2021/11/2605暫時(shí)去掉二期的內(nèi)容17條protobuf,在一期的根底上添加三條協(xié)議,并修正auth協(xié)議。參與加密解密部分闡明。2021/2/1206修正uuid的規(guī)定。補(bǔ)充協(xié)議字段和錯(cuò)誤碼。補(bǔ)充加密部分細(xì)節(jié)。2021/2/2707修正加密協(xié)議,添加例子。補(bǔ)
2、充不加密的協(xié)議。補(bǔ)充錯(cuò)誤碼。2021/3/407 . 1修正proto里的UserId,Challeange字段。2021/3/707 . 2規(guī)定低功耗藍(lán)牙廣播包必需包含mac地址。InitResp添加可選字段以支持自動(dòng)同步方式,修正解碼失敗錯(cuò)誤碼。2021/4/307 . 3修正SendData, SendDataPush兩條協(xié)議,添加type字段,用來(lái)區(qū)分是發(fā)送給廠商效力器,還是發(fā)送給公眾平臺(tái)效力器。2021/4/240 . 7 . 4修正ble藍(lán)牙service uuid的值。2021/4/250 . 7 . 5公眾平臺(tái)協(xié)議手環(huán)修正:添加BaseResponse字段。2021/4/301
3、 . 0 . 1提升版本號(hào)為1.0.1 Beta2021/6/91 . 0 . 2添加Read Characteristics,以支持ios多app銜接。添加html jsapi支持。公眾平臺(tái)協(xié)議手環(huán)修正:添加rtc時(shí)間支持。廢棄一些字段,修正協(xié)議名字為SendData,RecvData等。2021/7/151 . 0 . 3添加藍(lán)牙掃描綁定相關(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 藍(lán)牙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 藍(lán)牙掃描綁定 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 定長(zhǎng)包頭 PAGEREF _Toc396142807 h 11 HYPERLINK l _Toc396142808 6 變長(zhǎng)包體 PAGEREF _Toc396142808 h 11 HYPERLINK l _Toc396142809 7 身份驗(yàn)證和加密 PAGEREF _Toc396142809 h 12 HYPERLINK l _Toc396142810 8 不加密的方法 PAGEREF _Toc396142810 h 14 HYPERLINK l _Toc396142811 9 會(huì)話商定 PAGEREF _Toc396142811 h 15
7、 HYPERLINK l _Toc396142812 10 時(shí)序 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 錯(cuò)誤碼 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 藍(lán)牙硬件一些規(guī)定 PAGEREF _Toc396142824 h 23 HYPERLINK l _Toc396142825 3 Ios BLE設(shè)備的截圖 PAGEREF _Toc396142825 h 23 HYPERLINK l _Toc396142826 4 包的二
10、進(jìn)制例子 PAGEREF _Toc396142826 h 25 HYPERLINK l _Toc396142827 5 包的數(shù)據(jù)流圖 PAGEREF _Toc396142827 h 26 HYPERLINK l _Toc396142828 6 包的時(shí)序圖 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 微信藍(lán)牙外設(shè)proto文件 PAGEREF _Toc396142833 h 31 HYPERLINK l _Toc396142834 12 微信公眾平臺(tái)proto文件 PAGEREF _Toc396142834 h 35 HYPERLINK l _Toc396142835 13 JsApi例子
12、 PAGEREF _Toc396142835 h 37概要該文檔規(guī)范了藍(lán)牙設(shè)備和手機(jī)上的微信的通訊協(xié)議協(xié)議支持經(jīng)典藍(lán)牙和4.0 BLE藍(lán)牙,目前支持ios和andriod兩個(gè)系統(tǒng),后續(xù)會(huì)擴(kuò)展到其他系統(tǒng)。整體架構(gòu)廠商效力器和外設(shè),由廠商開發(fā)完成。微信會(huì)提供效力器的接口以對(duì)接廠商的效力器,會(huì)提供手機(jī)的接口如本文規(guī)定的藍(lán)牙協(xié)議以對(duì)接廠商的外設(shè)。主要功能該協(xié)議打通了設(shè)備和廠商效力器之間的數(shù)據(jù)鏈路,也就是支持將設(shè)備上的數(shù)據(jù)發(fā)送到廠商的效力器上,也支持將廠商的數(shù)據(jù)發(fā)送到設(shè)備。廠商的數(shù)據(jù)對(duì)于微信來(lái)說(shuō),是黑盒,微信不對(duì)設(shè)備數(shù)據(jù)做分析。該協(xié)議也打通了設(shè)備和微信效力器之間的數(shù)據(jù)鏈路。設(shè)備和微信效力器之間的數(shù)據(jù)格式
13、由微信規(guī)定,例如登錄,新音訊通知等。藍(lán)牙BLE模擬成流微信支持藍(lán)牙BLE。微信規(guī)定了藍(lán)牙BLE設(shè)備需求先模擬成流(即stream,輸入輸出流)。經(jīng)典藍(lán)牙的RFCOMM,就是一個(gè)流。流具有的特性有:可以傳輸無(wú)限長(zhǎng)度的數(shù)據(jù) 雙工,讀寫可以并發(fā),互不干擾。顯然,藍(lán)牙BLE無(wú)法傳輸無(wú)限長(zhǎng)度的數(shù)據(jù),為了實(shí)現(xiàn)這個(gè)目的,需求定義一個(gè)規(guī)范。藍(lán)牙設(shè)備需暴露兩個(gè)特征值Characteristics:Write特征值,Indication特征值。藍(lán)牙設(shè)備從Write特征值接受數(shù)據(jù),從Indication特征值發(fā)送數(shù)據(jù)。Indication特征值類型是bytes。這里我們商定,把一個(gè)特征值一次傳輸?shù)臄?shù)據(jù),稱為一幀不同
14、類型的特征值一次傳輸?shù)臄?shù)據(jù)長(zhǎng)度是不一樣的。留意:運(yùn)用層上的數(shù)據(jù)包例如1k大小,會(huì)分散成許多幀來(lái)傳輸。藍(lán)牙設(shè)備寫過(guò)程:分幀:假設(shè)藍(lán)牙手環(huán)上有1k數(shù)據(jù),要發(fā)給手機(jī)微信。由于一個(gè)特征值長(zhǎng)度有限如20個(gè)字節(jié),顯然需求分多次才干傳輸完成。1k數(shù)據(jù),要分成1024字節(jié)/ 20字節(jié)=51 個(gè)幀。剩下的4個(gè)字節(jié),缺乏一幀20個(gè)字節(jié),需補(bǔ)齊為一幀并對(duì)剩下的16個(gè)字節(jié)賦0??偣彩?2幀。發(fā)送第一個(gè)幀:把第一個(gè)幀的內(nèi)容放入特征值里面。然后通知手機(jī)讀取數(shù)據(jù),通知有兩種方式,Indication 和notify,這里運(yùn)用Indication方式,即帶呼應(yīng)的通知。當(dāng)通知完成的時(shí)候,可以以為手機(jī)曾經(jīng)讀完數(shù)據(jù)。這就完成了發(fā)送
15、第一個(gè)幀。按照2的步驟,依次發(fā)送剩下的幀。藍(lán)牙設(shè)備讀過(guò)程:當(dāng)藍(lán)牙設(shè)備發(fā)現(xiàn)讀特征值收到數(shù)據(jù)的時(shí)候,就接納數(shù)據(jù),并追加到設(shè)備的buf里。留意:藍(lán)牙設(shè)備必需等微信app訂閱了Characteristics之后,才干indicate數(shù)據(jù),否者會(huì)呵斥設(shè)備發(fā)送數(shù)據(jù)喪失的問(wèn)題。協(xié)議1 綁定用戶綁定設(shè)備有兩種方式:掃碼和藍(lán)牙掃描。這兩種方式都需求先向微信公眾平臺(tái)注冊(cè)授權(quán)設(shè)備詳細(xì)api參見公眾平臺(tái)文檔。掃碼綁定用戶經(jīng)過(guò)掃描設(shè)備二維碼綁定設(shè)備獲取二維碼的方法見公眾平臺(tái)文檔。用戶場(chǎng)景:用戶翻開掃一掃界面,掃碼設(shè)備二維碼,出現(xiàn)公眾號(hào)頁(yè)面。用戶點(diǎn)擊關(guān)注,進(jìn)展綁定設(shè)備。掃碼綁定并不需求設(shè)備在身邊。藍(lán)牙掃描綁定用戶經(jīng)過(guò)掃描
16、周邊的藍(lán)牙設(shè)備進(jìn)展綁定。用戶場(chǎng)景可確認(rèn)設(shè)備:用戶先關(guān)注公眾號(hào),點(diǎn)擊綁定設(shè)備,進(jìn)入綁定闡明頁(yè)。同時(shí),微信開場(chǎng)掃描設(shè)備。用戶操作設(shè)備確認(rèn)如點(diǎn)擊設(shè)備上的按鈕,或者雙擊設(shè)備,設(shè)備廣播特殊的包稱為確認(rèn)包,微信監(jiān)聽到包之后,開場(chǎng)關(guān)注并綁定。藍(lán)牙掃描綁定需求設(shè)備在身邊。藍(lán)牙掃描綁定的設(shè)備分為兩種:可確認(rèn)如有按鈕,或者可以雙擊的設(shè)備。大部分設(shè)備屬于可確認(rèn)設(shè)備。無(wú)法確認(rèn)的設(shè)備無(wú)法確認(rèn)的設(shè)備,出于平安性的思索,可用掃碼綁定可確認(rèn)的設(shè)備,當(dāng)用戶進(jìn)展設(shè)備確認(rèn)時(shí)如雙擊手環(huán),或者按按鈕,需求廣播特殊的包稱為確認(rèn)包,詳細(xì)格式見附錄。2 掃描和銜接進(jìn)入特定界面后,微信會(huì)開場(chǎng)掃描設(shè)備。低功耗藍(lán)牙設(shè)備需求在廣播包里廣播:微信規(guī)定
17、的service uuid詳細(xì)見附錄。廠商自定義字段里,包含mac地址詳細(xì)見附錄。并且需求包含指定的Characteristics詳細(xì)見附錄。Andriod經(jīng)典藍(lán)牙設(shè)備需求暴露一個(gè)指定uuid的rfcomm效力詳細(xì)見附錄。Ios經(jīng)典藍(lán)牙需求經(jīng)過(guò)mfi認(rèn)證,并且SerialNumber需為mac地址字符串方式。掃描到設(shè)備后,微信會(huì)銜接設(shè)備Ios經(jīng)典藍(lán)牙需求用戶手動(dòng)在設(shè)置界面里面銜接上設(shè)備。3 流經(jīng)典藍(lán)牙運(yùn)用RFCOMM通訊是個(gè)流,藍(lán)牙BLE也模擬成流。4 包流之上運(yùn)載的是一個(gè)緊接著一個(gè)的業(yè)務(wù)邏輯的數(shù)據(jù)包。數(shù)據(jù)包的發(fā)送方和接受方:設(shè)備廠商效力器,或者設(shè)備微信效力器。把設(shè)備-廠商效力器/微信效力器的
18、懇求稱為Req,回包稱為Resp。一個(gè)懇求,對(duì)應(yīng)著一個(gè)回包。把廠商效力器/微信效力器-設(shè)備的懇求稱為PushReq,沒(méi)有回包即沒(méi)有PushResp這樣的包。4 包構(gòu)造由定長(zhǎng)包頭和變長(zhǎng)包體組成。變長(zhǎng)包體Protoalbuf打包的二進(jìn)制數(shù)據(jù)定長(zhǎng)包頭struct BpFixHeadunsigned char bMagicNumber;unsigned char bVer;unsigned short nLength;unsigned short nCmdId;unsigned short nSeq;包包的二進(jìn)制例子見附錄。5 定長(zhǎng)包頭字段類型闡明bMagicNumberunsigned char填0
19、 xFEbVerunsigned char包格式版本號(hào),填1nLengthunsigned short為包頭+包體的長(zhǎng)度nCmdIdunsigned short命令號(hào),如ECI_req_auth,ECI_resp_sendDataToManufacturerSvr等nSequnsigned short遞增。一個(gè)Req對(duì)應(yīng)一個(gè)Resp,并且它們的nSeq一樣,并且永不為0。Push的nSeq永遠(yuǎn)為0;6 變長(zhǎng)包體為Protobufprotobuf的引見見附錄打包的構(gòu)造。例如AuthReq。一個(gè)包體里面只需一個(gè)Req,或者一個(gè)Resp,或者一個(gè)PushReq。每個(gè)Req/Resp/PushReq都
20、有對(duì)應(yīng)的EmCmdId,例如AuthReq的命令號(hào)為ECI_req_auth。詳細(xì)的定義見附錄。7 身份驗(yàn)證和加密為保證數(shù)據(jù)平安,一切命令都需求加密。加密算法選用aes 128位,并運(yùn)用cbc方式,pkcs7填充。初始向量為密鑰。詳細(xì)驗(yàn)證和加密的步驟如下:設(shè)備需求燒一個(gè)Key128位到硬件上,微信效力器也要記錄下這個(gè)Key。一個(gè)設(shè)備deiveId+deviceType獨(dú)一確定一個(gè)設(shè)備,對(duì)應(yīng)一個(gè)Key。key要維護(hù)好類似用戶密碼,銀行卡賬號(hào)密碼,千萬(wàn)不要印刷出來(lái)或者打印出來(lái)。對(duì)于設(shè)備來(lái)說(shuō),手機(jī)和效力器可看成一個(gè)黑盒。設(shè)備和手機(jī)效力器之間,經(jīng)過(guò)Auth命令,運(yùn)用key,最終,把sessionKey
21、下發(fā)給到設(shè)備。Auth的步驟為:設(shè)備發(fā)送AuthReq,里面的字段有MD5(deviceType+deviceId)假設(shè)設(shè)備算md5很費(fèi)事的話,建議先算好,直接燒進(jìn)設(shè)備里面,另一個(gè)字段為AES加密的一段buffer詳細(xì)字段細(xì)節(jié)在附錄描敘。微信發(fā)送回包AuthResp,里面的字段有用AES加密的含有sessionkey的一段buffer詳細(xì)字段細(xì)節(jié)在附錄描敘。設(shè)備解密這段buffer可得到SessionKey。設(shè)備和手機(jī)之間,就經(jīng)過(guò)sessionKey來(lái)加解密包。AuthReq, AuthResp之后的一切命令,例如InitReq, InitResponse,SendDataToManufatu
22、rSvrReq,SendDataToManufacturerSvrResponse,ManufacturerSvrSendDataPush等都需求加解密。加密只針對(duì)變長(zhǎng)包體,不需求加密定長(zhǎng)包頭。為了提高平安性,設(shè)備可再進(jìn)一步的驗(yàn)證手機(jī)能否可信。設(shè)備在InitReq里填入Challeange一個(gè)4字節(jié)的隨機(jī)數(shù)random4,手機(jī)將在InitResp里面前往ChalleangeAnswer一個(gè)4字節(jié)的數(shù),值為crc32(random4)。設(shè)備驗(yàn)證ChalleangeAnswer能否正確。假設(shè)是,闡明手機(jī)是可信的。身份驗(yàn)證和加解密大體的流程圖為:另外有一些細(xì)節(jié):當(dāng)sessionKey過(guò)期,手機(jī)對(duì)設(shè)備
23、的一切懇求都前往錯(cuò)誤碼 EEC_sessionTimeout,要求設(shè)備重做一次auth。當(dāng)發(fā)現(xiàn)解密設(shè)備的包失敗時(shí),前往 EEC_decode。這種情況下,通常是sessionkey過(guò)期,或者是設(shè)備程序有問(wèn)題。8 不加密的方法為了降低設(shè)備廠商的接入難度,加快產(chǎn)品進(jìn)程,微信客戶端同時(shí)支持不加密的方式。但是,這個(gè)只是在測(cè)試階段可用,正式的設(shè)備發(fā)布出去的時(shí)候,都要求加密。步驟如下:將AuthReq里的AesSign字段付空。發(fā)送AuthReq。收到AuthResp之后,忽略掉AesSessionKey字段。將InitReq里的Challeange字段隨意付一個(gè)值。發(fā)送InitReq。收到InitRes
24、p,忽略掉ChalleangeAnswer字段。隨后的包都不需求加解密。9 會(huì)話商定設(shè)備連上微信之后,需求發(fā)送AuthReq,等收到勝利的回包之后,接著還要發(fā)送InitReq,并收到勝利的回包之后,才干正常發(fā)送數(shù)據(jù)。假設(shè)設(shè)備沒(méi)有auth,手機(jī)對(duì)設(shè)備的一切懇求都前往錯(cuò)誤碼 EEC_needAuth。當(dāng)出現(xiàn)解包異常的時(shí)候,直接斷開銜接。Push類的包seq永遠(yuǎn)為0。Req類和Resp類的包的seq永不為0。效力器可隨時(shí)發(fā)送Push包。廠商效力器發(fā)送的Push包留意Push包是沒(méi)有回包的,即沒(méi)有PushResp,假設(shè)需求設(shè)備的回包,需求由廠商本人實(shí)現(xiàn)。詳細(xì)方法如:廠商發(fā)送ManufacturerSv
25、rSendDataPush給設(shè)備,設(shè)備收到push后,向廠商效力器發(fā)送一個(gè)SendDataToManufatureSvrReq。這時(shí)廠商效力器可知道設(shè)備收到了push,并且可以從Req里獲得設(shè)備的回應(yīng)數(shù)據(jù)。10 時(shí)序時(shí)序圖請(qǐng)見附錄。11 Read Characteristics設(shè)備需求再微信的service下面,暴露一個(gè)read character,內(nèi)容為6字節(jié)的mac地址。當(dāng)ios上的其他app銜接上設(shè)備時(shí),設(shè)備不會(huì)再?gòu)V播,微信會(huì)讀取該特征值,以確定能否要銜接該設(shè)備。12 其他目前規(guī)定了一些根底的協(xié)議,更多的協(xié)議等待補(bǔ)充。微信的Protobuf協(xié)議1 概述變長(zhǎng)包體部分,運(yùn)用的是Protobu
26、f定義的協(xié)議。Protobuf文件見附錄。里面規(guī)定了設(shè)備和微信客戶端之間的命令。2 命令列表稱號(hào)描敘Auth登錄Init初始化SendData設(shè)備發(fā)送數(shù)據(jù)給廠商或微信公眾平臺(tái)或微信客戶端。當(dāng)type為空或者等于0時(shí),表示發(fā)送給廠商效力器。當(dāng)type為10001時(shí),表示發(fā)送給微信客戶端html5設(shè)備會(huì)話界面。當(dāng)type為其他時(shí),表示發(fā)送給公眾平臺(tái)效力器。詳細(xì)的定義請(qǐng)看 附錄:微信公眾平臺(tái)proto文件。舉個(gè)例子,type等于1時(shí),表示手環(huán)數(shù)據(jù)。RecvDataPush廠商或微信客戶端或微信公眾平臺(tái)發(fā)送數(shù)據(jù)給設(shè)備當(dāng)type為空或者等于0時(shí),表示廠商發(fā)送設(shè)備。當(dāng)type為10001時(shí),表示收到微信客
27、戶端html5設(shè)備會(huì)話界面的數(shù)據(jù)。當(dāng)type為其他時(shí),表示公眾平臺(tái)發(fā)送給設(shè)備。詳細(xì)的定義請(qǐng)看 附錄:微信公眾平臺(tái)proto文件。舉個(gè)例子,type等于1時(shí),表示手環(huán)數(shù)據(jù)。SwitchViewPush微信客戶端進(jìn)入退出界面的通知SwitchBackgroudPush微信客戶端進(jìn)入退出后臺(tái)的通知3 錯(cuò)誤碼Proto里的錯(cuò)誤碼EEC_system微信客戶端普通的錯(cuò)誤EEC_needAuth設(shè)備未登錄。需求登錄。EEC_sessionTimeoutsessionKey超時(shí)。需求重新登錄。EEC_decode微信客戶端解proto失敗。能夠是設(shè)備端打包代碼有bug。EEC_deviceIsBlock微信
28、客戶端一段時(shí)間之內(nèi)制止設(shè)備的懇求。通常是設(shè)備某些異常行為引起,如短時(shí)間多次登錄,大量發(fā)送數(shù)據(jù)等。EEC_serviceUnAvalibleInBackgroundios處于后臺(tái)方式,無(wú)法正常效力EEC_deviceProtoVersionNeedUpdate設(shè)備的proto版本過(guò)老,需求更新EEC_phoneProtoVersionNeedUpdate微信客戶端的proto版本過(guò)老,需求更新EEC_maxReqInQueue設(shè)備發(fā)送了多個(gè)懇求,并且沒(méi)有收到回包。微信客戶端懇求隊(duì)列擁塞。EEC_userExitWxAccount用戶退出微信帳號(hào)。為正數(shù)時(shí)詳細(xì)見微信公眾平臺(tái)。固定包頭里的錯(cuò)誤碼:固
29、定包頭里的錯(cuò)誤碼放在cmdid字段里。當(dāng)設(shè)備收到這樣的錯(cuò)誤碼后,可以經(jīng)過(guò)seq查出是那個(gè)命令失敗。目前只需一個(gè)錯(cuò)誤碼。ECI_err_decode微信客戶端解密包體失敗。通常是由于sessionKey過(guò)時(shí),需求重新做一次auth,也能夠是設(shè)備加密代碼有bug。4 JSAPI微信提供javascript api,允許從Html頁(yè)面直接獲取設(shè)備形狀,并收發(fā)設(shè)備的數(shù)據(jù),而不需求經(jīng)過(guò)效力器。實(shí)時(shí)性要求高的藍(lán)牙設(shè)備例如遙控汽車可采用這種方式。當(dāng)SendData的type為EDDT_wxDeviceHtmlChatView時(shí),表示設(shè)備發(fā)送數(shù)據(jù)給Html頁(yè)面。當(dāng)RecvDataPush的type為EDDT_
30、wxDeviceHtmlChatView設(shè)備收到html發(fā)過(guò)來(lái)的數(shù)據(jù)。Jsapi包括函數(shù)和事件兩部分。詳細(xì)如下:函數(shù)函數(shù)名hdInit描敘初始化設(shè)備庫(kù)參數(shù)無(wú)前往值err_msg: hdInit:ok 勝利, hdInit:fail 失敗minVersion:當(dāng)前微信客戶端支持的最小jsapi版本maxVersion:當(dāng)前微信客戶端支持的最大jsapi版本函數(shù)名hdRelease描敘封鎖設(shè)備庫(kù)參數(shù)無(wú)前往值err_msg:hdRelease:ok 勝利, hdRelease:fail 失敗。函數(shù)名hdGetDeviceInfos描敘獲取設(shè)備信息參數(shù)無(wú)前往值err_msg:hdGetDeviceIn
31、fos:ok 勝利, hdGetDeviceInfos:fail 失敗。deviceInfos:deviceInfos : deviceId:myDevice1, state:connected, deviceId:myDevice2, state:connected deviceInfos包含多個(gè)deviceInfo,每個(gè)deviceInfo形如:deviceId:myDevice1, state:connected。函數(shù)名hdSendDataToDevice描敘發(fā)送數(shù)據(jù)給設(shè)備參數(shù)deviceId必填:設(shè)備iddata必填:數(shù)據(jù),經(jīng)過(guò)base64編碼后的字符串。前往值err_msg:hdSe
32、ndDataToDevice:ok 勝利, hdSendDataToDevice:fail 失敗。事件 事件名hdOnReceveDataFromDevice描敘接納到設(shè)備數(shù)據(jù)參數(shù)deviceId:設(shè)備iddata:數(shù)據(jù),經(jīng)過(guò)base64編碼后的字符串。事件名hdOnDeviceStateChanged描敘接納到設(shè)備數(shù)據(jù)參數(shù)deviceId:設(shè)備idstate:connecting 銜接中, connected 銜接上,disconnected 銜接斷開。運(yùn)用例子見附錄。附錄1 ProtoBuf協(xié)議引見ProtoBuf是google提供的一套開源的軟件協(xié)議。它主要作用是把c/c+的struct
33、打包成為二進(jìn)制數(shù)據(jù),或者把二進(jìn)制數(shù)據(jù)解包成c/c+的struct。詳細(xì)運(yùn)用過(guò)程為:1. 定義proto文件2. 經(jīng)過(guò)工具把.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 藍(lán)牙硬件一些規(guī)定稱號(hào)值ServiceUUID0 xFEE7該uuid經(jīng)藍(lán)牙官方授權(quán)Write Characteristics UUID0 xFEC7Indicate Characteristics UUID0 xFEC8Read Characteristics UUID0 xFEC9Andriod RFCOMM UUIDe5b152ed-6b46-09e9-4678-665e9a972cbcIos經(jīng)典藍(lán)牙的iap層的SerialNumber必需賦值,且等于m
35、ac地址字符串方式。低功耗藍(lán)牙的廣播包的manufature specific data里必需包含mac地址6字節(jié),并且以mac地址結(jié)尾。并且manufature specific data長(zhǎng)度需大于等于8字節(jié)最前兩個(gè)字節(jié)為company id,沒(méi)有的話隨意填??纱_認(rèn)設(shè)備確實(shí)認(rèn)包的manufature specific data需以下面格式結(jié)尾:0 xfe 0 x01 0 x01 + mac地址6字節(jié)3 Ios BLE設(shè)備的截圖LightBlue是一個(gè)Iphone上的app。這是設(shè)備的截屏。請(qǐng)下載App并檢查: 1. serviceId能否正確 2. characteristics能否正確包括
36、uuid和屬性 3. 能否在manufature data最尾部帶上了mac地址。 4 包的二進(jìn)制例子Req接受兩種格式:20字節(jié)對(duì)齊補(bǔ)零格式,不對(duì)齊格式。以AuthReq為例子不加密:20字節(jié)對(duì)齊補(bǔ)零ble特征值有些芯片只能發(fā)送固定20個(gè)字節(jié),20字節(jié)剩下的部分補(bǔ)零feMagicNumber01版本號(hào)00 3b總長(zhǎng)度 2711命令號(hào)0001Seq變長(zhǎng)包體: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補(bǔ)齊:00留意:這里的包長(zhǎng)度為003b(即59字節(jié)),由于20字節(jié)對(duì)齊,導(dǎo)致總長(zhǎng)為60字節(jié)。不對(duì)齊經(jīng)典藍(lán)牙沒(méi)有對(duì)齊問(wèn)題,某些ble芯片也沒(méi)有對(duì)齊問(wèn)題feMagicNumber01版本號(hào)00 3b總長(zhǎng)度 2711命令號(hào) 0001Seq 變長(zhǎng)包體: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版本號(hào)000e總長(zhǎng)度 4e21命令號(hào)0001Seq 包體:0a020800 12005 包的數(shù)據(jù)流圖6 包的時(shí)序圖最簡(jiǎn)單的時(shí)序圖:Push包插入的時(shí)序圖多Req包并且有push包插入的時(shí)序圖:留意:多個(gè)Req包時(shí),到達(dá)廠商效力器的先后順序不能保證。同樣多Resp包的情況下,到達(dá)外設(shè)的順序也不能保證。7 加解密字段AuthReq里的AesSign字段 = AESRan | Seq | CRC32 ( DeviceId | Ran | Seq )設(shè)備消費(fèi)一個(gè)隨機(jī)數(shù)Ran ( 4字節(jié) ),留意:隨機(jī)數(shù)應(yīng)盡量隨機(jī)假設(shè)設(shè)備有才干獲得當(dāng)前
39、的時(shí)間戳,那么運(yùn)用時(shí)間戳作為Seq ( 4字節(jié) ),否那么,運(yùn)用一個(gè)從0開場(chǎng)遞增的序列號(hào),保證每次auth的Seq遞增將Ran和Seq拼接到DeviceId不含DeviceType后得到二進(jìn)制串1變長(zhǎng)計(jì)算二進(jìn)制串1的CRC32 ( 4字節(jié) )將Ran、Seq、CRC值按順序拼接得到12字節(jié)的二進(jìn)制串2,運(yùn)用設(shè)備key對(duì)二進(jìn)制傳2進(jìn)展AES加密,得到16字節(jié)的AesSignAuthResp里的AesSessionKey字段 = AES (SessionKey )設(shè)備auth勝利后將獲得一個(gè)32字節(jié)的AesSessionKey字段,運(yùn)用設(shè)備key做AES解密后可得到16字節(jié)的明文內(nèi)容.該內(nèi)容為se
40、ssionKey。InitReq里的Challeange字段為隨機(jī)數(shù)(4字節(jié),記為Random3)InitResp里的ChalleangeAnswer字段為CRC32(Random3)。上述身份認(rèn)證和加密的方式為0 x1版本,對(duì)應(yīng)AuthReq里面的AuthMethod字段。該版本未來(lái)能夠晉級(jí)。8 Md5DeviceTypeAndDeviceId的例子Md5DeviceTypeAndDeviceId為16字節(jié)二進(jìn)制數(shù)據(jù)。假設(shè)deviceType為:gh_d53f87f298e5,deviceId為:test_device。將deviceType+deviceId拼起來(lái),不算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例子多項(xiàng)式為:0 xedb88320L字符串test_device_ios的crc32為:0 x02e312f3。11 微信藍(lán)牙外設(shè)proto文件/ proto version: 1.0.2package MmBp;enum EmCmdId ECI_none = 0;
42、/ req: 藍(lán)牙設(shè)備 - 微信/廠商效力器 ECI_req_auth = 10001; / 登錄 ECI_req_sendData = 10002; / 藍(lán)牙設(shè)備發(fā)送數(shù)據(jù)給微信或廠商 ECI_req_init = 10003; / 初始化 / resp:微信/廠商效力器 - 藍(lán)牙設(shè)備 ECI_resp_auth = 20001; ECI_resp_sendData = 20002; ECI_resp_init = 20003; / push:微信/廠商效力器 - 藍(lán)牙設(shè)備 ECI_push_recvData = 30001; / 微信或廠商發(fā)送數(shù)據(jù)給藍(lán)牙設(shè)備 ECI_push_switchV
43、iew = 30002; / 進(jìn)入/退出界面 ECI_push_switchBackgroud = 30003; / 切換后臺(tái) ECI_err_decode = 29999; / 解密失敗的錯(cuò)誤碼。留意:這不是cmdid。為節(jié)省固定包頭大小,這種特殊的錯(cuò)誤碼放在包頭的cmdid字段。enum EmErrorCode EEC_system = -1; / 通用的錯(cuò)誤 EEC_needAuth = -2; / 設(shè)備未登錄 EEC_sessionTimeout = -3; / session超時(shí),需求重新登錄 EEC_decode = -4; / proto解碼失敗 EEC_deviceIsBloc
44、k = -5; / 設(shè)備出現(xiàn)異常,導(dǎo)致被微信暫時(shí)性制止登錄 EEC_serviceUnAvalibleInBackground = -6; / ios處于后臺(tái)方式,無(wú)法正常效力 EEC_deviceProtoVersionNeedUpdate = -7; / 設(shè)備的proto版本過(guò)老,需求更新 EEC_phoneProtoVersionNeedUpdate = -8; / 微信客戶端的proto版本過(guò)老,需求更新 EEC_maxReqInQueue = -9; / 設(shè)備發(fā)送了多個(gè)懇求,并且沒(méi)有收到回包。微信客戶端懇求隊(duì)列擁塞。 EEC_userExitWxAccount = -10; / 用戶
45、退出微信帳號(hào)。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é)的二進(jìn)制數(shù)據(jù) required int32 ProtoVe
46、rsion = 3; / 設(shè)備支持的本proto文件的版本號(hào),第一個(gè)字節(jié)表示最小版本,第二個(gè)字節(jié)表示小版本,第三字節(jié)表示大版本。版本號(hào)為1.0.0的話,應(yīng)該填:0 x010000;1.2.3的話,填成0 x010203。 required int32 AuthProto = 4; / 填1 required int32 AuthMethod = 5; / 驗(yàn)證和加密的版本號(hào),當(dāng)前填1 required bytes AesSign = 6; / 詳細(xì)生成方法見文檔 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;/ 微信銜接上設(shè)備時(shí),處于什么情景enum EmInitScence EIS_deviceChat = 1; / 聊天 EIS_autoSync = 2; / 自動(dòng)同步message InitRequest required BaseRequest BaseRequest = 1; optional bytes RespFieldFilter = 2; / 當(dāng)一個(gè)bit被設(shè)置就表示要resp的某個(gè)字段:見EmInitRespFieldFilter。 optional bytes Challenge = 3; / 設(shè)備用來(lái)驗(yàn)證手機(jī)能否平
49、安。為設(shè)備隨機(jī)生成的四個(gè)字節(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; / 微信譽(yù)戶Id高32位 required uint32 UserIdLow = 3; / 微信譽(yù)戶Id低32位 optional uint32 Cha
50、lleangeAnswer = 4; / 手機(jī)回復(fù)設(shè)備的挑戰(zhàn)。為設(shè)備生成的字節(jié)的crc32。 optional EmInitScence InitScence = 5; / 微信銜接上設(shè)備時(shí),處于什么情景。假設(shè)該字段為空,表示處于EIS_deviceChat下。 optional uint32 AutoSyncMaxDurationSecond = 6; / 自動(dòng)同步最多繼續(xù)多長(zhǎng),微信就會(huì)封鎖銜接。0 xffffffff表示無(wú)限長(zhǎng)。 optional string UserNickName = 11; / 微信譽(yù)戶昵稱 optional EmPlatformType PlatformType
51、= 12; / 手機(jī)平臺(tái) optional string Model = 13; / 手機(jī)硬件型號(hào) optional string Os = 14; / 手機(jī)os版本 optional int32 Time = 15; / 手機(jī)當(dāng)前時(shí)間 optional int32 TimeZone = 16; / 手機(jī)當(dāng)前時(shí)區(qū) optional string TimeString = 17; / 手機(jī)當(dāng)前時(shí)間,格式如202102281005285,詳細(xì)字段意義為2021年022月2828號(hào)10點(diǎn)05分鐘28秒5星期五。星期一為1,星期天為7。/ 設(shè)備發(fā)送數(shù)據(jù)給微信或廠商 / 設(shè)備數(shù)據(jù)類型enum EmDev
52、iceDataType EDDT_manufatureSvr = 0; / 廠商自定義數(shù)據(jù) EDDT_wxWristBand = 1; / 微信公眾平臺(tái)手環(huán)數(shù)據(jù) EDDT_wxDeviceHtmlChatView = 10001; / 微信客戶端設(shè)備html5會(huì)話界面數(shù)據(jù)message SendDataRequest required BaseRequest BaseRequest = 1; required bytes Data = 2; optional EmDeviceDataType Type = 3; / 數(shù)據(jù)類型(如廠商自定義數(shù)據(jù),或公眾平臺(tái)規(guī)定的手環(huán)數(shù)據(jù),或微信客戶端設(shè)備html
53、5會(huì)話界面數(shù)據(jù)等。不填,或者等于0的時(shí)候,表示設(shè)備發(fā)送廠商自定義數(shù)據(jù)到廠商效力器。message SendDataResponse required BaseResponse BaseResponse = 1; optional bytes Data = 2;/ push =/ 微信或廠商發(fā)送數(shù)據(jù)給藍(lán)牙設(shè)備 message RecvDataPush required BasePush BasePush = 1; required bytes Data = 2; optional EmDeviceDataType Type = 3; / 數(shù)據(jù)類型(如廠商自定義數(shù)據(jù),或公眾平臺(tái)規(guī)定的手環(huán)數(shù)據(jù),或微
54、信客戶端設(shè)備html5會(huì)話界面數(shù)據(jù)等。不填,或者等于0的時(shí)候,表示設(shè)備收到廠商自定義數(shù)據(jù)。/ 微信客戶端進(jìn)入退出界面的通知 enum EmSwitchViewOp ESVO_enter = 1; ESVO_exit = 2;enum EmViewId EVI_deviceChatView = 1; / 微信客戶端設(shè)備號(hào)會(huì)話界面 EVI_deviceChatHtmlView = 2; / 微信客戶端設(shè)備號(hào)Html5會(huì)話界面。留意:只需當(dāng)H5界面自動(dòng)和設(shè)備銜接上之后,才會(huì)發(fā)送push。message SwitchViewPush required BasePush BasePush = 1; re
55、quired EmSwitchViewOp SwitchViewOp = 2; / 進(jìn)入或者退出View required EmViewId ViewId = 3; / view的idenum EmSwitchBackgroundOp ESBO_enterBackground = 1; / 進(jìn)入后臺(tái) ESBO_enterForground = 2; / 進(jìn)入前臺(tái) ESBO_sleep = 3; / 后臺(tái)休眠/ 微信客戶端進(jìn)入退出后臺(tái)的通知 message SwitchBackgroudPush required BasePush BasePush = 1; required EmSwitchB
56、ackgroundOp SwitchBackgroundOp = 2;12 微信公眾平臺(tái)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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年贛州b2考貨運(yùn)資格證要多久
- 2025年湖北貨運(yùn)從業(yè)資格證考試題庫(kù)工具箱
- 2025年北京年貨運(yùn)從業(yè)資格證考試題庫(kù)
- 小兒糖尿病的飲食護(hù)理
- 八年級(jí)英語(yǔ)Howlonghaveyoubeencollectingshells課件
- 【培訓(xùn)課件】軟件開發(fā)過(guò)程中的項(xiàng)目管理
- 《證券與證券法概述》課件
- 2025正規(guī)民間借貸合同文本
- 2025版本勞動(dòng)合同法
- 慢病科年終工作總結(jié)
- 腰穿術(shù)護(hù)理常規(guī)
- 2021-2022學(xué)年統(tǒng)編版道德與法治五年級(jí)上冊(cè)全冊(cè)單元測(cè)試題及答案(每單元1套共6套)
- 人力資源外包投標(biāo)方案
- CRH2型動(dòng)車組一級(jí)檢修作業(yè)辦法081222
- 淺談失業(yè)保險(xiǎn)的擴(kuò)面征繳
- (完整版)西南財(cái)經(jīng)大學(xué)計(jì)量經(jīng)濟(jì)學(xué)期末考試試題
- 研究生英語(yǔ)議論文范文模板
- 酒店建筑BIM實(shí)施方案
- 員工工資條模板(indoc整理)
- 燃?xì)獍踩R(shí)測(cè)試題(含答案)
- 拆遷安置房小區(qū)物業(yè)管理的問(wèn)題與對(duì)策
評(píng)論
0/150
提交評(píng)論