@@ -0,0 +1,20 @@ | |||||
"use strict"; | |||||
// 塑性仪蓝牙连接封装sdk | |||||
// 1.初始话蓝牙设备,根据蓝牙设备指定的服务ID过滤并且获取周边可用的蓝牙设备列表 | |||||
/** | |||||
* | |||||
* | |||||
*/ | |||||
function _initBlue() { | |||||
console.log("初始化蓝牙::"); | |||||
wx.openBluetoothAdapter({ | |||||
mode: 'peripheral', | |||||
success: (res) => { | |||||
console.error('蓝牙初始化成功', res) | |||||
}, | |||||
fail: function (err) { | |||||
console.error('蓝牙初始化失败', err) | |||||
} | |||||
}) | |||||
} |
@@ -1 +1,51 @@ | |||||
export const VersionModel = '2.0.4F'; | |||||
export const VersionModel = '2.0.4F'; | |||||
export const CommandButtonList = { | |||||
// 下发 | |||||
send: [ | |||||
// 2.2.1.读取工作强度映射表(0x0101) | |||||
{name:'读取工作强度映射表', enName: 'readWorkIntensityMapping', defaultSendData: 'FE0007010100FF'}, | |||||
// 2.2.2.设置设备工作强度映射表(0x0102) | |||||
{name:'设置工作强度映射表', enName: 'sendWorkIntensityMapping', defaultSendData: 'FE000701027FF'}, | |||||
// 2.2.3.读取设备工作强度(0x0103) | |||||
{name:'读取设备工作强度', enName: 'readWorkIntensity', defaultSendData: 'FE0007010300FF'}, | |||||
// 2.2.4.设置设备工作强度(0x0104) | |||||
{name:'设置设备工作强度', enName: 'sendWorkIntensity', defaultSendData: 'FE000E01040102FF'}, | |||||
// 2.2.5.读取设备工作流程(0x0105) | |||||
{name:'读取设备工作流程', enName: 'readWorkProcess', defaultSendData: 'FE0007010500FF'}, | |||||
// 2.2.6.设置设备工作流程(0x0106) | |||||
// {name:'设置设备工作流程', enName: 'sendWorkProcess', defaultSendData: 'FE00XX0016FF'}, | |||||
// 2.2.7.设备启动工作(0x0107) | |||||
{name:'设备启动工作', enName: 'deviceStartWork', defaultSendData: 'FE00070107000000010060FF'}, | |||||
// 2.2.8设备停止工作(0x0108) | |||||
{name:'设备停止工作', enName: 'deviceStopWork', defaultSendData: 'FE0007010800000001FF'}, | |||||
// 2.2.9设备暂停工作(0x0109) | |||||
{name:'设备暂停工作', enName: 'devicePauseWork', defaultSendData: 'FE0007010900000001FF'}, | |||||
//2.2.10设备恢复工作(0x010A) | |||||
{name:'设备恢复工作', enName: 'deviceResumeWork', defaultSendData: 'FE0007010A00000001FF'}, | |||||
//2.2.11设置设备时钟(0x010B) | |||||
{name:'设置设备时钟', enName: 'sendDeviceClock', defaultSendData: ''}, | |||||
//2.2.12设备恢复出厂设置(0x010C) | |||||
{name:'设备恢复出厂设置', enName: 'deviceReset', defaultSendData: 'FE0007010C00FF'}, | |||||
], | |||||
// 上报,解析 | |||||
report: [ | |||||
] | |||||
}; |
@@ -2,139 +2,202 @@ | |||||
const plugin = requirePlugin('ppScale-plugin') | const plugin = requirePlugin('ppScale-plugin') | ||||
var app = getApp(); | var app = getApp(); | ||||
Page({ | Page({ | ||||
data: { | |||||
deviceslist:[ | |||||
], | |||||
param: { | |||||
appKey:"lefu7afd0a504245139b" | |||||
} | |||||
}, | |||||
onLoad() { | |||||
}, | |||||
onUnload() { | |||||
// 业务结束后需要调用此方法 | |||||
plugin.Blue.stop() | |||||
}, | |||||
// 选择设备 | |||||
selItem: function(res) { | |||||
var that = this; | |||||
var devItem = res.currentTarget.dataset.item; | |||||
var device = this.data.deviceslist.find(item => item.deviceId === devItem.deviceId) | |||||
app.globalData.selmac = device; | |||||
console.log("this.globalData",app.globalData.selmac) | |||||
that.setData({ | |||||
selmac: device | |||||
data: { | |||||
deviceslist: [{ | |||||
name: "LFSmart Scale", | |||||
deviceId: "CF:E6:16:22:82:28" | |||||
}], | |||||
}, | |||||
onHide() { | |||||
}, | |||||
onLoad() { | |||||
let that = this; | |||||
//监听蓝牙打开状态 | |||||
wx.onBluetoothAdapterStateChange(function (res) { | |||||
console.log('蓝牙适配器打开状态变化', res) | |||||
// 如果蓝牙从关闭到打开并且 deviceslist 为空,则重新初始化蓝牙 | |||||
if (res.available && !that.data.deviceslist) { | |||||
that.initBlue(); | |||||
} | |||||
}) | |||||
//监听蓝牙连接状态 | |||||
wx.onBLEConnectionStateChange(function (res) { | |||||
// 该方法回调中可以用于处理连接意外断开等异常情况 | |||||
console.log(`设备蓝牙连接状态`, res); | |||||
// 如果蓝牙断开 | |||||
if (!res.connected) { | |||||
// 关闭蓝牙连接事件,再重新初始化连接? | |||||
// that.closeBlue(); | |||||
wx.showToast({ | |||||
title: '蓝牙已断开', | |||||
icon: 'error' | |||||
}) | }) | ||||
}, | |||||
refresh: function(res) { | |||||
// plugin.Blue.startBluetoothDevicesDiscovery(); | |||||
plugin.Blue.start([]); | |||||
console.log("刷新", plugin); | |||||
}, | |||||
doback: function(res) { | |||||
if(app.globalData.selmac){ | |||||
wx.navigateTo({ | |||||
url: '/pages/devicedetail/index' | |||||
}) | |||||
} else if(this.data.deviceslist.length <= 0) { | |||||
wx.showModal({ | |||||
title: '温馨提示', | |||||
content: `请打开手机蓝牙并且双脚站上蓝牙称扫描设备`, | |||||
showCancel: false, | |||||
/* setTimeout(() => { | |||||
that.initBlue(); | |||||
}, 1500) */ | |||||
} else { | |||||
wx.showToast({ | |||||
title: '蓝牙已连接', | |||||
icon: 'success' | |||||
}) | }) | ||||
}else { | |||||
wx.showModal({ | |||||
title: '温馨提示', | |||||
content: `请选择上面要连接的设备`, | |||||
showCancel: false, | |||||
} | |||||
}) | |||||
}, | |||||
onShow() { | |||||
// 初始化蓝牙 | |||||
this.initBlue() | |||||
}, | |||||
onUnload() { | |||||
// 业务结束后需要停止蓝牙 | |||||
this.closeBlue(); | |||||
}, | |||||
closeBlue() { | |||||
wx.closeBluetoothAdapter(); | |||||
wx.offBluetoothAdapterStateChange() | |||||
}, | |||||
initBlue() { | |||||
let that = this; | |||||
/* that.setData({ | |||||
deviceslist: '' | |||||
}) */ | |||||
console.log("初始化蓝牙"); | |||||
wx.openBluetoothAdapter({ | |||||
mode: 'peripheral', | |||||
success: (res) => { | |||||
console.log('openBluetoothAdapter', res) | |||||
// 初始化成功后开始搜索周边蓝牙列表 | |||||
wx.showLoading({ | |||||
title: '搜索中', | |||||
}) | }) | ||||
console.log('请选择设备') | |||||
} | |||||
}, | |||||
doback2: function(res) { | |||||
if(app.globalData.selmac){ | |||||
wx.navigateTo({ | |||||
url: '/pages/devicedetailfood/index' | |||||
wx.startBluetoothDevicesDiscovery({ | |||||
services: [], // 可指定服务UUID筛选要搜索的设备 | |||||
success: function (res) { | |||||
if (res.errno === 0) { | |||||
console.log('蓝牙设备搜索成功'); | |||||
setTimeout(() => { | |||||
wx.getBluetoothDevices({ | |||||
success: (resu) => { | |||||
console.log('getBluetoothDevices', resu) | |||||
// resu.device 为蓝牙列表 | |||||
wx.hideLoading(); | |||||
if (resu.devices.length > 0) { | |||||
wx.showToast({ | |||||
title: '搜索成功', | |||||
icon: 'success' | |||||
}) | |||||
that.setData({ | |||||
deviceslist: resu.devices | |||||
}); | |||||
// 此时再监听搜索到新设备的事件 | |||||
wx.onBluetoothDeviceFound(function(res) { | |||||
var devices = res.devices; | |||||
console.log('找到一个新设备', devices) | |||||
that.data.deviceslist.push(devices[0]); | |||||
that.setData({ | |||||
deviceslist: that.data.deviceslist | |||||
}); | |||||
}) | |||||
} else { | |||||
wx.showModal({ | |||||
title: '温馨提示', | |||||
content: `暂无搜索到可用设备`, | |||||
showCancel: false, | |||||
}) | |||||
} | |||||
} | |||||
}) | |||||
// // 搜索到设备后停止搜索 | |||||
// wx.stopBluetoothDevicesDiscovery({ | |||||
// success: () => { | |||||
// console.log("搜索到设备,停止搜索"); | |||||
// } | |||||
// }); | |||||
}, 1500) | |||||
} | |||||
}, | |||||
fail: function (err) { | |||||
wx.hideLoading(); | |||||
wx.showModal({ | |||||
title: '温馨提示', | |||||
content: `蓝牙设备搜索失败`, | |||||
showCancel: false, | |||||
}) | }) | ||||
}else { | |||||
wx.showModal({ | |||||
title: '温馨提示', | |||||
content: `请选择上面要连接的设备`, | |||||
showCancel: false, | |||||
console.error('蓝牙设备搜索失败', err) | |||||
} | |||||
}) | }) | ||||
console.log('请选择设备') | |||||
} | |||||
}, | |||||
/** | |||||
* 刷新token | |||||
* @param {function} fn 获取token后执行函数 | |||||
* @param {boolean} flag 请求刷新token | |||||
*/ | |||||
async refreshToken(fn, flag) { | |||||
let bodyToken = wx.getStorageSync('bodyToken'); | |||||
let bodyTokenTime = wx.getStorageSync('bodyTokenTime'); | |||||
if (!bodyToken || bodyTokenTime * 1000 < +new Date() || flag) { | |||||
let res = await plugin.refreshToken({ | |||||
url: 'https://uniquehealth.lefuenergy.com', | |||||
data: { | |||||
"appSecret":"AlgH7XDNWG1nABz3LSKdhaYTFUdETSBmKL4pRmD5mS4=", | |||||
"appKey": "lefu7afd0a504245139b" | |||||
} | |||||
}); | |||||
console.log("res", res); | |||||
if (res.data.code == 200) { | |||||
wx.setStorageSync('bodyToken', res.data.data.token); | |||||
wx.setStorageSync('bodyTokenTime', res.data.data.expireTime); | |||||
fn(); | |||||
} | |||||
} else { | |||||
fn(); | |||||
} | |||||
}, | |||||
getDeviceSettingList(param) { | |||||
let bodyToken = wx.getStorageSync('bodyToken'); | |||||
console.log("获取最新设备列表"); | |||||
console.log("param",param) | |||||
plugin.getDeviceSettingList({ | |||||
url: 'https://uniquehealth.lefuenergy.com', | |||||
data: param, | |||||
header: { | |||||
"token": bodyToken, | |||||
"Accept-Language": wx.getStorageSync("lang") || 'zh' | |||||
} | |||||
}).then(this.handleResponse); | |||||
}, | |||||
handleResponse(res) { | |||||
if (res.data.code == 200) { | |||||
// 配置蓝牙设备列表 | |||||
console.log("res.data.data",res.data.data) | |||||
plugin.Blue.setDeviceSetting(res.data.data) | |||||
} else if (res.data.code == 401) { | |||||
// token过期 重新请求token解析数据 | |||||
this.refreshToken(() => { | |||||
this.getDeviceSettingList(this.data.param) | |||||
}, true); | |||||
}, | |||||
fail: (fail) => { | |||||
wx.showModal({ | |||||
title: '温馨提示', | |||||
content: `请打开蓝牙`, | |||||
showCancel: false, | |||||
}) | |||||
} | |||||
}); | |||||
}, | |||||
// 选择设备 | |||||
selItem(res) { | |||||
var that = this; | |||||
var devItem = res.currentTarget.dataset.item; | |||||
var device = this.data.deviceslist.find(item => item.deviceId === devItem.deviceId) | |||||
app.globalData.selmac = device; | |||||
that.data.selmac = device; | |||||
that.setData({ | |||||
selmac: device | |||||
}) | |||||
// 本地缓存连接的蓝牙设备信息 | |||||
console.log("this.globalData", app.globalData.selmac) | |||||
}, | |||||
refresh: function (res) { | |||||
this.initBlue(); | |||||
console.log("刷新", ); | |||||
}, | |||||
doback(res) { | |||||
if (app.globalData.selmac) { | |||||
// 进入详情前先停止搜索设备, | |||||
wx.stopBluetoothDevicesDiscovery({ | |||||
success: () => { | |||||
console.log("开始连接到设备,停止搜索"); | |||||
} | } | ||||
}, | |||||
onShow() { | |||||
// 高于1.0.5版本 如无法扫描设备 需请求获取并设置最新设备配置列表 | |||||
console.log("开始扫描周边设备"); | |||||
/* this.getDeviceSettingList(this.data.param) */ | |||||
plugin.Blue.setDeviceSetting([ { "createBy": null, "createTime": "2023-10-11 16:57:08", "updateBy": null, "updateTime": "2023-10-20 14:05:03", "remark": null, "id": 39, "deviceName": "LFSmart Scale", "sign": "CE4004", "advLength": 20, "macAddressStart": 7, "deviceConnectType": 2, "deviceType": 1, "deviceProtocolType": 2, "deviceCalcuteType": 3, "devicePowerType": 1, "deviceFuncType": 67, "deviceAccuracyType": 2, "deviceUnitType": "0,1,11", "calorieStatus": 1, "uhStatus": 1, "status": 0, "imgUrl": null }, | |||||
]) | |||||
console.log("plugin.Blue",plugin) | |||||
plugin.Blue.start([],false) | |||||
// 获取扫描设备列表 | |||||
plugin.bus.subscribe("devicesList", (res) => { | |||||
console.log("devicesList'", JSON.parse(JSON.stringify(res))) | |||||
this.setData({ | |||||
deviceslist: res | |||||
}); | |||||
}); | |||||
}, | |||||
}); | |||||
wx.navigateTo({ | |||||
url: '/pages/devicedetail/index' | |||||
}) | |||||
} else if (this.data.deviceslist.length <= 0) { | |||||
wx.showModal({ | |||||
title: '温馨提示', | |||||
content: `搜索不到设备,请重试获取打开蓝牙`, | |||||
showCancel: false, | |||||
}) | |||||
} else { | |||||
wx.showModal({ | |||||
title: '温馨提示', | |||||
content: `请选择上面要连接的设备`, | |||||
showCancel: false, | |||||
}) | |||||
console.log('请选择设备') | |||||
} | |||||
}, | |||||
}) | }) |
@@ -1,12 +1,12 @@ | |||||
<view style="width:100vw;height:3vw"></view> | <view style="width:100vw;height:3vw"></view> | ||||
<view bindtap='selItem' data-item='{{item}}' class="item_class flex_column flex_space" wx:for="{{deviceslist}}" wx:key="lkeys"> | |||||
<view class="flex_row flex_space flex_vcenter"> | |||||
<view bindtap='selItem' data-item='{{item}}' class="item_class flex_column flex_space" wx:for="{{deviceslist}}" wx:key="lkeys"> | |||||
<view class="flex_row flex_space flex_vcenter" > | |||||
<view class="flex_row flex_vcenter"> | <view class="flex_row flex_vcenter"> | ||||
<text class="item_name_text">设备名:{{item.name || "未知设备"}}</text> | <text class="item_name_text">设备名:{{item.name || "未知设备"}}</text> | ||||
</view> | </view> | ||||
</view> | </view> | ||||
<view class="flex_row flex_space flex_vcenter flex_wrap" style="margin-top:3vw;display: flex;justify-content: space-between;"> | <view class="flex_row flex_space flex_vcenter flex_wrap" style="margin-top:3vw;display: flex;justify-content: space-between;"> | ||||
<text class="item_name_text">设备MAC:{{item.deviceId}} 信号值:{{item.RSSI || "0"}}</text> | |||||
<text class="item_name_text">设备MAC:{{item.deviceId}};信号值:{{item.RSSI || "0"}}</text> | |||||
<text hidden="{{selmac.deviceId != item.deviceId}}" mode="aspectFit" class="item_sel_img-active" ></text> | <text hidden="{{selmac.deviceId != item.deviceId}}" mode="aspectFit" class="item_sel_img-active" ></text> | ||||
<text hidden="{{selmac.deviceId == item.deviceId}}" mode="aspectFit" class="item_sel_img" ></text> | <text hidden="{{selmac.deviceId == item.deviceId}}" mode="aspectFit" class="item_sel_img" ></text> | ||||
</view> | </view> | ||||
@@ -16,7 +16,10 @@ | |||||
<view> | <view> | ||||
<text bindtap='refresh' class='bottom_text'>刷新</text> | <text bindtap='refresh' class='bottom_text'>刷新</text> | ||||
<button hidden="{{selmac.deviceId != ''}}" class="btn_disable">选择设备</button> | <button hidden="{{selmac.deviceId != ''}}" class="btn_disable">选择设备</button> | ||||
<button bindtap='doback' hidden="{{selmac.deviceId == ''}}" class="btn_normal" style="margin:0">选择设备</button> | |||||
<button bindtap='doback' hidden="{{selmac.deviceId == ''}}" class="btn_normal" style="margin:0"> | |||||
选择设备</button> | |||||
</view> | </view> | ||||
<view style="width:100vw;height:20vh;"></view> | |||||
<view style="width:100vw;height:20vh;"> | |||||
</view> |
@@ -1,552 +1,341 @@ | |||||
// 示例demo | // 示例demo | ||||
const plugin = requirePlugin('ppScale-plugin') | |||||
var app = getApp(); | |||||
const plugin = requirePlugin('ppScale-plugin'); | |||||
import { CommandButtonList } from '../../model/index' | |||||
let app = getApp(); | |||||
Page({ | Page({ | ||||
data: { | |||||
// 选择的设备对象 | |||||
selmac: null, | |||||
// 是否在测量中 | |||||
scaleing: false, | |||||
// 测量心率测量状态 | |||||
state: 0, | |||||
// 体重数据 | |||||
weight: '00.0', | |||||
// 测量单位 | |||||
unit: 'kg', | |||||
// 蓝牙连接状态 | |||||
devLink: false, | |||||
// 体重数据 | |||||
currentWeight: 0, | |||||
// 阻抗数据 | |||||
currentImpedance: 0, | |||||
// 扫描筛选出的设备 | |||||
selectDev: null, | |||||
// 设备模型 | |||||
deviceModel: null, | |||||
// 锁定数据 | |||||
lastData: null, | |||||
// 域名值 | |||||
domainValue: '', | |||||
// wifi名 | |||||
wifiValue: '', | |||||
// 密码值 | |||||
pwValue: '', | |||||
// 单位数组 | |||||
deviceUnitArray: Object.keys(plugin.PPBluetoothDefine.PPDeviceUnit), | |||||
// 单位数组下标 | |||||
deviceUnitIndex: 0, | |||||
// 网络dialog | |||||
netWorkFlag: false, | |||||
// 域名dialog | |||||
domainFlag: false, | |||||
// 单位dialog | |||||
unitFlag: false, | |||||
// 调试log列表 | |||||
consoleList: [], | |||||
// 获取设备数据传参 | |||||
param: { | |||||
appKey:"lefu7afd0a504245139b" | |||||
} | |||||
}, | |||||
data: { | |||||
// 选择的设备对象 | |||||
selmac: null, | |||||
// 是否在测量中 | |||||
scaleing: false, | |||||
/** | |||||
* 页面卸载时调用 | |||||
*/ | |||||
onUnload() { | |||||
// 业务结束后需要调用此方法 | |||||
plugin.Blue.stop() | |||||
}, | |||||
/** | |||||
* 页面隐藏时调用 | |||||
*/ | |||||
onHide() { | |||||
// 业务结束后需要调用此方法 | |||||
this.seeConsole('销毁蓝牙插件') | |||||
plugin.Blue.stop() | |||||
}, | |||||
onShow() { | |||||
// 高于1.0.5版本 如无法扫描设备 需请求获取并设置最新设备配置列表 | |||||
this.getDeviceSettingList(this.data.param) | |||||
// 高于1.0.5版本 如无法扫描设备 直接设置最新设备列表 | |||||
// plugin.Blue.setDeviceSetting([{"createBy":null,"createTime":"2023-09-14 11:38:56","updateBy":null,"updateTime":"2023-10-18 16:08:39","remark":null,"id":12,"deviceName":"LFSmart Scale","sign":"CF4303","advLength":20,"macAddressStart":7,"deviceConnectType":2,"deviceType":1,"deviceProtocolType":2,"deviceCalcuteType":3,"devicePowerType":2,"deviceFuncType":75,"deviceAccuracyType":2,"deviceUnitType":"0,3","calorieStatus":1,"uhStatus":1,"status":0,"imgUrl":"https://unique.lefuenergy.com/dev/2023/09/28/4dianji_border_20230928102849A007.png"}]) | |||||
// 使用节流函数包装测重事件处理函数 | |||||
let throttledScroll = this.throttle(this.handleProgress, 1500); | |||||
// 记录设备对象 | |||||
this.setData({ | |||||
selmac: app.globalData.selmac | |||||
}) | |||||
// 蓝牙状态监听 | |||||
wx.onBluetoothAdapterStateChange((res) => { | |||||
if (!res.available) { | |||||
this.seeConsole('蓝牙设备断开') | |||||
} | |||||
}) | |||||
// 是否开启插件日志 | |||||
// plugin.Blue.visibleLog() | |||||
this.seeConsole('开启蓝牙开始扫描设备') | |||||
// 获取扫描设备列表 | |||||
plugin.bus.subscribe("devicesList", (devList) => { | |||||
// 根据deviceId查找匹配设备 | |||||
let selectDev = devList.find(item => { | |||||
return item.deviceId == this.data.selmac.deviceId | |||||
}) | |||||
// 记录选择出设备 | |||||
this.setData({ | |||||
selectDev: selectDev | |||||
}) | |||||
if (!this.data.deviceModel && this.data.selectDev) { | |||||
//获取与保存秤类型 | |||||
this.seeConsole('获取秤端设备模型') | |||||
// 获取与记录设备模型 | |||||
this.setData({ | |||||
deviceModel: plugin.Blue.getDeviceModel(selectDev) | |||||
}) | |||||
} | |||||
// 匹配广播秤 | |||||
if (this.data.deviceModel && this.data.deviceModel.deviceConnectType == plugin.PPBluetoothDefine.PPDeviceConnectType | |||||
.PPDeviceConnectTypeBleAdv) { | |||||
this.seeConsole('设备连接广播秤') | |||||
// 广播秤 匹配与数据监听 | |||||
plugin.Blue.setbroadcastDev(selectDev) | |||||
} | |||||
// 匹配连接秤 | |||||
if (this.data.deviceModel && this.data.deviceModel.deviceConnectType == plugin.PPBluetoothDefine.PPDeviceConnectType | |||||
.PPDeviceConnectTypeBleConnect) { | |||||
// 停止扫描 | |||||
this.seeConsole('停止扫描') | |||||
plugin.Blue.stopBluetoothDevicesDiscovery() | |||||
// 连接设备 | |||||
this.seeConsole('开始连接设备') | |||||
plugin.Blue.createBLEConnection(selectDev) | |||||
} | |||||
}); | |||||
// 设备链接回调 | |||||
plugin.bus.subscribe("deviceConnect", (res) => { | |||||
this.seeConsole('成功连接设备') | |||||
// 开启监听蓝牙秤数据 必填 | |||||
plugin.ScaleAction.startDataProgress() | |||||
setTimeout(()=>{ | |||||
plugin.ScaleAction.syncDeviceSetting({ | |||||
unit: +this.data.deviceUnitIndex, | |||||
}) | |||||
},800) | |||||
}); | |||||
// 设备链接回调 | |||||
plugin.bus.subscribe("devicesModel", (res) => { | |||||
// console.log("res",res) | |||||
}); | |||||
// 蓝牙连接状态 | |||||
devLink: false, | |||||
// 监听秤端数据回调 | |||||
plugin.bus.subscribe("progressData", (res) => { | |||||
throttledScroll() | |||||
// console.log("selectDev",this.data.selectDev) | |||||
// console.log("selectDev",plugin.Blue.getDeviceModel(this.data.selectDev)) | |||||
if (this.data.selectDev) { | |||||
// 广播秤类型连接 | |||||
if (this.data.deviceModel && this.data.deviceModel.deviceConnectType == plugin.PPBluetoothDefine.PPDeviceConnectType | |||||
.PPDeviceConnectTypeBleAdv) { | |||||
this.setData({ | |||||
devLink: true | |||||
}) | |||||
} | |||||
if (res.weight > 0) { | |||||
// 有数据显示为测量中 | |||||
this.setData({ | |||||
scaleing: true | |||||
}) | |||||
// 记录体重数据 | |||||
this.setData({ | |||||
weight: (res.weight / 100).toFixed(2) | |||||
}) | |||||
// 获取测量过程秤显示单位 | |||||
this.setData({ | |||||
unit: this.getKeyByUnit(res.unit) | |||||
}) | |||||
} else { | |||||
// 无数据显示为未测量 | |||||
this.setData({ | |||||
state: 0 | |||||
}) | |||||
// 无数据显示为未测量 | |||||
this.setData({ | |||||
scaleing: false | |||||
}) | |||||
} | |||||
if (res.isHeartRating) { | |||||
// 心率测量中状态设置 | |||||
this.setData({ | |||||
state: 1 | |||||
}) | |||||
} | |||||
} | |||||
}); | |||||
// 设备自动断开监听 | |||||
plugin.bus.subscribe("deviceWillDisconnect", (res) => { | |||||
this.seeConsole('设备自动断开连接') | |||||
// 设备自动断连后重连 | |||||
this.setData({ | |||||
devLink: false | |||||
}) | |||||
// 重新连接方法 | |||||
this.reconnectDevice() | |||||
}) | |||||
// 扫描筛选出的设备 | |||||
selectDev: null, | |||||
// 设备模型 | |||||
deviceModel: null, | |||||
// 通讯结果 | |||||
contnectResult: null, | |||||
// 发送指令内容 | |||||
sendData: null, | |||||
// 蓝牙设备返回的结果 | |||||
callBack: null, | |||||
// 蓝牙设备下发指令按钮数据 | |||||
sendBtnList: CommandButtonList.send, //版本号 | |||||
// 手动输入文本域的值 | |||||
inputValue: '', | |||||
// 锁定数据 | |||||
plugin.bus.subscribe("lockData", (res) => { | |||||
this.seeConsole('锁定测量数据:' + JSON.stringify(res)) | |||||
// 测量结束 | |||||
this.setData({ | |||||
currentWeight: (res.weight / 100).toFixed(2) | |||||
}) | |||||
// 记录阻抗值 | |||||
this.setData({ | |||||
currentImpedance: res.resistance | |||||
}) | |||||
// 记录测量结果数据 | |||||
this.setData({ | |||||
lastData: JSON.stringify(res) | |||||
}) | |||||
// 状态还原 | |||||
this.setData({ | |||||
state: 0 | |||||
}) | |||||
this.setData({ | |||||
scaleing: false | |||||
}) | |||||
}); | |||||
// 蓝牙连接状态监听 | |||||
plugin.bus.subscribe("connectState", (res) => { | |||||
// 连接状态 | |||||
if (this.data.selectDev) { | |||||
if (res == plugin.BLUE_STATE.TRANSMITDATA || res == plugin.BLUE_STATE.LOCKDATA || res == plugin.BLUE_STATE | |||||
.HEARTRATING || res == | |||||
plugin.BLUE_STATE.CONNECTSUCCESS || res == plugin.BLUE_STATE.WIFISUCCESS) { | |||||
this.setData({ | |||||
devLink: true | |||||
}) | |||||
} else { | |||||
this.setData({ | |||||
devLink: false | |||||
}) | |||||
} | |||||
// 连接失败则重新连接 | |||||
if (res == plugin.BLUE_STATE.CONNECTFAILED) { | |||||
this.reconnectDevice() | |||||
} | |||||
} | |||||
}); | |||||
// 秤端操作回调 | |||||
plugin.bus.subscribe("syncDeviceSetting", (res) => { | |||||
this.seeConsole('成功配置设备') | |||||
}) | |||||
plugin.bus.subscribe("snData", () => { | |||||
this.seeConsole('成功配置wifi网络') | |||||
}) | |||||
plugin.bus.subscribe("domainChange", () => { | |||||
this.seeConsole('成功更新秤端请求服务器域名') | |||||
}) | |||||
plugin.bus.subscribe("syncDeviceTimeSuccess", () => { | |||||
this.seeConsole('成功同步时间') | |||||
}) | |||||
plugin.bus.subscribe("syncDeviceHistorySuccess", (e) => { | |||||
console.log("历史列表",e) | |||||
this.seeConsole('成功同步历史') | |||||
}) | |||||
plugin.bus.subscribe("deviceInfo", (res) => { | |||||
console.log("deviceInfo", res) | |||||
this.seeConsole('设备信息') | |||||
}) | |||||
}, | |||||
plugin.bus.subscribe("deleteDeviceHistoryDataSuccess", () => { | |||||
this.seeConsole('成功删除同步历史') | |||||
}) | |||||
// 开始扫描 | |||||
plugin.Blue.start([], false) | |||||
/** | |||||
* 页面卸载时调用 | |||||
*/ | |||||
onUnload() { | |||||
// 业务结束后需要调用此方法 | |||||
}, | |||||
connect() { | |||||
this.seeConsole('开始连接设备') | |||||
if (this.data.deviceModel && this.data.deviceModel.deviceConnectType == plugin.PPBluetoothDefine.PPDeviceConnectType | |||||
.PPDeviceConnectTypeBleConnect) { | |||||
// 连接设备 | |||||
plugin.Blue.createBLEConnection(this.data.selectDev) | |||||
} | |||||
}, | |||||
disconnect() { | |||||
this.seeConsole('断开连接') | |||||
plugin.Blue.disconnect() | |||||
}, | |||||
switchUnit() { | |||||
this.setData({ | |||||
unitFlag: true | |||||
}, | |||||
/** | |||||
* 页面隐藏时调用 | |||||
*/ | |||||
onHide() { | |||||
}, | |||||
onLoad() { | |||||
let that = this; | |||||
//监听蓝牙连接状态 | |||||
wx.onBLEConnectionStateChange(function (res) { | |||||
// 该方法回调中可以用于处理连接意外断开等异常情况 | |||||
console.log(`设备蓝牙连接状态`, res); | |||||
// 如果蓝牙断开 | |||||
if (!res.connected) { | |||||
// 关闭蓝牙连接事件,再重新初始化连接? | |||||
that.setData({ | |||||
devLink: false, | |||||
}) | }) | ||||
}, | |||||
setUserMes() { | |||||
this.seeConsole('下发用户信息') | |||||
if (this.data.devLink) { | |||||
// 根据设备已有单位切换 | |||||
plugin.ScaleAction.syncDeviceSetting({ | |||||
age: 28, | |||||
height: 167, | |||||
gender: 1, | |||||
}) | |||||
} else { | |||||
this.seeConsole('停止下发用户信息') | |||||
wx.showToast({ | |||||
title: '需要连接蓝牙秤', | |||||
icon: 'error', | |||||
duration: 1000, | |||||
mask: true | |||||
}) | |||||
} | |||||
}, | |||||
syncHistory() { | |||||
this.seeConsole('同步历史') | |||||
if (this.data.devLink) { | |||||
// 根据设备已有单位切换 | |||||
plugin.ScaleAction.fetchDeviceHistoryData() | |||||
} else { | |||||
this.seeConsole('停止同步历史') | |||||
wx.showToast({ | |||||
title: '需要连接蓝牙秤', | |||||
icon: 'error', | |||||
duration: 1000, | |||||
mask: true | |||||
}) | |||||
} | |||||
}, | |||||
deleteSyncHistory() { | |||||
this.seeConsole('删除同步历史') | |||||
if (this.data.devLink) { | |||||
// 根据设备已有单位切换 | |||||
plugin.ScaleAction.deleteDeviceHistoryData() | |||||
} else { | |||||
this.seeConsole('停止删除同步历史') | |||||
wx.showToast({ | |||||
title: '需要连接蓝牙秤', | |||||
icon: 'error', | |||||
duration: 1000, | |||||
mask: true | |||||
}) | |||||
} | |||||
}, | |||||
syncTime() { | |||||
this.seeConsole('同步时间') | |||||
if (this.data.devLink) { | |||||
// 根据设备已有单位切换 | |||||
plugin.ScaleAction.startDataProgress() | |||||
} else { | |||||
this.seeConsole('停止同步时间') | |||||
wx.showToast({ | |||||
title: '需要连接蓝牙秤', | |||||
icon: 'error', | |||||
duration: 1000, | |||||
mask: true | |||||
}) | |||||
} | |||||
}, | |||||
configureNetwork() { | |||||
this.setData({ | |||||
netWorkFlag: true | |||||
wx.showToast({ | |||||
title: '蓝牙已断开', | |||||
}) | }) | ||||
}, | |||||
modifyDNS() { | |||||
this.setData({ | |||||
domainFlag: true | |||||
/* setTimeout(() => { | |||||
that.initBlue(); | |||||
}, 1500) */ | |||||
} else { | |||||
that.setData({ | |||||
devLink: true, | |||||
}) | }) | ||||
}, | |||||
/** | |||||
* 重新连接设备 | |||||
*/ | |||||
reconnectDevice() { | |||||
this.seeConsole('尝试重新连接') | |||||
// 设备断开连接后重新连接 | |||||
plugin.Blue.disconnect((disres) => { | |||||
if (disres.errCode == 0) { | |||||
this.seeConsole('开始扫描设备') | |||||
plugin.Blue.startBluetoothDevicesDiscovery() | |||||
} else { | |||||
this.reconnectDevice() | |||||
} | |||||
} | |||||
}) | |||||
}, | |||||
onShow() { | |||||
let that = this; | |||||
// 记录设备对象 | |||||
this.setData({ | |||||
selmac: app.globalData.selmac | |||||
}) | |||||
console.log("selmac", that.data.selmac); | |||||
// 连接设备 | |||||
wx.createBLEConnection({ | |||||
deviceId: app.globalData.selmac.deviceId, | |||||
success: (res) => { | |||||
console.log("连接成功", res); | |||||
that.setData({ | |||||
devLink: true | |||||
}) | }) | ||||
}, | |||||
}, | |||||
fail: (e) => { | |||||
console.log("连接失败", e); | |||||
} | |||||
}) | |||||
/** | |||||
* 根据单位值获取设备单位描述 | |||||
* @param {number} unit 单位值 | |||||
* @return {string} 单位描述 | |||||
*/ | |||||
getKeyByUnit(unit) { | |||||
for (const key in plugin.PPBluetoothDefine.PPDeviceUnit) { | |||||
if (plugin.PPBluetoothDefine.PPDeviceUnit[key] === unit) { | |||||
return key; | |||||
setTimeout(() => { | |||||
// 获取蓝牙低功耗设备所有服务 (service) | |||||
wx.getBLEDeviceServices({ | |||||
deviceId: app.globalData.selmac.deviceId, | |||||
success: (res) => { | |||||
console.log("获取蓝牙低功耗设备所有服务成功", res); | |||||
let serviceId = res.services[0].uuid; | |||||
// 缓存数据 serviceId | |||||
app.globalData.serviceId = serviceId; | |||||
//获取蓝牙低功耗设备某个服务中所有特征 (characteristic)。 | |||||
wx.getBLEDeviceCharacteristics({ | |||||
deviceId: app.globalData.selmac.deviceId, | |||||
serviceId: serviceId, | |||||
success: (res) => { | |||||
console.log("获取蓝牙低功耗设备某个服务中所有特征", res); | |||||
let characteristicId = res.characteristics[0].uuid; | |||||
// 缓存数据 characteristicId | |||||
app.globalData.characteristicId = characteristicId; | |||||
}, | |||||
fail: (e) => { | |||||
console.log("获取蓝牙低功耗设备某个服务中所有特征", e); | |||||
} | } | ||||
}) | |||||
}, | |||||
fail: (e) => { | |||||
console.log("获取蓝牙低功耗设备所有服务失败", e); | |||||
} | } | ||||
return null; | |||||
}, | |||||
bindKeyInput: function (e) { | |||||
this.setData({ | |||||
inputValue: e.detail.value | |||||
}) | |||||
}, | |||||
bindDomainInput: function (e) { | |||||
this.setData({ | |||||
domainValue: e.detail.value | |||||
}) | |||||
}, | |||||
bindWifiInput: function (e) { | |||||
this.setData({ | |||||
wifiValue: e.detail.value | |||||
}) | |||||
}, | |||||
bindPasswdInput: function (e) { | |||||
this.setData({ | |||||
pwValue: e.detail.value | |||||
}) | |||||
}, | |||||
bindPickerChange: function (e) { | |||||
this.setData({ | |||||
deviceUnitIndex: e.detail.value | |||||
}); | |||||
}, | |||||
changeUnit() { | |||||
this.seeConsole('切换单位') | |||||
if (this.data.devLink) { | |||||
// 根据设备已有单位切换 | |||||
plugin.ScaleAction.syncDeviceSetting({ | |||||
unit: +this.data.deviceUnitIndex, | |||||
}) | |||||
}) | |||||
} else { | |||||
this.seeConsole('停止切换单位') | |||||
wx.showToast({ | |||||
title: '需要连接蓝牙秤', | |||||
icon: 'error', | |||||
duration: 1000, | |||||
mask: true | |||||
}) | |||||
} | |||||
this.setData({ | |||||
unitFlag: false | |||||
}) | |||||
}, | |||||
configWifi() { | |||||
this.seeConsole('开始配置wifi') | |||||
// 配置wifi | |||||
if (this.data.devLink && this.data.wifiValue && this.data.pwValue) { | |||||
console.log("this.data.wifiValue && this.data.pwValue",this.data.wifiValue , this.data.pwValue) | |||||
plugin.ScaleAction.configWifi(this.data.wifiValue, this.data.pwValue) | |||||
} else { | |||||
this.seeConsole('停止配置wifi') | |||||
wx.showToast({ | |||||
title: '需要连接蓝牙秤或wifi名称或密码', | |||||
duration: 1000, | |||||
mask: true | |||||
}) | |||||
}, 1500) | |||||
}, | |||||
connect() { | |||||
let that = this; | |||||
if (this.data.selmac.deviceId) { | |||||
console.log("可以初始化"); | |||||
wx.openBluetoothAdapter({ | |||||
mode: 'peripheral', | |||||
}) | |||||
// 连接设备 | |||||
wx.createBLEConnection({ | |||||
deviceId: that.data.selmac.deviceId, | |||||
success: (res) => { | |||||
console.log("建立连接成功", res); | |||||
}, | |||||
fail: (e) => { | |||||
console.log("建立连接失败", e); | |||||
wx.showToast({ | |||||
title: '重新连接失败', | |||||
icon: 'error' | |||||
}) | |||||
} | } | ||||
this.setData({ | |||||
netWorkFlag: false | |||||
}) | |||||
}, | |||||
changeDomain() { | |||||
this.seeConsole('开始配置域名') | |||||
// 配置域名 | |||||
if (this.data.domainValue != '' && this.data.devLink) { | |||||
plugin.ScaleAction.configDomain(this.data.domainValue.replace(/^(https?:\/\/)/, "")) | |||||
} else { | |||||
this.seeConsole('停止配置域名') | |||||
wx.showToast({ | |||||
title: '需要连接蓝牙秤或输入域名', | |||||
duration: 1000, | |||||
mask: true | |||||
}) | |||||
}) | |||||
} | |||||
}, | |||||
disconnect() { | |||||
let that = this; | |||||
if (this.data.selmac.deviceId) { | |||||
// 连接设备 | |||||
wx.closeBLEConnection({ | |||||
deviceId: that.data.selmac.deviceId, | |||||
success: (res) => { | |||||
console.log("断开连接成功", res); | |||||
}, | |||||
fail: (e) => { | |||||
console.log("断开连接失败", e); | |||||
} | } | ||||
this.setData({ | |||||
domainFlag: false | |||||
}) | |||||
}, | |||||
// 节流函数 | |||||
throttle: function (func, delay) { | |||||
let timer = null; | |||||
let lastTime = 0; | |||||
return function () { | |||||
const now = Date.now(); | |||||
if (now - lastTime >= delay) { | |||||
func(); | |||||
lastTime = now; | |||||
} else { | |||||
clearTimeout(timer); | |||||
timer = setTimeout(func, delay); | |||||
} | |||||
}; | |||||
}, | |||||
// 测量中体重记录 | |||||
handleProgress: function () { | |||||
this.seeConsole('正在测量体重:' + this.data.weight) | |||||
}, | |||||
seeConsole(string) { | |||||
this.setData({ | |||||
consoleList: [string].concat(this.data.consoleList) | |||||
}) | |||||
}, | |||||
/** | |||||
* 清除控制台 | |||||
*/ | |||||
clear() { | |||||
this.setData({ | |||||
consoleList: [] | |||||
}) | |||||
} | |||||
}, | |||||
onClearInput() { | |||||
this.setData({ | |||||
callBack: '', | |||||
sendData: '', | |||||
}); | |||||
}, | |||||
startwrite() { | |||||
// 下发指令 | |||||
let text = this.cleanHexString('hello'); | |||||
let buffer = this.stringToCmdBuffer(text); | |||||
let hexData = this.ab2hex(buffer); | |||||
let string = this.hexCharCodeToStr(hexData); | |||||
console.log("十六进制字符串转buffer", buffer); | |||||
console.log("buffer转hexData", hexData); | |||||
console.log("hexData转string", string); | |||||
this.sendMessage(text); | |||||
}, | |||||
bindTextAreaBlur(e) { | |||||
this.data.inputValue = e.detail.value; | |||||
console.log(e.detail.value) | |||||
}, | |||||
// 手动输入文本域的值 | |||||
onInputSend() { | |||||
console.log("this.data.inputValue", this.data.inputValue); | |||||
if(this.data.inputValue) { | |||||
this.sendMessage(this.data.inputValue, true); | |||||
} else { | |||||
wx.showToast({ | |||||
title: '指令不能为空', | |||||
icon: 'error' | |||||
}) | |||||
} | |||||
}, | |||||
// 发送数据 | |||||
sendMessage(event,type) { | |||||
let that = this; | |||||
let sendData = ''; | |||||
if(type) { | |||||
console.log("手动输出方式"); | |||||
sendData = event | |||||
} else { | |||||
console.log("按钮点击输出方式"); | |||||
console.log("event", event.target.dataset); | |||||
sendData = event.target.dataset.command.defaultSendData; | |||||
} | |||||
if(!that.data.devLink) { | |||||
wx.showToast({ | |||||
title: '蓝牙已断开', | |||||
icon: 'error' | |||||
}) | |||||
return | |||||
} | |||||
if(!sendData) { | |||||
wx.showToast({ | |||||
title: '指令不存在', | |||||
icon: 'error' | |||||
}) | |||||
return | |||||
} | |||||
this.setData({ | |||||
sendData: sendData | |||||
}) | |||||
let buffer = this.stringToCmdBuffer(sendData); | |||||
console.log("发送的指令",buffer); | |||||
wx.writeBLECharacteristicValue({ | |||||
deviceId: app.globalData.selmac.deviceId, // 设备ID | |||||
serviceId: app.globalData.selmac.serviceId, // 服务UUID | |||||
characteristicId: app.globalData.selmac.characteristicId, // 特征值 | |||||
value: buffer, | |||||
success(res) { | |||||
console.log("write指令发送成功", res) | |||||
that.notify(); | |||||
}, | |||||
fail(err) { | |||||
console.log("write指令发送失败", err); | |||||
that.setData({ | |||||
callBack: err.errMsg | |||||
}); | |||||
wx.showToast({ | |||||
title: '指令发送失败', | |||||
icon: 'error' | |||||
}) | }) | ||||
}, | |||||
/** | |||||
* 刷新token | |||||
* @param {function} fn 获取token后执行函数 | |||||
* @param {boolean} flag 请求刷新token | |||||
*/ | |||||
async refreshToken(fn, flag) { | |||||
let bodyToken = wx.getStorageSync('bodyToken'); | |||||
let bodyTokenTime = wx.getStorageSync('bodyTokenTime'); | |||||
if (!bodyToken || bodyTokenTime * 1000 < +new Date() || flag) { | |||||
let res = await plugin.refreshToken({ | |||||
url: 'https://uniquehealth.lefuenergy.com', | |||||
data: { | |||||
"appSecret":"AlgH7XDNWG1nABz3LSKdhaYTFUdETSBmKL4pRmD5mS4=", | |||||
"appKey": "lefu7afd0a504245139b" | |||||
} | |||||
}); | |||||
console.log("res", res); | |||||
if (res.data.code == 200) { | |||||
wx.setStorageSync('bodyToken', res.data.data.token); | |||||
wx.setStorageSync('bodyTokenTime', res.data.data.expireTime); | |||||
fn(); | |||||
} | |||||
} else { | |||||
fn(); | |||||
} | |||||
}, | |||||
getDeviceSettingList(param) { | |||||
let bodyToken = wx.getStorageSync('bodyToken'); | |||||
plugin.getDeviceSettingList({ | |||||
url: 'https://uniquehealth.lefuenergy.com', | |||||
data: param, | |||||
header: { | |||||
"token": bodyToken, | |||||
"Accept-Language": wx.getStorageSync("lang") || 'zh' | |||||
} | |||||
}).then(this.handleResponse); | |||||
}, | |||||
handleResponse(res) { | |||||
if (res.data.code == 200) { | |||||
// 配置蓝牙设备列表 | |||||
plugin.Blue.setDeviceSetting(res.data.data) | |||||
} else if (res.data.code == 401) { | |||||
// token过期 重新请求token解析数据 | |||||
this.refreshToken(() => { | |||||
this.getDeviceSettingList(this.data.param) | |||||
}, true); | |||||
} | |||||
}, | |||||
} | |||||
}) | |||||
}, | |||||
cleanHexString(hexStr) { | |||||
// 使用正则表达式匹配并移除多余的'0x',并拼接剩下的部分 | |||||
let cleanedHex = hexStr.replace(/0x/g, '').replace(/\b0+/g, ''); // 第二个正则表达式用于移除前导零 | |||||
return cleanedHex; | |||||
}, | |||||
// 开启消息监听 | |||||
notify() { | |||||
let that = this; | |||||
wx.notifyBLECharacteristicValueChange({ | |||||
deviceId: app.globalData.selmac.deviceId, // 设备ID, | |||||
serviceId: app.globalData.selmac.serviceId, // 服务UUID | |||||
characteristicId: app.globalData.selmac.characteristicId, // 特征值 | |||||
success(res) { | |||||
console.log(res) | |||||
// 监听消息变化的方法 | |||||
that.listenValueChange() | |||||
}, | |||||
fail(err) { | |||||
console.error(err) | |||||
} | |||||
}) | |||||
}, | |||||
// 消息变化 | |||||
listenValueChange() { | |||||
let that = this; | |||||
wx.onBLECharacteristicValueChange(res => { | |||||
console.log(res) | |||||
let resHex = that.ab2hex(res.value) | |||||
console.log("resHex", resHex) | |||||
let result = that.hexCharCodeToStr(resHex) | |||||
console.log("消息变化", String(result)) | |||||
that.setData({ | |||||
callBack: String(result) | |||||
}); | |||||
}) | |||||
}, | |||||
// 将16进制的内容转成我们看得懂的字符串内容 | |||||
hexCharCodeToStr(hexCharCodeStr) { | |||||
let trimedStr = hexCharCodeStr.trim(); | |||||
let rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr; | |||||
let len = rawStr.length; | |||||
if (len % 2 !== 0) { | |||||
alert("存在非法字符!"); | |||||
return ""; | |||||
} | |||||
let curCharCode; | |||||
let resultStr = []; | |||||
for (let i = 0; i < len; i = i + 2) { | |||||
curCharCode = parseInt(rawStr.substr(i, 2), 16); | |||||
resultStr.push(String.fromCharCode(curCharCode)); | |||||
} | |||||
return resultStr.join(""); | |||||
}, | |||||
/*字符串转换16进制buffer*/ | |||||
stringToCmdBuffer(msg) { | |||||
const buffer = new ArrayBuffer(msg.length) | |||||
const dataView = new DataView(buffer) | |||||
//dataView.setUint8(0, 0) | |||||
for (let i = 0; i < msg.length; i++) { | |||||
dataView.setUint8(i, msg.charAt(i).charCodeAt()) | |||||
}; | |||||
return buffer | |||||
}, | |||||
// ArrayBuffer转16进度字符串示例 | |||||
ab2hex(buffer) { | |||||
const hexArr = Array.prototype.map.call( | |||||
new Uint8Array(buffer), | |||||
function (bit) { | |||||
return ('00' + bit.toString(16)).slice(-2) | |||||
} | |||||
) | |||||
return hexArr.join('') | |||||
} | |||||
}) | }) |
@@ -1,103 +1,42 @@ | |||||
<!--pages/selble/selble.wxml--> | <!--pages/selble/selble.wxml--> | ||||
<view class="command"> | <view class="command"> | ||||
<view class="device-item"> | |||||
<view>连接状态:</view> | |||||
<view>{{devLink?'已连接':'未连接'}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>设备名:</view> | |||||
<view>{{selmac.name}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>设备mac:</view> | |||||
<view>{{selmac.deviceId}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>体重:</view> | |||||
<view>{{weight}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>当前单位:</view> | |||||
<view>{{unit}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>心率测量状态:</view> | |||||
<view>{{state==0?'未测量心率':'正在测量心率'}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>体重状态:</view> | |||||
<view>{{scaleing?'有体重数据':'无体重数据'}}</view> | |||||
</view> | |||||
<!-- <view class="device-item"> | |||||
<view>结果数据:</view> | |||||
<view class="device-result">{"isPlus": true, "isOverload": false, "weight": 1405, "resistance": 43181, "isEnd": true, "isHeartRating": false, "heartRate": 0, "unit": 0, "dateStr": "2023-08-01 09:48:52"}</view> | |||||
</view> --> | |||||
<view class="device-item"> | |||||
<view>连接状态:</view> | |||||
<view>{{devLink?'已连接':'未连接'}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>设备名:</view> | |||||
<view>{{selmac.name}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>设备mac:</view> | |||||
<view>{{selmac.deviceId}}</view> | |||||
</view> | |||||
<view class="device-item"> | |||||
<view>发送内容:</view> | |||||
<view>{{sendData || '暂无指令'}}</view> | |||||
</view> | |||||
<view class="command-result"> | |||||
<view>返回结果:</view> | |||||
<view>{{callBack || '暂无结果'}}</view> | |||||
</view> | </view> | ||||
<view class="command-line"> | |||||
<view wx:for="{{consoleList}}">{{item}}</view> | |||||
</view> | |||||
<view style="width:100vw;height:3vw"></view> | |||||
<view class="event-bar"> | |||||
<button type="default" bindtap="connect">连接</button> | |||||
<button type="default" bindtap="disconnect">断开连接</button> | |||||
<button type="default" bindtap="syncHistory">同步历史</button> | |||||
<button type="default" bindtap="deleteSyncHistory">删除同步历史</button> | |||||
<button type="default" bindtap="syncTime">同步时间</button> | |||||
<button type="default" bindtap="switchUnit">切换单位</button> | |||||
<button type="default" bindtap="configureNetwork">配置网络</button> | |||||
<button type="default" bindtap="modifyDNS">修改服务器域名</button> | |||||
<button type="default" bindtap="setUserMes">下发用户信息</button> | |||||
</view> | |||||
<view> | |||||
</view> | </view> | ||||
<view class="dialog" wx:if="{{unitFlag}}"> | |||||
<view class="dialog-content"> | |||||
<view class="dialog-title">切换单位</view> | |||||
<view> | |||||
<picker mode="selector" range="{{deviceUnitArray}}" bindchange="bindPickerChange"> | |||||
<view class="picker"> | |||||
点击选择单位:{{deviceUnitArray[deviceUnitIndex]}} | |||||
</view> | |||||
</picker> | |||||
</view> | |||||
<button type="default" bindtap="changeUnit">切换最新单位</button> | |||||
</view> | |||||
</view> | |||||
<view class="dialog" wx:if="{{domainFlag}}"> | |||||
<view class="dialog-content"> | |||||
<view> | |||||
<view class="dialog-title">域名配置</view> | |||||
<view>域名:{{domainValue}}</view> | |||||
<view> | |||||
<view> | |||||
<input class="weui-input" bindinput="bindDomainInput" placeholder="输入域名" /> | |||||
</view> | |||||
</view> | |||||
</view> | |||||
<button type="default" bindtap="changeDomain">更新服务器域名</button> | |||||
</view> | |||||
<view style="width:100vw;height:3vw"></view> | |||||
<view class="event-bar"> | |||||
<view class="btn-con"> | |||||
<button type="default" bindtap="connect">重新连接</button> | |||||
<!-- <button type="default" bindtap="startwrite">发送指令</button> --> | |||||
<button type="default" wx:for="{{sendBtnList}}" wx:key="lkeys" bindtap="sendMessage" data-command="{{item}}">{{item.name}}</button> | |||||
</view> | </view> | ||||
<view class="dialog" wx:if="{{netWorkFlag}}"> | |||||
<view class="dialog-content"> | |||||
<view class="dialog-title">wifi网络配置</view> | |||||
<view> | |||||
<!-- <view >wifi和密码:{{wifiValue}}-{{pwValue}}</view> --> | |||||
<view> | |||||
<view>wifi名称<input class="weui-input" bindinput="bindWifiInput" placeholder="输入wifi名称" /> | |||||
</view> | |||||
<view>密码: <input class="weui-input" bindinput="bindPasswdInput" placeholder="输入wifi密码" /> | |||||
</view> | |||||
</view> | |||||
</view> | |||||
<button class="dialog-button" bindtap="configWifi">配置网络</button> | |||||
</view> | |||||
<view class="command-input"> | |||||
<textarea bindblur="bindTextAreaBlur" auto-height | |||||
placeholder="请输入十六进制的数据格式,例如:FE0007010100FF" /> | |||||
<button type="primary" bindtap="onInputSend">手动输入发送</button> | |||||
<button type="primary" bindtap="onClearInput" >清空输出内容</button> | |||||
</view> | |||||
</view> | </view> | ||||
<button class="clear-btn" bindtap="clear">清除控制台</button> |
@@ -1,90 +1,132 @@ | |||||
.device-item { | .device-item { | ||||
display: flex; | |||||
justify-content: space-between; | |||||
display: flex; | |||||
justify-content: space-between; | |||||
} | } | ||||
.device-result { | .device-result { | ||||
flex:1; | |||||
text-align: center; | |||||
flex: 1; | |||||
text-align: center; | |||||
} | |||||
.command { | |||||
background-color: black; | |||||
color: white; | |||||
margin: 24rpx; | |||||
padding: 10rpx; | |||||
margin-bottom: 0; | |||||
} | } | ||||
.command{ | |||||
background-color: black; | |||||
color: white; | |||||
margin: 24rpx; | |||||
padding: 10rpx; | |||||
margin-bottom: 0; | |||||
.command-result { | |||||
background-color: black; | |||||
color: white; | |||||
/* margin: 0 24rpx 24rpx 24rpx; */ | |||||
margin-top: 24rpx; | |||||
overflow: auto; | |||||
height: 350rpx; | |||||
word-wrap: break-word; | |||||
word-break: normal; | |||||
} | } | ||||
.command-line { | .command-line { | ||||
background-color: black; | |||||
color: white; | |||||
font-family: monospace; | |||||
padding: 20rpx; | |||||
border: 1rpx solid white; | |||||
padding: 10rpx; | |||||
overflow: auto; | |||||
height: 350rpx; | |||||
margin: 24rpx; | |||||
margin-top: 0; | |||||
overflow-y: scroll; | |||||
text-align: right; | |||||
} | |||||
.command-line view { | |||||
word-wrap: break-word; | |||||
word-break: normal; | |||||
} | |||||
background-color: black; | |||||
color: white; | |||||
font-family: monospace; | |||||
padding: 20rpx; | |||||
border: 1rpx solid white; | |||||
padding: 10rpx; | |||||
overflow: auto; | |||||
height: 350rpx; | |||||
margin: 24rpx; | |||||
margin-top: 0; | |||||
overflow-y: scroll; | |||||
text-align: right; | |||||
} | |||||
.command-line view { | |||||
word-wrap: break-word; | |||||
word-break: normal; | |||||
} | |||||
.event-bar { | .event-bar { | ||||
display: flex; | |||||
justify-content: space-between; | |||||
padding: 24rpx; | |||||
flex-wrap: wrap; | |||||
} | |||||
.event-bar button { | |||||
width: 45%; | |||||
background-color: #f8f8f8; | |||||
color: #000; | |||||
text-align: center; | |||||
padding: 10rpx; | |||||
border:1rpx #ccc solid; | |||||
margin-bottom: 10rpx; | |||||
display: flex; | |||||
justify-content: space-between; | |||||
/* padding: 24rpx; */ | |||||
flex-wrap: wrap; | |||||
} | } | ||||
.dialog { | |||||
position: fixed; | |||||
top: 0; | |||||
left: 0; | |||||
width: 100%; | |||||
height: 100%; | |||||
background-color: rgba(0, 0, 0, 0.5); | |||||
display: flex; | |||||
justify-content: center; | |||||
align-items: center; | |||||
z-index: 1; | |||||
} | |||||
.dialog-content { | |||||
background-color: #fff; | |||||
padding: 20rpx; | |||||
border-radius: 10rpx; | |||||
box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.2); | |||||
width: 80%; | |||||
} | |||||
.dialog-title { | |||||
font-size: 35rpx; | |||||
font-weight: bold; | |||||
margin-bottom: 10rpx; | |||||
text-align: center; | |||||
} | |||||
.dialog-message { | |||||
font-size: 30rpx; | |||||
margin-bottom: 20rpx; | |||||
} | |||||
.btn-con { | |||||
padding: 0 20rpx; | |||||
display: flex; | |||||
justify-content: flex-start; | |||||
padding: 24rpx; | |||||
flex-wrap: wrap; | |||||
} | |||||
.btn-con button { | |||||
width: 200rpx; | |||||
background-color: #f8f8f8; | |||||
color: #000; | |||||
text-align: center; | |||||
padding: 5rpx; | |||||
border: 1rpx #ccc solid; | |||||
margin-bottom: 15rpx; | |||||
font-size: 20rpx; | |||||
} | |||||
.command-input { | |||||
width: 100vw; | |||||
padding: 24rpx; | |||||
.dialog-button { | |||||
padding: 10rpx 20rpx; | |||||
border-radius: 5rpx; | |||||
font-size: 30rpx; | |||||
} | |||||
.clear-btn { | |||||
margin: 24rpx; | |||||
} | |||||
} | |||||
.command-input button { | |||||
margin-bottom: 10rpx; | |||||
} | |||||
textarea { | |||||
height: 30rpx; | |||||
width: auto; | |||||
position: relative; | |||||
padding: 30rpx 24rpx; | |||||
margin-bottom: 20rpx; | |||||
border: 1rpx solid #c2bebe; | |||||
border-radius: 30rpx; | |||||
} | |||||
.dialog { | |||||
position: fixed; | |||||
top: 0; | |||||
left: 0; | |||||
width: 100%; | |||||
height: 100%; | |||||
background-color: rgba(0, 0, 0, 0.5); | |||||
display: flex; | |||||
justify-content: center; | |||||
align-items: center; | |||||
z-index: 1; | |||||
} | |||||
.dialog-content { | |||||
background-color: #fff; | |||||
padding: 20rpx; | |||||
border-radius: 10rpx; | |||||
box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.2); | |||||
width: 80%; | |||||
} | |||||
.dialog-title { | |||||
font-size: 35rpx; | |||||
font-weight: bold; | |||||
margin-bottom: 10rpx; | |||||
text-align: center; | |||||
} | |||||
.dialog-message { | |||||
font-size: 30rpx; | |||||
margin-bottom: 20rpx; | |||||
} | |||||
.dialog-button { | |||||
padding: 10rpx 20rpx; | |||||
border-radius: 5rpx; | |||||
font-size: 30rpx; | |||||
} | |||||
.clear-btn { | |||||
margin: 24rpx; | |||||
} |