欧美做暖暖视频_青青草精品视频在线观看_日本一二三四区视频_538在线视频观看_亚洲中文字幕无码专区_国产一区二区三区播放_粉色视频免费看_www.18av.com_91日韩视频在线观看_日韩中文字幕二区_国产精品50p_色片在线免费观看

歡迎光臨~深圳市山星盛電子科技有限公司-稱重產品官方展示網站
服務熱線 全國服務熱線:

0755-2979 1990

您的位置: 網站首頁 > 新聞資訊

新聞資訊

電子磅秤稱重設備 藍牙低功率對接微信小程序之藍牙 BLE 踩坑記錄

前段時間接手了一個微信小程序的開發,主要使用了小程序在今年 3 月開放的藍牙 API ,此過程踩坑無數,特此記錄一下跳坑過程。順便開了另一個相關的小項目,歡迎 start 和 fork: BLE_MiniProgram

API簡介

微信小程序目前有藍牙 API 共 18 個,其中操作藍牙適配器的共有 4 個,分別是

wx.openBluetoothAdapter 初始化藍牙適配器wx.closeBluetoothAdapter 關閉藍牙模塊wx.getBluetoothAdapterState 獲取本機藍牙適配器狀態wx.onBluetoothAdapterStateChange 監聽藍牙適配器狀態變化事件

連接前使用的共有 4 個,分別是

wx.startBluetoothDevicesDiscovery 開始搜尋附近的藍牙外圍設備wx.stopBluetoothDevicesDiscovery 停止搜尋附近的藍牙外圍設備wx.getBluetoothDevices 獲取所有已發現的藍牙設備wx.onBluetoothDeviceFound 監聽尋找到新設備的事件

連接和斷開時使用的共有 2 個,分別是

wx.createBLEConnection 連接低功耗藍牙設備wx.closeBLEConnection 斷開與低功耗藍牙設備的連接

連接成功后使用的共有 8 個,分別是

wx.getConnectedBluetoothDevices 根據 uuid 獲取處于已連接狀態的設備wx.getBLEDeviceServices 獲取藍牙設備所有 service(服務)wx.getBLEDeviceCharacteristics  獲取藍牙設備所有 characteristic(特征值)wx.readBLECharacteristicValue  讀取低功耗藍牙設備的特征值的二進制數據值wx.writeBLECharacteristicValue 向低功耗藍牙設備特征值中寫入二進制數據wx.notifyBLECharacteristicValueChange  啟用低功耗藍牙設備特征值變化時的 notify 功能wx.onBLECharacteristicValueChange 監聽低功耗藍牙設備的特征值變化wx.onBLEConnectionStateChange 監聽低功耗藍牙連接的錯誤事件

基本操作流程

最基本的操作流程是:初始化藍牙適配器→開始搜尋附近的藍牙外圍設備→監聽尋找到新設備的事件→連接低功耗藍牙設備→獲取藍牙設備所有 service 和 characteristic →讀取或寫入低功耗藍牙設備的特征值的二進制數據值。

踩過的幾個坑

支持藍牙 API 的版本

Android 從微信 6.5.7 開始支持,iOS 從微信 6.5.6 開始支持,因此小程序中需要做好版本檢測,在 app.js 文件中加入以下代碼,其中 wx.getSystemInfoSync 是一個獲取系統信息的API。

onLaunch: function() {    this.globalData.sysinfo = wx.getSystemInfoSync()
},getModel: function () { //獲取手機型號
    return this.globalData.sysinfo["model"]
},getVersion: function () { //獲取微信版本號
    return this.globalData.sysinfo["version"]
},getSystem: function () { //獲取操作系統版本
    return this.globalData.sysinfo["system"]
},getPlatform: function () { //獲取客戶端平臺
    return this.globalData.sysinfo["platform"]
},getSDKVersion: function () { //獲取客戶端基礎庫版本
    return this.globalData.sysinfo["SDKVersion"]
}

在初始頁面(一般是 index.wxml)對應的 js 文件中使用 app.getPlatform() 和 app.getVersion() 即可獲取到客戶端平臺(安卓或 iOS)和微信版本號。在onLoad中獲取這兩個信息后進行比較即可,使用了下面的版本比較方法。

versionCompare: function (ver1, ver2) { //版本比較
    var version1pre = parseFloat(ver1)    var version2pre = parseFloat(ver2)    var version1next = parseInt(ver1.replace(version1pre + ".", ""))    var version2next = parseInt(ver2.replace(version2pre + ".", ""))    if (version1pre > version2pre)        return true
    else if (version1pre < version2pre) 
        return false
    else {        if (version1next > version2next)            return true
        else
            return false
    }
}
if (app.getPlatform() == 'android' && this.versionCompare('6.5.7', app.getVersion())) {    wx.showModal({        title: '提示',        content: '當前微信版本過低,請更新至最新版本',        showCancel: false
    })
}
else if (app.getPlatform() == 'ios' && this.versionCompare('6.5.6', app.getVersion())) {    wx.showModal({        title: '提示',        content: '當前微信版本過低,請更新至最新版本',        showCancel: false
    })
}

