久久婷久久-久久婷婷丁香欧美-久久婷婷国产-久久婷婷国产麻豆91-久久婷婷激情-久久婷婷精品

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

0755-2979 1990

行業新聞

微信WX小程序連電子秤及稱重設備的藍牙調取連接讀取數據相關代碼及說明小程序藍牙親身總結

微信WX小程序連電子秤及稱重設備的藍牙調取連接讀取數據相關代碼及說明小程序藍牙親身總結

問題:
1.小程序藍牙搜索能不能搜到手機設備
2.如何判斷藍牙是否打開
3.搜索指定設備
4.開發者工具和 Android 上獲取到的deviceId為設備 MAC 地址,iOS 上則為設備 uuid。因此deviceId不能硬編碼到代碼中,如何連接藍牙
5.serviceId如何去選擇
6.characteristic(特征值)干嘛的,怎么用
7.開啟notify
8.如何寫入數據
---------------------

原文:https://blog.csdn.net/caohoucheng/article/details/81633822

問題:
最近做了一個涉及到藍牙模塊小程序,做一下總結,為自己的成長做一份記錄,如果能幫到大家的話是再好不過的了;

1.小程序藍牙搜索能不能搜到手機設備
2.如何判斷藍牙是否打開
3.搜索指定設備
4.開發者工具和 Android 上獲取到的deviceId為設備 MAC 地址,iOS 上則為設備 uuid。因此deviceId不能硬編碼到代碼中,
如何連接藍牙
5.設備服務所有 service(服務) 如何去選擇
6.設備characteristic(特征值)干嘛的,怎么用
7.開啟notify
8.寫入數據

1.小程序藍牙搜索能不能搜到手機設備
搜不到!!!
小程序藍牙只支持BLE低功耗藍牙
什么是低功耗藍牙設備呢?百度一下,你就知道(^__^) 嘻嘻

2.如何判斷藍牙是否打開
利用wx.openBluetoothAdapter(OBJECT)判斷藍牙是否可用
在用戶藍牙開關未開啟或者手機不支持藍牙功能的情況下,調用wx.openBluetoothAdapter會返回錯誤,表示手機藍牙功能不可用;

wx.openBluetoothAdapter({
success: function (res) {
console.log(res)
},
fail: function (res) {
wx.showModal({
content: '請開啟手機藍牙后再試'
})
}
})

注意:建議wx.openBluetoothAdapter(OBJECT)和wx.closeBluetoothAdapter(OBJECT)成對使用
wx.closeBluetoothAdapter:關閉藍牙模塊,使其進入未初始化狀態。調用該方法將斷開所有已建立的鏈接并釋放系統資源;

3.搜索指定設備
wx.startBluetoothDevicesDiscovery(OBJECT)開始搜尋附近的藍牙外圍設備
wx.getBluetoothDevices(OBJECT)獲取在小程序藍牙模塊生效期間所有已發現的藍牙設備
wx.onBluetoothDeviceFound(CALLBACK) 監聽尋找到新設備的事件

注意:搜索藍牙wx.startBluetoothDevicesDiscovery(OBJECT)操作比較耗費系統資源,在搜索并連接到設備后調用 wx.stopBluetoothDevicesDiscovery(OBJECT) 方法停止搜索。

//開始搜索藍牙
wx.startBluetoothDevicesDiscovery({
success: function (res) {
console.log('search', res)
}
})
//發現設備
wx.getBluetoothDevices({
success: function (res) {
console.log('發現設備', res)
if (res.devices[0]) {
console.log(that.ab2hext(res.devices[0].advertisData))
}
//5s內未搜索到設備,關閉搜索,關閉藍牙模塊
setTimeout(function(){
if (!that.data.deviceId){
wx.hideLoading()
app.showToast('搜索設備超時','none');
//關閉搜索
that.stopBluetoothDevicesDiscovery();
//關閉藍牙
that.closeBluetoothAdapter();
}
},5000)
}
})
//監聽發現設備
wx.onBluetoothDeviceFound(function (devices) {
console.log('發現設備:', devices.devices)
for (let i = 0; i < devices.devices.length; i++) {
//檢索指定設備
if (devices.devices[i].name == '設備name') {
that.setData({
deviceId: devices.devices[i].deviceId
})
//關閉搜索
that.stopBluetoothDevicesDiscovery();
console.log('已找到指定設備:', devices.devices[i].deviceId);
}
}
})
ab2hext: function(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}

