@@ -1,7 +1,9 @@ | |||
{ | |||
"pages": [ | |||
"pages/index/index", | |||
"pages/wifiList/wifiList" | |||
"pages/serverConfig/serverConfig", | |||
"pages/wifiList/wifiList", | |||
"pages/funcList/funcList" | |||
], | |||
"window": { | |||
"navigationBarBackgroundColor": "#0082FE", |
@@ -0,0 +1,29 @@ | |||
// pages/funcList/funcList.js | |||
Page({ | |||
/** | |||
* 页面的初始数据 | |||
*/ | |||
data: { | |||
}, | |||
/** | |||
* 生命周期函数--监听页面加载 | |||
*/ | |||
onLoad: function (options) { | |||
}, | |||
wifiConfig() { | |||
wx.navigateTo({ | |||
url: '../wifiList/wifiList', | |||
}) | |||
}, | |||
serverConfig() { | |||
wx.navigateTo({ | |||
url: '../serverConfig/serverConfig', | |||
}) | |||
}, | |||
}) |
@@ -0,0 +1,3 @@ | |||
{ | |||
"usingComponents": {} | |||
} |
@@ -0,0 +1,19 @@ | |||
<!--pages/funcList/funcList.wxml--> | |||
<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="wifiConfig" style="font-size: 32rpx;line-height:100rpx;width: 100%;">配置wifi</button> | |||
<button bindtap="serverConfig" style="font-size: 32rpx;line-height:100rpx;width: 100%;">配置云服务器</button> | |||
</view> | |||
</view> | |||
@@ -0,0 +1,16 @@ | |||
/* pages/funcList/funcList.wxss */ | |||
page { | |||
background: #f0f0f0; | |||
color: #333; | |||
} | |||
.container{ | |||
padding-bottom: 200rpx; | |||
} | |||
.header{ | |||
width: 100%; | |||
} | |||
.container button{ | |||
padding-top: 0; | |||
padding-bottom: 0; | |||
border: 1px solid #ddd; | |||
} |
@@ -7,19 +7,7 @@ const plugin = requirePlugin("sdkPlugin").AiLink; | |||
Page({ | |||
data: { | |||
showWriteInput: false, | |||
devices: [ | |||
// { | |||
// deviceId: "02:03:04:05:06:07", | |||
// name: "elink", | |||
// localName: "elink", | |||
// mac: "02:03:04:05:06:07", | |||
// RSSI: -69, | |||
// advertisServiceUUIDs:[ | |||
// "FFE0","FFC0" | |||
// ], | |||
// analyzeDataText:"0102003241123413" | |||
// } | |||
], | |||
devices: [], | |||
connected: false, | |||
chs: [], | |||
cmd: '', | |||
@@ -28,6 +16,26 @@ Page({ | |||
historyList: [], | |||
}, | |||
onLoad: function () { | |||
var that=this; | |||
wx.getSystemInfo({ | |||
success: function(res) { | |||
if (res.platform === 'devtools') { | |||
let devices = [{ | |||
deviceId: "02:03:04:05:06:07", | |||
name: "elink", | |||
localName: "elink", | |||
mac: "02:03:04:05:06:07", | |||
RSSI: -69, | |||
advertisServiceUUIDs:[ "FFE0","FFC0" ], | |||
analyzeDataText:"0102003241123413" | |||
}] | |||
that.setData({ | |||
devices: devices | |||
}) | |||
} | |||
} | |||
}) | |||
let historyList = [] | |||
historyList = wx.getStorageSync('historyList') | |||
this.setData({ | |||
@@ -38,7 +46,8 @@ Page({ | |||
toConnectWifi() { | |||
this.offBLECharacteristicValueChange() | |||
wx.navigateTo({ | |||
url: '../wifiList/wifiList', | |||
// url: '../wifiList/wifiList', | |||
url: '../funcList/funcList', | |||
}) | |||
}, | |||
@@ -55,7 +64,7 @@ Page({ | |||
title: '请打开蓝牙', | |||
icon: "none" | |||
}) | |||
wx.onBluetoothAdapterStateChange( (res)=> { | |||
wx.onBluetoothAdapterStateChange(function (res) { | |||
console.log('onBluetoothAdapterStateChange', res) | |||
if (res.available) { | |||
this.startBluetoothDevicesDiscovery() | |||
@@ -86,6 +95,7 @@ Page({ | |||
this._discoveryStarted = true | |||
wx.startBluetoothDevicesDiscovery({ | |||
allowDuplicatesKey: true, | |||
interval: 1000,//上报设备的间隔 | |||
services: [ | |||
"FFE0", | |||
], | |||
@@ -112,13 +122,13 @@ Page({ | |||
const data = {} | |||
// console.log(device) | |||
// console.log(ab2hex(device.advertisData)) | |||
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() | |||
device.analyzeDataText = ab2hex(device.advertisData).replace(/,/g, '').toUpperCase() | |||
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 { | |||
@@ -126,6 +136,10 @@ Page({ | |||
} | |||
this.setData(data) | |||
}) | |||
// 按RSSI值排序 | |||
this.data.devices.sort((a,b)=>{ | |||
return b.RSSI - a.RSSI | |||
}) | |||
}) | |||
}, | |||
// 连接低功耗蓝牙设备 | |||
@@ -252,7 +266,25 @@ Page({ | |||
this.toConnectWifi() | |||
},500) | |||
} else if (bleData.status == 1) { | |||
console.log('A7-----^') | |||
let payload = bleData.data //对应协议中的payload数据,可以自行解析该数据 | |||
// console.log(ab2hex(payload, ' ')) | |||
// console.log(ab2hex(bleData.completeData, ' ')) | |||
const idx = inArray(this.data.chs, 'uuid', characteristic.characteristicId) | |||
const data = {} | |||
if (idx === -1) { | |||
data[`chs[${this.data.chs.length}]`] = { | |||
uuid: characteristic.characteristicId, | |||
value: ab2hex(bleData.completeData, ' ') | |||
} | |||
} else { | |||
data[`chs[${idx}]`] = { | |||
uuid: characteristic.characteristicId, | |||
value: ab2hex(bleData.completeData, ' ') | |||
} | |||
} | |||
this.setData(data) | |||
} else if (bleData.status == 2) { | |||
console.log('A6-----^') | |||
} | |||
@@ -286,94 +318,4 @@ Page({ | |||
wx.closeBluetoothAdapter() | |||
this._discoveryStarted = false | |||
}, | |||
// 打开指令输入框 | |||
showWriteInputView() { | |||
this.setData({ | |||
showWriteInput: true | |||
}) | |||
}, | |||
// 关闭指令输入框 | |||
hideWriteInputView() { | |||
this.setData({ | |||
showWriteInput: false | |||
}) | |||
}, | |||
// 指令下发 | |||
submitCmd(e, cmd) { | |||
let arr = [] | |||
let temp = [] | |||
if (!cmd) { | |||
cmd = this.data.cmd | |||
} | |||
console.log(cmd) | |||
if(!cmd || !this.data.connected){ | |||
return | |||
} | |||
if(cmd.indexOf(",") == -1){ | |||
temp = cmd.split(" ") | |||
} else { | |||
temp = cmd.split(",") | |||
} | |||
let tempCmd = temp.join(' ') | |||
for(let i = 0; i < temp.length; i++){ | |||
arr[i] = parseInt(temp[i],16) | |||
} | |||
// let arr = [ | |||
// 0xA6, | |||
// 0x01, | |||
// 0x28, | |||
// 0x29, | |||
// 0x6A, | |||
// //A6 01 28 29 6A | |||
// ] | |||
if(arr[0] == 0xA6){ | |||
let len = arr[1] | |||
let payload = arr.slice(2, 2 + len) | |||
plugin.sendDataOfA6(payload) | |||
// let buff = new Uint8Array(arr).buffer | |||
// this.writeBLECharacteristicValue(buff, this.uuid3, this._deviceId, this._serviceId) | |||
} else if(arr[0] == 0xA7) { | |||
let len = arr[3] | |||
let payload = arr.slice(4, 4 + len) | |||
plugin.sendDataOfA7(payload) | |||
} | |||
let historyList = wx.getStorageSync('historyList') || [] | |||
let idx = historyList.findIndex(item => item.cmd == tempCmd) | |||
if (idx < 0) { | |||
historyList.push({cmd: tempCmd}) | |||
} | |||
this.setData({ | |||
historyList | |||
}) | |||
wx.setStorage({ | |||
data: historyList, | |||
key: 'historyList', | |||
}) | |||
wx.showToast({ | |||
title: '已发送', | |||
icon: 'none' | |||
}) | |||
}, | |||
history_delete(e) { | |||
let index = e.currentTarget.dataset.index | |||
this.data.historyList.splice(index, 1) | |||
this.setData({ | |||
historyList: this.data.historyList | |||
}) | |||
wx.setStorage({ | |||
data: this.data.historyList, | |||
key: 'historyList', | |||
}) | |||
}, | |||
history_copy(e) { | |||
let index = e.currentTarget.dataset.index | |||
wx.setClipboardData({ | |||
data: this.data.historyList[index].cmd | |||
}) | |||
}, | |||
history_send(e) { | |||
let index = e.currentTarget.dataset.index | |||
let cmd = this.data.historyList[index].cmd | |||
this.submitCmd(null, cmd) | |||
}, | |||
}); |
@@ -1,38 +1,38 @@ | |||
<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" style="font-size: 32rpx;line-height:100rpx;width: 100%;">开始扫描</button> | |||
<button bindtap="stopBluetoothDevicesDiscovery" style="font-size: 32rpx;line-height:100rpx;width: 100%;">停止扫描</button> | |||
<button bindtap="closeBluetoothAdapter" style="font-size: 32rpx;line-height:100rpx;width: 100%;">结束流程</button> | |||
</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: 10px">Service数量: {{utils.len(item.advertisServiceUUIDs)}}</view> --> | |||
<view style="font-size: 26rpx">广播数据:{{item.analyzeDataText}}</view> | |||
</view> | |||
</scroll-view> | |||
</view> | |||
<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" style="font-size: 32rpx;line-height:100rpx;width: 100%;">开始扫描</button> | |||
<button bindtap="stopBluetoothDevicesDiscovery" style="font-size: 32rpx;line-height:100rpx;width: 100%;">停止扫描</button> | |||
<button bindtap="closeBluetoothAdapter" style="font-size: 32rpx;line-height:100rpx;width: 100%;">结束流程</button> | |||
</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: 10px">Service数量: {{utils.len(item.advertisServiceUUIDs)}}</view> --> | |||
<view style="font-size: 26rpx">广播数据:{{item.analyzeDataText}}</view> | |||
</view> | |||
</scroll-view> | |||
</view> | |||
@@ -1,143 +1,143 @@ | |||
page { | |||
background: #f0f0f0; | |||
color: #333; | |||
} | |||
.container{ | |||
padding-bottom: 200rpx; | |||
} | |||
.header{ | |||
width: 100%; | |||
} | |||
.container button{ | |||
padding-top: 0; | |||
padding-bottom: 0; | |||
border: 1px solid #ddd; | |||
} | |||
.devices_summary { | |||
width: 100%; | |||
line-height: 70rpx; | |||
padding: 0 30rpx; | |||
margin-top: 30rpx; | |||
font-size: 32rpx; | |||
} | |||
.device_list { | |||
flex: 1; | |||
width: 100%; | |||
height: calc(100vh - 600rpx); | |||
margin-top: 0; | |||
border: 1px solid #fff; | |||
border-radius: 5px; | |||
background: #fff; | |||
} | |||
.device_item { | |||
line-height: 1.5; | |||
padding: 10rpx 30rpx; | |||
border-bottom: 1px solid #EEE; | |||
} | |||
.device_item_hover { | |||
background-color: rgba(0, 0, 0, .1); | |||
} | |||
.connected_info { | |||
position: fixed; | |||
bottom: 0; | |||
width: 100%; | |||
height: 200rpx; | |||
padding: 10px; | |||
border-top: 1px solid #ddd; | |||
background-color: #fff; | |||
font-size: 14px; | |||
box-shadow: 0px -4rpx 4rpx 0px rgba(0,0,0,.05); | |||
} | |||
.connected_info .operation { | |||
position: absolute; | |||
display: inline-block; | |||
right: 30rpx; | |||
} | |||
.writeInputViewBg{ | |||
position: fixed; | |||
top: 0; | |||
left: 0; | |||
right: 0; | |||
bottom: 0; | |||
z-index: 1000; | |||
background-color: rgba(0,0,0,0.5); | |||
} | |||
.writeInputView{ | |||
position: fixed; | |||
bottom: 200rpx; | |||
left: 0; | |||
z-index: 1001; | |||
display: flex; | |||
flex-direction: column; | |||
align-items: center; | |||
width: 100%; | |||
height: calc(100vh - 500rpx); | |||
background-color: #fff; | |||
border-top: 1px solid #ddd; | |||
} | |||
.history{ | |||
position: relative; | |||
flex: 1; | |||
width: 690rpx; | |||
padding-top: 60rpx; | |||
border: 1px solid #ddd; | |||
margin: 30rpx; | |||
} | |||
.history_title{ | |||
position: absolute; | |||
top: 0; | |||
left: 0; | |||
padding: 0 30rpx; | |||
line-height: 60rpx; | |||
font-size: 30rpx; | |||
} | |||
.history_wrap{ | |||
width: 100%; | |||
height: 100%; | |||
} | |||
.history_item{ | |||
display: flex; | |||
align-items: center; | |||
justify-content: space-between; | |||
width: 100%; | |||
height: 72rpx; | |||
padding: 0 30rpx; | |||
border-top: 1px solid #ddd; | |||
} | |||
.history_cmd{ | |||
flex: 1; | |||
overflow: hidden; | |||
text-overflow: ellipsis; | |||
white-space: nowrap; | |||
font-size: 24rpx; | |||
} | |||
.history_btns{ | |||
height: 60rpx; | |||
overflow: hidden; | |||
} | |||
.writeInput{ | |||
margin-top: 30rpx; | |||
width: 690rpx; | |||
height: 80rpx; | |||
border: 1rpx solid #ccc; | |||
} | |||
.writeInput input{ | |||
width: 100%; | |||
height: 100%; | |||
padding: 10rpx; | |||
font-size: 32rpx; | |||
} | |||
.hint{ | |||
padding-top: 10rpx; | |||
font-size: 24rpx; | |||
color: #999; | |||
} | |||
.btns{ | |||
display: flex; | |||
align-items: center; | |||
justify-content: space-between; | |||
width: 60%; | |||
padding-bottom: 30rpx; | |||
margin-top: 30rpx; | |||
page { | |||
background: #f0f0f0; | |||
color: #333; | |||
} | |||
.container{ | |||
padding-bottom: 200rpx; | |||
} | |||
.header{ | |||
width: 100%; | |||
} | |||
.container button{ | |||
padding-top: 0; | |||
padding-bottom: 0; | |||
border: 1px solid #ddd; | |||
} | |||
.devices_summary { | |||
width: 100%; | |||
line-height: 70rpx; | |||
padding: 0 30rpx; | |||
margin-top: 30rpx; | |||
font-size: 32rpx; | |||
} | |||
.device_list { | |||
flex: 1; | |||
width: 100%; | |||
height: calc(100vh - 600rpx); | |||
margin-top: 0; | |||
border: 1px solid #fff; | |||
border-radius: 5px; | |||
background: #fff; | |||
} | |||
.device_item { | |||
line-height: 1.5; | |||
padding: 10rpx 30rpx; | |||
border-bottom: 1px solid #EEE; | |||
} | |||
.device_item_hover { | |||
background-color: rgba(0, 0, 0, .1); | |||
} | |||
.connected_info { | |||
position: fixed; | |||
bottom: 0; | |||
width: 100%; | |||
height: 200rpx; | |||
padding: 10px; | |||
border-top: 1px solid #ddd; | |||
background-color: #fff; | |||
font-size: 14px; | |||
box-shadow: 0px -4rpx 4rpx 0px rgba(0,0,0,.05); | |||
} | |||
.connected_info .operation { | |||
position: absolute; | |||
display: inline-block; | |||
right: 30rpx; | |||
} | |||
.writeInputViewBg{ | |||
position: fixed; | |||
top: 0; | |||
left: 0; | |||
right: 0; | |||
bottom: 0; | |||
z-index: 1000; | |||
background-color: rgba(0,0,0,0.5); | |||
} | |||
.writeInputView{ | |||
position: fixed; | |||
bottom: 200rpx; | |||
left: 0; | |||
z-index: 1001; | |||
display: flex; | |||
flex-direction: column; | |||
align-items: center; | |||
width: 100%; | |||
height: calc(100vh - 500rpx); | |||
background-color: #fff; | |||
border-top: 1px solid #ddd; | |||
} | |||
.history{ | |||
position: relative; | |||
flex: 1; | |||
width: 690rpx; | |||
padding-top: 60rpx; | |||
border: 1px solid #ddd; | |||
margin: 30rpx; | |||
} | |||
.history_title{ | |||
position: absolute; | |||
top: 0; | |||
left: 0; | |||
padding: 0 30rpx; | |||
line-height: 60rpx; | |||
font-size: 30rpx; | |||
} | |||
.history_wrap{ | |||
width: 100%; | |||
height: 100%; | |||
} | |||
.history_item{ | |||
display: flex; | |||
align-items: center; | |||
justify-content: space-between; | |||
width: 100%; | |||
height: 72rpx; | |||
padding: 0 30rpx; | |||
border-top: 1px solid #ddd; | |||
} | |||
.history_cmd{ | |||
flex: 1; | |||
overflow: hidden; | |||
text-overflow: ellipsis; | |||
white-space: nowrap; | |||
font-size: 24rpx; | |||
} | |||
.history_btns{ | |||
height: 60rpx; | |||
overflow: hidden; | |||
} | |||
.writeInput{ | |||
margin-top: 30rpx; | |||
width: 690rpx; | |||
height: 80rpx; | |||
border: 1rpx solid #ccc; | |||
} | |||
.writeInput input{ | |||
width: 100%; | |||
height: 100%; | |||
padding: 10rpx; | |||
font-size: 32rpx; | |||
} | |||
.hint{ | |||
padding-top: 10rpx; | |||
font-size: 24rpx; | |||
color: #999; | |||
} | |||
.btns{ | |||
display: flex; | |||
align-items: center; | |||
justify-content: space-between; | |||
width: 60%; | |||
padding-bottom: 30rpx; | |||
margin-top: 30rpx; | |||
} |
@@ -0,0 +1,308 @@ | |||
// pages/serverConfig/serverConfig.js | |||
const util = require("../../utils/util"); | |||
const { | |||
ab2hex | |||
} = util; | |||
const plugin = requirePlugin("sdkPlugin").AiLink; | |||
Page({ | |||
/** | |||
* 页面的初始数据 | |||
*/ | |||
data: { | |||
serverAddress: '', | |||
serverPort: '', | |||
serverPath: '', | |||
pwdModal: false, | |||
itemIndex: 0, | |||
serverAddressInput: '', | |||
serverPortInput: '', | |||
serverPathInput: '', | |||
}, | |||
/** | |||
* 生命周期函数--监听页面加载 | |||
*/ | |||
onLoad: function (options) { | |||
wx.onBLECharacteristicValueChange((characteristic) => { | |||
// 解析特征值,返回解密后的数据 | |||
let bleData = plugin.parseBleData(characteristic.value) | |||
// console.log(bleData) | |||
this.dealBleData(bleData) | |||
}) | |||
this.getServerAddress() | |||
this.getServerPort() | |||
this.getServerPath() | |||
}, | |||
showModal() { | |||
this.setData({ | |||
pwdModal: true | |||
}) | |||
}, | |||
closeModal() { | |||
this.setData({ | |||
pwdModal: false | |||
}) | |||
}, | |||
tapItem(e) { | |||
let index = e.currentTarget.dataset.index | |||
this.setData({ | |||
itemIndex: index | |||
}) | |||
console.log('tapItem()', index) | |||
this.showModal() | |||
}, | |||
confirm() { | |||
console.log('confirm()') | |||
if (this.data.itemIndex === 0) { | |||
this.setServerAddress() | |||
} else if (this.data.itemIndex === 1) { | |||
this.setServerPort() | |||
} else if (this.data.itemIndex === 2) { | |||
this.setServerPath() | |||
} | |||
this.closeModal() | |||
}, | |||
/** | |||
* 处理数据 | |||
*/ | |||
dealBleData(bleData) { | |||
if (bleData.status == 0) { | |||
console.log("握手成功") | |||
} else if (bleData.status == 1) { | |||
console.log('A7-----^') | |||
} else if (bleData.status == 2) { | |||
console.log(bleData) | |||
console.log('A6-----^') | |||
let payload = bleData.data | |||
const result = ['成功', '失败', '不支持'] | |||
switch (payload[0]) { | |||
case 0x8B: { | |||
wx.hideLoading() | |||
wx.showToast({ | |||
title: '设置服务器地址' + result[payload[1]], | |||
icon: 'none' | |||
}) | |||
console.log('设置服务器地址' + result[payload[1]]) | |||
break; | |||
} | |||
case 0x8C: { | |||
console.log('上报服务器地址') | |||
let end = payload[1] | |||
if (end === 0) wx.hideLoading() | |||
let nameArr = payload.slice(2) | |||
console.log('原始数据===>' + ab2hex(nameArr, ' ')) | |||
let nameStr = nameArr.length ? util.hex2str(nameArr) : '' | |||
console.log('nameStr: ' + nameStr) | |||
nameStr = this.data.serverAddress + nameStr | |||
this.setData({ | |||
serverAddress: nameStr | |||
}) | |||
break | |||
} | |||
case 0x8D: { | |||
wx.hideLoading() | |||
wx.showToast({ | |||
title: '设置服务器端口' + result[payload[1]], | |||
icon: 'none' | |||
}) | |||
console.log('设置服务器端口' + result[payload[1]]) | |||
break; | |||
} | |||
case 0x8E: { | |||
console.log('上报服务器端口') | |||
wx.hideLoading() | |||
let port = payload[1]<<8 | payload[2] | |||
console.log('port: ' + port) | |||
this.setData({ | |||
serverPort: port | |||
}) | |||
break | |||
} | |||
case 0x96: { | |||
wx.hideLoading() | |||
wx.showToast({ | |||
title: '设置服务器路径' + result[payload[1]], | |||
icon: 'none' | |||
}) | |||
console.log('设置服务器路径' + result[payload[1]]) | |||
break; | |||
} | |||
case 0x97: { | |||
console.log('上报服务器路径') | |||
let end = payload[1] | |||
if (end === 0) wx.hideLoading() | |||
let nameArr = payload.slice(2) | |||
console.log('原始数据===>' + ab2hex(nameArr, ' ')) | |||
let nameStr = nameArr.length ? util.hex2str(nameArr) : '' | |||
console.log('nameStr: ' + nameStr) | |||
nameStr = this.data.serverPath + nameStr | |||
this.setData({ | |||
serverPath: nameStr | |||
}) | |||
break | |||
} | |||
} | |||
} | |||
}, | |||
/** | |||
* 设置服务器地址 | |||
*/ | |||
setServerAddress() { | |||
let str = this.data.serverAddressInput | |||
if (!str || str.length === 0) { | |||
wx.showToast({ | |||
title: '请输入服务器地址', | |||
icon: 'none' | |||
}) | |||
return | |||
} | |||
if (str.length > 56) { | |||
wx.showToast({ | |||
title: '最多56个字节', | |||
icon: 'none' | |||
}) | |||
return | |||
} | |||
let arr = util.str2hex(str) | |||
if (arr.length > 14) { // 超出14 byte 需分包 | |||
console.log('超出14位===') | |||
let list = [] | |||
let len = parseInt(arr.length / 14) + 1 | |||
for (let i = 0; i < len; i++) { | |||
setTimeout(() => { | |||
list[i] = arr.slice(i * 14, (i + 1) * 14) | |||
console.log('list:', list) | |||
let isEnd = +(i !== len - 1) | |||
console.log('isEnd:', isEnd) | |||
let cmd = [0x8B, isEnd, ...list[i]] | |||
console.log('cmd:', cmd) | |||
plugin.sendDataOfA6(cmd) | |||
}, 200 * i) | |||
} | |||
console.log('arr:', arr) | |||
} else { | |||
let cmd = [0x8B, 0x00, ...arr] | |||
plugin.sendDataOfA6(cmd) | |||
} | |||
//重新获取ServerAddress用于验证 | |||
setTimeout(() => { | |||
this.getServerAddress() | |||
}, 1000) | |||
}, | |||
/** | |||
* 设置服务器端口 | |||
*/ | |||
setServerPort() { | |||
let str = this.data.serverPortInput | |||
let port = parseInt(str) | |||
console.log('port:', port) | |||
if (port > 0xFFFF) { | |||
wx.showToast({ | |||
title: '超过端口号最大值65535', | |||
icon: 'none' | |||
}) | |||
return | |||
} | |||
let cmd = [0x8D, (port>>8)&0xFF, port&0xFF] | |||
plugin.sendDataOfA6(cmd) | |||
//重新获取ServerPort用于验证 | |||
setTimeout(() => { | |||
this.getServerPort() | |||
}, 1000) | |||
}, | |||
/** | |||
* 设置服务器路径 | |||
*/ | |||
setServerPath() { | |||
let str = this.data.serverPathInput | |||
if (!str || str.length === 0) { | |||
wx.showToast({ | |||
title: '请输入服务器路径', | |||
icon: 'none' | |||
}) | |||
return | |||
} | |||
if (str.length > 56) { | |||
wx.showToast({ | |||
title: '最多56个字节', | |||
icon: 'none' | |||
}) | |||
return | |||
} | |||
let arr = util.str2hex(str) | |||
if (arr.length > 14) { // 超出14 byte 需分包 | |||
console.log('超出14位===') | |||
let list = [] | |||
let len = parseInt(arr.length / 14) + 1 | |||
for (let i = 0; i < len; i++) { | |||
setTimeout(() => { | |||
list[i] = arr.slice(i * 14, (i + 1) * 14) | |||
console.log('list:', list) | |||
let isEnd = +(i !== len - 1) | |||
console.log('isEnd:', isEnd) | |||
let cmd = [0x96, isEnd, ...list[i]] | |||
console.log('cmd:', cmd) | |||
plugin.sendDataOfA6(cmd) | |||
}, 200 * i) | |||
} | |||
console.log('arr:', arr) | |||
} else { | |||
let cmd = [0x96, 0x00, ...arr] | |||
plugin.sendDataOfA6(cmd) | |||
} | |||
//重新获取ServerPath用于验证 | |||
setTimeout(() => { | |||
this.getServerPath() | |||
}, 1000) | |||
}, | |||
/** | |||
* 获取服务器地址 | |||
*/ | |||
getServerAddress() { | |||
this.setData({ | |||
serverAddress: '' | |||
}) | |||
let cmd = [0x8C] | |||
plugin.sendDataOfA6(cmd) | |||
}, | |||
/** | |||
* 获取服务器端口 | |||
*/ | |||
getServerPort() { | |||
this.setData({ | |||
serverPort: '' | |||
}) | |||
let cmd = [0x8E] | |||
plugin.sendDataOfA6(cmd) | |||
}, | |||
/** | |||
* 获取服务器路径 | |||
*/ | |||
getServerPath() { | |||
this.setData({ | |||
serverPath: '' | |||
}) | |||
let cmd = [0x97] | |||
plugin.sendDataOfA6(cmd) | |||
}, | |||
}) |
@@ -0,0 +1,3 @@ | |||
{ | |||
"usingComponents": {} | |||
} |
@@ -0,0 +1,57 @@ | |||
<!--pages/serverConfig/serverConfig.wxml--> | |||
<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"> | |||
<button class="text_left" bindtap="tapItem" data-index='{{0}}' style="font-size: 32rpx;line-height:100rpx;width: 100%;background:#fff">服务器地址:{{serverAddress}}</button> | |||
<button class="text_left" bindtap="tapItem" data-index='{{1}}' style="font-size: 32rpx;line-height:100rpx;width: 100%;background:#fff">端口:{{serverPort}}</button> | |||
<button class="text_left" bindtap="tapItem" data-index='{{2}}' style="font-size: 32rpx;line-height:100rpx;width: 100%;background:#fff">路径:{{serverPath}}</button> | |||
</view> | |||
</view> | |||
<view class="modal_wrapper {{pwdModal ? 'modal_wrapper_show': ''}}" catchtouchmove="stopAction"> | |||
<view class="remindModal" wx:if="{{itemIndex == 0}}"> | |||
<view class="remindModal_title">输入服务器地址</view> | |||
<view class="modal_input_wrap"> | |||
<input model:value='{{serverAddressInput}}' class="modal_input" placeholder="请输入服务器地址" placeholder-style="font-size:30rpx;color:#b4b4b4" /> | |||
</view> | |||
<view class="remindModal_btn"> | |||
<view class="confirm_btn" bindtap="confirm">确定</view> | |||
<view class="remindModal_cancel_btn" bindtap="closeModal" hover-class="hover_tap">取消</view> | |||
</view> | |||
</view> | |||
<view class="remindModal" wx:if="{{itemIndex == 1}}"> | |||
<view class="remindModal_title">输入服务器端口</view> | |||
<view class="modal_input_wrap"> | |||
<input model:value='{{serverPortInput}}' class="modal_input" placeholder="请输入服务器端口" placeholder-style="font-size:30rpx;color:#b4b4b4" /> | |||
</view> | |||
<view class="remindModal_btn"> | |||
<view class="confirm_btn" bindtap="confirm">确定</view> | |||
<view class="remindModal_cancel_btn" bindtap="closeModal" hover-class="hover_tap">取消</view> | |||
</view> | |||
</view> | |||
<view class="remindModal" wx:if="{{itemIndex == 2}}"> | |||
<view class="remindModal_title">输入服务器路径</view> | |||
<view class="modal_input_wrap"> | |||
<input model:value='{{serverPathInput}}' class="modal_input" placeholder="请输入服务器路径" placeholder-style="font-size:30rpx;color:#b4b4b4" /> | |||
</view> | |||
<view class="remindModal_btn"> | |||
<view class="confirm_btn" bindtap="confirm">确定</view> | |||
<view class="remindModal_cancel_btn" bindtap="closeModal" hover-class="hover_tap">取消</view> | |||
</view> | |||
</view> | |||
</view> |
@@ -0,0 +1,126 @@ | |||
/* pages/serverConfig/serverConfig.wxss */ | |||
page{ | |||
background: #f8f8f8; | |||
} | |||
.container{ | |||
padding-bottom: 200rpx; | |||
} | |||
.container button{ | |||
padding-top: 0; | |||
padding-bottom: 0; | |||
border: 1px solid #ddd; | |||
} | |||
.header_button{ | |||
flex: 0 0 auto; | |||
width: 100%; | |||
} | |||
.text_left { | |||
text-align: left; | |||
} | |||
.footer { | |||
position: fixed; | |||
bottom: 0; | |||
width: 100%; | |||
height: 200rpx; | |||
padding: 10px; | |||
border-top: 1px solid #ddd; | |||
background-color: #fff; | |||
font-size: 14px; | |||
box-shadow: 0px -4rpx 4rpx 0px rgba(0,0,0,.05); | |||
} | |||
.footer .operation { | |||
position: absolute; | |||
display: inline-block; | |||
right: 30rpx; | |||
} | |||
.modal_wrapper{ | |||
position: fixed; | |||
top: 0; | |||
left: 0; | |||
right: 0; | |||
z-index: -1; | |||
background: rgba(0,0,0,0.5); | |||
transition: .4s all; | |||
height: 200vh; | |||
opacity: 0; | |||
} | |||
.modal_wrapper_show{ | |||
transform: translateY(-100vh); | |||
opacity: 1; | |||
overflow-x: hidden; | |||
overflow-y: auto; | |||
z-index: 1000; | |||
} | |||
.remindModal{ | |||
position: absolute; | |||
bottom: 70vh; | |||
left: 50%; | |||
z-index: 101; | |||
transform: translate(-50%, 50%); | |||
background: #fff; | |||
width: 600rpx; | |||
padding: 40rpx 60rpx; | |||
border-radius: 20rpx; | |||
} | |||
.remindModal_title{ | |||
padding: 10rpx 30rpx 50rpx; | |||
text-align: center; | |||
font-size: 32rpx; | |||
} | |||
.remindModal_content{ | |||
font-size: 30rpx; | |||
line-height: 1.6; | |||
text-align: center; | |||
padding-top: 30rpx; | |||
min-height: 100rpx; | |||
} | |||
.remindModal_btn{ | |||
margin-top: 80rpx; | |||
margin-bottom: 10rpx; | |||
} | |||
.remindModal_cancel_btn{ | |||
margin-top: 30rpx; | |||
height: 80rpx; | |||
line-height: 80rpx; | |||
text-align: center; | |||
color: #FA1111; | |||
font-size: 30rpx; | |||
} | |||
.modal_input_wrap{ | |||
width: 100%; | |||
height: 80rpx; | |||
padding: 0 10rpx; | |||
border: 1px solid #dcdcdc; | |||
border-radius: 10rpx; | |||
} | |||
.modal_input{ | |||
width: 100%; | |||
height: 100%; | |||
padding: 10rpx; | |||
font-size: 30rpx; | |||
} | |||
.confirm_btn{ | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
width: 480rpx; | |||
height: 100rpx; | |||
border: 1px solid transparent; | |||
margin: auto; | |||
background: #1977FF; | |||
color: #fff; | |||
font-size: 16px; | |||
letter-spacing: 2rpx; | |||
border-radius: 1000rpx; | |||
white-space: nowrap; | |||
} | |||
.item_hover{ | |||
background-color: rgba(0, 0, 0, .1); | |||
} |
@@ -1,142 +1,142 @@ | |||
/* pages/wifiList/wifiList.wxss */ | |||
page{ | |||
background: #f8f8f8; | |||
} | |||
.container{ | |||
padding-bottom: 200rpx; | |||
} | |||
.container button{ | |||
padding-top: 0; | |||
padding-bottom: 0; | |||
border: 1px solid #ddd; | |||
} | |||
.header_button{ | |||
flex: 0 0 auto; | |||
width: 100%; | |||
} | |||
.wifi_title{ | |||
width: 100%; | |||
padding: 40rpx 30rpx 20rpx; | |||
line-height: 1.5; | |||
} | |||
.wifi_list{ | |||
width: 100%; | |||
height: calc(100vh - 400rpx); | |||
border: 1px solid #ccc; | |||
} | |||
.wifi_item{ | |||
height: 100rpx; | |||
padding: 0 30rpx; | |||
border-bottom: 1px solid #ddd; | |||
background: #fff; | |||
} | |||
.wifi_item_right{ | |||
color: #1977ff; | |||
} | |||
.footer { | |||
position: fixed; | |||
bottom: 0; | |||
width: 100%; | |||
height: 200rpx; | |||
padding: 10px; | |||
border-top: 1px solid #ddd; | |||
background-color: #fff; | |||
font-size: 14px; | |||
box-shadow: 0px -4rpx 4rpx 0px rgba(0,0,0,.05); | |||
} | |||
.footer .operation { | |||
position: absolute; | |||
display: inline-block; | |||
right: 30rpx; | |||
} | |||
.modal_wrapper{ | |||
position: fixed; | |||
top: 0; | |||
left: 0; | |||
right: 0; | |||
z-index: -1; | |||
background: rgba(0,0,0,0.5); | |||
transition: .4s all; | |||
height: 200vh; | |||
opacity: 0; | |||
} | |||
.modal_wrapper_show{ | |||
transform: translateY(-100vh); | |||
opacity: 1; | |||
overflow-x: hidden; | |||
overflow-y: auto; | |||
z-index: 1000; | |||
} | |||
.remindModal{ | |||
position: absolute; | |||
bottom: 50vh; | |||
left: 50%; | |||
z-index: 101; | |||
transform: translate(-50%, 50%); | |||
background: #fff; | |||
width: 600rpx; | |||
padding: 40rpx 60rpx; | |||
border-radius: 20rpx; | |||
} | |||
.remindModal_title{ | |||
padding: 10rpx 30rpx 50rpx; | |||
text-align: center; | |||
font-size: 32rpx; | |||
} | |||
.remindModal_content{ | |||
font-size: 30rpx; | |||
line-height: 1.6; | |||
text-align: center; | |||
padding-top: 30rpx; | |||
min-height: 100rpx; | |||
} | |||
.remindModal_btn{ | |||
margin-top: 80rpx; | |||
margin-bottom: 10rpx; | |||
} | |||
.remindModal_cancel_btn{ | |||
margin-top: 30rpx; | |||
height: 80rpx; | |||
line-height: 80rpx; | |||
text-align: center; | |||
color: #FA1111; | |||
font-size: 30rpx; | |||
} | |||
.modal_input_wrap{ | |||
width: 100%; | |||
height: 80rpx; | |||
padding: 0 10rpx; | |||
border: 1px solid #dcdcdc; | |||
border-radius: 10rpx; | |||
} | |||
.modal_input{ | |||
width: 100%; | |||
height: 100%; | |||
padding: 10rpx; | |||
font-size: 30rpx; | |||
} | |||
.confirm_btn{ | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
width: 480rpx; | |||
height: 100rpx; | |||
border: 1px solid transparent; | |||
margin: auto; | |||
background: #1977FF; | |||
color: #fff; | |||
font-size: 16px; | |||
letter-spacing: 2rpx; | |||
border-radius: 1000rpx; | |||
white-space: nowrap; | |||
} | |||
.item_hover{ | |||
background-color: rgba(0, 0, 0, .1); | |||
/* pages/wifiList/wifiList.wxss */ | |||
page{ | |||
background: #f8f8f8; | |||
} | |||
.container{ | |||
padding-bottom: 200rpx; | |||
} | |||
.container button{ | |||
padding-top: 0; | |||
padding-bottom: 0; | |||
border: 1px solid #ddd; | |||
} | |||
.header_button{ | |||
flex: 0 0 auto; | |||
width: 100%; | |||
} | |||
.wifi_title{ | |||
width: 100%; | |||
padding: 40rpx 30rpx 20rpx; | |||
line-height: 1.5; | |||
} | |||
.wifi_list{ | |||
width: 100%; | |||
height: calc(100vh - 400rpx); | |||
border: 1px solid #ccc; | |||
} | |||
.wifi_item{ | |||
height: 100rpx; | |||
padding: 0 30rpx; | |||
border-bottom: 1px solid #ddd; | |||
background: #fff; | |||
} | |||
.wifi_item_right{ | |||
color: #1977ff; | |||
} | |||
.footer { | |||
position: fixed; | |||
bottom: 0; | |||
width: 100%; | |||
height: 200rpx; | |||
padding: 10px; | |||
border-top: 1px solid #ddd; | |||
background-color: #fff; | |||
font-size: 14px; | |||
box-shadow: 0px -4rpx 4rpx 0px rgba(0,0,0,.05); | |||
} | |||
.footer .operation { | |||
position: absolute; | |||
display: inline-block; | |||
right: 30rpx; | |||
} | |||
.modal_wrapper{ | |||
position: fixed; | |||
top: 0; | |||
left: 0; | |||
right: 0; | |||
z-index: -1; | |||
background: rgba(0,0,0,0.5); | |||
transition: .4s all; | |||
height: 200vh; | |||
opacity: 0; | |||
} | |||
.modal_wrapper_show{ | |||
transform: translateY(-100vh); | |||
opacity: 1; | |||
overflow-x: hidden; | |||
overflow-y: auto; | |||
z-index: 1000; | |||
} | |||
.remindModal{ | |||
position: absolute; | |||
bottom: 50vh; | |||
left: 50%; | |||
z-index: 101; | |||
transform: translate(-50%, 50%); | |||
background: #fff; | |||
width: 600rpx; | |||
padding: 40rpx 60rpx; | |||
border-radius: 20rpx; | |||
} | |||
.remindModal_title{ | |||
padding: 10rpx 30rpx 50rpx; | |||
text-align: center; | |||
font-size: 32rpx; | |||
} | |||
.remindModal_content{ | |||
font-size: 30rpx; | |||
line-height: 1.6; | |||
text-align: center; | |||
padding-top: 30rpx; | |||
min-height: 100rpx; | |||
} | |||
.remindModal_btn{ | |||
margin-top: 80rpx; | |||
margin-bottom: 10rpx; | |||
} | |||
.remindModal_cancel_btn{ | |||
margin-top: 30rpx; | |||
height: 80rpx; | |||
line-height: 80rpx; | |||
text-align: center; | |||
color: #FA1111; | |||
font-size: 30rpx; | |||
} | |||
.modal_input_wrap{ | |||
width: 100%; | |||
height: 80rpx; | |||
padding: 0 10rpx; | |||
border: 1px solid #dcdcdc; | |||
border-radius: 10rpx; | |||
} | |||
.modal_input{ | |||
width: 100%; | |||
height: 100%; | |||
padding: 10rpx; | |||
font-size: 30rpx; | |||
} | |||
.confirm_btn{ | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
width: 480rpx; | |||
height: 100rpx; | |||
border: 1px solid transparent; | |||
margin: auto; | |||
background: #1977FF; | |||
color: #fff; | |||
font-size: 16px; | |||
letter-spacing: 2rpx; | |||
border-radius: 1000rpx; | |||
white-space: nowrap; | |||
} | |||
.item_hover{ | |||
background-color: rgba(0, 0, 0, .1); | |||
} |
@@ -32,11 +32,25 @@ function hex2str(arr) { | |||
let uint8 = new Uint8Array(arr) | |||
let res = decoder.decode(uint8) | |||
return res | |||
// if (!arr.length) { | |||
// return | |||
// } | |||
// let ret = "" | |||
// arr.forEach(item=>{ | |||
// ret += '%' + item.toString(16) | |||
// }) | |||
// console.log(ret) | |||
// return decodeURIComponent(ret) | |||
} | |||
function str2hex(str) { | |||
let encoder = new TextEncoder('utf8') | |||
return encoder.encode(str) | |||
// let temp = encodeURIComponent(str).split('%').slice(1) | |||
// let ret = temp.map(item=>{ | |||
// return parseInt(item, 16) | |||
// }) | |||
// return ret | |||
} | |||
module.exports = { |