安卓 6.0 及以上設備需打開定位服務

在測試中發現安卓 6.0 以上的手機未打開系統定位服務時,搜索不到藍牙設備,因此最好在頁面中提示用戶打開定位服務。

wx.onBluetoothDeviceFound 不兼容

安卓及iOS設備使用 wx.onBluetoothDeviceFound 時會出現不同的返回值,且有概率出現重復設備,所以使用以下代碼可以清除重復的設備和解決 API 不兼容問題。

wx.onBluetoothDeviceFound(function (devices) {    var isnotExist = true
    if (devices.deviceId) {        for (var i = 0; i < foundDevice.length; i ++) {            if (devices.deviceId == foundDevice[i].deviceId) {
                isnotExist = false
            }
        }        if (isnotexist)
            foundDevice.push(devices)
    }    else if (devices.devices) {        for (var i = 0; i < foundDevice.length; i++) {            if (devices.devices[0].deviceId == foundDevice[i].deviceId) {
                isnotExist = false
            }
        }        if (isnotexist)
            foundDevice.push(devices.devices[0])
    }    else if (devices[0]) {        for (var i = 0; i < foundDevice.length; i++) {            if (devices[0].deviceId == foundDevice[i].deviceId) {
                isnotExist = false
            }
        }        if (isnotexist)
            foundDevice.push(devices[0])
    }
})

讀取廣播數據和特征值

小程序中讀取 BLE 廣播數據使用 wx.onBluetoothDeviceFound 接口中的 advertisData,對應上面兼容問題的 devices 格式,如 devices.advertisData,這個數據是 ArrayBuffer,需要轉換,可以使用以下兩種轉換方法。另外 wx.getBLEDeviceCharacteristics 讀取的特征值 characteristic.value 也是 ArrayBuffer,用同樣的方法轉換。

