微信硬件藍牙開發指南

幾個基本要用的東西:
1、微信公衆平臺
網址:https://mp.weixin.qq.com
可以在此申請微信公衆號,獲取微信測試號。
微信測試號擁有所有功能權限,如果你有正式的企業服務號,就不必用測試號了。

2、微信JS-SDK說明文檔
網址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
到時候會引入一個JS文件,是用來調用微信提供的那些接口的

3、微信硬件平臺說明文檔
網址(新版):http://iot.weixin.qq.com/wiki/new/index.html
網址(舊版):http://iot.weixin.qq.com/wiki/index.html
新版和舊版唯一的區別是,新版沒有JS硬件API的說明頁(但可以在下載中心自己下載)
開始開發

1、首先,自己到微信公衆平臺申請一個微信公衆號,就選個人訂閱號。
2、登錄你的公衆號,進入公衆平臺管理頁,左邊最下面有個“開發者工具”。
3、點“開發者工具”,進去後找到“公衆平臺測試帳號”,自己按照步驟申請開通一個。
4、進入測試號管理頁面,就會得到:
原始ID:gh_xxxxxxxxxx (右上角顯示的,這個是微信原始ID,不是微信號)
(坑:微信原始ID 和 微信帳號不是同一個,微信帳號在之後都不會用到,用到的是原始ID)
appID:wxxxxxxxxxxxx (appID)
appsecret:xxxxxxxxxxxxxx (密鑰)
5、測試號管理頁面,下面找到“JS接口安全域名”,要配置成你們自己的服務器域名,後面有些微信API會返回數據,它會去匹配這個域名,如果不是指定的域名,會報錯。
6、繼續往下看,下面有個“體驗接口權限表”,在裏面找到“設備功能”,開通它
7、開通設備功能後,點右邊的“設置”,進入設備功能頁面
8、自己”添加產品”,隨便搞,連接類型勾選”藍牙”即可(添加完成後,該產品有個產品編號,後面設備授權時有用)

======= 以上是公衆平臺的配置,下面開始寫前端代碼 ======
1、新建HTML,基本結構寫好。
2、引入”http://res.wx.qq.com/open/js/jweixin-1.0.0.js“,這個JS

3、寫方法:

[javascript] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <code class="hljs d">wx.config({  
  2.     beta:true,                  //坑:這個很重要,必須配置這個爲true,才能調用微信的硬件API  
  3.     debug: false,               //是否開啓調試模式,會自動彈一些消息框顯示微信返回的數據  
  4.     appId: 這裏填寫appID,        //讓後臺返回appid  
  5.     timestamp: 時間戳,          //讓後臺返回生成證書時用的時間戳  
  6.     nonceStr: 隨機字符串,        //讓後臺返回生成證書時用的隨機串  
  7.     signature: 證書,            //讓後臺返回已當前URL地址生成的證書  
  8.     jsApiList: [                //需要調用的接口,都得在這裏面寫一遍  
  9.         "openWXDeviceLib",//初始化設備庫(只支持藍牙設備)  
  10.         "closeWXDeviceLib",//關閉設備庫(只支持藍牙設備)  
  11.         "getWXDeviceInfos",//獲取設備信息(獲取當前用戶已綁定的藍牙設備列表)  
  12.         "sendDataToWXDevice",//發送數據給設備  
  13.         "startScanWXDevice",//掃描設備(獲取周圍所有的設備列表,無論綁定還是未被綁定的設備都會掃描到)  
  14.         "stopScanWXDevice",//停止掃描設備  
  15.         "connectWXDevice",//連接設備  
  16.         "disconnectWXDevice",//斷開設備連接  
  17.         "getWXDeviceTicket",//獲取操作憑證  
  18.    
  19.         //下面是監聽事件:  
  20.         "onWXDeviceBindStateChange",//微信客戶端設備綁定狀態被改變時觸發此事件  
  21.         "onWXDeviceStateChange",//監聽連接狀態,可以監聽連接中、連接上、連接斷開  
  22.         "onReceiveDataFromWXDevice",//接收到來自設備的數據時觸發  
  23.         "onScanWXDeviceResult",//掃描到某個設備時觸發  
  24.         "onWXDeviceBluetoothStateChange",//手機藍牙打開或關閉時觸發  
  25.     ]  
  26. });</code>  
