以藍牙開發的視覺解讀微信Airsync協議


微信硬件平台使用藍牙作為近場控制的連接件,並擬定了《微信藍牙外設協議》。這份協議更像一個標准,用於規范微信和藍牙外設之間的數據交互場景和接口。但從開發者來看,要完全讀懂這份協議,恐怕需要熟讀很多遍,並且要結合調試才能真正實現微信Airsync通信。筆者對IOT和微信硬件平台的整個框架和技術都比較熟悉了,並且已經在TI的CC254X和Dialog的DA14580上實現了微信Airsync協議通信。現在回過頭來,從開發的角度,對微信Airsync協議進行重新解讀,以幫助新進入物聯網領域的開發者更快地掌握微信藍牙設備通信開發,以讓產品快速接入微信硬件平台。

       有關微信硬件平台和物聯網的架構分析請參考筆者之前的博文,特別是《一張圖讀懂基於微信硬件平台的物聯網架構》和《基於微信硬件公眾平台的智能控制開發流程》。

一、微信藍牙物聯的技術需求

軟件和協議都是需求驅動的。在物聯網、移動互聯網領域,理解場景是提煉需求的重要方法。那么,我們從場景分析的角度來理解微信硬件平台的藍牙物聯需求。

1.     微信藍牙物聯是一種近場控制場景

微信硬件平台支持藍牙和Wifi/3G/GPRS接入。Wifi/3G/GPRS是一種遠場控制手段,只要網絡可達,那么用戶可以在遠場(例如辦公場所)控制離用戶距離很遠(例如家里)的物聯設備。而藍牙接入則是一種近場控制手段,用戶只能利用微信通過手機的藍牙來控制20米左右的藍牙設備。也即是,當藍牙設備離開手機藍牙的連接范圍,那么用戶是控制不了該設備的。

對於藍牙外設來說,手機就像一個藍牙網關一樣,手機通過藍牙來跟藍牙外設進行通信,將得到的數據通過手機的wifi或者3G/4G信號與雲后端(微信公眾平台、第三方雲服務端)交互。前者是基於微信Airsync協議,后者則是微信制定的基於TCP/IP協議的《設備接入接口協議》。

2.     藍牙外設身份注冊

微信硬件平台只提供兩部分核心的物聯功能,一是身份管理,二是消息推送。任何一個外設,不管是藍牙還是wifi,它都將擁有一個唯一的設備ID。設備ID的相關描述請參考《一張圖讀懂基於微信硬件平台的物聯網架構》,其包括設備類型(設備廠商的公眾號ID)和該設備廠商自行定義的設備ID。這種設計手段和藍牙MAC地址、網卡MAC地址的設置是一樣的。設備ID就是外設的身份。

在外設向微信硬件平台注冊身份前,微信硬件平台是不認識這個外設的。所以,我們在使用藍牙外設前,需要向微信硬件平台注冊身份。

對於微信硬件平台而言,設備注冊其實就是平台對這個設備進行授權(加入)的過程。接口如下圖。其主要通過提交自身的唯一MAC、設備ID來向平台注冊。

 

3.     藍牙廣播

對於藍牙設備來說,它主要的狀態包括未連接和已連接兩種狀態。在未連接時,它需要進行廣播。廣播的目的是為了讓手機微信能夠通過藍牙掃描得知這是一個支持藍牙Airsync協議的設備。當手機微信識別到是一個支持該協議的外設時,手機微信會發起連接。

那么,廣播數據需要包含什么格式的數據才能被手機微信所識別到呢?這就是藍牙Airsync協議規定的內容。

4.     藍牙通信

藍牙連接之后,自然是數據通信的需求。對藍牙BLE來說,數據通信都是通過訪問某個characteristics來實現的。而characteristics需要支持以下場景:

1)手機微信對外設進行寫控制,要求characteristics的write屬性。

2)手機微信讀取外設的一些信息。當外設和廠商自己研制的APP連上之后,外設處於連接狀態,其不會再發出廣播信息,此時微信想去連接這個外設怎么辦?其是通過讀取外設的信息,如MAC,來判斷該外設是否支持微信。這要求characteristics的read屬性。

以上兩種都是手機微信作為主動方,外設是被動。接下來,我們來看看外設是主動時的場景:

3)例如,運動手環需要主動上報用戶某個時段的運動步數。在這種情況下,手機微信主動讀取運動步數顯然是不合適的,因為手機不應該時時刻刻地讀這個步數來更新。而應該是手機微信訂閱characteristics的信息更新服務,即作為被動方接受外設的信息更新。

