1. 程式人生 > >轉載微信硬體藍芽開發各種坑不完全開發指南

轉載微信硬體藍芽開發各種坑不完全開發指南

原文地址:http://m.blog.csdn.net/article/details?id=51163000  轉載

幾個基本要用的東西:
1、微信公眾平臺
網址:https://mp.weixin.qq.com
申請微信公眾號,獲取微信測試號。

– 開始開發 –

1、首先到微信公眾平臺申請微信公眾號,就選個人訂閱號。
2、登入你的公眾號,進入公眾平臺管理頁,左邊最下面有個“開發者工具”。
3、點“開發者工具”,進去後找到“公眾平臺測試帳號”,自己按照步驟申請開通一個。
4、進入測試號管理頁面,就會得到:

原始ID:gh_xxxxxxxxxx (右上角顯示的,這個是微信原始ID,不是微訊號)
(坑:微信原始ID 和 微信帳號不是同一個,微信帳號在之後都不會用到,用到的是原始ID)


appID:wxxxxxxxxxxxx (appID)
appsecret:xxxxxxxxxxxxxx (金鑰)

5、測試號管理頁面,下面找到“JS介面安全域名”,要配置成你們自己的伺服器域名,後面有些微信API會返回資料,它會去匹配這個域名,如果不是指定的域名,會報錯。
6、繼續往下看,下面有個“體驗介面許可權表”,在裡面找到“裝置功能”,開通它
7、開通裝置功能後,點右邊的“設定”,進入裝置功能頁面
8、自己”新增產品”,隨便搞,連線型別勾選”藍芽”即可(新增完成後,該產品有個產品編號,後面裝置授權時有用)

======= 以上是公眾平臺的配置,下面開始寫前端程式碼 ======

