1. 前言
在物聯網時代,有一個問題肯定會讓人頭疼(現在已經初露端倪了):
物聯網中的IOT設備有兩個主要特點: 基於這兩個特點,手機等終端設備一般通過APP(或APK)對IOT設備進行控制,不同廠家的不同設備,通常需要不同的APP/APK。於是出現了這樣的結果: |
既然有問題,肯定就有人試圖解決,於是微信IoT、阿里小智、亞馬遜IoT等等,互聯網大佬們就各顯神通了。最終誰能稱霸天下,現在還不得而知,本文也不去討論這些。
作為藍牙BLE的介紹文章,本文將以微信IoT的“微信藍牙精簡協議”為例,通過“把一個藍牙適配器模擬成微信計步器”,分別從BLE技術(怎樣注冊一個GATT service)和微信IoT(微信物聯網平台的思路和想法)兩個角度,窺一窺IoT江湖的冰山一角(權當開闊眼界了)。
2. 微信藍牙精簡協議簡介
微信藍牙精簡協議的思路很簡單(具體可參考“http://iot.weixin.qq.com/wiki/new/index.html?page=4-3“),如下圖:
圖片1 微信藍牙精簡協議框架
總結來說,就是:
通過微信(可以運行在手機、平板、電腦、等硬件上面)統一和IoT設備交互; 交互的介質是BLE協議(可以搖身變為其它無線協議); 交互的過程可由服務器協助完成(服務器可選擇微信服務器或者第三方服務器)。 |
雖然思路簡單,背后卻有深深的“不懷好意”,因為:
1)IoT設備想要和微信(或者微信背后的服務器)交互,就必須遵守微信定義的協議; 2)IoT設備通過微信和服務的交互(無論是第三方服務器,還是微信服務器),都必須遵守微信定義的協議,並經由微信服務器轉發。 基於上面兩點,物聯網中最重要的兩個環節:設備和數據,都掌握在微信的手中了。恐怖!! |
到目前為止,“微信藍牙精簡協議”有一個比較成熟的應用實例:微信計步器,其工作流程為:
1)在帶有計步功能的BLE設備上,按照協議規定的方式,基於BLE GATT,實現相應的Profile、Service、Attribute。 2)在微信公眾平台,為該設備申請一個唯一的設備ID,並和設備的MAC地址一起,在公眾平台上注冊、授權。 3)在微信的微信運動小程序中,掃描並添加該設備,即可通過BLE讀取設備的計步信息。 4)微信運動讀取計步信息后,可以進行后續的動作(例如在朋友圈刷排名等)。 |
以上步驟,后面章節將會使用一個藍牙適配器(模擬藍牙計步器),配合自己的手機微信,進行演示說明。
3. 將藍牙適配器模擬成一個計步器
3.1 環境准備
后續實驗基於如下的硬件、軟件環境(其它環境也okay,不過我沒有測試)。
運行Ubuntu為例的PC、筆記本(或者開發板),包含藍牙4.0(及以上)功能(自帶或者使用藍牙適配器); Ubuntu中安裝有較新版本的Bluez協議棧及工具集,以及其它必須的軟禁包(具體步驟略,碰到問題的時候可以一點點解決); 具有BLE功能的手機(上面有可以正常使用的微信); |
3.2 搭建Golang開發環境
在包含Bluez(及相關工具集)的Linux OS中,使用Bluez的工具,可以完成大部分的BLE實驗,例如:
hcitool、bluetoothctl等工具,可以進行BLE設備的掃描、連接、配對、廣播等操作; hcitool可以發送HCI command,設置BLE的廣播數據; gatttool可以在GATT層面,完成GATT profile的連接、service attribute的讀寫等操作; 等等。 |
但有一個功能點,不是很容易實現,就是如何自定義一個GATT profile(要知道,BLE 90%以上的功能都是通過GATT實現的,如果做到這一點,學習BLE就非常方便了)。當然,BLE不復雜,我們可以直接使用BLuez提供的API,自行開發。如果是產品開發,無可厚非,但是如果僅僅只做個實驗,這樣大張旗鼓的就不划算了,最好能有一些開源的工具。確實有,我搜集、嘗試過幾種工具:
1)使用bluez的測試代碼(bluez-5.37/test/example-gatt-server),是一個python腳本。這個家伙對環境依賴度比較高,很難用,最終沒有用起來。 2)一個由nodejs腳本寫的工具(https://github.com/luluxie/weixin-iot)。基本功能還好,不過本人對js不太熟,就算了。 3)一個由Go語言寫的工具(https://github.com/paypal/gatt)。功能OK,關鍵還是新奇的Go語言,果斷使用~~ |
這就是搭建Golang開發環境的原因。至於步驟,很簡單(以Ubuntu為例):
1)安裝Go語言 2)創建GOPATH環境變量 |
3.3 代碼准備
在github上,從https://github.com/paypal/gatt中clone一個倉庫,clone的倉庫地址為https://github.com/wowotech/gatt。clone后使用go get命令,下載代碼到本地:
vim@ubuntu:~$ go get github.com/wowotech/gatt |
下載后代碼的位置為:
vim@ubuntu:~$ ls $GOPATH/src/github.com/wowotech/ gatt |
然后,手動將代碼中所有的“github.com/paypal”類型的import修改為“github.com/wowotech”(fuck Go!!)
cd $GOPATH/src/github.com/wowotech/gatt find . -name "*.go" | xargs sed -i 's/paypal/wowotech/g' |
提交記錄如下:
https://github.com/wowotech/gatt/commit/1f1c23e94cb7e1b54078a568a60cf1aaef7de195 |
3.4 編譯並運行一個示例文件.
(略)。
3.5 支持“微信藍牙精簡協議”
參考examples/server.go以及藍牙精簡協議的定義[1],新建weixin.go,增加微信藍牙精簡協議。最終的文件如下(代碼很簡單,熟悉BLE GATT協議的同學,很容易看懂,就不過多解釋了):
https://github.com/wowotech/gatt/commit/942e7480ad1664dabacdb5561fa98a831621f7de |
注1:可以通過代碼中如下的定義修改計步的步數(想刷爆微信運動朋友圈的同學注意了,嘿嘿!!):
+ // steps little endian + // 01(steps) 10 27 00(0x002710 = 10000) + // http://iot.weixin.qq.com/wiki/new/index.html?page=4-3 + steps := []byte{ 0x01, 0x5c, 0x74, 0x01 } |
3.6 編譯、運行、測試
編譯:
vim@ubuntu:~/gopath/src/github.com/wowotech/gatt/examples$ go build weixin.go |
運行:
vim@ubuntu:~/gopath/src/github.com/wowotech/gatt/examples$ sudo ./weixin [sudo] password for vim: 2017/03/04 01:03:13 dev: hci0 up |
然后在手機下載AirSyncDebugger2.3.0.apk(http://iot.weixin.qq.com/wiki/new/index.html?page=4-3的底部)測試精簡協議是否okay:
打開APK---->精簡協議---->計步器測試 |
測試界面如下(Android平台):
4. 在微信公眾平台注冊並授權設備
第2章成功模擬出來一個遵守“微信藍牙精簡協議”的計步器之后,我們需要登錄微信的公眾平台(可以使用測試帳號),注冊一個產品類別,並授權該設備,之后就可以在微信運動界面使用這個設備了。
4.1 登錄“微信公眾平台接口測試帳號”
打開下面鏈接:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
點擊登錄按鈕,用自己微信的掃一掃登錄,登錄后的界面如下:
注意圖中紅色塗抹的三個信息(要記錄下來,后面有用):
微信號: appID: appsecret: |
4.2 開啟設備功能接口
將上面的登錄界面往下拉,找到“功能服務”,“設備功能”,點擊“開啟”,開啟設備功能接口,如下圖:
4.3 添加產品
設備功能接口開啟后,會出現“設置”按鈕,點擊進入下一個界面,進行設備功能管理。在該界面,點擊“添加產品”按鈕,為我們的計步器設備添加一個產品類別:
按照提示填入相關的信息(需要注意紅色圈出的地方):
點擊“下一步”進入“產品能力登記”界面:
最后,點擊“添加”按鈕,將產品添加進去。添加成功后,進入如下的界面(注意其中紅色塗抹的那一串數字,是產品的ID,記下來,后面有用):
4.4 授權設備
4.4.1 獲取access_token
根據上面得到的appID和appsecret,在瀏覽器里面輸入如下指令,獲取訪問微信公眾平台的token(令牌):
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxxxxxxxxx&secret=xxxxxxxx
注意紅色部分要修改為實際內容(具體可參考4.1章節獲取的信息)。
瀏覽器會返回如下內容:
{"access_token":"xxxxxxxxxxxxxxxxxxx","expires_in":7200} |
有兩個字段,access_token(記錄下來,后面有用)和有效時間(7200秒,很長了)。
4.4.2 為設備生成一個唯一ID(device_id)及二維碼(通過微信掃描即可添加設備)
在瀏覽器輸入如下指令:
https://api.weixin.qq.com/device/getqrcode?access_token=xxxxxxxxxxxx&product_id=xxxxx
其中access_token為4.4.1中獲取的,product_id為4.3中獲取的。
瀏覽器的返回如下:
{"base_resp":{"errcode":0,"errmsg":"ok"},"deviceid":"xxxxxx","qrticket":"http:\/\/we.qq.com\/d\/AQArGYez06UDOcqKNe1jqWeeLhiF7fIKebEP5hiT"} |
deviceid為新生成的唯一ID,記錄下來,后面有用。
qrticket是設備的二維碼,隨便找一個二維碼生成的網站(例如http://cli.im/),就可得到圖片二維碼,如下(注意需要將瀏覽器返回的轉義字符改回正常):
4.4.3 設備鑒權
這一步要借助微信公眾平台的debug頁面了,單純的瀏覽器無法搞定。打開如下的debug地址:
http://mp.weixin.qq.com/debug/ |
找到如下界面:
body輸入的內容如下:
{ "device_num":"1", "device_list":[ { "id":" xxxxxxxx", "mac":"5CF3706ABA27", "connect_protocol":"3", "auth_key":"", "close_strategy":"1", "conn_strategy":"5", "crypt_method":"0", "auth_ver":"0", "manu_mac_pos":"-1", "ser_mac_pos":"-2", "ble_simple_protocol": "1" } ], "op_type":"0", "product_id": "xxxxx" } |
注意上面紅色的字段,id是4.4.2中獲得的deviceid,mac是藍牙設備的物理地址,product_id是4.3中獲得產品ID的。
點擊“檢查問題”,看到如下的成功信息,說明授權成功了:
5. 使用手機微信綁定設備
使用微信掃一掃,掃描剛才獲得的二維碼,點擊“綁定設備”,即可添加設備,如下:
綁定成功后,設備顯示未連接,如下:
接下來要連接設備。對iOS來說,在設置界面無法主動連接BLE設備,必須有應用程序自行連接,這里以微信運動為例,搜索並連接剛才授權的那個設備,即可看到計步數據的更新。步驟如下面圖片(不再解釋了,大家可以自己試試):
6. 參考文檔
[1] 微信藍牙精簡協議,http://iot.weixin.qq.com/wiki/new/index.html?page=4-3
[2] https://github.com/paypal/gatt
原創文章,轉發請注明出處。蝸窩科技,www.wowotech.net。