在WeChat微信小程序中連接藍牙電子計重秤(電子秤品牌:山星盛MOUNT STAR),直接通過藍牙獲取當前稱重的重量數據,然后顯示在weixin界面上。山星盛電子科技是一家衡器硬件設備提供商,我們專業提供ERP管理系統PC,APP,APK,POS,PDA,安卓The android和蘋果apple手機IOS及android操作系統,電腦端微軟Microsoft安裝版及文本直接傳送的電子秤,平臺秤,物聯網電子稱,藍牙無線電子秤,WIFI電子秤,手機軟件直連手機等稱重設備,買我們電子秤能提供騰訊微信小程序demo程序開發包,還能提供安卓和蘋果手機APP軟件電子秤連接的demo指導文件及開發包供您開發自己的軟件。
山星盛電子科技是一家衡器硬件設備提供商,我們專業提供ERP管理系統PC,APP,APK,POS,PDA,安卓The android和蘋果apple手機IOS及android操作系統,電腦端微軟Microsoft安裝版及文本直接傳送的電子秤,平臺秤,物聯網電子稱,藍牙無線電子秤,WIFI電子秤,手機軟件直連手機等稱重設備,買我們電子秤能提供騰訊微信小程序demo程序開發包,還能提供安卓和蘋果手機APP軟件電子秤連接的demo指導文件及開發包供您開發自己的軟件。

騰訊微信小程序電子稱
前情:在微信小程序中連接藍牙電子計重桌秤,(電子秤品牌:山星盛MOUNT STAR),直接通過藍牙獲取當前稱重的重量數據,然后顯示在界面上。
ps:記錄的時候,還在開發階段,得到了數據,數據有會實時變化。

