You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

751 lines
21 KiB

// pages/bindLock/bindLock.js
var util = require('../../utils/util');
var util1 = require('../../utils/util1');
import {
BLE
} from "../../utils/btls/ble";
const app = getApp();
const WXAPI = require('../../utils/request')
import ICINLocker from '../../utils/ICINPakage/ICINLocker'
const emitter = app.globalData.emitter
// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join(',');
}
function promisify(fn, args) {
return new Promise((resolve, reject) => {
fn({
...(args || {}),
success: (res) => resolve(res),
fail: (err) => reject(err),
});
});
}
Page({
/**
* 页面的初始数据
*/
data: {
deviceNum: '',
radio: '1',
zgBlueStatus: false,
bluestatus: true,
selectindex: 1,
info: '',
deviceList:[],
searchClick:false,
show:false,
showSelect:false,
searchValue:'',
pageNum: 1,
pageSize: 20,
zNodes: [],
selectRoomName:'选择房间',
allDevice:[],
list:[],
setRoomArr:[],
confirmSelectKey:'',
stoppull:false
},
onChange1(event) {
this.setData({
deviceNum: event.detail,
});
},
onChange2(event) {
this.setData({
radio: event.detail,
});
},
// 关闭弹窗
onClose() {
this.setData({ show: false });
},
onClose1() {
this.setData({ showSelect: false });
},
// 打开弹窗
selectRoom(){
this.setData({ show: true });
},
// 房源搜索
onClick() {
this.getRoom2()
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// app.globalData.zgBlueStatus = false
let _this=this
this.setData({
selectindex: options.id
})
ICINLocker.checkTheWechatVersion()
this.getTree()
},
// 触底触发
bottomingOut(){
if (!this.data.stoppull) {
var num = this.data.pageNum + 1
this.setData({
pageNum: num
})
this.getRoom()
}
},
// 搜索值
onChangeSearch(event){
this.setData({
searchValue: event.detail
})
},
//选择房源弹窗
bindroom() {
this.setData({
showSelect: true
});
},
// 获取所有设备
getAllDeviceSelect(ids,callback){
var data = {
q: JSON.stringify({
roomIds: ids
})
}
WXAPI.getDeviceItems(data).then(res => {
if(res.data.list.length>0){
callback(res.data.list)
}else{
callback([])
}
}).catch(err=>{
callback([])
})
},
getTree() {
var _this = this
WXAPI.getTree('').then(res => {
var list=res.data.sort((pre, cur)=>pre.id - cur.id)
var newArr = util.uniqueArray(list, "id");
var setting = {
data: {
simpleData: {
idKey: 'id',
pIdKey: 'pid'
},
key: {
children: 'children'
}
}
}
var dataList = this.transformTozTreeFormat(setting, newArr)
var selectKey = wx.getStorageSync('selectKey') || ''
var selectRoomName = wx.getStorageSync('selectRoomName') || ''
var pid = wx.getStorageSync('pid') || dataList[0].pid
this.setData({
dataList: dataList,
// pid:dataList[0].pid,
treeList:newArr,
// selectRoomName:dataList[0].name,
selectKey,selectRoomName,pid
})
this.getRoom()
})
},
// 确认选择房间
selectRoomId(e){
this.setData({
confirmSelectKey:e.currentTarget.dataset.select.id,
show:false,
selectRoomName:e.currentTarget.dataset.select.path
})
},
handleSelect(e) {
console.log(e)
wx.showToast({
title: `已选择${e.detail.item.name}`,
icon: 'none',
duration: 1000
})
wx.setStorageSync('selectKey', e.detail.item.id)
wx.setStorageSync('selectRoomName', e.detail.item.name)
wx.setStorageSync('pid', e.detail.item.id)
this.setData({
selectKey: e.detail.item.id,
selectRoomName: e.detail.item.name,
pid:e.detail.item.id,
showSelect: false
})
this.getRoom2()
},
// 获取房间
getRoom2() {
var that = this
var q = {
ancestor: this.data.selectKey,
isRoom:1,
name:this.data.searchValue
};
console.log(q)
var data = {
q: JSON.stringify(q),
pageNum: 1,
pageSize: 20
};
WXAPI.getSiteList(data).then(res => {
var stoppull = false
if (res.data.list.list.length < 20) {
stoppull = true
}
let setArr = []
var alllist = res.data.list.list
alllist.map(lt=>{
setArr.push(lt.id)
})
this.getAllDeviceSelect(setArr,function(data){
alllist.map(li=>{
var name = that.findIndexArray(that.data.dataList, li.id, [])
var path = ''
if (name) {
path = name.reverse().join('/')
}
li['path'] = path
var device=data.filter(item=>item.roomId==li.id)[0]
if(device){
li.deviceNum=device.deviceNum
li['battery']=device.battery
li['rssi']=device.rssi
li['isOnline']=device.isOnline
li['manufactureId']=device.manufactureId
}else{
li['battery']=''
li['rssi']=''
li['isOnline']=''
li['manufactureId']=''
}
})
that.setData({
list: alllist,
stoppull,
pageNum: 1
})
})
})
},
findIndexArray(data,id,indexArray){
let arr = Array.from(indexArray);
for(let i=0,len=data.length;i<len;i++){
arr.push(data[i].name);
if(data[i].id===id){
return arr
}
let children=data[i].children;
if(children&&children.length){
let result=this.findIndexArray(children,id,arr);
if(result) return result
}
arr.pop()
}
return false
},
transformTozTreeFormat(setting, sNodes) {
var i, l,
key = setting.data.simpleData.idKey,
parentKey = setting.data.simpleData.pIdKey,
childKey = setting.data.key.children
if (!key || key == "" || !sNodes) return [];
var r = [];
var tmpMap = [];
for (i = 0, l = sNodes.length; i < l; i++) {
tmpMap[sNodes[i][key]] = sNodes[i];
}
for (i = 0, l = sNodes.length; i < l; i++) {
if (tmpMap[sNodes[i][parentKey]] && sNodes[i][key] != sNodes[i][parentKey]) {
if (!tmpMap[sNodes[i][parentKey]][childKey])
tmpMap[sNodes[i][parentKey]][childKey] = [];
tmpMap[sNodes[i][parentKey]][childKey].push(sNodes[i]);
} else {
r.push(sNodes[i]);
}
}
return r;
},
// 获取房间
getRoom() {
var that= this
var q = {
ancestor: this.data.pid,
isRoom:1,
name:this.data.searchValue
};
var data = {
q: JSON.stringify(q),
pageNum: this.data.pageNum,
pageSize: this.data.pageSize
};
WXAPI.getSiteList(data).then(res => {
var stoppull = false
if (res.data.list.list.length < 20) {
stoppull = true
}
let setArr = []
var alllist = this.data.list.concat(res.data.list.list)
alllist.map(lt=>{
setArr.push(lt.id)
})
this.getAllDeviceSelect(setArr,function(data){
alllist.map(li=>{
var name = that.findIndexArray(that.data.dataList, li.id, [])
var path = ''
if (name) {
path = name.reverse().join('/')
}
li['path'] = path
var device=data.filter(item=>item.roomId==li.id)[0]
if(device){
li.deviceNum=device.deviceNum
li['battery']=device.battery
li['rssi']=device.rssi
li['isOnline']=device.isOnline
li['manufactureId']=device.manufactureId
}else{
li['battery']=''
li['rssi']=''
li['isOnline']=''
li['manufactureId']=''
}
})
that.setData({
list: alllist,
setRoomArr:setArr,
stoppull
})
})
})
},
getAllDevice(deviceNum,callback){
var data = {
q: JSON.stringify({
deviceNum: deviceNum
})
}
WXAPI.getDeviceItems(data).then(res => {
if(res.data.list.length>0){
callback(res.data.list)
}else{
callback([])
}
}).catch(err=>{
callback([])
})
},
searchDevicesMethods(){
var that = this;
wx.showLoading({
title: '正在搜索',
// mask: true
})
this.setData({
searchClick:false
})
wx.openBluetoothAdapter({
success: function (res) {
wx.startBluetoothDevicesDiscovery({
success: function (res) {
wx.getBluetoothDevices({
success: function (res) {
wx.hideLoading()
if(that.data.selectindex==1){
var deviceList=[]
res.devices.map(li=>{
var status=li.name.indexOf('yxwl')
if(status!=-1){
that.getAllDevice(li.name,function(data){
if(data.length>0){
li.roomName = data[0].roomName
deviceList.push(li)
}else{
li.roomName = ''
deviceList.push(li)
}
})
}
})
setTimeout(()=>{
that.setData({
deviceList
})
},1000)
}else if(that.data.selectindex==2||that.data.selectindex==3){
var deviceList=[]
res.devices.map(li=>{
var status=li.name.indexOf('ICIN_')
if(status!=-1){
that.getAllDevice(li.name,function(data){
if(data.length>0){
li.roomName = data[0].roomName
deviceList.push(li)
}else{
li.roomName = ''
deviceList.push(li)
}
})
deviceList.push(li)
}
})
setTimeout(()=>{
that.setData({
deviceList
})
},1000)
}else if(that.data.selectindex==4){
var deviceList=[]
console.log(res);
res.devices.map(it=>{
console.log(it);
var status=it.name.indexOf('WSL_')
if(status!=-1){
if (it.RSSI != 127) {
if (it.advertisData != null) {
it.adData = util1.ab2hex(it.advertisData)
if (it.adData.length > 10) {
var macStr = it.adData.substring(4, 16).toUpperCase()
//console.log('macStr', macStr)
it.mac = macStr.substr(10, 2) + ':' + macStr.substr(8, 2) + ':' + macStr.substr(6, 2) + ':' + macStr.substr(4, 2) + ':' + macStr.substr(2, 2) + ':' + macStr.substr(0, 2)
if (it.adData.substring(1, 2) == '1') {
it.isLightOn = true
it.textColor = 'green'
} else {
it.isLightOn = false
it.textColor = 'black'
}
if (it.adData.substring(3, 4) == '1') {
it.textColor = 'pink'
it.isBind = true
} else {
it.isBind = false
}
// deviceList.push(it)
//console.log(it)
}
} else {
it.textColor = 'black'
}
console.log(it)
var lockModel = util1.getLockModel(it.name)
it.lockType = util1.getLockType(lockModel)
if(that.data.searchClick){
wx.navigateTo({
url: '/pages/Bluetooth/Bluetooth?&deviceNum=' + it.name + '&selectindex=' + that.data.selectindex+'&connectedDeviceId='+ it.deviceId+'&name='+ it.name+'&mac=' + it.mac,
})
}else{
deviceList.push(it)
}
app.addDeviceWithDevName(it.name, it)
}
}
})
that.setData({
deviceList
})
}
console.log(res)
}
})
},
fail:function(res){
wx.hideLoading({
success: (res) => {
wx.showToast({
title: '请重新搜索设备',
duration:2000,
icon:'none'
})
},
})
}
})
},
fail: function (res) {
console.log('请打开蓝牙和定位功能')
wx.hideLoading({
success: (res) => {
wx.showToast({
title: '请打开蓝牙和定位功能',
duration:2000,
icon:'none'
})
},
})
}
})
},
searchBlueButton(e) {
var deviceId=e.currentTarget.dataset.select.name
this.setData({
deviceNum:deviceId
})
this.linkBule()
},
// 扫描
scanning() {
var that = this
wx.showLoading({
title: '加载中',
mask: true
});
wx.scanCode({
success(res) {
var deviceNum = ''
if (res.result.indexOf('&') != -1) {
deviceNum = res.result.split('&')[0]
}else if(res.result.indexOf('WSL') != -1){
deviceNum = res.result
}else if (res.result.indexOf('_')) {
deviceNum = "ICIN_" + res.result.split('_')[0]
}
that.setData({
deviceNum: deviceNum,
bluestatus: true
})
wx.hideLoading()
},
fail(res) {
wx.hideLoading()
}
})
},
linkBule() {
wx.stopBluetoothDevicesDiscovery()
wx.closeBluetoothAdapter()
if (this.data.deviceNum == '') {
wx.hideLoading()
wx.showToast({
title: '请输入锁号',
duration: 2000,
icon: 'none'
})
} else {
// wx.navigateTo({
// url: '/pages/Bluetooth/Bluetooth?&deviceNum=' + this.data.deviceNum + '&selectindex=' + this.data.selectindex,
// })
// return
if (this.data.selectindex == 1) {
// wx.navigateTo({
// url: '/pages/Bluetooth1/Bluetooth1?&deviceNum=' + this.data.deviceNum + '&selectindex=' + this.data.selectindex,
// })
// return
this.startconnect()
}else if( this.data.selectindex == 4){
this.searchDevicesMethods()
this.setData({
searchClick:true
})
} else if (this.data.selectindex == 2||this.data.selectindex == 3) {
// wx.navigateTo({
// url: '/pages/Bluetooth/Bluetooth?&deviceNum=' + this.data.deviceNum + '&selectindex=' + this.data.selectindex,
// })
// return
this.goBlue()
}
}
},
ConnectTo: function(e) {
var that = this
console.log('ConnectTo', e.currentTarget.dataset.select)
var bleDevice = app.getDeviceByDevName(e.currentTarget.dataset.select)
console.log('bleDevice', bleDevice)
// wx.navigateTo({
// url: '../lockFun/lockFun?connectedDeviceId=' + bleDevice.deviceId + '&name=' + bleDevice.name + '&mac=' + bleDevice.mac
// })
wx.navigateTo({
url: '/pages/Bluetooth/Bluetooth?&deviceNum=' + bleDevice.name + '&selectindex=' + this.data.selectindex+'&connectedDeviceId='+ bleDevice.deviceId+'&name='+ bleDevice.name+'&mac=' + bleDevice.mac,
})
return
},
startconnect() {
wx.showLoading({
title: "连接中",
// mask: true
})
const ble = new BLE(this.data.deviceNum, emitter)
app.globalData.ble = ble
this.watchBLE()
app.globalData.ble.init()
},
watchBLE() {
var that = this
if (app.globalData.ble) {
app.globalData.ble.listen(res => {
if (res.type == 'connect') {
if (res.data == "未打开适配器") {
wx.hideLoading()
wx.showModal({
title: "提示",
content: "请检查手机蓝牙和定位功能是否打开?",
showCancel: false,
confirmText: "确定",
success(res) {}
});
} else {
if (res.data == '蓝牙已连接') {
this.data.info = res.data
app.globalData.bleStatus = res.data
wx.navigateTo({
url: '/pages/Bluetooth1/Bluetooth1?&deviceNum=' + this.data.deviceNum + '&selectindex=' + this.data.selectindex,
})
}
}
}
})
}
},
goBlue() {
var that = this
wx.showLoading({
title: '连接中',
// mask: true
})
wx.removeStorageSync("connectedDeviceId")
ICINLocker.scanDevices(this.data.deviceNum)
.then((res) => {
console.log(res)
if (res.status == 0) {
//成功找到蓝牙情况下进行锁连接
app.globalData.blueDeviceId = res.deviceId
console.log(app.globalData.blueDeviceId, 'blueDeviceId')
ICINLocker.connect(res.deviceId, false) // 此处 deviceId 存起来,当断开连接时使用
.then((res) => {
if (res.status === 0) {
wx.hideLoading()
if(this.data.confirmSelectKey){
wx.navigateTo({
url: '/pages/Bluetooth/Bluetooth?&deviceNum=' + this.data.deviceNum + '&type=' + this.data.radio+'&selectindex=' + this.data.selectindex+'&selectKey='+this.data.confirmSelectKey+'&selectRoomName='+this.data.selectRoomName,
})
}else{
wx.navigateTo({
url: '/pages/Bluetooth/Bluetooth?&deviceNum=' + this.data.deviceNum + '&type=' + this.data.radio+'&selectindex=' + this.data.selectindex,
})
}
//此处成功连接锁
wx.showToast({
title: res.statusReason,
duration: 1000,
icon: 'none'
})
} else {
var msg = ''
switch (res.errCode) {
case 10001:
msg = '调用失败,请打开蓝牙!';
break;
}
wx.showToast({
title: msg,
duration: 2000,
icon: 'none'
})
//此处处理返回值不为成功(0)的情况
}
}).catch((res) => {
wx.hideLoading()
wx.showToast({
title: '连接错误',
duration: 2000,
icon: 'none'
})
console.log(res, '失败')
})
}
})
.catch((res) => {
if (res.status == 1) {
if (res.statusReason.errCode == 10001) {
wx.hideLoading()
wx.showModal({
title: "提示",
content: "请检查手机蓝牙和定位功能是否打开?",
showCancel: false,
confirmText: "确定",
success(res) {}
});
} else {
if (!app.globalData.zgBlueStatus && that.data.bluestatus) {
that.goBlue()
} else {
wx.hideLoading()
}
}
}
})
},
onChange(event) {
// event.detail 为当前输入的值
this.setData({
deviceNum: event.detail
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
app.globalData.zgBlueStatus = false
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
this.setData({
bluestatus: false
})
},
closeblue() {
app.globalData.ble.close()
app.globalData.bleStatus = false
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
this.closeblue()
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})