① 小程序藍牙搜不到設備ID
系統問題。
1、小程序藍牙搜不到設備ID是因為兩者系統不符。
2、導致搜索不到該設備,可以更換一下藍牙設備就可以了。
② vivos12pro微信小程序藍牙連不上
可參考以下無法連接藍牙設備處理步驟:
1、確認藍牙設備電量與連接范圍
確認藍牙設備電量充足,藍牙連接有效距離一般為10米左右,如果雙方設備距離較遠或中間存在障礙物,則可能搜索不到藍牙設備。
2、確認藍牙設備連接狀態
確保沒有其他手機連接此藍牙設備。
3、重新配對藍牙設備
請參考藍牙設備說明書操作,確保設備處於可配對狀態,並重新配對設備。
註:
1)vivo TWS 1/vivo TWS Neo/vivo TWS 2/vivo TWS 2e配對方法:將兩只耳機放入充電盒內,打開盒蓋,長按充電盒功能鍵2秒直至指示燈呈白色閃爍,手機藍牙搜索配對。或者長按充電盒功能鍵15秒,指示燈呈橙色並快速閃爍,耳機恢復出廠設置並重新進入配對狀態。
2)vivo WATCH配對方法:【初次配對】通過手機掃描手錶屏幕二維碼,下載安裝「健康」App,打開軟體,注冊登錄vivo帳號,點擊設備頁,添加設備,配對vivo WATCH。健康App是連接管理手錶的必備應用,vivo手機用戶前往應用商店下載並安裝App,蘋果手機用戶前往App Store搜索下載安裝App。【後期配對】按壓vivo WATCH上鍵--設置--系統菜單--恢復配對,通過健康App搜索連接,或按壓vivo WATCH上鍵--設置--系統菜單--恢復出廠,再通過健康App搜索連接。
3)其他品牌和型號的藍牙設備,可以查看對應產品說明書了解配對方法。
4、進行對比測試
同時使用兩個無配對記錄的手機搜索,如果其他手機也不能搜索到設備,則可能是藍牙設備故障。
5、重置網路設置
進入設置--系統管理--備份與重置--重置網路設置--重置設置,再使用查看。
7、再次點擊已配對的藍牙設備進行連接時,會提示「請確認「XX設備」已打開,在通信范圍內,且未連接其他設備」:兩台設備的藍牙進行配對成功即可使用藍牙的相關功能,不需要再次點擊藍牙設備進行連接,此提示並非手機異常,請您放心使用。
8、服務中心檢測
若以上方法未能解決問題,請提前備份好手機數據,攜帶手機和購機憑證前往vivo客戶服務中心檢測,進入瀏覽器搜索vivo官網--服務--服務中心--查看全部--選擇省市查詢當地的服務中心地址以及聯系方式。
③ 小程序 藍牙連接
//初始化藍牙
initBlue() {
var that = this;
wx.openBluetoothAdapter({ //調用微信小程序api 打開藍牙適配器介面
success: function (res) {
console.log('1.初始化藍牙成功')
},
//監聽手機藍牙的開關
monitorTheBlue:function(){
var that =this;
wx.onBluetoothAdapterStateChange(function(res){
})
},
//開始獲取附近的藍牙設備
//. 獲取到附近的藍牙數組 通過藍牙特定的名稱獲取自己想要連接的藍牙設備
//. 獲取附近藍牙設備的數組
findBlue() {
console.log(new Date())
var that = this
wx.({
allowDuplicatesKey: false,
interval: 0,
success: function (res) {
console.log('2.正在搜索設備.............')
if (that.data.isFirestShow) {
wx.showLoading({
title: '正在搜索設備'
})
}
},
//搜索獲取附近的所有藍牙設備 獲取附近所有的藍牙設備的相關信息 獲取需要連接藍牙設備的deviceID
//. 通過bluetoothDeviceName 和 localName 來確定製定藍牙
//. 一般根據制定設備的名字去連接 設備的名字 是出產廠家設定
getBlue() {
var that = this
wx.getBluetoothDevices({
success: function (res) {
console.log('3.找到設備列表........')
wx.hideLoading()
// return false
var index = 10
for (var i = 0; i < res.devices.length; i++) {
if (res.devices[i].name && res.devices[i].localName) {
var arr = res.devices[i].name.split("-")
var secArr = res.devices[i].localName.split("-")
if (arr[0] == that.data.bluetoothDeviceName || secArr[0] == that.data.bluetoothDeviceName) {
},
//連接藍牙設備
//通過deviceId 連接藍牙
/**
},
//6 連接上需要的藍牙設備之後,獲取這個藍牙設備的服務uuid
//獲取設備的uuid
getServiceId() {
var that = this
wx.getBLEDeviceServices({
// 這里的 deviceId 需要已經通過 createBLEConnection 與對應設備建立鏈接
deviceId: that.data.deviceId,
success: function (res) {
var model = res.services[1]
that.setData({
servicesUUID: model.uuid
})
console.log('7.獲取設備 uuid 成功....')
that.getCharacteId() //6.0
}
})
},
//7 如果一個藍牙設備需要進行數據的寫入以及數據傳輸,就必須具有某些特徵值,所以通過上面步驟獲取的id可以查看當前藍牙設備的特徵值
//notify write read 當只有 notify為true的時候才能 接收藍牙設備傳來的數據,
//write 為true 才能傳入數據
//read 為true 才能讀取設備數據
getCharacteId() {
var that = this
wx.getBLEDeviceCharacteristics({
// 這里的 deviceId 需要已經通過 createBLEConnection 與對應設備建立鏈接
deviceId: that.data.deviceId,
// 這里的 serviceId 需要在上面的 getBLEDeviceServices 介面中獲取
serviceId: that.data.servicesUUID,
success: function (res) {
for (var i = 0; i < res.characteristics.length; i++) { //2個值
var model = res.characteristics[i]
if (model.properties.notify == true) {
that.setData({
characteristicId: model.uuid //監聽的值
})
console.log('8.model.properties.notify == true')
that.startNotice(model.uuid) //7.0
}
// if (model.properties.read == true) {
// that.readData(model.uuid)
// }
// if (model.properties.write == true) {
// that.setData({
// writeId: model.uuid//用來寫入的值
// })
// }
}
}
})
},
fordateTime1(){
let now = new Date(),hour = now.getHours()
console.log(hour)
let str = ''
if(hour < 7){str = '早餐前'}
else if ((7< hour) && (hour<= 9)){str = '早餐後'}
else if ((9< hour) && (hour<= 11)){str = '午餐前'}
else if ((11< hour) && (hour<= 13)){str = '午餐後'}
else if ((13< hour) && (hour<= 17)){str = '晚餐前'}
else if ((17< hour) && (hour<= 19)){str = '晚餐後'}
else if ((19< hour) && (hour<= 24)){str = '睡覺前'}
return str
},
//8 如果一個藍牙設備需要進行數據的寫入以及數據傳輸,就必須具有某些特徵值,所以通過上面步驟獲取的id可以查看當前藍牙設備的特徵值
//開啟設備數據監聽 監聽藍牙設備返回來的數據
startNotice(uuid) {
var that = this;
wx.({
state: true, // 啟用 notify 功能
deviceId: that.data.deviceId,
serviceId: that.data.servicesUUID,
characteristicId: uuid, //第一步 開啟監聽 notityid 第二步發送指令 write
success: function (res) {
// that.closeConnect(that.data.deviceId)
// 設備返回的方法
let tip = 0
wx.(res1 => {
},
/**
//監聽藍牙設備是否會異常斷開
() {
},
// 斷開設備連接
closeConnect: function(v) {
var that = this
if (v) {
wx.closeBLEConnection({
deviceId: v,
success: function(res) {
console.log("藍牙斷開連接")
that.closeBluetoothAdapter()
},
fail(res) {
}
})
} else {
that.closeBluetoothAdapter()
}
},
// 關閉藍牙模塊
closeBluetoothAdapter:function () {
wx.closeBluetoothAdapter({
success: function(res) {
console.log("關閉藍牙模塊")
},
fail: function(err) {
}
})
},
④ 微信小程序藍牙教程--完整版親測
#使用mpvue 開發小程序過程中 簡單介紹一下微信小程序藍牙連接過程
#在藍牙連接的過程中部分api需要加定時器延時1秒到2秒左右再執行,原因為何不知道,小程序有這樣的要求
#1.首先是要初始化藍牙:openBluetoothAdapter()
```js
if (wx.openBluetoothAdapter) {
wx.openBluetoothAdapter({
success: function(res) {
/* 獲取本機的藍牙狀態 */
setTimeout(() => {
getBluetoothAdapterState()
}, 1000)
},
fail: function(err) {
// 初始化失敗
}
})
} else {
}
```
#2.檢測本機藍牙是否可用:
# 要在上述的初始化藍牙成功之後回調里調用
```js
getBluetoothAdapterState() {
var that= this;
that.toastTitle= '檢查藍牙狀態'
wx.getBluetoothAdapterState({
success: function(res) {
()
},
fail(res) {
console.log(res)
}
})
}
```
#3. 開始搜索藍牙設備:
```js
() {
var that= this;
setTimeout(() => {
wx.({
success: function(res) {
/* 獲取藍牙設備列表 */
that.getBluetoothDevices()
},
fail(res) {
}
})
}, 1000)
}
```
#4. 獲取搜索到的藍牙設備列表
# /* that.deviceName 是獲取到的藍牙設備的名稱, 因為藍牙設備在安卓和蘋果手機上搜到的藍牙地址顯示是不一樣的,所以根據設備名稱匹配藍牙*/
```js
getBluetoothDevices() {
var that= this;
setTimeout(() => {
wx.getBluetoothDevices({
services: [],
allowDuplicatesKey: false,
interval: 0,
success: function(res) {
if (res.devices.length> 0) {
if (JSON.stringify(res.devices).indexOf(that.deviceName) !== -1) {
for (let i = 0; i < res.devices.length; i++) {
if (that.deviceName === res.devices[i].name) {
/* 根據指定的藍牙設備名稱匹配到deviceId */
that.deviceId = that.devices[i].deviceId;
setTimeout(() => {
that.connectTO();
}, 2000);
};
};
} else {
}
} else {
}
},
fail(res) {
console.log(res, '獲取藍牙設備列表失敗=====')
}
})
}, 2000)
},
```
#5.連接藍牙
# 匹配到的藍牙設備ID 發送連接藍牙的請求, 連接成功之後 應該斷開藍牙搜索的api,然後去獲取所連接藍牙設備的service服務
```js
connectTO() {
wx.createBLEConnection({
deviceId: deviceId,
success: function(res) {
that.connectedDeviceId = deviceId;
/* 4.獲取連接設備的service服務 */
that.getBLEDeviceServices();
wx.stopBluetoothDevicesDiscovery({
success: function(res) {
console.log(res, '停止搜索')
},
fail(res) {
}
})
},
fail: function(res) {
}
})
}
```
#6. 獲取藍牙設備的service服務,獲取的serviceId有多個要試著連接最終確定哪個是穩定版本的service 獲取服務完後獲取設備特徵值
```js
getBLEDeviceServices() {
setTimeout(() => {
wx.getBLEDeviceServices({
deviceId: that.connectedDeviceId,
success: function(res) {
that.services= res.services
/* 獲取連接設備的所有特徵值 */
that.getBLEDeviceCharacteristics()
},
fail: (res) => {
}
})
}, 2000)
},
```
#7.獲取藍牙設備特徵值
# 獲取到的特徵值有多個,最後要用的事能讀,能寫,能監聽的那個值的uuid作為特徵值id,
```js
getBLEDeviceCharacteristics() {
setTimeout(() => {
wx.getBLEDeviceCharacteristics({
deviceId: connectedDeviceId,
serviceId: services[2].uuid,
success: function(res) {
for (var i = 0; i < res.characteristics.length; i++) {
if ((res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate) &&
(res.characteristics[i].properties.read && res.characteristics[i].properties.write)) {
console.log(res.characteristics[i].uuid, '藍牙特徵值 ==========')
/* 獲取藍牙特徵值 */
that.notifyCharacteristicsId = res.characteristics[i].uuid
// 啟用低功耗藍牙設備特徵值變化時的 notify 功能
that.()
}
}
},
fail: function(res) {
}
})
}, 1000)
},
```
#8.啟動notify 藍牙監聽功能 然後使用 wx.用來監聽藍牙設備傳遞數據
#接收到的數據和發送的數據必須是二級制數據, 頁面展示的時候需要進行轉換
```js
() { // 啟用低功耗藍牙設備特徵值變化時的 notify 功能
var that= this;
console.log('6.啟用低功耗藍牙設備特徵值變化時的 notify 功能')
wx.({
state: true,
deviceId: that.connectedDeviceId,
serviceId: that.notifyServicweId,
characteristicId: that.notifyCharacteristicsId,
complete(res) {
/*用來監聽手機藍牙設備的數據變化*/
wx.(function(res) {
/**/
that.balanceData += that.buf2string(res.value)
that.hexstr += that.receiveData(res.value)
})
},
fail(res) {
console.log(res, '啟用低功耗藍牙設備監聽失敗')
that.measuringTip(res)
}
})
},
/*轉換成需要的格式*/
buf2string(buffer) {
var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)
return arr.map((char, i) => {
return String.fromCharCode(char);
}).join('');
},
receiveData(buf) {
return this.hexCharCodeToStr(this.ab2hex(buf))
},
/*轉成二進制*/
ab2hex (buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer), function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('')
},
/*轉成可展會的文字*/
hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStr.trim();
var rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;
var len = rawStr.length;
var curCharCode;
var resultStr= [];
for (var i = 0; i < len; i = i+ 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16);
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join('');
},
```
# 向藍牙設備發送數據
```js
sendData(str) {
let that= this;
let dataBuffer = new ArrayBuffer(str.length)
let dataView = new DataView(dataBuffer)
for (var i = 0; i < str.length; i++) {
dataView.setUint8(i, str.charAt(i).charCodeAt())
}
let dataHex = that.ab2hex(dataBuffer);
this.writeDatas = that.hexCharCodeToStr(dataHex);
wx.writeBLECharacteristicValue({
deviceId: that.connectedDeviceId,
serviceId: that.notifyServicweId,
characteristicId: that.notifyCharacteristicsId,
value: dataBuffer,
success: function (res) {
console.log('發送的數據:' + that.writeDatas)
console.log('message發送成功')
},
fail: function (res) {
},
complete: function (res) {
}
})
},
```
# 當不需要連接藍牙了後就要關閉藍牙,並關閉藍牙模塊
```js
// 斷開設備連接
closeConnect() {
if (that.connectedDeviceId) {
wx.closeBLEConnection({
deviceId: that.connectedDeviceId,
success: function(res) {
that.closeBluetoothAdapter()
},
fail(res) {
}
})
} else {
that.closeBluetoothAdapter()
}
},
// 關閉藍牙模塊
closeBluetoothAdapter() {
wx.closeBluetoothAdapter({
success: function(res) {
},
fail: function(err) {
}
})
},
```
#在向藍牙設備傳遞數據和接收數據的過程中,並未使用到read的API 不知道有沒有潛在的問題,目前線上運行為發現任何的問題
#今天的藍牙使用心得到此結束,謝謝
⑤ 微信小程序連接藍牙血壓儀
此方法可以檢測中心設備是否支持藍牙功能,是否打開藍牙開關,如不符合上述條件,返回失敗建wx.openBluetoothAdapter(OBJECT)和wx.closeBluetoothAdapter(OBJECT)成對使用wx.closeBluetoothAdapter:關閉藍牙模塊,使其進入未初始化狀態。調用該方法將斷開所有已建立的鏈接並釋放系統資源;
2.搜索指定設備
wx.(OBJECT)開始搜尋附近的藍牙外圍設備
wx.getBluetoothDevices(OBJECT)獲取在小程序藍牙模塊生效期間所有已發現的藍牙設備
wx.onBluetoothDeviceFound(CALLBACK) 監聽尋找到新設備的事件
注意: 搜索藍牙wx.(OBJECT)操作比較耗費系統資源,在搜索並連接到設備後調用 wx.stopBluetoothDevicesDiscovery(OBJECT) 方法停止搜索。
正確的流程是
初始化藍牙wx.openBluetoothAdapter(OBJECT)
↓
開始搜索藍牙 wx.(OBJECT)
↓
所有已發現的藍牙設備wx.getBluetoothDevices(OBJECT)
↓
監聽尋找到新設備的事件wx.onBluetoothDeviceFound(CALLBACK)
↓
連接低功耗藍牙設備wx.createBLEConnection(OBJECT)
↓
獲取藍牙設備所有 service(服務) wx.getBLEDeviceServices(OBJECT)
↓
獲取藍牙設備某個服務中的所有 characteristic(特徵值)wx.getBLEDeviceCharacteristics(OBJECT)
↓
啟用低功耗藍牙設備特徵值變化時的 notify 功能wx.(OBJECT)
↓
寫入wx.writeBLECharacteristicValue(OBJECT)
⑥ 微信小程序藍牙入坑總結
微信小程序的藍牙流程按著官網的說明寫就可以了,具體參看文檔: 小程序開發文檔
坑列表:
1.成對調用需要注意, wx.openBluetoothAdapter 與 wx.closeBluetoothAdapter
wx. 與 wx.stopBluetoothDevicesDiscovery
2.安卓與IOS的區別:安卓可以根據藍牙標識直接連接,IOS則必須先搜索才能進行連接;
3.許可權問題:IOS的系統不能僅僅打開系統的藍牙許可權,因為IOS新版本針對藍牙做了應用及的限制,因此需要給微信藍牙許可權才可以使用;對於安卓系統,部分手機必須打開定位許可權才能搜索到藍牙設備
4.創建連接API( wx.createBLEConnection )調用失敗:
超時報錯:{"errCode":10012,"errMsg":"createBLEConnection:fail:operate time out"}
連接超時:{"errCode":10003,"errMsg":"createBLEConnection:fail connect time out."}
連接失敗:{"errCode":10003,"errMsg":"createBLEConnection:fail:connection fail status:133"}
基本都是安卓手機出現以上問題,針對這些報錯,需編寫重試連接操作,很大概率能解決此問題;
5.搜索不到任何設備,安卓手機可能是定位許可權的問題造成,蘋果手機基本就是設備出問題了
6.網路請求與藍牙請求盡量分開,因為藍牙連接會受到影響,造成一些異常信息;
7.所有API調用針對fail函數最好都做一次重試,因為再次重試可能就會成功;、
8.API調用之間最好有一定毫秒數的間隔,目前懷疑api部分機型會存在延時;
總之微信的藍牙連接就那些已知的介面,調用時多考慮異常的情況下的重試,簡單總結下,以便查閱。