From 2191f48734964f6e1bf75b46a3499a9f077ac470 Mon Sep 17 00:00:00 2001 From: qiaocl <3189782663@qq.com> Date: Fri, 5 Jan 2024 13:59:49 +0800 Subject: [PATCH] J01demo --- bluetooth_demo_J01.zip | Bin 0 -> 7994 bytes bluetooth_demo_J01/README.md | 8 + bluetooth_demo_J01/app.js | 5 + bluetooth_demo_J01/app.json | 20 ++ bluetooth_demo_J01/app.wxss | 55 ++++ bluetooth_demo_J01/pages/index/index.js | 304 ++++++++++++++++++ bluetooth_demo_J01/pages/index/index.json | 4 + bluetooth_demo_J01/pages/index/index.wxml | 37 +++ bluetooth_demo_J01/project.config.json | 57 ++++ .../project.private.config.json | 4 + bluetooth_demo_J01/sitemap.json | 7 + bluetooth_demo_J01/utils/util.js | 30 ++ bluetooth_demo_L11.zip | Bin 0 -> 6140 bytes 13 files changed, 531 insertions(+) create mode 100644 bluetooth_demo_J01.zip create mode 100644 bluetooth_demo_J01/README.md create mode 100644 bluetooth_demo_J01/app.js create mode 100644 bluetooth_demo_J01/app.json create mode 100644 bluetooth_demo_J01/app.wxss create mode 100644 bluetooth_demo_J01/pages/index/index.js create mode 100644 bluetooth_demo_J01/pages/index/index.json create mode 100644 bluetooth_demo_J01/pages/index/index.wxml create mode 100644 bluetooth_demo_J01/project.config.json create mode 100644 bluetooth_demo_J01/project.private.config.json create mode 100644 bluetooth_demo_J01/sitemap.json create mode 100644 bluetooth_demo_J01/utils/util.js create mode 100644 bluetooth_demo_L11.zip diff --git a/bluetooth_demo_J01.zip b/bluetooth_demo_J01.zip new file mode 100644 index 0000000000000000000000000000000000000000..c753a7a8d416200b9cc203a38a42f43cb5714ae1 GIT binary patch literal 7994 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 Ifq#AXf2;yyEdT%j literal 0 HcmV?d00001 diff --git a/bluetooth_demo_J01/README.md b/bluetooth_demo_J01/README.md new file mode 100644 index 0000000..badfeb4 --- /dev/null +++ b/bluetooth_demo_J01/README.md @@ -0,0 +1,8 @@ +# #参考使用设备类型 +``` +F01PRO + +``` + +## + diff --git a/bluetooth_demo_J01/app.js b/bluetooth_demo_J01/app.js new file mode 100644 index 0000000..ff15a95 --- /dev/null +++ b/bluetooth_demo_J01/app.js @@ -0,0 +1,5 @@ +//app.js +App({ + onLaunch: function () { + } +}) \ No newline at end of file diff --git a/bluetooth_demo_J01/app.json b/bluetooth_demo_J01/app.json new file mode 100644 index 0000000..36fa20f --- /dev/null +++ b/bluetooth_demo_J01/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_J01/app.wxss b/bluetooth_demo_J01/app.wxss new file mode 100644 index 0000000..bee9f30 --- /dev/null +++ b/bluetooth_demo_J01/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_J01/pages/index/index.js b/bluetooth_demo_J01/pages/index/index.js new file mode 100644 index 0000000..e1deb9a --- /dev/null +++ b/bluetooth_demo_J01/pages/index/index.js @@ -0,0 +1,304 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +const plugin = requirePlugin("sdkPlugin").AiLink; +Page({ + data: { + devices: [], + connected: false, + cmd: '', + name: '', + weight: "", + height: "", + text: "", + imp: "", + uuid1: "", + uuid2: "", + uuid3: "", + 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: 1000, //上报设备的间隔 + services: [ + "FFE0", + ], + 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('AiLink_') != -1) { + wx.stopBluetoothDevicesDiscovery() //搜索到名称为“AiLink_”的蓝牙后,停止搜寻附近的蓝牙 + 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: [], + weight: "", + height: "", + text: "", + imp: "" + }) + } + }) + }, + + // 获取蓝牙设备的 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('FFE0') > -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) => { + console.log('getBLEDeviceCharacteristics success', res.characteristics) + // 初始化插件 + plugin.initPlugin(res.characteristics, that._device) + + wx.onBLECharacteristicValueChange((characteristic) => { + let bleData = plugin.parseBleData(characteristic.value) + let dw1 = "kg" + if (bleData.status == 0) { + console.log("握手成功", arr) + } else if (bleData.status == 1) { + let payload = ab2hex(bleData.data, '') + let type = payload.substring(0, 2) + let typeInfo = payload.substring(4, 6) + console.log("payload", payload) + if (type == "10" || type == "30" || type == "40") { //体脂模式 + let data = parseInt(payload.substring(6, 12), 16) + let msg = parseInt(payload.substring(12, 14), 16).toString(2) + let dw = PrefixZero(msg, 8).substring(4, 8) + let num = PrefixZero(msg, 8).substring(0, 4) + if (dw == "0001") { + dw1 = '斤' + } + if (dw == "0110") { + dw1 = 'lb' + } + if (num == "0001") { + data = data / 10 + } + if (num == "0010") { + data = data / 100 + } + if (num == "0011") { + data = data / 1000 + } + if (typeInfo == "01") { + that.setData({ + weight: "实时体重是:" + data + dw1 + }) + } + if (typeInfo == "02") { + that.setData({ + weight: "稳定体重是:" + data + dw1 + }) + } + } + if (type == "14" || type == "41") { //身高模式 + let height = parseInt(payload.substring(4, 8), 16) + let numH = parseInt(payload.substring(10, 12), 16) + if (numH == "1") { + height = height / 10 + } + if (numH == "2") { + height = height / 100 + } + that.setData({ + height: "身高是:" + height + }) + } + if (type == "11") { //阻抗模式 + if (typeInfo == "03" || typeInfo == "04") { + let imp = parseInt(payload.substring(8, 16), 16) + console.log("imp", payload, imp) + that.setData({ + imp: "阻抗值:" + imp + }) + } + } + } + }) + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + height: "", + text: "", + imp: "" + }) + }, + // 断开与低功耗蓝牙设备的连接 + 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_J01/pages/index/index.json b/bluetooth_demo_J01/pages/index/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/bluetooth_demo_J01/pages/index/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/bluetooth_demo_J01/pages/index/index.wxml b/bluetooth_demo_J01/pages/index/index.wxml new file mode 100644 index 0000000..105d823 --- /dev/null +++ b/bluetooth_demo_J01/pages/index/index.wxml @@ -0,0 +1,37 @@ + + module.exports.max = function(n1, n2) { + return Math.max(n1, n2) + } + module.exports.len = function(arr) { + arr = arr || [] + return arr.length + } + + + + + + + + + + {{weight}} + {{height}} + {{imp}} + {{text}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + diff --git a/bluetooth_demo_J01/project.config.json b/bluetooth_demo_J01/project.config.json new file mode 100644 index 0000000..809d2a2 --- /dev/null +++ b/bluetooth_demo_J01/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_J01/project.private.config.json b/bluetooth_demo_J01/project.private.config.json new file mode 100644 index 0000000..d4dc1a3 --- /dev/null +++ b/bluetooth_demo_J01/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_J01/sitemap.json b/bluetooth_demo_J01/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/bluetooth_demo_J01/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_J01/utils/util.js b/bluetooth_demo_J01/utils/util.js new file mode 100644 index 0000000..7aafdf3 --- /dev/null +++ b/bluetooth_demo_J01/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_L11.zip b/bluetooth_demo_L11.zip new file mode 100644 index 0000000000000000000000000000000000000000..2a922641485ecbfabddb248b5e166cf6faa39583 GIT binary patch literal 6140 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 literal 0 HcmV?d00001