const util = require("../../../utils/util"); const datagramHelp = require("../../../utils/datagramHelp") var app = getApp(); var task_timer; Page({ data: { devices: { deviceId: '', serviceId: '', characteristicId: '', connectedBluetoothName: '' }, deviceConnected: true, statusInfo: { rtu_code: '', datagram_idx: '', collect_time: '', acc_rain: '', fiveMinute_rain: '', hour_rain: '', weater_level: '', power_v: '', rtu_ver: '', rtu_uuid: '', bt_v: '', rtu_rssi: '', rtu_temperature: '', lua_ver: '' }, baseInfo: { rtu_code: '', ip1: '', ip2: '', ip3: '', ip4: '', rtu_work_model: '', rtu_kind: '', datagram_idx: '', collect_time: '' }, clockInfo: { rtu_code: '', datagram_idx: '', collect_time: '' }, runInfo: { rtu_code: '', datagram_idx: '', collect_time: '', collect_interval: '', water_level_base_point: '', water_level_correct_point: '' }, datagramBuff: '', datagramCache: [], trySendCount: 0, datagramIndex: 0, rtu_kind_code: ['P', 'H', 'K', 'Z', 'D', 'T', 'M', 'G', 'Q', 'I', 'O'], rtu_kind_name: ['P(降水)', 'H(河道)', 'K(水库/湖泊)', 'Z(闸坝)', 'D(泵站)', 'T(潮汐)', 'M(墒情)', 'G(地下水)', 'Q(水质)', 'I(取水口)', 'O(排水口)'] }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { console.log('bluebooth main page load ', '**********************************************') var that = this; var deviceId = options.deviceId; var serviceId = options.serviceId; var characteristicId = options.characteristicId; var connectedBluetoothName = options.connectedBluetoothName; var devices = {} devices['deviceId'] = deviceId; devices['serviceId'] = serviceId; devices['characteristicId'] = characteristicId; devices['connectedBluetoothName'] = connectedBluetoothName; this.setData({ devices: devices }) wx.setNavigationBarTitle({ title: this.data.devices.name, }) // if (null != deviceId && deviceId.length > 0 && null != serviceId && serviceId.length > 0 && null != characteristicId && characteristicId.length > //0) { // var devices = {} // devices['deviceId'] = deviceId; // devices['serviceId'] = serviceId; // devices['characteristicId'] = characteristicId; // devices['connectedBluetoothName'] = connectedBluetoothName; // this.setData({ // devices: devices // }) // wx.setNavigationBarTitle({ // title: this.data.devices.connectedBluetoothName, // }) task_timer = undefined; this.setData({ trySendCount: 0, datagramIndex: 0 }) this.getRtuVersion(); this.getRtuBaseSetting(); this.getRtuRunSetting(); if (this.data.datagramCache.length > 0) { let datagram = this.data.datagramCache[this.data.datagramIndex]; this.sendDatagramToRtu(datagram); let index = this.data.datagramIndex + 1; if (this.data.datagramCache.length == index) { index = 0; } let count = this.data.trySendCount + 1; this.setData({ datagramIndex: index, trySendCount: count }) } // wx.onBLEConnectionStateChange(function (res) { // // 该方法回调中可以用于处理连接意外断开等异常情况 // console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`) // if (res.deviceId == that.data.devices.deviceId) { // if (!res.connected) { // that.setData({ // deviceConnected: false // }) // wx.showToast({ // title: '蓝牙连接断开', // icon: 'none', // duration: 2000 // }) // } // } // }) }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { console.log('bluebooth main page onHide ', '**********************************************') this.cancelTime(); }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { console.log('bluebooth main page onUnload ', '**********************************************') this.cancelTime(); this.closeBLEConnection(); }, /** * 生命周期函数--监听页面显示 */ onShow: function () { console.log('bluebooth main page onShow ', '**********************************************') this.timeCallback(); }, closeBLEConnection() { if (this.data.devices.deviceId.length > 0) { var id = this.data.devices.deviceId; wx.closeBLEConnection({ deviceId: id, success(res) { console.log(res) } }) } }, toRtuStatus: function () { this.cancelTime(); wx.navigateTo({ url: '/pages/bluetooth/info/bluetoothInfo?connectedBluetoothName=' + this.data.devices.connectedBluetoothName + '&deviceId=' + this.data.devices.deviceId + '&serviceId=' + this.data.devices.serviceId + '&characteristicId=' + this.data.devices.characteristicId, }) }, toRunSetting: function () { this.cancelTime(); wx.navigateTo({ url: '/pages/bluetooth/runSetting/bluetoothRunSetting?connectedBluetoothName=' + this.data.devices.connectedBluetoothName + '&deviceId=' + this.data.devices.deviceId + '&serviceId=' + this.data.devices.serviceId + '&characteristicId=' + this.data.devices.characteristicId, }) }, toBaseSetting: function () { this.cancelTime(); wx.navigateTo({ url: '/pages/bluetooth/baseSetting/bluetoothBaseSetting?connectedBluetoothName=' + this.data.devices.connectedBluetoothName + '&deviceId=' + this.data.devices.deviceId + '&serviceId=' + this.data.devices.serviceId + '&characteristicId=' + this.data.devices.characteristicId, }) }, toClockSetting: function () { this.cancelTime(); wx.navigateTo({ url: '/pages/bluetooth/clock/bluetoothClock?connectedBluetoothName=' + this.data.devices.connectedBluetoothName + '&deviceId=' + this.data.devices.deviceId + '&serviceId=' + this.data.devices.serviceId + '&characteristicId=' + this.data.devices.characteristicId, }) }, getRtuVersion() { let datagram = datagramHelp.datagram_45(); let cache = this.data.datagramCache; cache.push(datagram); }, getRtuStatus() { var datagram = datagramHelp.datagram_f7(); let cache = this.data.datagramCache; cache.push(datagram); }, getRtuClock() { let datagram = datagramHelp.datagram_51(); let cache = this.data.datagramCache; cache.push(datagram); }, getRtuBaseSetting() { let datagram = datagramHelp.datagram_41(); let cache = this.data.datagramCache; cache.push(datagram); }, getRtuRunSetting() { let datagram = datagramHelp.datagram_43(); let cache = this.data.datagramCache; cache.push(datagram); }, pushDatagramBuff(datagram) { let tmpdatagramBuff = this.data.datagramBuff; if (tmpdatagramBuff.length > 0) { tmpdatagramBuff = tmpdatagramBuff + datagram; } else { tmpdatagramBuff = datagram; } this.setData({ datagramBuff: tmpdatagramBuff }) this.processDatagram(); this.setData({ trySendCount: 0 }) }, processDatagram() { let datagram = this.data.datagramBuff; if (datagram.length > 0) { for (let i = 0; i < datagram.length; i++) { if (datagram.indexOf("7e7e") == 0) { break; } else { datagram = datagram.substring(i, datagram.length); } } if (null != datagram && datagram.length > 0 && datagram.indexOf("7e7e") >= 0) { if (datagram.length >= 26) { var lenBuff = util.HexStr2Bytes(datagram.substring(22, 22 + 4)); var len = util.byteToUint16(lenBuff); // 报文长度(int) var datagramlength = 11 + len + 6; if (datagram.length >= datagramlength * 2) { var onedatagram = datagram.substring(0, datagramlength * 2); if (!datagramHelp.crcCheck(onedatagram)) { wx.showToast({ title: '数据CRC校验错误,请重试!', icon: 'none', duration: 2000 }) this.setData({ datagramBuff: '' }) return; } var count = 20; var funcode = datagram.substring(count, count + 2); count += 2; if (funcode == "f6") { let info = datagramHelp.datagram_f6_analyse(onedatagram) console.log(info) } else if (funcode == "f7") { let info = datagramHelp.datagram_f7_analyse(onedatagram) console.log(info) } else if (funcode == '45') { let info = datagramHelp.datagram_45_analyse(onedatagram) console.log(info) let ver = info['rtu_ver']; if (ver != undefined && ver.length > 0) { let statusInfo = this.data.statusInfo; statusInfo['rtu_ver'] = ver; this.setData({ statusInfo: statusInfo }); } let ct = info['collect_time']; if (ct != undefined && ct.length > 0) { let clockInfo = this.data.clockInfo; clockInfo['collect_time'] = ct; this.setData({ clockInfo: clockInfo }); } } else if (funcode == '47') { var info = datagramHelp.datagram_47_analyse(onedatagram) console.log(info) } else if (funcode == '48') { var info = datagramHelp.datagram_48_analyse(onedatagram) console.log(info) } else if (funcode == '41') { var info = datagramHelp.datagram_41_analyse(onedatagram) console.log(info) var baseInfo = this.data.baseInfo; let rtuCode = info['rtu_code']; baseInfo['rtu_code'] = rtuCode; let ip1 = info['ip1']; if (ip1 != undefined && ip1.length > 0) { // ip1 = ip1 + ":" + info['ip1_port']; } else { ip1 = ""; } let ip2 = info['ip2']; if (ip2 != undefined && ip2.length > 0) { // ip2 = ip2 + ":" + info['ip2_port']; } else { ip2 = ""; } let ip3 = info['ip3']; if (ip3 != undefined && ip3.length > 0) { // ip3 = ip3 + ":" + info['ip3_port']; } else { ip3 = ""; } let ip4 = info['ip4']; if (ip4 != undefined && ip4.length > 0) { // ip4 = ip4 + ":" + info['ip4_port']; } else { ip4 = ""; } baseInfo['ip1'] = ip1; baseInfo['ip2'] = ip2; baseInfo['ip3'] = ip3; baseInfo['ip4'] = ip4; let workModel = info['rtu_work_model']; if (workModel == "0") { baseInfo['rtu_work_model'] = "低功耗"; } else { baseInfo['rtu_work_model'] = "永在线"; } let rtuKind = info['rtu_kind']; for (let i = 0; i < this.data.rtu_kind_code.length; i++) { let code = this.data.rtu_kind_code[i]; if (code == rtuKind) { baseInfo['rtu_kind'] = this.data.rtu_kind_name[i]; break; } } this.setData({ baseInfo: baseInfo }); } else if (funcode == '40') { var info = datagramHelp.datagram_40_analyse(onedatagram) console.log(info) } else if (funcode == '43') { var info = datagramHelp.datagram_43_analyse(onedatagram) console.log(info) let intervalTime = info['intervalTime']; let intervalTimeText = ""; if (intervalTime == "5") { intervalTimeText = "5分钟"; } else if (intervalTime == "60") { intervalTimeText = "1小时"; } else if (intervalTime == "120") { intervalTimeText = "2小时"; } else if (intervalTime == "180") { intervalTimeText = "3小时"; } else if (intervalTime == "240") { intervalTimeText = "4小时"; } else if (intervalTime == "360") { intervalTimeText = "6小时"; } else if (intervalTime == "480") { intervalTimeText = "8小时"; } else if (intervalTime == "720") { intervalTimeText = "12小时"; } else if (intervalTime == "1440") { intervalTimeText = "24小时"; } let runInfo = this.data.runInfo; runInfo['collect_interval'] = intervalTimeText; runInfo['water_level_base_point'] = info['water_level_base_point']; runInfo['water_level_correct_point'] = info['water_level_correct_point']; this.setData({ runInfo: runInfo }); } else if (funcode == '42') { var info = datagramHelp.datagram_42_analyse(onedatagram) console.log(info) } else if (funcode == '4A') { var info = datagramHelp.datagram_4A_analyse(onedatagram) console.log(info) } else if (funcode == '51') { var info = datagramHelp.datagram_51_analyse(onedatagram) console.log(info) let ct = info['collect_time']; if (ct != undefined && ct.length > 0) { let clockInfo = this.data.clockInfo; clockInfo['collect_time'] = ct; this.setData({ clockInfo: clockInfo }); } } else if (funcode == 'f3') { var info = datagramHelp.datagram_f3_analyse(onedatagram) console.log(info) } if (datagram.length - datagramlength * 2 > 0) { let tmp = datagram.substring(datagramlength * 2, datagram.length); this.setData({ datagramBuff: tmp }) } else { this.setData({ datagramBuff: "" }) } } else { this.setData({ datagramBuff: datagram }) } } else { this.setData({ datagramBuff: datagram }) } } else { if (null != datagram && datagram.length > 0) { this.setData({ datagramBuff: datagram }) } else { this.setData({ datagramBuff: '' }) } } } }, sendDatagramToRtu(datagram) { console.log("will send datagram " + datagram); let buffer = util.HexStr2Bytes(datagram); var that = this; let count = 0; let inView = new DataView(buffer); while (true) { if (buffer.byteLength - count > 20) { let tmpBuff = new ArrayBuffer(20); let outView = new DataView(tmpBuff); for (let i = 0; i < 20; i++) { outView.setUint8(i, inView.getUint8(count + i)) } wx.writeBLECharacteristicValue({ deviceId: that.data.devices['deviceId'], serviceId: that.data.devices['serviceId'], characteristicId: that.data.devices['characteristicId'], value: tmpBuff, success(res) { console.log('writeBLECharacteristicValue success', res.errMsg) wx.onBLECharacteristicValueChange((characteristic) => { console.log("read datagram==============", util.ab2hex(characteristic.value)) var datagram = util.ab2hex(characteristic.value); that.pushDatagramBuff(datagram); }) wx.readBLECharacteristicValue({ deviceId: that.data.devices['deviceId'], serviceId: that.data.devices['serviceId'], characteristicId: that.data.devices['characteristicId'], success: function (res) { console.log('readBLECharacteristicValue') } }) }, fail(res) { console.log('writeBLECharacteristicValue success', res.errMsg) } }) count += 20; } else { let len = buffer.byteLength - count; let tmpBuff = new ArrayBuffer(len); let outView = new DataView(tmpBuff); for (let i = 0; i < len; i++) { outView.setUint8(i, inView.getUint8(count + i)) } wx.writeBLECharacteristicValue({ deviceId: that.data.devices['deviceId'], serviceId: that.data.devices['serviceId'], characteristicId: that.data.devices['characteristicId'], value: tmpBuff, success(res) { console.log('writeBLECharacteristicValue success', res.errMsg) wx.onBLECharacteristicValueChange((characteristic) => { console.log("read datagram==============", util.ab2hex(characteristic.value)) var datagram = util.ab2hex(characteristic.value); that.pushDatagramBuff(datagram); }) wx.readBLECharacteristicValue({ deviceId: that.data.devices['deviceId'], serviceId: that.data.devices['serviceId'], characteristicId: that.data.devices['characteristicId'], success: function (res) { console.log('readBLECharacteristicValue') } }) }, fail(res) { console.log('writeBLECharacteristicValue success', res.errMsg) } }) count += len; } if (count >= buffer.byteLength) { wx.readBLECharacteristicValue({ deviceId: that.data.devices['deviceId'], serviceId: that.data.devices['serviceId'], characteristicId: that.data.devices['characteristicId'], success: function (res) { console.log('readBLECharacteristicValue') } }) break; } } }, timeCallback() { let that = this; task_timer = setTimeout(function () { console.log("------------------------------------Time CallBack----------------------------"); if (that.data.trySendCount == 0) { console.log("index " + that.data.datagramIndex); let datagram = that.data.datagramCache[that.data.datagramIndex]; that.sendDatagramToRtu(datagram); if (that.data.datagramCache.length == that.data.datagramIndex + 1) { that.setData({ datagramIndex: 0, trySendCount: 1 }) } else { that.setData({ datagramIndex: that.data.datagramIndex + 1, trySendCount: 1 }) } } else { let count = that.data.trySendCount + 1; if (count >= 4) { count = 0; } that.setData({ trySendCount: count }) } that.timeCallback(); }, 3000); }, cancelTime() { if (task_timer != undefined) { clearTimeout(task_timer); task_timer = undefined; } this.setData({ datagramIndex: 0, trySendCount: 0 }) } })