微信藍芽BLE接入除錯指引 測試公眾號篇
微信藍芽BLE接入除錯指引
測試公眾號篇
2 微信測試公眾號
2.1 申請測試公眾號
可以在http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login申請到一個用於測試的公眾號,這個帳號可以用於除錯具用AirSync協議的藍芽裝置,簡精協議好像調不了。
申請步驟:
開啟網址,點選登陸後,出來二維碼,用微信掃一下,在彈出的頁面點確認登陸,然後網頁會自動進入測試號介面
進入後,注意一下上圖示紅線的值,BLE韌體裡的DEVICE_TYPE的值要改成上面標紅微訊號的值,而appID和appsecret這兩個值在獲取access_token時會用到。
2.2 新增藍芽產品
在測試號介面,找到“功能服務”-》“裝置功能”,點開啟,然後進行設定,進去後新增產品,然後參考下圖填寫,就紅圈要注意,其他隨便填。
新增完後,並不表示進入公眾號後就可以去連藍芽了,這只是將公眾號配置成具有藍芽功能,想要連線藍芽裝置,還得繼續往下。另外,注意上圖示紅圈的那個值6563,它是產品ID(product_id),在授權時會用到。
另外,說明一下,這裡提到的產品是什麼意思,要是以為是一個裝置就是一樣產品,那就慘了,因為測試帳號的限額就5個產品。我的理解是,一個產品,是指具有相同介面功能的硬體,比如藍芽手錶,就一個產品,所有手錶都是同一個產品,藍芽手環也是一樣產品,
剛建立的這個產品,只是個空殼,接下來使用“微信公眾平臺介面除錯工具”
來向產品新增藍芽裝置。
2.3 新增藍芽裝置
然後再一下appid和secret的值,appid是測試號介面的appID,secret是appsecret。填好後點一下“檢查問題”,正常的話,會返回:
上面的請求地址,意思是,點選“檢查問題”按鈕時,實際執行的就是這個指令,你把這個地址拷到網頁瀏覽,顯示的資訊就是返回結果。
access_token 叫訪問令牌,它的有效期是2小時,它的作用是下面提到的指令都得帶訪問令牌,否則測試號後臺是不會接受的。
獲取到access_token後,我們就可以新增裝置了。將介面型別選擇為“硬體接入API介面除錯”,介面列表選擇為“裝置授權”:
在body裡填入下面資訊:
{
"device_num": "1",
"device_list": [
{
"id": "device3",
"mac": "f4e6f41549f2",
"connect_protocol": "3",
"auth_key": "000102030405060708090a0b0c0d0e0f",
"close_strategy": "1",
"conn_strategy": "1",
"crypt_method": "1",
"auth_ver": "1",
"manu_mac_pos": "-1",
"ser_mac_pos": "-2"
}
],
"op_type": "0",
"product_id": "6563"
}
正常返回如下:
我們來解讀一下BODY的資訊,BODY是一個json結構,即“變數”:“值”的格式構成,不清楚的可以查一下。
{
"device_num": "1", //表示device_list裡有多少項,1表示1項,如果是2,list就得有兩項。
"device_list": [ //裝置列表
{
"id": "device3", //這個值要與BLE韌體裡的DEVICE_ID一致,可以自定義,也可通過微信HTTP介面生成。
"mac": "f4e6f41549f2", //這個值是硬體篇提到的BLE裝置的MAC地址,與廣播資料裡的MAC地址順序一樣,也和手機掃描到的MAC地址順序一樣。
"connect_protocol": "3", //3 表示BLE藍芽協議
"auth_key": "000102030405060708090a0b0c0d0e0f", //和BLE韌體裡的aes_key值一致。
"close_strategy": "1", //1:退出公眾號頁面時即斷開連線
"conn_strategy": "1", //1:(第1bit 置位)在公眾號對話頁面,不停的嘗
試連線裝置
"crypt_method": "1", //1:AES 加密
"auth_ver": "1", //加密版本,0是不加密
"manu_mac_pos": "-1", //-1:MAC地址在尾部
"ser_mac_pos": "-2" //-2:表示serial number不包含mac 地址
}
],
"op_type": "0", //0 表示新增,1表示更改,第一次用0,之後用1
"product_id": "6563" //對用新增的產品號,op_type = 0時需要。
}
裝置授權,不表示進入微訊號後就會連線裝置,只是表示在後面的配置裡可以被引用。
對上面的“id”項,詳細說明一下,id指的是device_id,是唯一的,不能重名,它有兩種產生方式,一種是使用者自己定義,如上的device3就是我自己取的,另一種是呼叫微信介面產生:
一般在這裡只填access_token,會產生錯誤提示:
{
"base_resp": {
"errcode": 100020,
"errmsg": "account quota not enough"
}
}
原因是deviceid的產生需要指定產品ID,表明它是基於哪個產品。解決方法是:在access_tokey裡填寫ACCESS_TOKEN&product_id=PRODUCT_ID,如下:
http的請求方式:
https://api.weixin.qq.com/device/getqrcode?access_token=ue48NdvmlCrEcknhRP0FJwmeg0d0hOu9aB9Q9ZW0d6HB-RhM6O2ffnSxhzXvH8ClAgSJ1mYnHiQLRScXCH3tMfXv5X-Wlk5kYC6waMPCpyMIYKgAGAQGS&product_id=6563
正常返回結果:
會產生一個deviceid和一個二維碼地址。這個二維碼地址是對應該裝置的,它與公眾號二維碼的不同是,它加入了裝置資訊,使用者在掃描二維碼後,可以繫結裝置,而掃描公眾號二維碼,則不會要求繫結裝置。
二維碼地址可以通過這個網站http://cli.im/url來產生二維碼圖片。
另外,自己定義的device id,可以通過下命令來產生二維碼地址:
curl https://api.weixin.qq.com/device/create_qrcode?access_token=ACCESS_TOKEN -d "{\"device_num\":\"1\", \"device_id_list\":[\"device3\"]}"
上面的access_token和device3要換成自己的。
Curl命令一般在linux終端下使用比較方便,WINDOWS的自己查一下。
2.4 繫結裝置
二維碼圖片產生後,在微信掃一掃,就會跳出繫結介面,已綁過的除外。
點選繫結後,微信就會將device3與使用者的微號進行繫結,可以通除錯介面工具,在“查詢使用者繫結的裝置”中查到,
Openid是使用者微訊號,當用戶微信關注裝置後,可以在測試號介面裡的使用者列表上看到。
查詢使用者繫結的裝置”也可通過下面命令查到:
https://api.weixin.qq.com/device/get_bind_device?access_token=ACCESS_TOKEN&openid=微訊號
這裡的繫結,不是實際物理意義上的繫結,只是軟體的配置,並沒有形成實際的連線。在繫結後,進入公眾號,公眾號就才會根據它繫結的裝置去掃描,當找到對應的裝置後,才去連線。所以,如果沒有配置好繫結資訊,進入公眾號後是不會去連線裝置的。
另外,除了通過掃描裝置二維碼去繫結裝置,還可以通過HTTP介面來繫結裝置,這個可以參考下面2.6提到的強制繫結裝置。
至此,繫結裝置後就可以在公眾號裡連線BLE裝置,完成第一階段的握手,當然,資料的互發還得等第三方伺服器建好後。
2.5 裝置接入介面協議
可以看到,除錯工具的每個介面都有對應的http請求方式,這些請求方式,在《裝置接入介面協議V2.3.2》裡有詳細解釋,可以在http://iot.weixin.qq.com/wiki/new/index.html?page=6-1下載。
接入介面協議有涉及第三方伺服器介面,也有微信本身介面,下面做一下簡單導讀。
開啟文件後,翻到目錄,字首是“訊息介面”的,是微信發給第三方伺服器的,方式是向地址http://URL?signature=SIGNATURE×tamp=12345678&nonce=NONCE傳送一段格式如下的xml資料:
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%u</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<DeviceType><![CDATA[%s]]></DeviceType>
<DeviceID><![CDATA[%s]]></DeviceID>
<Content><![CDATA[%s]]></Content>
<SessionID>%lu</SessionID>
<MsgID>%lu</MsgID>
<OpenID><![CDATA[%s]]></OpenID>
</xml>
然後,第三伺服器也會迴應一段xml資料,格式如下:
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%u</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<DeviceType><![CDATA[%s]]></DeviceType>
<DeviceID><![CDATA[%s]]></DeviceID>
<SessionID>%u</SessionID>
<Content><![CDATA[%s]]></Content>
</xml>
在目錄中,字首為“API”的,是對微信進行操作的介面,比如配置微信,上面2.3、2.4提到的新增裝置、查詢繫結,以及通過微信往裝置發資料等。API方式,是請求微信的API地址,如果附帶有引數或資料,則發一段JSCON格式的資料,如獲取裝置二維碼:
curl https://api.weixin.qq.com/device/create_qrcode?access_token=ATOKEN -d
"{\"device_num\":\"2\", \"device_id_list\":[\"ID1\",\"ID2\"]}"
2.6 API除錯
除錯公眾號後臺,常用到的幾個API:
獲取ACCESS_TOKEN:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appID&secret=appsecret
appID和appsecret可以在測試號介面找到。
ACCESS_TOKEN是其他API的訪問令牌,有效期是2小時。
獲取裝置二維碼:
curl https://api.weixin.qq.com/device/create_qrcode?access_token=ACCESS_TOKEN -d "{\"device_num\":\"1\", \"device_id_list\":[\"device1\"]}"
device1是使用者自定義的裝置ID。
授權裝置:
curl https://api.weixin.qq.com/device/authorize_device?access_token=ACCESS_TOKEN -d '{"device_num": "1","device_list": [{"id": "device1", "mac": "f4e6f41549f2", "connect_protocol": "3","auth_key": "", "close_strategy": "1","connect_protocol": "3","conn_strategy": "1","crypt_method": "0","auth_ver": "0","manu_mac_pos": "-1","ser_mac_pos": "-2"}], "op_type": "1", "product_id": "6563"}'
各項引數在2.3有提到。
查詢使用者繫結的裝置:
https://api.weixin.qq.com/device/get_bind_device?access_token=ACCESS_TOKEN&openid=OPEN_ID
OPEN_ID是使用者的微訊號。查詢該微訊號已繫結的裝置。
強制繫結裝置
Curl https://api.weixin.qq.com/device/compel_bind?access_token=ACCESS_TOKEN -d ‘{"device_id": "device1","openid": "OPEN_ID"}’
device1是使用者自定義的裝置ID,OPEN_ID是使用者微訊號
強制解綁裝置
Curl https://api.weixin.qq.com/device/compel_unbind?access_token=ACCESS_TOKEN -d ‘{"device_id": "device1","openid": "OPEN_ID"}’
device1是使用者自定義的裝置ID,OPEN_ID是使用者微訊號