這段代碼是通過設備名name去匹配配對設備,若5s內未搜到指定設備則關閉搜索,關閉藍牙模塊;
設備名是已發現的藍牙設備device 對象中的name


4.開發者工具和 Android 上獲取到的deviceId為設備 MAC 地址,iOS 上則為設備 uuid。因此deviceId不能硬編碼到代碼中,如何連接藍牙
搜索我們可以拿到了設備的deviceId,通過deviceId去連接藍牙
Android 上獲取到的deviceId為設備 MAC 地址,iOS 上獲取到的deviceId則為設備 uuid,因此deviceId不能硬編碼到代碼中
那么可能就有機智的小伙伴說了,設置兩個變量,一個為設備MAC,一個為設備uuid
在連接設備的之前判斷下機型,ios設備deviceId取:設備uuid,android設備deviceId:MAC地址!!!
我原本也是這樣想的,因為我們做的這個小程序是掃碼連接指定設備(就好像共享單車一樣),所以本來是想在二維碼中直接放入mac和uuid然后連接的時候去根據機型去取對應值
但是!!!但是!!!但是!!!
在實現過程中發現,ios不同手機搜索到的設備deviceId還是不同的.
所以還是乖乖通過設備name(廣播名),去獲取deviceId去連接


只怪自己經驗不足,還總想走捷徑
正確的流程是
初始化藍牙wx.openBluetoothAdapter(OBJECT)

開始搜索藍牙 wx.startBluetoothDevicesDiscovery(OBJECT)

所有已發現的藍牙設備wx.getBluetoothDevices(OBJECT)

監聽尋找到新設備的事件wx.onBluetoothDeviceFound(CALLBACK)

連接低功耗藍牙設備wx.createBLEConnection(OBJECT)

獲取藍牙設備所有 service(服務) wx.getBLEDeviceServices(OBJECT)

獲取藍牙設備某個服務中的所有 characteristic(特征值)wx.getBLEDeviceCharacteristics(OBJECT)

啟用低功耗藍牙設備特征值變化時的 notify 功能wx.notifyBLECharacteristicValueChange(OBJECT)

寫入wx.writeBLECharacteristicValue(OBJECT)

在搜索到設備后通過拿到的設備的deviceId去連接設備

wx.createBLEConnection({
deviceId: that.data.deviceId,//搜索設備獲得的藍牙設備 id
success: function (res) {
console.log('連接藍牙:', res.errMsg);
},
fail: function (res) {
app.showToast('連接超時,請重試或更換車輛', 'none');
that.closeBluetoothAdapter();
}
})

5.serviceId如何去選擇
連接成功以后就可以去獲取設備的服務列表,我這邊拿的是FEE7的服務ID

wx.getBLEDeviceServices({
deviceId: that.data.deviceId,//搜索設備獲得的藍牙設備 id
success: function (res) {
let service_id = "";
for(let i = 0;i<res.services.length;i++){
if(services[i].uuid.toUpperCase().indexOf("FEE7") != -1){
service_id = services[i].uuid;
break;
}
}
console.log('fee7-service_id:', that.data.service_id);
},
fail(res){
console.log(res);
}
})

6.characteristic(特征值)干嘛的,怎么用
服務特征值是干嘛的:每個服務都包含了一組特征值用來描述服務的一些屬性,獲取是否可讀,是否可寫,是否可以開啟notify通知等,當你跟藍牙通信時需要這些特征值ID來傳遞數據。
服務特征值怎么用:

//獲取特征值
wx.getBLEDeviceCharacteristics({
deviceId: that.data.deviceId,//搜索設備獲得的藍牙設備 id
serviceId: that.data.service_id,//服務ID
success: function (res) {
console.log('device特征值:', res.characteristics)
for (let i = 0; i < res.characteristics.length; i++) {
let charc = res.characteristics[i];
if (charc.properties.indicate) {
that.setData({indicate_id: charc.uuid});
console.log('indicate_id:', that.data.indicate_id);
}
if (charc.properties.write) {
that.setData({write_id: charc.uuid});
console.log('寫write_id:', that.data.write_id);
}
if (charc.properties.read) {
that.setData({read_id: charc.uuid});
console.log('讀read_id:', that.data.read_id);
}
}
}
});

篩選出你所需要的服務特征值
在得到對應特征值后可以在執行相關操作時使用
例如:
開啟notify:必須設備的特征值支持notify或者indicate才可以成功調用
支不支持notify或者indicate就是我們上面篩選出來的對應值