上面這個方法,在進入頁面時應該首先被調用,這是初始化微信JS-SDK
其中:
beta 這個參數需設爲true,才能調用那些微信還沒有正式開放的新接口
appID,timestamp,nonceStr,signature這幾個由後臺傳遞到前端。
生成證書的方法JS-SDK文檔中有,此處暫時省略

4:繼續寫方法

[javascript] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <code class="hljs javascript">wx.ready(function(){  
  2.     //初始化設備庫 需填寫參數 公衆號的原始ID  
  3.     wx.invoke('openWXDeviceLib', {'brandUserName':'gh_xxxxxxxxxx'}, function(res){  
  4.         //自己把res輸出來看一下吧,裏面包括了是否初始化成功,當前手機的藍牙狀態等信息  
  5.         //這裏有個坑,當時研究了好久,跟論壇裏的人討論了半天,就是IOS下正常,  
  6.         //安卓下,請帶上這個參數:brandUserName:後面是你公衆號的原始ID。不然會初始化失敗  
  7.         //正式的公衆號,也有原始ID,是gh_開頭的那個,進入公衆號,自己找一下吧,有的  
  8.         //測試號,就用測試號管理頁面右上角的那個gh_開頭的那一串數字  
  9.     });  
  10.    
  11.         //手機藍牙狀態改變時觸發 (這是監聽事件的調用方法,注意,監聽事件都沒有參數)  
  12.         wx.on('onWXDeviceBluetoothStateChange',function(res){  
  13.                 //把res輸出來看吧  
  14.         });  
  15.    
  16.         //設備綁定狀態改變事件(解綁成功,綁定成功的瞬間,會觸發)  
  17.         wx.on('onWXDeviceBindStateChange',function(res){  
  18.                 //把res輸出來看吧  
  19.         });  
  20.    
  21.         //設備連接狀態改變  
  22.         wx.on('onWXDeviceStateChange',function(res){  
  23.             //有3個狀態:connecting連接中,connected已連接,unconnected未連接  
  24.             //每當手機和設備之間的狀態改變的瞬間,會觸發一次  
  25.         });  
  26.    
  27.         //接收到設備傳來的數據  
  28.         wx.on('onReceiveDataFromWXDevice',function(res){  
  29.                 //接收到的原始數據:JSON.stringify(res)  
  30.                 //自己去百度下載一個jbase64.js,可以對字符串進行base64編碼解碼  
  31.                 //這裏就是用的jbase64.js對原始數據進行解碼  
  32.                 var unicode= BASE64.decoder(res.base64Data);  
  33.                 var str = '';    
  34.                 for(var i = 0 , len =  unicode.length ; i < len ;++i){    
  35.                          str += String.fromCharCode(unicode[i]);    
  36.                 }  
  37.                 //解碼後的數據:str  
  38.                 //坑:你們測試的時候,不要在這裏用alert(),頁面會卡死。自己把信息輸出到頁面中查看吧  
  39.                 //不要在這裏alert出來  
  40.             });  
  41.         });</code>  


5、繼續寫方法:

[javascript] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <code class="hljs javascript">wx.error(function(res){  
  2.     alert("wx.error錯誤:"+JSON.stringify(res));  
  3.     //如果初始化出錯了會調用此方法,沒什麼特別要注意的  
  4. });</code>  
6、掃描設備:
(是通過手機掃描附近的設備,得到設備的deviceid,然後進行綁定,不是用戶掃描二維碼進行綁定,所以這裏介紹掃描設備的過程)

