玩轉BLE(3)_使用微信藍牙精簡協議偽造記步數據


1. 前言

在物聯網時代,有一個問題肯定會讓人頭疼(現在已經初露端倪了):

物聯網中的IOT設備有兩個主要特點: 
1)簡單小巧(不具備復雜的人機交互接口,需要手機等終端設備輔助完成配置、控制等功能)。 
2)數量和種類繁多(消費者面對的可是數量眾多的不同廠家、不同類型的設備)。

基於這兩個特點,手機等終端設備一般通過APP(或APK)對IOT設備進行控制,不同廠家的不同設備,通常需要不同的APP/APK。於是出現了這樣的結果: 
如果你家里有一個小米yeelight的床頭燈,你需要安裝一個yeelight的APP/APK; 
如果你手上戴一個百度智能手環,你需要安裝一個百度智能手環APP/APK; 
如果你跑步時戴一個xxx運動藍牙耳機,你需要安裝一個xxx運動藍牙耳機APP/APK; 
如果你要騎摩拜單車,你需要安裝一個摩拜單車APP/APK; 
如果你也行騎一下優拜單車,你需要安裝一個優拜單車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語言 
sudo apt install golang

2)創建GOPATH環境變量 
mkdir ~/gopath 
export GOPATH=$HOME/gopath    #為了方便,可以放到~/.profile中

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 
2017/03/04 01:03:14 dev: hci0 down 
2017/03/04 01:03:14 dev: hci0 opened 
State: PoweredOn 
2017/03/04 01:03:14 BD Addr: 5C:F3:70:6A:BA:27 
2017/03/04 01:03:14 Generating attribute table: 
2017/03/04 01:03:14 handle type props secure pvt value 
2017/03/04 01:03:14 0x0001 0x2800 0x02 0x00 *gatt.Service [ E7 FE ] 
2017/03/04 01:03:14 0x0002 0x2803 0x32 0x00 *gatt.Characteristic [ 32 03 00 A1 FE ] 
2017/03/04 01:03:14 0x0003 0xfea1 0x32 0x00 *gatt.Characteristic [ ] 
2017/03/04 01:03:14 0x0004 0x2902 0x0E 0x00 *gatt.Descriptor [ 00 00 ] 
2017/03/04 01:03:14 0x0005 0x2803 0x3E 0x00 *gatt.Characteristic [ 3E 06 00 A2 FE ] 
2017/03/04 01:03:14 0x0006 0xfea2 0x3E 0x00 *gatt.Characteristic [ ] 
2017/03/04 01:03:14 0x0007 0x2902 0x0E 0x00 *gatt.Descriptor [ 00 00 ] 
2017/03/04 01:03:14 0x0008 0x2803 0x02 0x00 *gatt.Characteristic [ 02 09 00 C9 FE ] 
2017/03/04 01:03:14 0x0009 0xfec9 0x02 0x00 *gatt.Characteristic [ ]

然后在手機下載AirSyncDebugger2.3.0.apk(http://iot.weixin.qq.com/wiki/new/index.html?page=4-3的底部)測試精簡協議是否okay:

打開APK---->精簡協議---->計步器測試

測試界面如下(Android平台):

wx-藍牙精簡協議-AirSyncDebugger

4. 在微信公眾平台注冊並授權設備

第2章成功模擬出來一個遵守“微信藍牙精簡協議”的計步器之后,我們需要登錄微信的公眾平台(可以使用測試帳號),注冊一個產品類別,並授權該設備,之后就可以在微信運動界面使用這個設備了。

4.1 登錄“微信公眾平台接口測試帳號”

打開下面鏈接:

http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

點擊登錄按鈕,用自己微信的掃一掃登錄,登錄后的界面如下:

wx-iot-登錄界面

注意圖中紅色塗抹的三個信息(要記錄下來,后面有用):

微信號: 
appID: 
appsecret:

4.2 開啟設備功能接口

將上面的登錄界面往下拉,找到“功能服務”,“設備功能”,點擊“開啟”,開啟設備功能接口,如下圖:

wx-iot-設備功能接口

4.3 添加產品

設備功能接口開啟后,會出現“設置”按鈕,點擊進入下一個界面,進行設備功能管理。在該界面,點擊“添加產品”按鈕,為我們的計步器設備添加一個產品類別:

wx-iot-添加產品

按照提示填入相關的信息(需要注意紅色圈出的地方):

wx-iot-基礎資料登記1

wx-iot-基礎資料登記2

點擊“下一步”進入“產品能力登記”界面:

wx-iot-產品能力登記

最后,點擊“添加”按鈕,將產品添加進去。添加成功后,進入如下的界面(注意其中紅色塗抹的那一串數字,是產品的ID,記下來,后面有用):

wx-iot-product_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/),就可得到圖片二維碼,如下(注意需要將瀏覽器返回的轉義字符改回正常):

wx-iot-二維碼獲取

4.4.3 設備鑒權

這一步要借助微信公眾平台的debug頁面了,單純的瀏覽器無法搞定。打開如下的debug地址:

http://mp.weixin.qq.com/debug/

找到如下界面:

wx-iot-設備授權

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的。

點擊“檢查問題”,看到如下的成功信息,說明授權成功了:

wx-iot-授權成功

5. 使用手機微信綁定設備

使用微信掃一掃,掃描剛才獲得的二維碼,點擊“綁定設備”,即可添加設備,如下:

wx-掃一掃綁定設備

綁定成功后,設備顯示未連接,如下:

wx-綁定設備未連接

接下來要連接設備。對iOS來說,在設置界面無法主動連接BLE設備,必須有應用程序自行連接,這里以微信運動為例,搜索並連接剛才授權的那個設備,即可看到計步數據的更新。步驟如下面圖片(不再解釋了,大家可以自己試試):

wx-微信運動-設置

wx-微信運動-添加數據來源

wx-微信運動-搜索並添加設備

6. 參考文檔

[1] 微信藍牙精簡協議,http://iot.weixin.qq.com/wiki/new/index.html?page=4-3

[2] https://github.com/paypal/gatt

原創文章,轉發請注明出處。蝸窩科技,www.wowotech.net。


免責聲明!

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



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