對於藍牙外設來說,characteristics的信息更新有兩種,一種是notify,一種是indicate。他們有什么區別呢?對於notify,當藍牙外設的characteristics的值有變化時,它會主動將新的值告知手機微信,而手機微信收到這個信息更新時不需要回復。而對於indicate屬性,手機微信在收到這個信息時需要給藍牙外設一個簡單的回復。

藍牙BLE通信的characteristics的長度是有限制的,或者說每一幀數據長度是有限的,是20字節。那么,如果藍牙外設有一串很長的數據要主動傳送,很明顯,它需要indicate屬性才能完成這個任務,即將這段數據按20字節長度進行分幀,每次更新發送之后,需要等手機微信回復之后才能發下一個20字節,直到發完為止。

二、藍牙微信Airsync協議開發

根據以上對藍牙微信物聯的技術需求分析,再根據藍牙BLE的應用開發知識,我們來梳理藍牙微信Airsync協議的開發要點。

1.     廣播

藍牙外設廣播的目的是讓手機微信能夠識別到。微信Airsync協議是這樣規定藍牙外設廣播數據格式的:

1) 聲明自己的ServiceUUID是0xFEE7。

2) 在自定義廠商數據manufature specific data中需以MAC地址(身份注冊時的MAC地址,也是該設備真實的MAC地址)結尾,並且要求manufature specific data的長度大於等於8.

藍牙的廣播數據格式定義請參考《Blutoothspecification 4.0》的P1735頁,對應以下兩個類型:

另外,微信Airsync協議提到廣播設備分為兩種,一種是普通設備,沒有按鈕,需要無時無刻地廣播數據;另一種是確認設備,即有按鈕,即用戶按下按鈕后才開始廣播數據。事實上,現實生活中為了省功耗,不可能時時刻刻都在廣播的,都是在用戶拿手機過來后,再按下外設按鈕之后才開始廣播並連接的。但是微信把這種方式稱為確認設備會造成困惑啊,又沒解釋清楚,以為廣播之后還要確認什么的。這里明確解釋這一點。

對於確認按鈕之后的廣播數據需要注意的是,在自定義廠商數據manufature specific data中需以0xfe 0x01 0x01 +MAC地址結尾。

2.     藍牙通信服務

外設要實現以下特征,並根據具體芯片平台的接口實現各特征字的讀寫回調過程,以實現具體的應用需求。

即寫characteristics的UUID是0xfec7, indicate characteristics的UUID是0xfec8. 這兩個是必須的。而read characteristics UUID不支持也沒有問題。

3.     藍牙Airsync協議交互

滿足以上兩個條件代表已經能夠跟手機微信進行數據通信了。但是交互過程是一個協作的過程,就像我們訪問業務系統一樣也要先登陸,再初始化后,才能進行正常的業務通信啊。那么登陸和初始化我們可以理解為應用控制信令,而后續的數據通信也是應用數據通信。

藍牙Airsync協議使用protobuf技術進行封包和解包,詳見《 Protocolbuffer序列化及其在微信藍牙協議中的應用》。

1) 登陸

登陸時的數據參數格式是:

微信支持兩種登陸身份認證,加密和不加密。這里只討論簡單的不加密認證好了。不加密時,我們一般用MAC地址方式登陸,即將AeSine付空值,AuthMethod賦值為EAM_macNoEncrypt.

Author會收到手機微信的回復,在加密時收到的是一個用於之后通信的秘鑰,但在不加密是可以忽略。

2) 初始化

初始化的目的是外設生成一個隨機數,以后每次通信后,該數值都會自動加1;另外,在初始化的回復中,手機微信可以告訴外設手機微信當前的用的手機操作系統的版本、當前時間、微信用戶ID等等。以便於外設記錄用戶的信息。

初始化的數據參數格式是:

       初始化成功之后就可以正常通信了。

       微信提供一個叫做airsyncDebug的工具用於調試,如果能正常與它連接通信,那就代表着可以跟微信進行正常通信了。

 

三、藍牙Airsync協議學習開發步驟      

1.     初步理解微信規范《藍牙外設協議》。

2.     理解本文

3.     根據本文的分析理解微信官方實現的基於NRF81522平台的外設例程。

4.     在自己的藍牙單芯片平台開發實現Airsync協議,並結合airsyncDebug進行調試。

你將會事半功倍!祝好運!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM