新增H01pro
This commit is contained in:
parent
9911418cf9
commit
820b6ce159
56
app.json
56
app.json
|
|
@ -1,30 +1,30 @@
|
|||
{
|
||||
"pages": [
|
||||
"pages/index/index",
|
||||
"pages/PCD01PRO/index",
|
||||
"pages/PCH0809/index",
|
||||
"pages/PCF01B/index",
|
||||
"pages/PCF01proFRK/index",
|
||||
"pages/PCF08/index",
|
||||
"pages/PCJ02/index",
|
||||
"pages/G01/index",
|
||||
"pages/FB03/index",
|
||||
"pages/L08/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"
|
||||
"pages": [
|
||||
"pages/index/index",
|
||||
"pages/PCD01PRO/index",
|
||||
"pages/H01PRO/index",
|
||||
"pages/PCH0809/index",
|
||||
"pages/PCF01B/index",
|
||||
"pages/PCF01proFRK/index",
|
||||
"pages/PCF08/index",
|
||||
"pages/L08/index",
|
||||
"pages/G01/index",
|
||||
"pages/FB03/index",
|
||||
"pages/PCJ02/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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,275 @@
|
|||
const util = require("../../utils/util");
|
||||
const {
|
||||
inArray,
|
||||
ab2hex
|
||||
} = util
|
||||
Page({
|
||||
data: {
|
||||
devices: [],
|
||||
connected: false,
|
||||
text: '',
|
||||
name: '',
|
||||
weight: "",
|
||||
height: "",
|
||||
imp: "",
|
||||
readId: "",
|
||||
writeId: "",
|
||||
notifyId: "",
|
||||
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('My') != -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)
|
||||
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].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
|
||||
wx.hideLoading()
|
||||
wx.getBLEDeviceCharacteristics({
|
||||
deviceId,
|
||||
serviceId,
|
||||
success: (res) => {
|
||||
console.log('getBLEDeviceCharacteristics success', res.characteristics)
|
||||
that.setData({
|
||||
text: "请站在秤上,开始测量"
|
||||
})
|
||||
for (let i = 0; i < res.characteristics.length; i++) {
|
||||
let item = res.characteristics[i];
|
||||
if (item.uuid.indexOf("FFE1") != -1) {
|
||||
if (item.properties.notify == true) {
|
||||
that.data.notifyId = item.uuid
|
||||
}
|
||||
if (item.properties.read) {
|
||||
that.data.readId = item.uuid
|
||||
}
|
||||
if (item.properties.write == true) {
|
||||
that.data.writeId = item.uuid
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 打开监听
|
||||
wx.notifyBLECharacteristicValueChange({
|
||||
deviceId,
|
||||
serviceId,
|
||||
characteristicId: that.data.notifyId,
|
||||
state: true,
|
||||
})
|
||||
wx.notifyBLECharacteristicValueChange({
|
||||
deviceId,
|
||||
serviceId,
|
||||
characteristicId: that.data.writeId,
|
||||
state: true,
|
||||
})
|
||||
|
||||
wx.onBLECharacteristicValueChange((res) => {
|
||||
let value = ab2hex(res.value, '');
|
||||
let weight = parseInt(value.substring(4, 8), 16) / 100
|
||||
let height = parseInt(value.substring(30, 34), 16) / 10
|
||||
let imp0 = value.substring(28, 30) + value.substring(34, 36)
|
||||
that.setData({
|
||||
weight: "您的体重是:" + weight + 'kg'
|
||||
})
|
||||
that.setData({
|
||||
height: "您的身高是:" + height + 'kg'
|
||||
})
|
||||
that.setData({
|
||||
imp: "阻抗:" + parseInt(imp0, 16)
|
||||
})
|
||||
that.setData({
|
||||
text: "测量结束"
|
||||
})
|
||||
})
|
||||
},
|
||||
fail(res) {
|
||||
console.error('getBLEDeviceCharacteristics', res)
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* 断开蓝牙模块
|
||||
*/
|
||||
closeBluetoothAdapter() {
|
||||
wx.closeBluetoothAdapter()
|
||||
this._discoveryStarted = false
|
||||
wx.showToast({
|
||||
title: '断开蓝牙模块',
|
||||
icon: 'none'
|
||||
})
|
||||
this.setData({
|
||||
devices: [],
|
||||
weight: "",
|
||||
height: "",
|
||||
imp: ""
|
||||
})
|
||||
},
|
||||
// 断开与低功耗蓝牙设备的连接
|
||||
closeBLEConnection() {
|
||||
wx.closeBLEConnection({
|
||||
deviceId: this._deviceId
|
||||
})
|
||||
wx.showToast({
|
||||
title: '断开蓝牙连接',
|
||||
icon: 'none'
|
||||
})
|
||||
this.setData({
|
||||
connected: false,
|
||||
devices: [],
|
||||
height: "",
|
||||
weight: "",
|
||||
imp: ""
|
||||
})
|
||||
},
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"usingComponents": {
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<wxs module="utils">
|
||||
module.exports.max = function(n1, n2) {
|
||||
return Math.max(n1, n2)
|
||||
}
|
||||
module.exports.len = function(arr) {
|
||||
arr = arr || []
|
||||
return arr.length
|
||||
}
|
||||
</wxs>
|
||||
|
||||
<view class="container">
|
||||
<view class="header">
|
||||
<button bindtap="openBluetoothAdapter">开始扫描</button>
|
||||
<button bindtap="stopBluetoothDevicesDiscovery">停止扫描</button>
|
||||
<button bindtap="closeBluetoothAdapter">结束流程</button>
|
||||
</view>
|
||||
<view class="weight">
|
||||
<view>{{weight}}</view>
|
||||
<view>{{height}}</view>
|
||||
<view>{{imp}}</view>
|
||||
<view>{{text}}</view>
|
||||
</view>
|
||||
<view class="devices_summary">已发现 {{devices.length}} 个外围设备:</view>
|
||||
<scroll-view class="device_list" scroll-y scroll-with-animation>
|
||||
<view wx:for="{{devices}}" wx:key="index" data-device-id="{{item.deviceId}}"
|
||||
data-name="{{item.name || item.localName}}" data-mac="{{item.mac}}" data-index="{{index}}"
|
||||
bindtap="createBLEConnection" class="device_item" hover-class="device_item_hover">
|
||||
<view style="font-size: 32rpx;">
|
||||
<text style="color:#000;font-weight:bold">{{item.name}}</text>
|
||||
<text style="font-size:26rpx">(信号强度: {{item.RSSI}}dBm)</text>
|
||||
</view>
|
||||
<view style="font-size: 26rpx">mac地址: {{item.macAddr || item.deviceId}}</view>
|
||||
<!-- <view style="font-size: 26rpx">广播数据:{{item.analyzeDataText}}</view> -->
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
</view>
|
||||
|
|
@ -1,392 +1,399 @@
|
|||
const util = require("../../utils/util");
|
||||
const {
|
||||
inArray,
|
||||
ab2hex
|
||||
inArray,
|
||||
ab2hex
|
||||
} = util
|
||||
|
||||
Page({
|
||||
data: {
|
||||
devices: [],
|
||||
connected: false,
|
||||
cmd: '',
|
||||
name: '',
|
||||
weight: "",
|
||||
text: "",
|
||||
imp: "",
|
||||
deviceId: null,
|
||||
},
|
||||
onLoad: function() {},
|
||||
// 初始化蓝牙模块
|
||||
editclick: function(e) {
|
||||
let type = e.currentTarget.dataset.name
|
||||
if (type == 'PCD01PRO') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCD01PRO/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCH0809') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCH0809/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCF01B') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCF01B/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCF01proFRK') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCF01proFRK/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCF08') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCF08/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCJ02') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCJ02/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'FB03') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/FB03/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'G01') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/G01/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'h018') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/h018/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'L08') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/L08/index`
|
||||
})
|
||||
return
|
||||
data: {
|
||||
devices: [],
|
||||
connected: false,
|
||||
cmd: '',
|
||||
name: '',
|
||||
weight: "",
|
||||
text: "",
|
||||
imp: "",
|
||||
deviceId: null,
|
||||
},
|
||||
onLoad: function() {},
|
||||
// 初始化蓝牙模块
|
||||
editclick: function(e) {
|
||||
let type = e.currentTarget.dataset.name
|
||||
if (type == 'PCD01PRO') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCD01PRO/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCH0809') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCH0809/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCF01B') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCF01B/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCF01proFRK') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCF01proFRK/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCF08') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCF08/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'PCJ02') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/PCJ02/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'FB03') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/FB03/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'G01') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/G01/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'h018') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/h018/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
if (type == 'L08') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/L08/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (type == 'H01PRO') {
|
||||
wx.navigateTo({
|
||||
url: `/pages/H01PRO/index`
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
},
|
||||
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()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
},
|
||||
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, //是否允许重复上报同一设备
|
||||
services: [ //要搜索蓝牙设备主 service 的 uuid 列表
|
||||
"FFE0",
|
||||
],
|
||||
success: (res) => {
|
||||
console.log('startBluetoothDevicesDiscovery success', res)
|
||||
this.onBluetoothDeviceFound()
|
||||
},
|
||||
})
|
||||
},
|
||||
// 停止搜寻附近的蓝牙外围设备
|
||||
stopBluetoothDevicesDiscovery() {
|
||||
wx.stopBluetoothDevicesDiscovery()
|
||||
},
|
||||
|
||||
// 开始搜寻附近的蓝牙外围设备
|
||||
startBluetoothDevicesDiscovery() {
|
||||
if (this._discoveryStarted) {
|
||||
return
|
||||
}
|
||||
this._discoveryStarted = true
|
||||
wx.startBluetoothDevicesDiscovery({
|
||||
allowDuplicatesKey: true, //是否允许重复上报同一设备
|
||||
services: [ //要搜索蓝牙设备主 service 的 uuid 列表
|
||||
"FFE0",
|
||||
],
|
||||
success: (res) => {
|
||||
console.log('startBluetoothDevicesDiscovery success', res)
|
||||
this.onBluetoothDeviceFound()
|
||||
},
|
||||
})
|
||||
},
|
||||
// 停止搜寻附近的蓝牙外围设备
|
||||
stopBluetoothDevicesDiscovery() {
|
||||
wx.stopBluetoothDevicesDiscovery()
|
||||
},
|
||||
// 找到新设备的事件
|
||||
onBluetoothDeviceFound() {
|
||||
wx.onBluetoothDeviceFound((res) => {
|
||||
res.devices.forEach(device => {
|
||||
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
|
||||
}
|
||||
console.log("131", data)
|
||||
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({
|
||||
connected: false,
|
||||
devices: [],
|
||||
weight: "",
|
||||
text: "",
|
||||
imp: ""
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 找到新设备的事件
|
||||
onBluetoothDeviceFound() {
|
||||
wx.onBluetoothDeviceFound((res) => {
|
||||
res.devices.forEach(device => {
|
||||
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
|
||||
}
|
||||
console.log("131", data)
|
||||
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({
|
||||
connected: false,
|
||||
devices: [],
|
||||
weight: "",
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 获取蓝牙设备的 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) {
|
||||
this._deviceId = deviceId
|
||||
this._serviceId = serviceId
|
||||
this._device.serviceId = serviceId
|
||||
wx.getBLEDeviceCharacteristics({
|
||||
deviceId,
|
||||
serviceId,
|
||||
success: (res) => {
|
||||
console.log('getBLEDeviceCharacteristics success', res.characteristics)
|
||||
wx.showLoading({
|
||||
title: '获取特征值成功',
|
||||
})
|
||||
//FFE1:write: true, FFE2:notify: true,FFE3:read: true, write: true, notify: true,
|
||||
for (let i = 0; i < res.characteristics.length; i++) {
|
||||
let characteristic = res.characteristics[i];
|
||||
if (characteristic.uuid.indexOf("FFE2") != -1) {
|
||||
if (characteristic.properties.notify == true) {
|
||||
this.notifyBLECharacteristicValue(deviceId, serviceId, characteristic
|
||||
.uuid)
|
||||
console.log("ffe2服务的notifyId获取成功")
|
||||
}
|
||||
if (characteristic.properties.read == true) {
|
||||
that.readId = characteristic.uuid
|
||||
}
|
||||
if (characteristic.properties.write == true) {
|
||||
that.writeId = characteristic.uuid
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
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(function(res) {
|
||||
let value = ab2hex(res.value);
|
||||
let num = value.substring(18, 19)
|
||||
let dw = value.substring(19, 20)
|
||||
let typeInfo = value.substring(10, 12)
|
||||
console.log("16进制转化:", value);
|
||||
if (value.length == 26) {
|
||||
let data = parseInt(value.substring(13, 18), 16)
|
||||
let dw1 = "kg"
|
||||
if (dw == "1") {
|
||||
dw1 = "斤"
|
||||
console.log("体重单位:斤")
|
||||
}
|
||||
if (dw == "4") {
|
||||
dw1 = "st:lb"
|
||||
console.log("体重单位:st:lb,计算方法:1 * data + 5")
|
||||
}
|
||||
if (dw == "6") {
|
||||
dw1 = "lb"
|
||||
console.log("体重单位:lb")
|
||||
}
|
||||
if (num == "1") {
|
||||
data = parseInt(value.substring(13, 18), 16) / 10
|
||||
console.log("体重小数点后1位")
|
||||
}
|
||||
if (num == "2") {
|
||||
data = parseInt(value.substring(13, 18), 16) / 100
|
||||
console.log("体重小数点后2位")
|
||||
}
|
||||
if (num == "3") {
|
||||
data = parseInt(value.substring(13, 18), 16) / 1000
|
||||
console.log("体重小数点后3位")
|
||||
}
|
||||
if (typeInfo == "01") {
|
||||
console.log("实时体重:", data)
|
||||
that.setData({
|
||||
weight: "实时体重是:" + data + dw1
|
||||
})
|
||||
}
|
||||
if (typeInfo == "02") {
|
||||
console.log("稳定体重:", data)
|
||||
that.setData({
|
||||
weight: "稳定体重是:" + data + dw1
|
||||
})
|
||||
}
|
||||
}
|
||||
if (value.length == 30) {
|
||||
console.log("阻抗值:", value)
|
||||
if (typeInfo == "03") {
|
||||
let imp = parseInt(value.substring(17, 22), 16)
|
||||
that.setData({
|
||||
imp: "阻抗值:" + imp
|
||||
})
|
||||
}
|
||||
|
||||
// 获取蓝牙设备某个服务中所有特征值(characteristic)
|
||||
/**
|
||||
* read: true读,write: true写,notify: true广播
|
||||
*/
|
||||
getBLEDeviceCharacteristics(deviceId, serviceId) {
|
||||
this._deviceId = deviceId
|
||||
this._serviceId = serviceId
|
||||
this._device.serviceId = serviceId
|
||||
wx.getBLEDeviceCharacteristics({
|
||||
deviceId,
|
||||
serviceId,
|
||||
success: (res) => {
|
||||
console.log('getBLEDeviceCharacteristics success', res.characteristics)
|
||||
wx.showLoading({
|
||||
title: '获取特征值成功',
|
||||
})
|
||||
//FFE1:write: true, FFE2:notify: true,FFE3:read: true, write: true, notify: true,
|
||||
for (let i = 0; i < res.characteristics.length; i++) {
|
||||
let characteristic = res.characteristics[i];
|
||||
if (characteristic.uuid.indexOf("FFE2") != -1) {
|
||||
if (characteristic.properties.notify == true) {
|
||||
this.notifyBLECharacteristicValue(deviceId, serviceId, characteristic
|
||||
.uuid)
|
||||
console.log("ffe2服务的notifyId获取成功")
|
||||
}
|
||||
if (characteristic.properties.read == true) {
|
||||
that.readId = characteristic.uuid
|
||||
}
|
||||
if (characteristic.properties.write == true) {
|
||||
that.writeId = characteristic.uuid
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
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(function(res) {
|
||||
let value = ab2hex(res.value);
|
||||
let num = value.substring(18, 19)
|
||||
let dw = value.substring(19, 20)
|
||||
let typeInfo = value.substring(10, 12)
|
||||
console.log("16进制转化:", value);
|
||||
if (value.length == 26) {
|
||||
let data = parseInt(value.substring(13, 18), 16)
|
||||
let dw1 = "kg"
|
||||
if (dw == "1") {
|
||||
dw1 = "斤"
|
||||
console.log("体重单位:斤")
|
||||
}
|
||||
if (dw == "4") {
|
||||
dw1 = "st:lb"
|
||||
console.log("体重单位:st:lb,计算方法:1 * data + 5")
|
||||
}
|
||||
if (dw == "6") {
|
||||
dw1 = "lb"
|
||||
console.log("体重单位:lb")
|
||||
}
|
||||
if (num == "1") {
|
||||
data = parseInt(value.substring(13, 18), 16) / 10
|
||||
console.log("体重小数点后1位")
|
||||
}
|
||||
if (num == "2") {
|
||||
data = parseInt(value.substring(13, 18), 16) / 100
|
||||
console.log("体重小数点后2位")
|
||||
}
|
||||
if (num == "3") {
|
||||
data = parseInt(value.substring(13, 18), 16) / 1000
|
||||
console.log("体重小数点后3位")
|
||||
}
|
||||
if (typeInfo == "01") {
|
||||
console.log("实时体重:", data)
|
||||
that.setData({
|
||||
weight: "实时体重是:" + data + dw1
|
||||
})
|
||||
}
|
||||
if (typeInfo == "02") {
|
||||
console.log("稳定体重:", data)
|
||||
that.setData({
|
||||
weight: "稳定体重是:" + data + dw1
|
||||
})
|
||||
}
|
||||
}
|
||||
if (value.length == 30) {
|
||||
console.log("阻抗值:", value)
|
||||
if (typeInfo == "03") {
|
||||
let imp = parseInt(value.substring(17, 22), 16)
|
||||
that.setData({
|
||||
imp: "阻抗值:" + imp
|
||||
})
|
||||
}
|
||||
}
|
||||
if (value.toUpperCase() == "A90026023000589A") {
|
||||
console.log("测量完成")
|
||||
that.setData({
|
||||
text: "测量完成"
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
fail(res) {
|
||||
console.log("测量失败", res.value);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
}
|
||||
if (value.toUpperCase() == "A90026023000589A") {
|
||||
console.log("测量完成")
|
||||
that.setData({
|
||||
text: "测量完成"
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
fail(res) {
|
||||
console.log("测量失败", res.value);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 断开蓝牙模块
|
||||
*/
|
||||
closeBluetoothAdapter() {
|
||||
wx.closeBluetoothAdapter()
|
||||
this._discoveryStarted = false
|
||||
wx.showToast({
|
||||
title: '断开蓝牙模块',
|
||||
icon: 'none'
|
||||
})
|
||||
this.setData({
|
||||
devices: [],
|
||||
weight: "",
|
||||
text: "",
|
||||
imp: ""
|
||||
})
|
||||
},
|
||||
// 断开与低功耗蓝牙设备的连接
|
||||
closeBLEConnection() {
|
||||
wx.closeBLEConnection({
|
||||
deviceId: this._deviceId
|
||||
})
|
||||
wx.showToast({
|
||||
title: '断开蓝牙连接',
|
||||
icon: 'none'
|
||||
})
|
||||
this.setData({
|
||||
connected: false,
|
||||
devices: [],
|
||||
text: "",
|
||||
weight: "",
|
||||
imp: ""
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 断开蓝牙模块
|
||||
*/
|
||||
closeBluetoothAdapter() {
|
||||
wx.closeBluetoothAdapter()
|
||||
this._discoveryStarted = false
|
||||
wx.showToast({
|
||||
title: '断开蓝牙模块',
|
||||
icon: 'none'
|
||||
})
|
||||
this.setData({
|
||||
devices: [],
|
||||
weight: "",
|
||||
text: "",
|
||||
imp: ""
|
||||
})
|
||||
},
|
||||
// 断开与低功耗蓝牙设备的连接
|
||||
closeBLEConnection() {
|
||||
wx.closeBLEConnection({
|
||||
deviceId: this._deviceId
|
||||
})
|
||||
wx.showToast({
|
||||
title: '断开蓝牙连接',
|
||||
icon: 'none'
|
||||
})
|
||||
this.setData({
|
||||
connected: false,
|
||||
devices: [],
|
||||
text: "",
|
||||
weight: "",
|
||||
imp: ""
|
||||
})
|
||||
},
|
||||
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,25 +1,27 @@
|
|||
<wxs module="utils">
|
||||
module.exports.max = function(n1, n2) {
|
||||
return Math.max(n1, n2)
|
||||
}
|
||||
module.exports.len = function(arr) {
|
||||
arr = arr || []
|
||||
return arr.length
|
||||
}
|
||||
module.exports.max = function(n1, n2) {
|
||||
return Math.max(n1, n2)
|
||||
}
|
||||
module.exports.len = function(arr) {
|
||||
arr = arr || []
|
||||
return arr.length
|
||||
}
|
||||
</wxs>
|
||||
|
||||
<view class="container">
|
||||
<view class="list">
|
||||
<view class="item" bindtap="editclick" data-name="PCD01PRO" >PCD01PRO</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCH0809">PCH08/09</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCF01B">PCF01B</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCF01proFRK">PCF01pro(旧)</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCF01B">PCF01pro(新)</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCF08">PCF08</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCJ02">PCJ02</view>
|
||||
<view class="item" bindtap="editclick" data-name="G01">G01</view>
|
||||
<view class="item" bindtap="editclick" data-name="FB03">B03</view>
|
||||
<!-- <view class="item" bindtap="editclick" data-name="h018">h018</view> -->
|
||||
<view class="item" bindtap="editclick" data-name="L08">L08</view>
|
||||
</view>
|
||||
<view class="list">
|
||||
<view class="item" bindtap="editclick" data-name="PCD01PRO">PCD01PRO</view>
|
||||
<view class="item" bindtap="editclick" data-name="H01PRO">H01PRO</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCH0809">PCH08/09</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCF01B">PCF01B</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCF01proFRK">PCF01pro(旧)</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCF01B">PCF01pro(新)</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCF08">PCF08</view>
|
||||
<view class="item" bindtap="editclick" data-name="L08">L08</view>
|
||||
<view class="item" bindtap="editclick" data-name="FB03">B03</view>
|
||||
<view class="item" bindtap="editclick" data-name="PCJ02">PCJ02</view>
|
||||
<view class="item" bindtap="editclick" data-name="G01">G01</view>
|
||||
<!-- <view class="item" bindtap="editclick" data-name="h018">h018</view> -->
|
||||
|
||||
</view>
|
||||
</view>
|
||||
|
|
|
|||
|
|
@ -1,57 +1,56 @@
|
|||
{
|
||||
"description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
|
||||
"packOptions": {
|
||||
"ignore": [],
|
||||
"include": []
|
||||
},
|
||||
"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": false,
|
||||
"babelSetting": {
|
||||
"ignore": [],
|
||||
"disablePlugins": [],
|
||||
"outputPath": ""
|
||||
"description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
|
||||
"packOptions": {
|
||||
"ignore": [],
|
||||
"include": []
|
||||
},
|
||||
"useIsolateContext": true,
|
||||
"userConfirmedBundleSwitch": false,
|
||||
"packNpmManually": false,
|
||||
"packNpmRelationList": [],
|
||||
"minifyWXSS": true,
|
||||
"showES6CompileOption": false,
|
||||
"disableUseStrict": false,
|
||||
"ignoreUploadUnusedFiles": true,
|
||||
"useStaticServer": true,
|
||||
"useCompilerPlugins": false,
|
||||
"minifyWXML": true
|
||||
},
|
||||
"compileType": "miniprogram",
|
||||
"libVersion": "2.16.0",
|
||||
"projectname": "bluetooth_demo",
|
||||
"simulatorType": "wechat",
|
||||
"simulatorPluginLibVersion": {},
|
||||
"appid": "wxcea3504a31518eb6",
|
||||
"condition": {},
|
||||
"editorSetting": {
|
||||
"tabIndent": "insertSpaces",
|
||||
"tabSize": 2
|
||||
}
|
||||
"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
|
||||
},
|
||||
"compileType": "miniprogram",
|
||||
"libVersion": "2.16.0",
|
||||
"projectname": "bluetooth_demo",
|
||||
"simulatorType": "wechat",
|
||||
"simulatorPluginLibVersion": {},
|
||||
"appid": "wxcea3504a31518eb6",
|
||||
"editorSetting": {
|
||||
"tabIndent": "insertSpaces",
|
||||
"tabSize": 2
|
||||
},
|
||||
"condition": {}
|
||||
}
|
||||
Loading…
Reference in New Issue