此次,只涉及讀取數據,沒有寫入數據,具體 API 查看小程序官方文檔
確保手機藍牙已經打開,并且可以搜索到該電子秤的藍牙設備,android 可以搜到,ios 搜不到
微信小程序中搜索到的藍牙設備很多,deviceId 在 android 上顯示為藍牙設備主服務的 mac 地址,在 ios 上顯示為藍牙設備主服務的 uuid
最終得到的結果是 ArrayBuffer 型數據,需要先轉為16進制字符串,再轉為10進制數據
// 定義數據data: {
devices: [], // 搜索到的藍牙設備 deviceId 數組
deviceId: '', // 目標藍牙設備 deviceId
services: [] // 設備服務列表 serviceId 數組
serviceId: '',
characteristics: [] // 特征值列表
characteristicId: '' // 選擇某一個特征值
value: '' // 16 進制數據值}// 藍牙 API 調用步驟openBluetoothAdapter() {
wx.openBluetoothAdapter({ // (1)
success: res => { console.log('openBluetoothAdapter初始化藍牙模塊成功:', res) this.startBluetoothDevicesDiscovery() // (2) 開始搜索
},
fail: err => { console.log('openBluetoothAdapter初始化藍牙模塊失敗:', err) if (err.errCode === 10001) { // 當前藍牙適配器不可用
wx.onBluetoothAdapterStateChange( res => { if (res.available) { this.startBluetoothDevicesDiscovery()
}
})
}
}
})
}入參 services 作用要搜索的藍牙設備主 service 的 uuid 列表,某些藍牙設備會廣播自己的主 service 的 uuid,如果設置此參數,則只搜索廣播包括對應 uuid 的主服務的藍牙設備,可以通過該參數過濾掉周邊不需要處理的其他藍牙設備
入參 allowDuplicatesKey 作用是否允許重復上報同一設備,如果允許重復上報,則 wx.onBlueToothDeviceFound 方法會多次上報同一設備,但是 RSSI 值會有不同,默認為 false
eg: services: ['FEE7'] 主服務的 UUID 是 FEE7,傳入這個參數,只搜索主服務 UUID 為 FEE7 的設備,該設備是微信硬件平臺的藍牙智能燈
?? 此操作比較耗費系統資源,需要在搜索并連接到設備后調用 wx.stopBluetoothDevicesDiscovery 方法停止搜索
startBluetoothDevicesDiscovery() {
wx.startBluetoothDevicesDiscovery({
success: res => { console.log('startBluetoothDevicesDiscovery開始搜索外圍設備成功:', res) this.getBluetoothDevices() // (3) 獲取藍牙列表
},
fail: err => { console.log('startBluetoothDevicesDiscovery搜索外圍設備失敗:', err)
}
})
}getBluetoothDevices() {
wx.getBluetoothDevices({
success: res => { console.log('getBluetoothDevices獲取藍牙設備成功:', res) this.setData({
devices: res. devices || [] // uuid 對應的的已連接設備列表
}) this.createBLEConnection(); // (4) 與目標設備建立連接
},
fail: err => { console.log('getBluetoothDevices獲取藍牙設備失敗:', err)
}
})
}?? 如果微信小程序此前搜索過某個藍牙設備,并成功建立連接,可直接傳入之前搜索獲取的 deviceId 直接嘗試連接該設備,不用重新搜索
createBLEConnection() { // 如果是第一次建立連接,可以通過名稱匹配,獲取相應設備的 deviceId
let devices = this.data.devices;
devices.forEach(item => { if(item.name == 'kunHong') { this.setData({
deviceId: item.deviceId
})
}
}) // 建立連接
wx.createBLEConnection({
deviceId: this.data.deviceId,
success: res => { console.log('createBLEConnection與目標藍牙連接成功:', res) this.getBLEDeviceServices() // (5)獲取服務
},
fail: err => { console.log('createBLEConnection與目標藍牙連接失敗:', err)
}
})
}入參 deviceId 為 wx.getBluetoothDevices 中獲取的目標藍牙設備的 deviceId
??開發過程中,主服務 serviceId 和 主服務的特征值 characteristics 都是選取的實際操作過程中,得到的類似于該目標藍牙設備的 id,但是小程序官方文檔的 demo,遍歷了所有的列表(serviceId 和 characteristics),需要區分一下
getBLEDeviceServices() {
wx.getBLEDeviceServices({
deviceId: this.data.deviceId,
success: res => { console.log('getBLEDeviceServices獲取藍牙設備服務', res) // getBluetoothDevices 獲取的有 deviceId 和 advertisServiceUUIDs,可以在這里獲取的服務列表中選擇一個一樣的作為后續 API 請求的服務id,這個 id 需要滿足是否可讀
this.setData({
services: res.services,
serviceId: res.services[0].uuid // 假設是第一個
}) this.getBLEDeviceCharacteristics() // (6) 獲取特征值
// 官方 demo
for(var i = 0; i < res.services.length; i++) { // 該服務是否為主服務
if(res.services[i].isPrimary) { this.getBLEDeviceCharacteristics(res.services[i].uuid)
}
}
},
fail: err => { console.log('getBLEDeviceServices獲取藍牙設備服務失敗:', err)
}
})
}入參 deviceId 為 wx.getBluetoothDevices 中獲取的目標藍牙設備的 deviceId
入參 serviceId 為藍牙服務 uuid ,通過 wx.getBLEDeviceServices 獲取
getBLEDeviceCharacteristics(serviceId) {
wx.getBLEDeviceCharacteristics({
deviceId: this.data.deviceId,
serviceId: this.data.serviceId,
success: res => {
console.log('getBLEDeviceCharacteristics獲取藍牙服務特征值成功:', res) this.setData({
characteristics: res. characteristics,
characteristics: res. characteristics[0].uuid
}) this.notifyBLECharacteristicValueChange(); // (7)啟用 notify 功能
// 官方 demo
for(var i = 0; i < res.characteristics.length; i++) { // 是否可讀
if(res.characteristics[i].read) { // 讀取數據
wx.readBLECharacteristicValue({
deviceId: this.data.deviceId,
serviceId: serviceid,
characteristicId: res.characteristicId[i].uuid
})
}, if(res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate) { // 啟用功能
wx.notifyBLECharacteristicValueChange({
deviceId,
serviceId,
characteristicId: item.uuid,
state: true,
})
}
}
},
fail: err => {
console.log('getBLEDeviceCharacteristics獲取藍牙服務特征值失敗:', err)
}
}) this.onBLECharacteristicValueChange() // (8)監聽特征值變化
this.readBLECharacteristicValue(); // (9)讀取數據}??必須設備的特征值支持 notify 或者 indicate 才可以成功啟用
notifyBLECharacteristicValueChange() {
wx.notifyBLECharacteristicValueChange({
deviceId: this.data.deviceId,
serviceId: this.data.serviceId,
characteristicId: this.data. characteristicId,
state: true // 是否啟用 notify (四個字段全部必填)
})
}??必須先啟用 notifyBLECharacteristicValueChange 接口才能接收到設備推送的 notification(通知)
// 先監聽一下,保證第一時間獲取數據onBLECharacteristicValueChange() { wx.onBLECharacteristicValueChange( characteristic => { console.log('onBLECharacteristicValueChange從目標藍牙設備監聽到的數據值:', characteristic) this.setData({ value: this.ab2hex(abcharacteristic.value) // (10) 轉為 16 進制
})
})
}??必須目標藍牙設備的特征值支持 read 才可以成功調用,并且單獨使用 readBLECharacteristicValue 并不能獲取到真正的特征值,只能返回獲取特征值的狀態,即是否成功獲取到值,真正的值需要使用 wx.onBLECharacteristicValueChange() 執行回調才可以在 wx.onBLECharacteristicValueChange() 這個 API 中獲得讀取到的特征值
readBLECharacteristicValue() {
wx.readBLECharacteristicValue({
deviceId: this.data.deviceId,
serviceId: this.data.serviceId,
characteristicId: this.data.charecteristicId,
success: res => {
console.log('readBLECharacteristicValue讀取特征值成功:', res)
},
fail: err => {
console.log('readBLECharacteristicValue讀取特征值失敗:', err)
}
})
}<br>###(10)轉為 16 進制####官方文檔中介紹了 ArrayBuffer 轉為 16 進制的方法
// ArrayBuffer轉16進制字符串示例
ab2hex(buffer) {
let hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
<br>###(11)值轉換####官方文檔介紹的方法似乎有點不適用哎,試下這個
ab2Str(arrayBuffer){
let unit8Arr = new Uint8Array(arrayBuffer);
let encodedString = String.fromCharCode.apply(null, unit8Arr);
return encodedString;
}ACSII碼16進制轉換代碼
如以上轉換都不能成功,請試用以下轉換代碼
ab2Weight(abValue) {
let characteristicValue = this.ab2hex(abValue);
let strValue = this.hexCharCodeToStr(characteristicValue)
return strValue
// let weightValue =
},
ab2hex(buffer) {
let 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;
if (len % 2 !== 0) {
alert("Illegal Format ASCII Code!");
return "";
}
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join("");
}


來源:http://www.dzc360.com/new/WeChat-scale.html
我們專業提供電子秤硬件稱重設備:服務電話:0755-23035550 直線:18923420600/15307550221
聯系人:黃金
手 機:153 0755 0221
郵 箱:jane@dzc.hk
公 司:深圳市山星盛電子科技有限公司-稱重產品官方展示網站
地 址:廣東省深圳市寶安鳳塘大道25號(山星盛電子秤)