微信硬件平臺使用藍牙做爲近場控制的鏈接件,並擬定了《微信藍牙外設協議》。這份協議更像一個標準,用於規範微信和藍牙外設之間的數據交互場景和接口。但從開發者來看,要徹底讀懂這份協議,恐怕須要熟讀不少遍,而且要結合調試才能真正實現微信Airsync通訊。筆者對IOT和微信硬件平臺的整個框架和技術都比較熟悉了,而且已經在TI的CC254X和Dialog的DA14580上實現了微信Airsync協議通訊。如今回過頭來,從開發的角度,對微信Airsync協議進行從新解讀,以幫助新進入物聯網領域的開發者更快地掌握微信藍牙設備通訊開發,以讓產品快速接入微信硬件平臺。後端
有關微信硬件平臺和物聯網的架構分析請參考筆者以前的博文,特別是《一張圖讀懂基於微信硬件平臺的物聯網架構》和《基於微信硬件公衆平臺的智能控制開發流程》。微信
1、微信藍牙物聯的技術需求網絡
軟件和協議都是需求驅動的。在物聯網、移動互聯網領域,理解場景是提煉需求的重要方法。那麼,咱們從場景分析的角度來理解微信硬件平臺的藍牙物聯需求。架構
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字節,直到發完爲止。
2、藍牙微信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的工具用於調試,若是能正常與它鏈接通訊,那就表明着能夠跟微信進行正常通訊了。
3、藍牙Airsync協議學習開發步驟
1. 初步理解微信規範《藍牙外設協議》。
2. 理解本文
3. 根據本文的分析理解微信官方實現的基於NRF81522平臺的外設例程。
4. 在本身的藍牙單芯片平臺開發實現Airsync協議,並結合airsyncDebug進行調試。
你將會事半功倍!祝好運!
更多嵌入式Linux和物聯網原創分享,請關注微信公衆號:嵌入式企鵝圈