buf2string: function (buffer) {    var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)    var str = ''
    for (var i = 0; i < arr.length; i++) {
      str += String.fromCharCode(arr[i])
    }    return str
}
buf2hex: function (buffer) {    return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

發送大于 20 字節的數據包

眾所周知,BLE 4.0 中發送一個數據包只能包含 20 字節的數據,大于 20 字節只能分包發送。微信小程序提供的 API 中似乎沒有自動分包的功能,這就只能自己手動分包了。調試中發現,在 iOS 系統中調用 wx.writeBLECharacteristicValue 發送數據包,回調 success 后緊接著發送下一個數據包,很少出現問題,可以很快全部發送完畢。而安卓系統中,發送一個數據包成功后緊接著發送下一個,很大概率會出現發送失敗的情況,在中間稍做延時再發送下一個就可以解決這個問題(不同安卓手機的時間長短也不一致),照顧下一些比較奇葩的手機,大概需要延時 250 ms 。不太好的但是比較科學的辦法是,只要成功發送一個數據包則發送下一個,否則不斷重發,具體就是
wx.writeBLECharacteristicValue 回調 fail 則重新發送,直至發送完畢。

補充說明

此處補充說明一下,華為榮耀部分機型、還有藍綠廠的部分機型,在藍牙 API 有深坑,謹慎調試。另:發現挺多同學沒有注意到官方文檔最下方的錯誤碼列表,順便在此處貼出來。

藍牙錯誤碼 (errCode) 列表

錯誤碼說明備注
0ok正常
10000not init未初始化藍牙適配器
10001not available當前藍牙適配器不可用
10002no device沒有找到指定設備
10003connection fail連接失敗
10004no service沒有找到指定服務
10005no characteristic沒有找到指定特征值
10006no connection當前連接已斷開
10007property not support當前特征值不支持此操作
10008system error其余所有系統上報的異常
10009system not supportAndroid 系統特有,系統版本低于 4.3 不支持BLE


用手機掃描二維碼關閉
二維碼
欧美做暖暖视频_青青草精品视频在线观看_日本一二三四区视频_538在线视频观看_亚洲中文字幕无码专区_国产一区二区三区播放_粉色视频免费看_www.18av.com_91日韩视频在线观看_日韩中文字幕二区_国产精品50p_色片在线免费观看
成人久久久久| 亚洲综合不卡| 精品国产美女a久久9999| 久久久久中文| 麻豆久久久久久久| 在线观看视频免费一区二区三区| 国产精品亚洲综合色区韩国| 一区二区精品伦理...| 欧美一级久久| 亚洲精品一二| 亚洲欧美视频一区二区三区 | 日韩专区在线视频| 国产乱码午夜在线视频| 国产欧美一区二区三区米奇| 石原莉奈一区二区三区在线观看| 99视频精品全国免费| 精品午夜视频| 精品欧美视频| 国产精品中文| 欧美日本不卡高清| 好吊一区二区三区| 亚洲天堂黄色| 亚洲高清毛片| 夜久久久久久| 精品日韩毛片| 婷婷久久免费视频| 91久久视频| 红桃视频国产精品| 国产亚洲精品v| 亚洲一区二区小说| 日韩一区免费| 国产欧美日韩一级| 久久av电影| 精品三级在线| 国产 日韩 欧美一区| 高清一区二区三区| 日韩久久精品网| 五月婷婷六月综合| 中文字幕一区日韩精品| 欧美有码在线| 日韩一区二区中文| 亚洲精品1区2区| 日韩中文字幕一区二区高清99| 亚洲区欧美区| 久久中文精品| 亚洲夜间福利| 亚洲性视频在线| 美女久久精品| 激情久久中文字幕| 综合欧美亚洲| 国产欧美日韩影院| 不卡一二三区| 亚洲毛片在线| 97精品中文字幕| 中文在线一区| 国产精品多人| 99国产精品久久久久久久| 日本中文字幕不卡| 亚洲精品福利电影| 综合激情在线| 亚洲韩日在线| 国产麻豆一区二区三区| 久久精品官网| 亚洲免费影院| 日本一区二区免费高清| 亚洲一区欧美激情| 日韩不卡一区| 日韩精品一级中文字幕精品视频免费观看 | 国产精品毛片久久久| caoporn视频在线| 久久精品国内一区二区三区水蜜桃| 欧美午夜不卡| 美女精品视频在线| 久久高清免费观看| 久久只有精品| 国产精品女主播一区二区三区| 亚洲日韩中文字幕一区| 伊人久久国产| 欧美一级网站| 国产亚洲午夜| 日韩精品亚洲专区| 99视频一区| 国产videos久久| 视频一区二区三区中文字幕| 精品久久精品| 亚洲一区二区三区免费在线观看| 精品国产欧美日韩| 青草综合视频| 亚洲国产不卡| 另类中文字幕国产精品| 欧美在线看片| 西西人体一区二区| 午夜精品久久久久久久久久蜜桃| 日韩精品导航| 精品91久久久久| 国产99精品一区| 精品高清久久| 国产伦乱精品| 视频一区欧美日韩| 欧美~级网站不卡| 精品国产一区二区三区2021| 日韩av在线免费观看不卡| 亚洲一区二区三区高清| 欧美不卡在线| 日韩中文在线播放| 日韩一区二区中文| 久久一区视频| 亚洲一区二区三区四区电影| 久久精品免费一区二区三区| 日韩精品电影| 三上悠亚国产精品一区二区三区| 日韩精品中文字幕吗一区二区| 黄色不卡一区| 99国产精品99久久久久久粉嫩| 婷婷久久一区| 日韩国产专区| 秋霞国产精品| 99视频精品免费观看| 亚洲美洲欧洲综合国产一区| 好看的av在线不卡观看| 欧美日韩国产探花| 欧美精品一卡| 日韩专区在线视频| 国产日韩三级| 正在播放日韩精品| 999久久久91| 中文不卡在线| 美女视频黄久久| 91欧美国产| 久久中文亚洲字幕| 91精品国产乱码久久久久久久| 91精品国产福利在线观看麻豆| 精品捆绑调教一区二区三区| 婷婷久久一区| 中文字幕中文字幕精品| 国产精品v日韩精品v欧美精品网站| 国产精品久久| 欧美aa在线观看| 一区免费在线| 国产亚洲一卡2卡3卡4卡新区| 超碰99在线| 亚洲专区欧美专区| 久久香蕉精品香蕉| 欧美在线资源| 国产一区二区三区久久| 99精品在线免费在线观看| 激情久久婷婷| 欧美一区=区三区| 在线中文字幕播放| 久热re这里精品视频在线6| 欧美日韩一区二区三区在线电影| 国产不卡精品在线| 丝袜美腿亚洲一区二区图片| 国产麻豆一区| 9色精品在线| 国产资源在线观看入口av| av不卡在线看| 国产福利亚洲| 老司机精品久久| 国产成人黄色| 日本在线不卡视频| 日韩国产欧美一区二区| 日韩精品三级| av亚洲在线观看| 久久久久黄色| 日本免费在线视频不卡一不卡二| 久久香蕉国产| 国产videos久久| 国产精品1区在线| 久久最新视频| 米奇777超碰欧美日韩亚洲| 国精品产品一区| 青青草国产成人99久久| 久久中文视频| 国产美女高潮在线观看| 欧美亚洲综合视频| 欧美日韩少妇| 激情六月综合| 亚洲精品.com| 亚洲精品在线影院| 麻豆91在线播放| 日韩1区2区日韩1区2区| 美女久久久久| 色爱av综合网| 亚洲性色av| 中文在线中文资源| 美女高潮久久久| 美女视频黄 久久| 老司机精品视频网| 欧美国产一级| 99视频精品全国免费| 国产精品99在线观看| 丰满少妇一区| а√天堂8资源在线| 精品国产欧美日韩| 91欧美在线| 午夜欧美巨大性欧美巨大| 麻豆理论在线观看| av一区在线| 黄色亚洲精品|