if (charc.properties.indicate) {
that.setData({indicate_id: charc.uuid});
console.log('indicate_id:', that.data.indicate_id);
}

7.開啟notify
開啟notify后可以監聽低功耗藍牙設備的特征值變化。必須先啟用notify接口才能接收到設備推送的notification

//開啟notify
wx.notifyBLECharacteristicValueChange({
state: true, // 啟用 notify 功能
deviceId: that.data.deviceId,//藍牙設備id
serviceId: that.data.service_id,//服務id
characteristicId: that.data.indicate_id,//服務特征值indicate
success: function (res) {
console.log('開啟notify', res.errMsg)
//監聽低功耗藍牙設備的特征值變化
wx.onBLECharacteristicValueChange(function (res) {
console.log('特征值變化', that.arrayBufferToHexString(res.value));
})
//寫入數據

}
});

8.如何寫入數據
如何寫入數據呢,通過獲取到的write特征值write_id
注意:必須設備的特征值支持write才可以成功調用

let buffer = that.hexStringToArrayBuffer(ArrayBuffer);
//寫入數據
wx.writeBLECharacteristicValue({
deviceId: that.data.deviceId,//設備deviceId
serviceId: that.data.service_id,//設備service_id
characteristicId: that.data.write_id,//設備write特征值
value: buffer,//寫入數據
success: function (res) {
console.log('發送數據:', res.errMsg)
}
});
hexStringToArrayBuffer:function (str) {
if(!str) {
return new ArrayBuffer(0);
}
var buffer = new ArrayBuffer(str.length);
let dataView = new DataView(buffer)
let ind = 0;
for (var i = 0, len = str.length; i < len; i += 2) {
let code = parseInt(str.substr(i, 2), 16)
dataView.setUint8(ind, code)
ind++
}
return buffer;
}
總結:有幾點特別需要注意,快拿出小本本
1.IOS里面藍牙狀態變化以后不能馬上開始搜索,否則會搜索不到設備,必須要等待2秒以上
2.開啟notify以后并不能馬上發送消息,藍牙設備有個準備的過程,需要在setTimeout中延遲1秒以上才能發送,否則會發送失敗

setTimeout(function () {
wx.writeBLECharacteristicValue({
deviceId: that.data.deviceId,
serviceId: that.data.service_id,
characteristicId: that.data.write_id,
value: buffer,
success: function (res) {
console.log('發送數據:', res.errMsg)
}
});
}, 1100);

3.搜索到設備后記得釋放資源stopBluetoothDevicesDiscovery
4.不需要使用藍牙的時候一定要關閉藍牙.wx.openBluetoothAdapter(OBJECT)和wx.closeBluetoothAdapter(OBJECT)成對使用
---------------------
作者:Cc_JoJo
來源:CSDN
原文:https://blog.csdn.net/caohoucheng/article/details/81633822
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

FueQIxYJ_yqBy.jpg

用手機掃描二維碼關閉
二維碼
主站蜘蛛池模板: HEYZO北条麻妃M痴女在线 | 午夜性影院 | 无码四区 | 涩涩网站 | 精品人人妻人人澡人人爽牛牛 | 免费无码潮喷A片无码高潮 国产一区2区 | 久久久久久亚洲Av无码精品专口 | 精品国产乱码一区二区三区A | 欧美精品亚洲精品日韩精品 | 国产AV综合 | 国产乱人妻精品秘 入口 | 91干逼| 午夜精品久久久久久久无码软件 | 亚洲AV午夜成人片精品网站 | 国产成人三级无码中文在线观看 | 无码区免费看一级毛片A片 无码少妇 | 182TV午夜福利线路一 | 无码Av免费一区二区三区吻戏 | 国产伦精品一区二区三区免.费 | 亚洲无码不卡在线观看 | 国产一级黄色大片 | 国产三级无码 | 成人午夜福利视频镇东影视 | 国产精品三级 | 久久中文字幕视频 | 精品国产乱码久久久久夜深人妻 | 男人添女人全过A片 | 国产中文 | 国产精品不卡 | 亚洲av网址| 有码人妻 | 亚洲精品乱码久久久久久蜜桃91 | 国产精品国产毛片 | 2025国产精品高清在线 | 免费看黄色网址 | 日产综合论理影院 | 国产午夜精品理论片A级大结局 | 国产裸体美女 | 少妇一级婬片A片无码粉色视频 | 黃色A片三級三級三級 | 亚洲成人二区 |