wx.config({
    beta:true
, //坑:這個很重要,必須配置這個為true,才能呼叫微信的硬體API debug: false, //是否開啟除錯模式,會自動彈一些訊息框顯示微信返回的資料 appId: 這裡填寫appID, //讓後臺返回appid timestamp: 時間戳, //讓後臺返回生成證書時用的時間戳 nonceStr: 隨機字串, //讓後臺返回生成證書時用的隨機串 signature: 證書, //讓後臺返回以當前URL地址生成的證書 jsApiList: [ //需要呼叫的介面,都得在這裡面寫一遍
"openWXDeviceLib",//初始化裝置庫(只支援藍芽裝置) "closeWXDeviceLib",//關閉裝置庫(只支援藍芽裝置) "getWXDeviceInfos",//獲取裝置資訊(獲取當前使用者已繫結的藍芽裝置列表) "sendDataToWXDevice",//傳送資料給裝置 "startScanWXDevice",//掃描裝置(獲取周圍所有的裝置列表,無論繫結還是未被繫結的裝置都會掃描到) "stopScanWXDevice",//停止掃描裝置 "connectWXDevice",//連線裝置 "disconnectWXDevice",//斷開裝置連線 "getWXDeviceTicket",//獲取操作憑證 //下面是監聽事件: "onWXDeviceBindStateChange",//微信客戶端裝置繫結狀態被改變時觸發此事件 "onWXDeviceStateChange",//監聽連線狀態,可以監聽連線中、連線上、連線斷開 "onReceiveDataFromWXDevice",//接收到來自裝置的資料時觸發 "onScanWXDeviceResult",//掃描到某個裝置時觸發 "onWXDeviceBluetoothStateChange",//手機藍芽開啟或關閉時觸發 ] });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

上面這個方法,在進入頁面時應該首先被呼叫,這是初始化微信JS-SDK
其中:
beta 這個引數需設為true,才能呼叫那些微信還沒有正式開放的新介面
appID,timestamp,nonceStr,signature這幾個由後臺傳遞到前端。
生成證書的方法JS-SDK文件中有,此處暫時省略

4、繼續寫方法:

wx.ready(function(){
    //初始化裝置庫 需填寫引數 公眾號的原始ID
    wx.invoke('openWXDeviceLib', {'brandUserName':'gh_xxxxxxxxxx'}, function(res){
        //自己把res輸出來看一下吧,裡面包括了是否初始化成功,當前手機的藍芽狀態等資訊
        //這裡有個坑,當時研究了好久,跟論壇裡的人討論了半天,就是IOS下正常,
        //安卓下,請帶上這個引數:brandUserName:後面是你公眾號的原始ID。不然會初始化失敗
        //正式的公眾號,也有原始ID,是gh_開頭的那個,進入公眾號,自己找一下吧,有的
        //測試號,就用測試號管理頁面右上角的那個gh_開頭的那一串數字
    });

    //手機藍芽狀態改變時觸發 (這是監聽事件的呼叫方法,注意,監聽事件都沒有引數)
    wx.on('onWXDeviceBluetoothStateChange',function(res){
            //把res輸出來看吧
    });

    //裝置繫結狀態改變事件(解綁成功,繫結成功的瞬間,會觸發)
    wx.on('onWXDeviceBindStateChange',function(res){
            //把res輸出來看吧
    });

    //裝置連線狀態改變
    wx.on('onWXDeviceStateChange',function(res){
        //有3個狀態:connecting連線中,connected已連線,unconnected未連線
        //每當手機和裝置之間的狀態改變的瞬間,會觸發一次
    });

    //接收到裝置傳來的資料
    wx.on('onReceiveDataFromWXDevice',function(res){
        //接收到的原始資料:JSON.stringify(res)
        //自己去百度下載一個jbase64.js,可以對字串進行base64編碼解碼
        //這裡就是用的jbase64.js對原始資料進行解碼
        var unicode= BASE64.decoder(res.base64Data);
        var str = '';  
        for(var i = 0 , len =  unicode.length ; i < len ;++i){  
                 str += String.fromCharCode(unicode[i]);  
        }
        //解碼後的資料:str
        //坑:你們測試的時候,不要在這裡用alert(),頁面會卡死。自己把資訊輸出到頁面中檢視吧
        //不要在這裡alert出來
    });
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

5、繼續寫方法:

wx.error(function(res){
    alert("wx.error錯誤:"+JSON.stringify(res));
    //如果初始化出錯了會呼叫此方法,沒什麼特別要注意的
});
  • 1
  • 2
  • 3
  • 4

6、掃描裝置:
(我做的那個專案,是通過手機掃描附近的裝置,得到裝置的deviceid,然後進行繫結,不是使用者掃描二維碼進行繫結,所以這裡介紹掃描裝置的過程)

//掃描前請先監聽裝置掃描事件
wx.on('onScanWXDeviceResult',function(res){
    alert("掃描到1個裝置");
    //自己解析一下res,裡面會有deviceid,掃描裝置的目的就是為了得到這個
    //然後就可以開始綁定了
}

//開始掃描
wx.invoke("startScanWXDevice",{"btVersion":"ble"},function(res){});
//這裡填的引數是ble,也可以填bc,bc是經典藍芽,我們做的這個裝置不支援經典藍芽,所以直接填ble
//安卓系統不能同時支援ble和bc,這個後面詳細說一下
//執行此方法後,就開始一直不停的掃描,掃描到了裝置會觸發上面的監聽事件

//如果不想掃了,可以停止掃描
//然而經測試,這個方法並沒有什麼卵用
//你發現重新掃描根本什麼都掃不出來,即使你現在重新整理頁面,也掃不出任何東西
//解決方法:每次掃描前,先呼叫closeWXDeviceLib關閉裝置庫,再呼叫openWXDeviceLib開啟裝置庫
//這樣就相當於重新初始化了一遍裝置庫,你現在再重新掃描,就可以掃描到裝置了。
wx.invoke("stopScanWXDevice",{},function(res){});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

7、繫結和解除繫結

//使用者繫結裝置
//1、先獲取操作憑證(type為1表示繫結,2表示解除繫結)
wx.invoke('getWXDeviceTicket',{"deviceId":"填寫裝置的deviceID","type":1},function(res){
    if(res.err_msg !="getWXDeviceTicket:ok"){
            alert("獲取操作憑證失敗,請重試");  
            return;
    }else{
        //2.將deviceID和操作憑證通過ajax傳給後臺 進行繫結   
        //後臺應該是有當前使用者的openId的,其實前端也可以獲取到,但比較麻煩
        //我們這邊的做法是,後臺在資料庫裡儲存了使用者的openId,每次要用直接從資料庫拿
        //就不用每次還去調微信的介面拿,太麻煩了
        //...此處ajax程式碼略      
    }
});

//使用者解除繫結
//與上面的方法基本相同,只有type引數不同
wx.invoke('getWXDeviceTicket',{"deviceId":"填寫裝置的deviceID","type":2},function(res){
    if(res.err_msg !="getWXDeviceTicket:ok"){
            alert("獲取操作憑證失敗,請重試");  
            return;
    }else{
        //2.將deviceID和操作憑證通過ajax傳給後臺 進行繫結   
        ...程式碼略      
    }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

8、向裝置傳送資料

wx.invoke('sendDataToWXDevice', {'deviceId':dev,"base64Data":BASE64.encoder(str)}, function(res){
    if(res.err_msg =="sendDataToWXDevice:ok"){
            alert("資料已傳送");
    }else{
            alert("資料傳送失敗");
    }
});
//傳送的資料需要經過base64編碼
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

以上是前端頁面中,基本就這些程式碼
當用戶綁定了裝置後,微信會不停的嘗試連線裝置,所以其實不用程式設計師寫程式碼去連線裝置。

下面來說一下遇到的各種坑:(上面內容中提到的就不說了)
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估計是訂閱那個什麼東西非常快,不會過期,所以一下就連上了。

那句話具體在什麼地方,我真的找不到了,微信太坑了。
目前的解決辦法:藍牙板子是有相關介面的,藍牙板子可以得到當前手機的連線狀態。所以如果當前微信顯示的是“正在連線中…”,這個時候,讓硬體開發人員再發送Auth和Init包。

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

5、繼續補充中