From a1613196906ec3f5acebbdd9826a6dbe15427e77 Mon Sep 17 00:00:00 2001 From: qiaocl <3189782663@qq.com> Date: Fri, 30 May 2025 09:49:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9ET01=E8=B7=B3=E7=BB=B3demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bluetooth_demo_F01/pages/index/index.js | 1 - bluetooth_demo_G02.zip | Bin 0 -> 7706 bytes bluetooth_demo_G02/README.md | 8 + bluetooth_demo_G02/app.js | 5 + bluetooth_demo_G02/app.json | 20 + bluetooth_demo_G02/app.wxss | 55 +++ bluetooth_demo_G02/pages/index/index.js | 271 ++++++++++++ bluetooth_demo_G02/pages/index/index.json | 4 + bluetooth_demo_G02/pages/index/index.wxml | 34 ++ bluetooth_demo_G02/project.config.json | 57 +++ .../project.private.config.json | 4 + bluetooth_demo_G02/sitemap.json | 7 + bluetooth_demo_G02/utils/util.js | 30 ++ bluetooth_demo_J01.zip | Bin 7994 -> 0 bytes bluetooth_demo_L01.zip | Bin 6370 -> 0 bytes bluetooth_demo_L08.zip | Bin 7653 -> 0 bytes bluetooth_demo_T01.zip | Bin 0 -> 8803 bytes bluetooth_demo_T01/README.md | 8 + bluetooth_demo_T01/app.js | 5 + bluetooth_demo_T01/app.json | 14 + bluetooth_demo_T01/app.wxss | 55 +++ bluetooth_demo_T01/pages/index/index.js | 393 ++++++++++++++++++ bluetooth_demo_T01/pages/index/index.json | 4 + bluetooth_demo_T01/pages/index/index.wxml | 45 ++ bluetooth_demo_T01/project.config.json | 57 +++ .../project.private.config.json | 4 + bluetooth_demo_T01/sitemap.json | 7 + bluetooth_demo_T01/utils/util.js | 54 +++ 28 files changed, 1141 insertions(+), 1 deletion(-) create mode 100644 bluetooth_demo_G02.zip create mode 100644 bluetooth_demo_G02/README.md create mode 100644 bluetooth_demo_G02/app.js create mode 100644 bluetooth_demo_G02/app.json create mode 100644 bluetooth_demo_G02/app.wxss create mode 100644 bluetooth_demo_G02/pages/index/index.js create mode 100644 bluetooth_demo_G02/pages/index/index.json create mode 100644 bluetooth_demo_G02/pages/index/index.wxml create mode 100644 bluetooth_demo_G02/project.config.json create mode 100644 bluetooth_demo_G02/project.private.config.json create mode 100644 bluetooth_demo_G02/sitemap.json create mode 100644 bluetooth_demo_G02/utils/util.js delete mode 100644 bluetooth_demo_J01.zip delete mode 100644 bluetooth_demo_L01.zip delete mode 100644 bluetooth_demo_L08.zip create mode 100644 bluetooth_demo_T01.zip create mode 100644 bluetooth_demo_T01/README.md create mode 100644 bluetooth_demo_T01/app.js create mode 100644 bluetooth_demo_T01/app.json create mode 100644 bluetooth_demo_T01/app.wxss create mode 100644 bluetooth_demo_T01/pages/index/index.js create mode 100644 bluetooth_demo_T01/pages/index/index.json create mode 100644 bluetooth_demo_T01/pages/index/index.wxml create mode 100644 bluetooth_demo_T01/project.config.json create mode 100644 bluetooth_demo_T01/project.private.config.json create mode 100644 bluetooth_demo_T01/sitemap.json create mode 100644 bluetooth_demo_T01/utils/util.js diff --git a/bluetooth_demo_F01/pages/index/index.js b/bluetooth_demo_F01/pages/index/index.js index 304a2f5..958ba19 100644 --- a/bluetooth_demo_F01/pages/index/index.js +++ b/bluetooth_demo_F01/pages/index/index.js @@ -212,7 +212,6 @@ Page({ }) // 初始化插件 plugin.initPlugin(res.characteristics, that._device) - wx.onBLECharacteristicValueChange((characteristic) => { let bleData = plugin.parseBleData(characteristic.value) let dw1 = "kg" diff --git a/bluetooth_demo_G02.zip b/bluetooth_demo_G02.zip new file mode 100644 index 0000000000000000000000000000000000000000..b8d8445b19ab87000bc6b61cc06090c80085a8a4 GIT binary patch literal 7706 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 literal 0 HcmV?d00001 diff --git a/bluetooth_demo_G02/README.md b/bluetooth_demo_G02/README.md new file mode 100644 index 0000000..badfeb4 --- /dev/null +++ b/bluetooth_demo_G02/README.md @@ -0,0 +1,8 @@ +# #参考使用设备类型 +``` +F01PRO + +``` + +## + diff --git a/bluetooth_demo_G02/app.js b/bluetooth_demo_G02/app.js new file mode 100644 index 0000000..ff15a95 --- /dev/null +++ b/bluetooth_demo_G02/app.js @@ -0,0 +1,5 @@ +//app.js +App({ + onLaunch: function () { + } +}) \ No newline at end of file diff --git a/bluetooth_demo_G02/app.json b/bluetooth_demo_G02/app.json new file mode 100644 index 0000000..36fa20f --- /dev/null +++ b/bluetooth_demo_G02/app.json @@ -0,0 +1,20 @@ +{ + "pages": [ + "pages/index/index" + ], + "window": { + "navigationBarBackgroundColor": "#0082FE", + "navigationBarTextStyle": "white", + "navigationBarTitleText": "蓝牙连接Demo", + "backgroundColor": "#eeeeee", + "backgroundTextStyle": "light" + }, + "plugins": { + "sdkPlugin": { + "version": "2.1.0", + "provider": "wx17e93aad47cdae1a" + } + }, + "style": "v2", + "sitemapLocation": "sitemap.json" +} diff --git a/bluetooth_demo_G02/app.wxss b/bluetooth_demo_G02/app.wxss new file mode 100644 index 0000000..bee9f30 --- /dev/null +++ b/bluetooth_demo_G02/app.wxss @@ -0,0 +1,55 @@ +/**app.wxss**/ +view, +cover-view, +scroll-view, +swiper, +swiper-item, +movable-area, +movable-view, +button, +input, +textarea, +label, +navigator { + box-sizing: border-box; +} + +page { + --safe-bottom: env(safe-area-inset-bottom); +} + +.container { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + width: 100vw; + height: 100vh; + padding-bottom: var(--safe-bottom); +} + +.header { + width: 100%; +} + +.header button { + font-size: 16px; + line-height: 40px; + width: 100% !important; + border-bottom: 1px solid #dfdfdf; +} + +.device_item { + padding: 15px; + border-bottom: 1px solid #dfdfdf; +} + +.weight { + width: 100%; + margin: 15px; + padding-bottom: 15px; + text-align: center; + font-size: 18px; + font-weight: 700; + border-bottom: 1px solid #dfdfdf; +} diff --git a/bluetooth_demo_G02/pages/index/index.js b/bluetooth_demo_G02/pages/index/index.js new file mode 100644 index 0000000..e8e467f --- /dev/null +++ b/bluetooth_demo_G02/pages/index/index.js @@ -0,0 +1,271 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +const plugin = requirePlugin("sdkPlugin").AiLink; +Page({ + data: { + devices: [], + connected: false, + name: '', + height: "", + imp: "", + deviceId: null, + }, + onLoad: function() {}, + // 初始化蓝牙模块 + openBluetoothAdapter() { + wx.openBluetoothAdapter({ + success: (res) => { + console.log('openBluetoothAdapter success', res) + wx.showToast({ + title: '蓝牙连接中', + icon: "none" + }) + this.startBluetoothDevicesDiscovery() + }, + fail: (res) => { + if (res.errCode === 10001) { + wx.showToast({ + title: '请打开蓝牙', + icon: "none" + }) + // 监听本机蓝牙状态变化的事件 + wx.onBluetoothAdapterStateChange((res) => { + console.log('onBluetoothAdapterStateChange', res) + if (res.available) { + this.startBluetoothDevicesDiscovery() + } + }) + } + } + }) + }, + + // 开始搜寻附近的蓝牙外围设备 + startBluetoothDevicesDiscovery() { + if (this._discoveryStarted) { + return + } + this._discoveryStarted = true + wx.startBluetoothDevicesDiscovery({ + allowDuplicatesKey: true, + interval: 500, //上报设备的间隔 + success: (res) => { + console.log('startBluetoothDevicesDiscovery success', res) + this.onBluetoothDeviceFound() + }, + }) + }, + // 停止搜寻附近的蓝牙外围设备 + stopBluetoothDevicesDiscovery() { + wx.stopBluetoothDevicesDiscovery() + }, + + // 找到新设备的事件 + onBluetoothDeviceFound() { + wx.onBluetoothDeviceFound((res) => { + res.devices.forEach(device => { + if (!device.name && !device.localName) { + return + } + if (device.name.indexOf('G02') != -1) { + wx.stopBluetoothDevicesDiscovery() + const foundDevices = this.data.devices + const idx = inArray(foundDevices, 'deviceId', device.deviceId) + const data = {} + let buff = device.advertisData.slice(-6) + device.mac = new Uint8Array(buff) // 保存广播数据中的mac地址,这是由于iOS不直接返回mac地址 + let tempMac = Array.from(device.mac) + tempMac.reverse() + device.macAddr = ab2hex(tempMac, ':').toUpperCase() + if (idx === -1) { + data[`devices[${foundDevices.length}]`] = device + } else { + data[`devices[${idx}]`] = device + } + this.setData(data) + } + }) + }) + }, + // 连接低功耗蓝牙设备 + createBLEConnection(e) { + wx.showLoading({ + title: '连接中', + }) + const ds = e.currentTarget.dataset + const index = ds.index + this._device = this.data.devices[index] + const deviceId = ds.deviceId + const name = ds.name + this.mac = ds.mac + wx.createBLEConnection({ + deviceId, + success: (res) => { + this.setData({ + connected: true, + name, + deviceId, + }) + console.log("createBLEConnection:success") + this.onBLEConnectionStateChange() + this.getBLEDeviceServices(deviceId) + }, + fail: res => { + wx.hideLoading() + wx.showToast({ + title: '连接失败', + icon: 'none' + }) + } + }) + }, + //监听蓝牙连接状态 + onBLEConnectionStateChange() { + wx.onBLEConnectionStateChange((res) => { + if (!res.connected) { + setTimeout(() => { + wx.showToast({ + title: '连接已断开', + icon: 'none' + }) + }, 500) + this.setData({ + connected: false, + devices: [], + height: "", + }) + } + }) + }, + + // 获取蓝牙设备的 serviceId + getBLEDeviceServices(deviceId) { + wx.getBLEDeviceServices({ + deviceId, + success: (res) => { + for (let i = 0; i < res.services.length; i++) { + if (res.services[i].isPrimary && res.services[i].uuid.indexOf('FFF0') > -1) { + wx.showLoading({ + title: '获取设备的UUID成功', + }) + this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) + return + } + } + } + }) + }, + + // 获取蓝牙设备某个服务中所有特征值(characteristic) + /** + * read: true读,write: true写,notify: true广播 + */ + getBLEDeviceCharacteristics(deviceId, serviceId) { + let that = this + that._deviceId = deviceId + that._serviceId = serviceId + that._device.serviceId = serviceId + + function PrefixZero(num, n) { + return (Array(n).join(0) + num).slice(-n); + } + wx.hideLoading() + wx.getBLEDeviceCharacteristics({ + deviceId, + serviceId, + success: (res) => { + for (let i = 0; i < res.characteristics.length; i++) { + let item = res.characteristics[i]; + if (item.uuid.indexOf('0000FFF1') != -1) { + this.notifyBLECharacteristicValue(deviceId, serviceId, item.uuid) + } + } + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + + notifyBLECharacteristicValue(deviceId, serviceId, notifyId) { + let that = this + wx.notifyBLECharacteristicValueChange({ + state: true, // 启用 notify 功能 + deviceId: deviceId, + serviceId: serviceId, + characteristicId: notifyId, + success(res) { + wx.onBLECharacteristicValueChange((characteristic) => { + let value = ab2hex(characteristic.value, ""); + let data = parseInt(value.substring(7, 10), 16) + let unit = parseInt(value.substring(10, 12)) + let digit = parseInt(value.substring(12, 14)) + let unit2 = 'cm' + if (digit == "1") { + data = data / 10 + } + if (digit == "2") { + data = data / 100 + } + if (unit == "0") { + unit2 = "cm" + } + if (unit == "1") { + unit2 = "inch" + } + if (unit == "2") { + unit2 = "ft" + let data1 = data / 12 + let data2 = Number(data1 - Math.floor(data1)) * 12 + let height = Math.floor(data1) + "'" + data2.toFixed(1) + that.setData({ + height: "身高是:" + height + unit2 + }) + } else { + that.setData({ + height: "身高是:" + data + unit2 + }) + } + }) + } + }) + }, + + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + height: "", + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + devices: [], + text: "", + height: "", + weight: "", + imp: "" + }) + }, + +}); \ No newline at end of file diff --git a/bluetooth_demo_G02/pages/index/index.json b/bluetooth_demo_G02/pages/index/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/bluetooth_demo_G02/pages/index/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/bluetooth_demo_G02/pages/index/index.wxml b/bluetooth_demo_G02/pages/index/index.wxml new file mode 100644 index 0000000..535eef3 --- /dev/null +++ b/bluetooth_demo_G02/pages/index/index.wxml @@ -0,0 +1,34 @@ + + module.exports.max = function(n1, n2) { + return Math.max(n1, n2) + } + module.exports.len = function(arr) { + arr = arr || [] + return arr.length + } + + + + + + + + + + {{height}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + diff --git a/bluetooth_demo_G02/project.config.json b/bluetooth_demo_G02/project.config.json new file mode 100644 index 0000000..809d2a2 --- /dev/null +++ b/bluetooth_demo_G02/project.config.json @@ -0,0 +1,57 @@ +{ + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "setting": { + "urlCheck": true, + "es6": false, + "enhance": true, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "useIsolateContext": true, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "disableUseStrict": false, + "minifyWXML": true, + "showES6CompileOption": false, + "useCompilerPlugins": false, + "ignoreUploadUnusedFiles": true, + "condition": false + }, + "compileType": "miniprogram", + "simulatorType": "wechat", + "simulatorPluginLibVersion": {}, + "projectname": "bluetooth_demo_F01", + "libVersion": "2.23.2", + "appid": "wx39cf431caa22b5c8", + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + }, + "condition": {}, + "packOptions": { + "ignore": [], + "include": [] + } +} \ No newline at end of file diff --git a/bluetooth_demo_G02/project.private.config.json b/bluetooth_demo_G02/project.private.config.json new file mode 100644 index 0000000..d4dc1a3 --- /dev/null +++ b/bluetooth_demo_G02/project.private.config.json @@ -0,0 +1,4 @@ +{ + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "projectname": "bluetooth_demo_F01" +} \ No newline at end of file diff --git a/bluetooth_demo_G02/sitemap.json b/bluetooth_demo_G02/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/bluetooth_demo_G02/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/bluetooth_demo_G02/utils/util.js b/bluetooth_demo_G02/utils/util.js new file mode 100644 index 0000000..7aafdf3 --- /dev/null +++ b/bluetooth_demo_G02/utils/util.js @@ -0,0 +1,30 @@ +function inArray(arr, key, val) { + if (!arr || !arr.length || typeof arr != 'object' || !Array.isArray(arr)) { + return -1 + } + for (let i = 0; i < arr.length; i++) { + if (!key) { + if (arr[i] == val) { + return i + } + } else if (arr[i][key] === val) { + return i + } + } + return -1; +} + +// ArrayBuffer转16进度字符串示例 +function ab2hex(buffer, split) { + var hexArr = Array.prototype.map.call( + new Uint8Array(buffer), + function(bit) { + return ('00' + bit.toString(16)).slice(-2) + } + ) + return hexArr.join(split); +} +module.exports = { + inArray, + ab2hex, +} diff --git a/bluetooth_demo_J01.zip b/bluetooth_demo_J01.zip deleted file mode 100644 index c753a7a8d416200b9cc203a38a42f43cb5714ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7994 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 Ifq#AXf2;yyEdT%j diff --git a/bluetooth_demo_L01.zip b/bluetooth_demo_L01.zip deleted file mode 100644 index 5a748c5cbe06cd85b53b1a8b680e5dd7c50e9e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6370 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 diff --git a/bluetooth_demo_L08.zip b/bluetooth_demo_L08.zip deleted file mode 100644 index 88c1551007c66582a05fc7496f3a2b442c83a2eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7653 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%0ATu?8Rq6} zZ*2+Xv~+f|v9m=SvJid-SXG^Z=X&ct+eoISmXu@|MIKEK6aN575m=|c>ZSqdi`FU2 zIDer7jl(x4z7X{yE#KS*C7q2|#b1R!k=pOt)WAZzsJ;xPecDg^l+MM@iH?IaAu3s6 zRar$gXL{atcHiUs`PlaR(zIdf^Rweam$OehYez4scjtD8RvSXMxbQ731WI(!3u(Z} zGhp=g(7U>7YOLU%iDczW$iyVW7l!ZITAg6ZuO!S`jJ_?V;oKx0air#e*ugf!gl=+pkc%fAgLM)5= z>TI~<3z5SDaMu^K-DuB7|2qW3iicRZK1!&z!{+=fMyS$HM(AJ;-AwOlq@QROl@;ux zPHuN+G?rGPsLFFtvh`2*>p`%kXte?Z-X-R-WtGiK3<6g~W)yez!$sk~hTH;#ZKdO% zmK!_jb%_RycjGw2Tx^=P(vR|$z8#+oX+7a_YN@TS^y3_IP%%(pug8)*k40s9ps4^M zW5kp)Rt%4Z2!nX^*p4*p8>9W>XIJ1J@2aJSK zQnmrRV2fj3GlJK1J`nAf6}ek#JMS0k6ndN(-6iZ*MngohTS!>TMVWCt z{rX$Y(-S?FkwH!5cQeHkJSMoJ^*eB-wJ4;KumuMf_H5Wo3?~X}i{YA+#H9o!l*9>i>K)YhP? z1}HYrf)oy#;8Y`I&78s*iA=#ypZn<4u?XgsCYqWpE?pA-g-3XOD=4oXA^2B__BZZ? zyB*Zp(fq0X+R3nC5B{f-wEo^~{Gbc^jgGCrfNrXn+ zk|N-_PvYPqvbIc_X%2JMK&cHaxu!(Aw$fJrEqe2pS1lng$5al%hH#1FISqQV!RE4&G`V9hT3_IH?)+9*BKy85|bjpNr8 z?|x8+RV=WW7ZX_id6Vp>K;gNe$RiD9BxG^G)rK1(fC2HSE?(Dvc2~Lfz#q>O06+qe z0oX{T8v2E&kt|4|GH^r>G#CGI{}b|e-u^EL4FbZ0XjlAe;NMRFW!kWZrv(f_@w!pY zeL?dGkobf4r;~q~R&_P)Uw;0jzyK(fBG??0NO^wBiWf+h7ncM3J3Id}iWDLKD+2q8 za(22L*JQFCkEGNT(&M*!)k6rF{MnzdKi%)kFdf7!`y1GW7k(KQmle~V^Jo&O5;ZXY z0>;gEIf+;60`$8sP_Kmjv}G@&)Yv3{Q%4KZ&-;IpAoXu3!GA*ibbv1dufcu?{`vxc z0k86jFDDZE-+{ke^WWIkE;C|7YXkCu<=RCMj=I=+7%i#Oh{voM9BmD*b zT|B>(T0+)=ccIj??91q%O8xV|avA;pe??y$UoJ;oYWW#@5$)G#+aJ39mHx}={&Tx{ z89j%8b<}@u9xrq8au%~LxC2h5Kk9&u;eSdP6Y%G1eVIFf$jcS;vEM7|uL^rPr+==mzfd#?)c1cv{cE+oOsteq l;*&>IA3yS0){Cn8>llfKEL-p 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 { + console.log('openBluetoothAdapter success', res) + wx.showToast({ + title: '蓝牙搜索中', + icon: "none" + }) + this.startBluetoothDevicesDiscovery() + }, + fail: (res) => { + if (res.errCode === 10001) { + wx.showToast({ + title: '请打开蓝牙', + icon: "none" + }) + } + } + }) + }, + // 开始搜寻附近的蓝牙外围设备 + startBluetoothDevicesDiscovery() { + wx.startBluetoothDevicesDiscovery({ + allowDuplicatesKey: true, + interval: 200, //上报设备的间隔 + services: [], + success: (res) => { + console.log('startBluetoothDevicesDiscovery success', res) + this.onBluetoothDeviceFound() + }, + }) + }, + // 停止搜寻附近的蓝牙外围设备 + stopBluetoothDevicesDiscovery() { + wx.stopBluetoothDevicesDiscovery() + }, + + // 找到新设备的事件 + onBluetoothDeviceFound() { + wx.onBluetoothDeviceFound((res) => { + res.devices.forEach(device => { + if (!device.name && !device.localName) { + return + } + if (device.name.indexOf('YPC') != -1) { + wx.stopBluetoothDevicesDiscovery() + const foundDevices = this.data.devices + const idx = inArray(foundDevices, 'deviceId', device.deviceId) + const data = {} + const tempMac = device.name.substring(7, 19) + device.macAddr = tempMac.substring(0, tempMac.length - 1) + .replace(/(.{2})(?!$)/g, '$1:') + tempMac.substring(tempMac.length - 1); + if (idx === -1) { + data[`devices[${foundDevices.length}]`] = device + } else { + data[`devices[${idx}]`] = device + } + this.setData(data) + } + }) + }) + }, + // 连接低功耗蓝牙设备 + createBLEConnection(e) { + this._connLoading = true + wx.showLoading({ + title: '连接中', + }) + setTimeout(() => { + if (this._connLoading) { + this._connLoading = false + wx.hideLoading() + } + }, 6000) + const ds = e.currentTarget.dataset + const index = ds.index + this._device = this.data.devices[index] + const deviceId = ds.deviceId + const name = ds.name + this.mac = ds.mac + wx.createBLEConnection({ + deviceId, + success: (res) => { + this.setData({ + connected: true, + name, + deviceId, + }) + console.log("createBLEConnection:success") + this.onBLEConnectionStateChange() + this.getBLEDeviceServices(deviceId) + }, + fail: res => { + this._connLoading = false + wx.hideLoading() + wx.showToast({ + title: '连接失败', + icon: 'none' + }) + } + }) + }, + //监听蓝牙连接状态 + onBLEConnectionStateChange() { + wx.onBLEConnectionStateChange((res) => { + if (!res.connected) { + setTimeout(() => { + wx.showToast({ + title: '连接已断开', + icon: 'none' + }) + }, 500) + this.setData({ + devices: [], + weight: "", + text: "", + Mode: "", + kcal: "", + }) + } + }) + }, + + // 获取蓝牙设备的 serviceId + getBLEDeviceServices(deviceId) { + wx.getBLEDeviceServices({ + deviceId, + success: (res) => { + for (let i = 0; i < res.services.length; i++) { + let service = res.services[i]; + if (service.uuid.indexOf('FFE0') > -1) { + this.data.serviceId = service.uuid + this.data.deviceId = deviceId + this.getBLEDeviceCharacteristics(deviceId, service.uuid) + wx.showLoading({ + title: '获取设备的UUID成功', + }) + return + } + } + } + }) + }, + + // 获取蓝牙设备某个服务中所有特征值(characteristic) + /** + * read: true读,write: true写,notify: true广播 + */ + getBLEDeviceCharacteristics(deviceId, serviceId) { + let that = this + this._deviceId = deviceId + this._serviceId = serviceId + this._device.serviceId = serviceId + wx.showLoading({ + title: '连接成功', + }) + wx.getBLEDeviceCharacteristics({ + deviceId, + serviceId, + success: (res) => { + console.log("服务的特征值成功:", res) + for (let i = 0; i < res.characteristics.length; i++) { + let item = res.characteristics[i]; + if (item.uuid.indexOf('0000FFE4') != -1) { + that.data.uuid1 = item.uuid //主服务 UUID + } else if (item.uuid.indexOf('0000FF12') != -1) { + that.data.uuid2 = item.uuid //写入设置 + } + } + setTimeout(function() { //下发密码指令 + let j = Number(165 + 10 + 1 + 8 + 8 + 8 + 8 + 8 + 8).toString(16) + let str = "A50A01080808080808" + j.substr(j.length - 2, 2) + that.SendData(str) + }, 300) + setTimeout(function() { //设置体重指令 默认100斤 + let num = parseInt(100).toString(); + let m = Number(165 + 5 + 8 + Number(num)).toString(16) + let send = "A50508" + Number(num).toString(16) + m.substr(m.length - 2, + 2) + that.SendData(send) + }, 600) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid1, + state: true, + }) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid2, + state: true, + }) + that.notifyBLECharacteristicValue() + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + notifyBLECharacteristicValue() { + let that = this; + wx.notifyBLECharacteristicValueChange({ + state: true, // 启用 notify 功能 + deviceId: that.data.deviceId, + serviceId: that.data.serviceId, + characteristicId: that.data.uuid1, + success(res) { + wx.onBLECharacteristicValueChange((characteristic) => { + let value = ab2hex(characteristic.value, ""); + let count = parseInt(value.substring(8, 12), 16) + let Ycount = parseInt(value.substring(12, 16), 16) //设置次数 + let time = parseInt(value.substring(16, 20), 16) //运行时间/秒 + let timeDown = parseInt(value.substring(20, 24), 16) //倒计时时间 + let type = parseInt(value.substring(30, 32), 16) //当前状态 + let weight = parseInt(value.substring(32, 34), 16) //重量 + let kcal = parseInt(value.substring(34, 38), 16) / 10 //卡路里 + let minutes = 0 + let seconds = 0 + let time_m = "00" + let time_s = "00" + let j = null + let str = null + if (value == '5a05090169') { //模式设置成功 + setTimeout(function() { + j = Number(165 + 5 + 5).toString(16) + str = "A5050500" + j.substr(j.length - 2, 2) + that.SendData(str) //开始 + }, 900) + setTimeout(function() { + j = Number(165 + 5 + 3).toString(16) + str = "A5050300" + j.substr(j.length - 2, 2) + that.SendData(str) //连续 + }, 1200) + + } + if (value == '5a05080168') { + setTimeout(function() { //自由模式 + that.data.Mode = "自由模式" + j = Number(165 + 8 + 9).toString(16) + str = "A5080900000000" + j.substr(j.length - 2, 2) + that.SendData(str) //连续 + console.log("模式模式") + }, 300) + } + console.log("value", value, type, that.data.active) + if (type == 0 || type == 4) { + if (that.data.active != 2 && count != 0) { //自由模式 + 计数 + minutes = Math.floor((time % 3600) / 60) + seconds = time % 60 + } + if (that.data.active == 2) { //计时 + let T = Number(timeDown) - Number(time) + minutes = Math.floor((T % 3600) / 60) + seconds = T % 60 + } + time_m = minutes > 9 ? minutes : '0' + minutes + time_s = seconds > 9 ? seconds : '0' + seconds + that.setData({ + Mode: that.data.Mode, + weight: "跳绳个数:" + count, + text: "时长:" + time_m + ':' + time_s, + kcal: "消耗卡路里:" + Math.floor(kcal), + }) + } + + }) + } + }) + }, + // 模式切换 + handleStart(e) { + let that = this + let m = null + let send = null + console.log("ind", ind) + that.data.active = e.currentTarget.dataset.name + let ind = e.currentTarget.dataset.name + if (ind == 1) { // 1自由 + m = Number(165 + 8 + 9).toString(16) + send = "A5080900000000" + m.substr(m.length - 2, 2) + that.data.Mode = "自由模式" + } + if (ind == 2) { //2定时 默认60秒 + m = Number(165 + 8 + 9 + 60).toString(16) + send = "A508090000" + toHex(60, 4) + m.substr(m.length - 2, 2) + that.data.Mode = "定时模式" + } + if (ind == 3) { //3定数 默认50个 + m = Number(165 + 8 + 9 + 50).toString(16) + send = "A50809" + toHex(50, 4) + "0000" + m.substr(m.length - 2, 2) + that.data.Mode = "定数模式" + } + console.log("send", send) + that.SendData(send) + that.stopBluetoothDevicesDiscovery() + }, + SendData(str) { + let that = this + let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) { + return parseInt(h, 16) + })) + wx.writeBLECharacteristicValue({ + deviceId: that.data.deviceId, + serviceId: that.data.serviceId, + characteristicId: that.data.uuid2, + value: buf.buffer, + success: res => { + console.log('下发指令', res.errMsg) + wx.showToast({ + title: '下发指令成功', + duration: 2000, + icon: 'none' + }) + }, + fail: res => { + wx.showToast({ + title: '下发指令失败', + duration: 2000, + icon: 'none' + }) + console.log("失败", res); + }, + }) + }, + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + text: "", + Mode: "", + kcal: "", + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + text: "", + Mode: "", + kcal: "", + }) + }, + +}); \ No newline at end of file diff --git a/bluetooth_demo_T01/pages/index/index.json b/bluetooth_demo_T01/pages/index/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/bluetooth_demo_T01/pages/index/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/bluetooth_demo_T01/pages/index/index.wxml b/bluetooth_demo_T01/pages/index/index.wxml new file mode 100644 index 0000000..3998885 --- /dev/null +++ b/bluetooth_demo_T01/pages/index/index.wxml @@ -0,0 +1,45 @@ + +module.exports.max = function(n1, n2) { + return Math.max(n1, n2) +} +module.exports.len = function(arr) { + arr = arr || [] + return arr.length +} + + + + + + + + + + + + {{Mode}} + {{weight}} + {{text}} + {{kcal}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + + diff --git a/bluetooth_demo_T01/project.config.json b/bluetooth_demo_T01/project.config.json new file mode 100644 index 0000000..e4748e8 --- /dev/null +++ b/bluetooth_demo_T01/project.config.json @@ -0,0 +1,57 @@ +{ + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "setting": { + "urlCheck": true, + "es6": false, + "enhance": true, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "useIsolateContext": true, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "disableUseStrict": false, + "minifyWXML": true, + "showES6CompileOption": false, + "useCompilerPlugins": false, + "ignoreUploadUnusedFiles": true, + "condition": false + }, + "compileType": "miniprogram", + "simulatorType": "wechat", + "simulatorPluginLibVersion": {}, + "projectname": "bluetooth_demo_F01", + "libVersion": "3.8.6", + "appid": "wx39cf431caa22b5c8", + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + }, + "condition": {}, + "packOptions": { + "ignore": [], + "include": [] + } +} \ No newline at end of file diff --git a/bluetooth_demo_T01/project.private.config.json b/bluetooth_demo_T01/project.private.config.json new file mode 100644 index 0000000..d4dc1a3 --- /dev/null +++ b/bluetooth_demo_T01/project.private.config.json @@ -0,0 +1,4 @@ +{ + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "projectname": "bluetooth_demo_F01" +} \ No newline at end of file diff --git a/bluetooth_demo_T01/sitemap.json b/bluetooth_demo_T01/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/bluetooth_demo_T01/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/bluetooth_demo_T01/utils/util.js b/bluetooth_demo_T01/utils/util.js new file mode 100644 index 0000000..21a9389 --- /dev/null +++ b/bluetooth_demo_T01/utils/util.js @@ -0,0 +1,54 @@ +function inArray(arr, key, val) { + if (!arr || !arr.length || typeof arr != 'object' || !Array.isArray(arr)) { + return -1 + } + for (let i = 0; i < arr.length; i++) { + if (!key) { + if (arr[i] == val) { + return i + } + } else if (arr[i][key] === val) { + return i + } + } + return -1; +} + +// ArrayBuffer转16进度字符串示例 +function ab2hex(buffer, split) { + var hexArr = Array.prototype.map.call( + new Uint8Array(buffer), + function(bit) { + return ('00' + bit.toString(16)).slice(-2) + } + ) + return hexArr.join(split); +} + +//转16进制位数不足补0 +function toHex(num, length) { + return num.toString(16).padStart(length, '0'); +} +// 跳绳分秒时间选择 +function gethms(type) { + var mindata = [] + var secondData = [] + let timeList = [] + for (var i = 0; i <= 59; i++) { + i = i > 9 ? i : '0' + i + mindata.push(i + '分'); + } + for (var i = 0; i <= 59; i++) { + i = i > 9 ? i : '0' + i + secondData.push(i + '秒'); + } + timeList[0] = mindata + timeList[1] = secondData + return timeList +} +module.exports = { + inArray, + ab2hex, + toHex, + gethms +} \ No newline at end of file