美女网站大全视频成人免费-美女网站黄-美女网站黄a大全-美女网站免费视频-美女网站全黄-美女网站色视频全是黄

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

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

用手機掃描二維碼關閉
二維碼
主站蜘蛛池模板: 免费高清欧美亚洲视频 | 日韩免费福利试看3分钟 | 国内自拍中文欧美 | 日本欧美人成免费视频 | 成人v中| a级国产乱理论片在线观看 国产乱肥老妇国产一区二 国产日韩欧美视频成人 | 色五月激情五月综合网五月天 | 女儿国3在线观看免费版高清 | 欧美一级高清在线观看 | 欧美日韩一区二区三区综合 | 日本亚洲欧洲无免费码在线 | 日本又黄又粗暴的视频 | 精品国产天堂 | 99热久re这里只有精品小草 | 国产一级在线现免费观看 | 日韩一区二区免费 | 国产日韩一区二区三区视频免费 | 日韩v手机在线免费观看亚洲 | 丰满成熟亚洲人毛茸茸 | 日韩欧美天堂一区二区三区 | 国产亚洲自拍一区 | 国产免费爽爽视频 | 国产高清吹潮免费视频 | 国产羞羞视频在线观看 | 欧美日韩国产另类精品图二区 | 国产在线一区二区播放精品 | 国产欧美日韩一区二区搜索 | 99热手机在线 | 日本三级带黄在线观看 | 日韩一区二区高清视频免费在线 | 国产真实乱系列视频在线观看 | 在线观看国产日韩亚洲中文字幕 | 精品人伦一区二区三区 | 色国产综合免费视频在线播放 | 国产精品自在 | 女同精品一区二区网站 | 免费国产草莓视频在线观看黄 | 三级网页 | 成人免费一区二区三区视频软件 | 国产人在线成免费视频 | 国语自产精品视频一区二区 |