山星盛電子科技是一家衡器硬件設備提供商,我們專(zhuān)業(yè)提供ERP管理系統PC,APP,APK,POS,PDA,安卓The android和蘋(píng)果apple手機IOS及android操作系統,電腦端微軟Microsoft安裝版及文本直接傳送的電子秤,平臺秤,物聯(lián)網(wǎng)電子稱(chēng),藍牙無(wú)線(xiàn)電子秤,WIFI電子秤,手機軟件直連手機等稱(chēng)重設備,買(mǎi)我們電子秤能提供騰訊微信小程序demo程序開(kāi)發(fā)包,還能提供安卓和蘋(píng)果手機APP軟件電子秤連接的demo指導文件及開(kāi)發(fā)包供您開(kāi)發(fā)自己的軟件。
騰訊微信小程序電子稱(chēng)
前情:在微信小程序中連接藍牙電子計重桌秤,(電子秤品牌:山星盛MOUNT STAR),直接通過(guò)藍牙獲取當前稱(chēng)重的重量數據,然后顯示在界面上。
ps:記錄的時(shí)候,還在開(kāi)發(fā)階段,得到了數據,數據有會(huì )實(shí)時(shí)變化。
此次,只涉及讀取數據,沒(méi)有寫(xiě)入數據,具體 API 查看小程序官方文檔
確保手機藍牙已經(jīng)打開(kāi),并且可以搜索到該電子秤的藍牙設備,android 可以搜到,ios 搜不到
微信小程序中搜索到的藍牙設備很多,deviceId 在 android 上顯示為藍牙設備主服務(wù)的 mac 地址,在 ios 上顯示為藍牙設備主服務(wù)的 uuid
最終得到的結果是 ArrayBuffer 型數據,需要先轉為16進(jìn)制字符串,再轉為10進(jìn)制數據
// 定義數據data: { devices: [], // 搜索到的藍牙設備 deviceId 數組 deviceId: '', // 目標藍牙設備 deviceId services: [] // 設備服務(wù)列表 serviceId 數組 serviceId: '', characteristics: [] // 特征值列表 characteristicId: '' // 選擇某一個(gè)特征值 value: '' // 16 進(jìn)制數據值}// 藍牙 API 調用步驟openBluetoothAdapter() { wx.openBluetoothAdapter({ // (1) success: res => { console.log('openBluetoothAdapter初始化藍牙模塊成功:', res) this.startBluetoothDevicesDiscovery() // (2) 開(kāi)始搜索 }, fail: err => { console.log('openBluetoothAdapter初始化藍牙模塊失?。?#39;, err) if (err.errCode === 10001) { // 當前藍牙適配器不可用 wx.onBluetoothAdapterStateChange( res => { if (res.available) { this.startBluetoothDevicesDiscovery() } }) } } }) }
入參 services 作用要搜索的藍牙設備主 service 的 uuid 列表,某些藍牙設備會(huì )廣播自己的主 service 的 uuid,如果設置此參數,則只搜索廣播包括對應 uuid 的主服務(wù)的藍牙設備,可以通過(guò)該參數過(guò)濾掉周邊不需要處理的其他藍牙設備
入參 allowDuplicatesKey 作用是否允許重復上報同一設備,如果允許重復上報,則 wx.onBlueToothDeviceFound 方法會(huì )多次上報同一設備,但是 RSSI 值會(huì )有不同,默認為 false
eg: services: ['FEE7'] 主服務(wù)的 UUID 是 FEE7,傳入這個(gè)參數,只搜索主服務(wù) UUID 為 FEE7 的設備,該設備是微信硬件平臺的藍牙智能燈
?? 此操作比較耗費系統資源,需要在搜索并連接到設備后調用 wx.stopBluetoothDevicesDiscovery 方法停止搜索
startBluetoothDevicesDiscovery() { wx.startBluetoothDevicesDiscovery({ success: res => { console.log('startBluetoothDevicesDiscovery開(kāi)始搜索外圍設備成功:', res) this.getBluetoothDevices() // (3) 獲取藍牙列表 }, fail: err => { console.log('startBluetoothDevicesDiscovery搜索外圍設備失?。?#39;, err) } }) }
getBluetoothDevices() { wx.getBluetoothDevices({ success: res => { console.log('getBluetoothDevices獲取藍牙設備成功:', res) this.setData({ devices: res. devices || [] // uuid 對應的的已連接設備列表 }) this.createBLEConnection(); // (4) 與目標設備建立連接 }, fail: err => { console.log('getBluetoothDevices獲取藍牙設備失?。?#39;, err) } }) }
?? 如果微信小程序此前搜索過(guò)某個(gè)藍牙設備,并成功建立連接,可直接傳入之前搜索獲取的 deviceId 直接嘗試連接該設備,不用重新搜索
createBLEConnection() { // 如果是第一次建立連接,可以通過(guò)名稱(chēng)匹配,獲取相應設備的 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)獲取服務(wù) }, fail: err => { console.log('createBLEConnection與目標藍牙連接失?。?#39;, err) } }) }
入參 deviceId 為 wx.getBluetoothDevices 中獲取的目標藍牙設備的 deviceId
??開(kāi)發(fā)過(guò)程中,主服務(wù) serviceId 和 主服務(wù)的特征值 characteristics 都是選取的實(shí)際操作過(guò)程中,得到的類(lèi)似于該目標藍牙設備的 id,但是小程序官方文檔的 demo,遍歷了所有的列表(serviceId 和 characteristics),需要區分一下
getBLEDeviceServices() { wx.getBLEDeviceServices({ deviceId: this.data.deviceId, success: res => { console.log('getBLEDeviceServices獲取藍牙設備服務(wù)', res) // getBluetoothDevices 獲取的有 deviceId 和 advertisServiceUUIDs,可以在這里獲取的服務(wù)列表中選擇一個(gè)一樣的作為后續 API 請求的服務(wù)id,這個(gè) id 需要滿(mǎn)足是否可讀 this.setData({ services: res.services, serviceId: res.services[0].uuid // 假設是第一個(gè) }) this.getBLEDeviceCharacteristics() // (6) 獲取特征值 // 官方 demo for(var i = 0; i < res.services.length; i++) { // 該服務(wù)是否為主服務(wù) if(res.services[i].isPrimary) { this.getBLEDeviceCharacteristics(res.services[i].uuid) } } }, fail: err => { console.log('getBLEDeviceServices獲取藍牙設備服務(wù)失?。?#39;, err) } }) }
入參 deviceId 為 wx.getBluetoothDevices 中獲取的目標藍牙設備的 deviceId
入參 serviceId 為藍牙服務(wù) uuid ,通過(guò) wx.getBLEDeviceServices 獲取
getBLEDeviceCharacteristics(serviceId) { wx.getBLEDeviceCharacteristics({ deviceId: this.data.deviceId, serviceId: this.data.serviceId, success: res => { console.log('getBLEDeviceCharacteristics獲取藍牙服務(wù)特征值成功:', 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獲取藍牙服務(wù)特征值失?。?#39;, err) } }) this.onBLECharacteristicValueChange() // (8)監聽(tīng)特征值變化 this.readBLECharacteristicValue(); // (9)讀取數據}
??必須設備的特征值支持 notify 或者 indicate 才可以成功啟用
notifyBLECharacteristicValueChange() { wx.notifyBLECharacteristicValueChange({ deviceId: this.data.deviceId, serviceId: this.data.serviceId, characteristicId: this.data. characteristicId, state: true // 是否啟用 notify (四個(gè)字段全部必填) }) }
??必須先啟用 notifyBLECharacteristicValueChange 接口才能接收到設備推送的 notification(通知)
// 先監聽(tīng)一下,保證第一時(shí)間獲取數據onBLECharacteristicValueChange() { wx.onBLECharacteristicValueChange( characteristic => { console.log('onBLECharacteristicValueChange從目標藍牙設備監聽(tīng)到的數據值:', characteristic) this.setData({ value: this.ab2hex(abcharacteristic.value) // (10) 轉為 16 進(jìn)制 }) }) }
??必須目標藍牙設備的特征值支持 read 才可以成功調用,并且單獨使用 readBLECharacteristicValue 并不能獲取到真正的特征值,只能返回獲取特征值的狀態(tài),即是否成功獲取到值,真正的值需要使用 wx.onBLECharacteristicValueChange() 執行回調才可以在 wx.onBLECharacteristicValueChange() 這個(gè) 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讀取特征值失?。?#39;, err) } }) }
<br>###(10)轉為 16 進(jìn)制####官方文檔中介紹了 ArrayBuffer 轉為 16 進(jìn)制的方法 // ArrayBuffer轉16進(jìn)制字符串示例 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)值轉換####官方文檔介紹的方法似乎有點(diǎn)不適用哎,試下這個(gè) ab2Str(arrayBuffer){ let unit8Arr = new Uint8Array(arrayBuffer); let encodedString = String.fromCharCode.apply(null, unit8Arr); return encodedString; }
ACSII碼16進(jìn)制轉換代碼
如以上轉換都不能成功,請試用以下轉換代碼
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("");
}
來(lái)源:http://www.dzc360.com/new/WeChat-scale.html
我們專(zhuān)業(yè)提供電子秤硬件稱(chēng)重設備:服務(wù)電話(huà):0755-23035550 直線(xiàn):18923420600/15307550221
聯(lián)系人:黃金
手 機:153 0755 0221
郵 箱:jane@dzc.hk
公 司:深圳市山星盛電子科技有限公司-稱(chēng)重產(chǎn)品官方展示網(wǎng)站
地 址:廣東省深圳市寶安鳳塘大道25號(山星盛電子秤)