[javascript] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <code class="hljs javascript">//掃描前請先監聽設備掃描事件  
  2. wx.on('onScanWXDeviceResult',function(res){  
  3.     alert("掃描到1個設備");  
  4.     //自己解析一下res,裏面會有deviceid,掃描設備的目的就是爲了得到這個  
  5.     //然後就可以開始綁定了  
  6. }  
  7.    
  8. //開始掃描  
  9. wx.invoke("startScanWXDevice",{"btVersion":"ble"},function(res){});  
  10. //這裏填的參數是ble,也可以填bc,bc是經典藍牙, 
  11. //安卓系統不能同時支持bel和bc,這個後面詳細說一下  
  12. //執行此方法後,就開始一直不停的掃描,掃描到了設備會觸發上面的監聽事件  
  13.    
  14. //如果不想掃了,可以停止掃描  
  15. wx.invoke("stopScanWXDevice",{},function(res){});</code>  

7、綁定和解除綁定

[javascript] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <code class="hljs r">//用戶綁定設備  
  2. //1、先獲取操作憑證(type爲1表示綁定,2表示解除綁定)  
  3. wx.invoke('getWXDeviceTicket',{"deviceId":"填寫設備的deviceID","type":1},function(res){  
  4.     if(res.err_msg !="getWXDeviceTicket:ok"){  
  5.             alert("獲取操作憑證失敗,請重試");    
  6.             return;  
  7.     }else{  
  8.         //2.將deviceID和操作憑證通過ajax傳給後臺 進行綁定     
  9.         //後臺應該是有當前用戶的openId的,其實前端也可以獲取到,但比較麻煩  
  10.         //我們這邊的做法是,後臺在數據庫裏保存了用戶的openId,每次要用直接從數據庫拿  
  11.         //就不用每次還去調微信的接口拿,太麻煩了  
  12.         //...此處ajax代碼略        
  13.     }  
  14. });  
  15.    
  16. //用戶解除綁定  
  17. //與上面的方法基本相同,只有type參數不同  
  18. wx.invoke('getWXDeviceTicket',{"deviceId":"填寫設備的deviceID","type":2},function(res){  
  19.     if(res.err_msg !="getWXDeviceTicket:ok"){  
  20.             alert("獲取操作憑證失敗,請重試");    
  21.             return;  
  22.     }else{  
  23.         //2.將deviceID和操作憑證通過ajax傳給後臺 進行綁定     
  24.         ...代碼略        
  25.     }  
  26. });</code>  

8、向設備發送數據

[javascript] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <code class="hljs javascript">wx.invoke('sendDataToWXDevice', {'deviceId':dev,"base64Data":BASE64.encoder(str)}, function(res){  
  2.     if(res.err_msg =="sendDataToWXDevice:ok"){  
  3.             alert("數據已發送");  
  4.     }else{  
  5.             alert("數據發送失敗");  
  6.     }  
  7. });  
  8. //發送的數據需要經過base64編碼</code>  

以上是前端頁面中,基本就這些代碼

在寫前端頁面時候,後端需要對設備進行授權,
當用戶綁定了設備後,微信會不停的嘗試連接設備,所以其實不用程序員寫代碼去連接設備。

下面來說一下遇到的各種坑:(上面內容中提到的就不說了)
1、開發流程:
①、硬件廠商,他們只要得到了設備的mac地址,就可以開始授權了(好像只要有藍牙板子,就有mac地址了)。
②、然後再開始生產設備
③、然後才賣給用戶
④、用戶關注公衆號,掃描設備(如果用的二維碼方式,那就是掃二維碼。我們沒有用二維碼那種方式)
⑤、用戶綁定設備
⑥、微信自動連接設備
⑦、連接上後,就可以收發數據了

2、關於授權:
我們用的授權新接口,即不需要廠商提供deviceid,由微信分配deviceid
然後是授權時的那些參數:
product_id:就是你之前“添加設備”後,就會得到那個編號
connect_protocol:連接協議
只能填3,或者只能填1.你別弄成:3|1,
下面寫了,安卓設備不能同時支持ble和經典藍牙
iOS一切正常,但是填成3|1,你就發現安卓的ble藍牙調用“getWXDeviceInfos”(獲取設備信息),獲取不到!
如果用戶的手機是經典藍牙,你就寫一個html頁面,搞個按鈕叫“刷成經典藍牙”,用戶可以自己去更新設備屬性(就是授權那個地方,不是可以更新設備屬性嗎,讓你們後臺工程師寫個接口,用戶可以自己去把connect_protocol刷成1)

3、IOS連接設備很快很穩定,安卓連不上設備,顯示“已連接0個設備”:
在微信硬件平臺的文檔裏面的某個地方,有一句話,說安卓設備要先訂閱個什麼東西,訂閱上了,這個時候再連接就OK,因爲設備只發了一次Auth和Init包,如果錯過這個時機,就錯過了…就再也連不上了,除非設備斷電重啓。
但IOS估計是訂閱那個什麼東西非常快,不會過期,所以一下就連上了。

4、關於設備向手機發數據:
設備發的數據,裏面有兩個值,一個代表包括包頭包尾的總長度,一個代表除去包頭包尾的長度,必須與所發數據的實際情況相對應,HTML頁面中才能接收到。否則不報錯,但也接收不到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章