一级女人毛片人一女人-一级女性大黄生活片免费-一级女性全黄久久生活片-一级女性全黄生活片免费-国产美女在线一区二区三区-国产美女在线观看

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

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


用手機掃描二維碼關閉
二維碼
日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产视频一区二区在线播放| 国产不卡在线播放| 99色视频在线观看| 99色吧| 99久久网站| 999久久狠狠免费精品| 九九精品在线播放| 青青久久精品| 91麻豆精品国产高清在线| 一级女性全黄生活片免费| 久久99爰这里有精品国产| 欧美另类videosbestsex高清| 一级女性全黄生活片免费| 久草免费在线视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 黄色福利片| 久久成人综合网| 99久久精品费精品国产一区二区| 亚州视频一区二区| 99久久精品国产高清一区二区| 欧美18性精品| 可以免费在线看黄的网站| 日本特黄特色aaa大片免费| 欧美另类videosbestsex| 日韩中文字幕在线播放| 日韩在线观看网站| 成人免费网站久久久| 久久久久久久免费视频| 二级片在线观看| 久久久久久久免费视频| 久久成人性色生活片| 欧美激情中文字幕一区二区| 一级毛片看真人在线视频| 精品久久久久久中文字幕一区| 欧美日本免费| 天天做人人爱夜夜爽2020| 91麻豆精品国产自产在线| 国产伦久视频免费观看视频| 欧美大片一区| 亚洲女初尝黑人巨高清在线观看| 国产视频一区二区在线播放| 亚洲第一页色| 91麻豆精品国产自产在线| 精品久久久久久综合网| 久草免费资源| 免费国产在线视频| 精品久久久久久中文字幕2017| 欧美激情伊人| 色综合久久久久综合体桃花网| 欧美激情伊人| 色综合久久久久综合体桃花网| 国产原创中文字幕| 亚洲精品久久玖玖玖玖| 精品视频在线看| 日日日夜夜操| 午夜久久网| 国产成人女人在线视频观看| 国产一区二区精品久久91| 亚洲精品影院久久久久久| 在线观看成人网| 一级毛片视频在线观看| 精品视频免费在线| 在线观看成人网| 久久国产一区二区| 九九国产| 精品久久久久久中文字幕2017| 可以免费在线看黄的网站| 精品视频在线看 | 日韩免费在线视频| 欧美大片aaaa一级毛片| 成人高清免费| 青草国产在线观看| 精品视频在线观看一区二区| 黄视频网站在线观看| 日韩中文字幕一区二区不卡| 精品视频在线看 | 欧美另类videosbestsex视频 | a级精品九九九大片免费看| 91麻豆精品国产自产在线 | 日韩一级黄色| 亚欧成人乱码一区二区| 尤物视频网站在线| 精品国产香蕉在线播出| 国产麻豆精品视频| 精品视频在线看| 欧美激情一区二区三区中文字幕| 精品久久久久久中文| 国产国语在线播放视频| 91麻豆tv| 一级女性全黄生活片免费| 精品视频在线观看免费 | 国产国语在线播放视频| 欧美爱爱动态| 成人高清视频免费观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚洲天堂免费| 韩国毛片免费大片| 国产成a人片在线观看视频 | 国产成人精品影视| 97视频免费在线观看| 99色视频在线| 免费一级片在线| 美国一区二区三区| 久久精品成人一区二区三区| 欧美国产日韩精品| 日韩中文字幕在线亚洲一区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 亚洲精品久久玖玖玖玖| 免费国产在线观看| 99热热久久| 麻豆午夜视频| 日本在线不卡免费视频一区| 国产成人精品影视| 99久久精品国产免费| 国产麻豆精品高清在线播放| 日韩中文字幕一区二区不卡| 日本在线不卡免费视频一区| 深夜做爰性大片中文| 午夜欧美成人久久久久久| 国产伦精品一区二区三区在线观看 | 韩国三级视频在线观看| 一级毛片视频免费| 久久国产精品只做精品| 亚洲女人国产香蕉久久精品| 国产美女在线一区二区三区| 韩国毛片| 国产一区免费观看| 一级毛片视频播放| 成人影院一区二区三区| 日本伦理网站| 精品在线免费播放| 高清一级做a爱过程不卡视频| 美女免费精品高清毛片在线视| 一级毛片视频在线观看| 日韩在线观看免费| 国产成人精品影视| 国产激情视频在线观看| 精品国产香蕉在线播出| 成人影视在线播放| 美女免费毛片| 日韩中文字幕在线亚洲一区| 可以免费看污视频的网站| 久久国产精品只做精品| 99热视热频这里只有精品| 国产a一级| 韩国三级一区| 欧美另类videosbestsex| 九九久久国产精品大片| 日本特黄特色aaa大片免费| 99久久精品国产免费| 精品视频一区二区三区免费| 午夜家庭影院| 久久精品店| 九九国产| 免费国产在线视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 99色视频在线| 国产一区二区精品久久91| 国产麻豆精品免费密入口| 精品国产香蕉伊思人在线又爽又黄| 国产精品免费久久| 在线观看成人网| 亚飞与亚基在线观看| 尤物视频网站在线观看| 91麻豆精品国产高清在线| 一a一级片| 黄色免费三级| 欧美激情一区二区三区视频| 成人免费一级毛片在线播放视频| 亚洲天堂在线播放| 国产成人啪精品| 尤物视频网站在线观看| 四虎久久影院| 国产91丝袜高跟系列| 成人影院久久久久久影院| 成人高清免费| 一级片片| 可以在线看黄的网站| 国产视频久久久久| 成人在免费观看视频国产| 国产一区二区高清视频| 国产精品1024永久免费视频| 欧美另类videosbestsex视频 | 色综合久久手机在线| 一级毛片看真人在线视频| 久久精品免视看国产明星| 你懂的在线观看视频| 国产国语在线播放视频| 一本高清在线| 精品国产香蕉伊思人在线又爽又黄| 欧美激情一区二区三区视频 | 日韩中文字幕在线亚洲一区| 亚洲第一页色| 午夜在线观看视频免费 成人| 美女免费精品高清毛片在线视| 日本在线www| 欧美激情伊人| 久久精品大片| 黄色免费三级|