bluetoothHome.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. const util = require("../../../utils/util");
  2. const datagramHelp = require("../../../utils/datagramHelp")
  3. var app = getApp();
  4. var task_timer;
  5. Page({
  6. data: {
  7. devices: {
  8. deviceId: '',
  9. serviceId: '',
  10. characteristicId: '',
  11. connectedBluetoothName: ''
  12. },
  13. deviceConnected: true,
  14. statusInfo: {
  15. rtu_code: '',
  16. datagram_idx: '',
  17. collect_time: '',
  18. acc_rain: '',
  19. fiveMinute_rain: '',
  20. hour_rain: '',
  21. weater_level: '',
  22. power_v: '',
  23. rtu_ver: '',
  24. rtu_uuid: '',
  25. bt_v: '',
  26. rtu_rssi: '',
  27. rtu_temperature: '',
  28. lua_ver: ''
  29. },
  30. baseInfo: {
  31. rtu_code: '',
  32. ip1: '',
  33. ip2: '',
  34. ip3: '',
  35. ip4: '',
  36. rtu_work_model: '',
  37. rtu_kind: '',
  38. datagram_idx: '',
  39. collect_time: ''
  40. },
  41. clockInfo: {
  42. rtu_code: '',
  43. datagram_idx: '',
  44. collect_time: ''
  45. },
  46. runInfo: {
  47. rtu_code: '',
  48. datagram_idx: '',
  49. collect_time: '',
  50. collect_interval: '',
  51. water_level_base_point: '',
  52. water_level_correct_point: ''
  53. },
  54. datagramBuff: '',
  55. datagramCache: [],
  56. trySendCount: 0,
  57. datagramIndex: 0,
  58. rtu_kind_code: ['P', 'H', 'K', 'Z', 'D', 'T', 'M', 'G', 'Q', 'I', 'O'],
  59. rtu_kind_name: ['P(降水)', 'H(河道)', 'K(水库/湖泊)', 'Z(闸坝)', 'D(泵站)', 'T(潮汐)', 'M(墒情)', 'G(地下水)', 'Q(水质)', 'I(取水口)', 'O(排水口)']
  60. },
  61. /**
  62. * 生命周期函数--监听页面加载
  63. */
  64. onLoad: function (options) {
  65. console.log('bluebooth main page load ', '**********************************************')
  66. var that = this;
  67. var deviceId = options.deviceId;
  68. var serviceId = options.serviceId;
  69. var characteristicId = options.characteristicId;
  70. var connectedBluetoothName = options.connectedBluetoothName;
  71. var devices = {}
  72. devices['deviceId'] = deviceId;
  73. devices['serviceId'] = serviceId;
  74. devices['characteristicId'] = characteristicId;
  75. devices['connectedBluetoothName'] = connectedBluetoothName;
  76. this.setData({
  77. devices: devices
  78. })
  79. wx.setNavigationBarTitle({
  80. title: this.data.devices.name,
  81. })
  82. // if (null != deviceId && deviceId.length > 0 && null != serviceId && serviceId.length > 0 && null != characteristicId && characteristicId.length > //0) {
  83. // var devices = {}
  84. // devices['deviceId'] = deviceId;
  85. // devices['serviceId'] = serviceId;
  86. // devices['characteristicId'] = characteristicId;
  87. // devices['connectedBluetoothName'] = connectedBluetoothName;
  88. // this.setData({
  89. // devices: devices
  90. // })
  91. // wx.setNavigationBarTitle({
  92. // title: this.data.devices.connectedBluetoothName,
  93. // })
  94. task_timer = undefined;
  95. this.setData({
  96. trySendCount: 0,
  97. datagramIndex: 0
  98. })
  99. this.getRtuVersion();
  100. this.getRtuBaseSetting();
  101. this.getRtuRunSetting();
  102. if (this.data.datagramCache.length > 0) {
  103. let datagram = this.data.datagramCache[this.data.datagramIndex];
  104. this.sendDatagramToRtu(datagram);
  105. let index = this.data.datagramIndex + 1;
  106. if (this.data.datagramCache.length == index) {
  107. index = 0;
  108. }
  109. let count = this.data.trySendCount + 1;
  110. this.setData({
  111. datagramIndex: index,
  112. trySendCount: count
  113. })
  114. }
  115. // wx.onBLEConnectionStateChange(function (res) {
  116. // // 该方法回调中可以用于处理连接意外断开等异常情况
  117. // console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
  118. // if (res.deviceId == that.data.devices.deviceId) {
  119. // if (!res.connected) {
  120. // that.setData({
  121. // deviceConnected: false
  122. // })
  123. // wx.showToast({
  124. // title: '蓝牙连接断开',
  125. // icon: 'none',
  126. // duration: 2000
  127. // })
  128. // }
  129. // }
  130. // })
  131. },
  132. /**
  133. * 生命周期函数--监听页面隐藏
  134. */
  135. onHide: function () {
  136. console.log('bluebooth main page onHide ', '**********************************************')
  137. this.cancelTime();
  138. },
  139. /**
  140. * 生命周期函数--监听页面卸载
  141. */
  142. onUnload: function () {
  143. console.log('bluebooth main page onUnload ', '**********************************************')
  144. this.cancelTime();
  145. this.closeBLEConnection();
  146. },
  147. /**
  148. * 生命周期函数--监听页面显示
  149. */
  150. onShow: function () {
  151. console.log('bluebooth main page onShow ', '**********************************************')
  152. this.timeCallback();
  153. },
  154. closeBLEConnection() {
  155. if (this.data.devices.deviceId.length > 0) {
  156. var id = this.data.devices.deviceId;
  157. wx.closeBLEConnection({
  158. deviceId: id,
  159. success(res) {
  160. console.log(res)
  161. }
  162. })
  163. }
  164. },
  165. toRtuStatus: function () {
  166. this.cancelTime();
  167. wx.navigateTo({
  168. 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,
  169. })
  170. },
  171. toRunSetting: function () {
  172. this.cancelTime();
  173. wx.navigateTo({
  174. 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,
  175. })
  176. },
  177. toBaseSetting: function () {
  178. this.cancelTime();
  179. wx.navigateTo({
  180. 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,
  181. })
  182. },
  183. toClockSetting: function () {
  184. this.cancelTime();
  185. wx.navigateTo({
  186. 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,
  187. })
  188. },
  189. getRtuVersion() {
  190. let datagram = datagramHelp.datagram_45();
  191. let cache = this.data.datagramCache;
  192. cache.push(datagram);
  193. },
  194. getRtuStatus() {
  195. var datagram = datagramHelp.datagram_f7();
  196. let cache = this.data.datagramCache;
  197. cache.push(datagram);
  198. },
  199. getRtuClock() {
  200. let datagram = datagramHelp.datagram_51();
  201. let cache = this.data.datagramCache;
  202. cache.push(datagram);
  203. },
  204. getRtuBaseSetting() {
  205. let datagram = datagramHelp.datagram_41();
  206. let cache = this.data.datagramCache;
  207. cache.push(datagram);
  208. },
  209. getRtuRunSetting() {
  210. let datagram = datagramHelp.datagram_43();
  211. let cache = this.data.datagramCache;
  212. cache.push(datagram);
  213. },
  214. pushDatagramBuff(datagram) {
  215. let tmpdatagramBuff = this.data.datagramBuff;
  216. if (tmpdatagramBuff.length > 0) {
  217. tmpdatagramBuff = tmpdatagramBuff + datagram;
  218. } else {
  219. tmpdatagramBuff = datagram;
  220. }
  221. this.setData({
  222. datagramBuff: tmpdatagramBuff
  223. })
  224. this.processDatagram();
  225. this.setData({
  226. trySendCount: 0
  227. })
  228. },
  229. processDatagram() {
  230. let datagram = this.data.datagramBuff;
  231. if (datagram.length > 0) {
  232. for (let i = 0; i < datagram.length; i++) {
  233. if (datagram.indexOf("7e7e") == 0) {
  234. break;
  235. } else {
  236. datagram = datagram.substring(i, datagram.length);
  237. }
  238. }
  239. if (null != datagram && datagram.length > 0 && datagram.indexOf("7e7e") >= 0) {
  240. if (datagram.length >= 26) {
  241. var lenBuff = util.HexStr2Bytes(datagram.substring(22, 22 + 4));
  242. var len = util.byteToUint16(lenBuff); // 报文长度(int)
  243. var datagramlength = 11 + len + 6;
  244. if (datagram.length >= datagramlength * 2) {
  245. var onedatagram = datagram.substring(0, datagramlength * 2);
  246. if (!datagramHelp.crcCheck(onedatagram)) {
  247. wx.showToast({
  248. title: '数据CRC校验错误,请重试!',
  249. icon: 'none',
  250. duration: 2000
  251. })
  252. this.setData({
  253. datagramBuff: ''
  254. })
  255. return;
  256. }
  257. var count = 20;
  258. var funcode = datagram.substring(count, count + 2);
  259. count += 2;
  260. if (funcode == "f6") {
  261. let info = datagramHelp.datagram_f6_analyse(onedatagram)
  262. console.log(info)
  263. } else if (funcode == "f7") {
  264. let info = datagramHelp.datagram_f7_analyse(onedatagram)
  265. console.log(info)
  266. } else if (funcode == '45') {
  267. let info = datagramHelp.datagram_45_analyse(onedatagram)
  268. console.log(info)
  269. let ver = info['rtu_ver'];
  270. if (ver != undefined && ver.length > 0) {
  271. let statusInfo = this.data.statusInfo;
  272. statusInfo['rtu_ver'] = ver;
  273. this.setData({
  274. statusInfo: statusInfo
  275. });
  276. }
  277. let ct = info['collect_time'];
  278. if (ct != undefined && ct.length > 0) {
  279. let clockInfo = this.data.clockInfo;
  280. clockInfo['collect_time'] = ct;
  281. this.setData({
  282. clockInfo: clockInfo
  283. });
  284. }
  285. } else if (funcode == '47') {
  286. var info = datagramHelp.datagram_47_analyse(onedatagram)
  287. console.log(info)
  288. } else if (funcode == '48') {
  289. var info = datagramHelp.datagram_48_analyse(onedatagram)
  290. console.log(info)
  291. } else if (funcode == '41') {
  292. var info = datagramHelp.datagram_41_analyse(onedatagram)
  293. console.log(info)
  294. var baseInfo = this.data.baseInfo;
  295. let rtuCode = info['rtu_code'];
  296. baseInfo['rtu_code'] = rtuCode;
  297. let ip1 = info['ip1'];
  298. if (ip1 != undefined && ip1.length > 0) {
  299. // ip1 = ip1 + ":" + info['ip1_port'];
  300. } else {
  301. ip1 = "";
  302. }
  303. let ip2 = info['ip2'];
  304. if (ip2 != undefined && ip2.length > 0) {
  305. // ip2 = ip2 + ":" + info['ip2_port'];
  306. } else {
  307. ip2 = "";
  308. }
  309. let ip3 = info['ip3'];
  310. if (ip3 != undefined && ip3.length > 0) {
  311. // ip3 = ip3 + ":" + info['ip3_port'];
  312. } else {
  313. ip3 = "";
  314. }
  315. let ip4 = info['ip4'];
  316. if (ip4 != undefined && ip4.length > 0) {
  317. // ip4 = ip4 + ":" + info['ip4_port'];
  318. } else {
  319. ip4 = "";
  320. }
  321. baseInfo['ip1'] = ip1;
  322. baseInfo['ip2'] = ip2;
  323. baseInfo['ip3'] = ip3;
  324. baseInfo['ip4'] = ip4;
  325. let workModel = info['rtu_work_model'];
  326. if (workModel == "0") {
  327. baseInfo['rtu_work_model'] = "低功耗";
  328. } else {
  329. baseInfo['rtu_work_model'] = "永在线";
  330. }
  331. let rtuKind = info['rtu_kind'];
  332. for (let i = 0; i < this.data.rtu_kind_code.length; i++) {
  333. let code = this.data.rtu_kind_code[i];
  334. if (code == rtuKind) {
  335. baseInfo['rtu_kind'] = this.data.rtu_kind_name[i];
  336. break;
  337. }
  338. }
  339. this.setData({
  340. baseInfo: baseInfo
  341. });
  342. } else if (funcode == '40') {
  343. var info = datagramHelp.datagram_40_analyse(onedatagram)
  344. console.log(info)
  345. } else if (funcode == '43') {
  346. var info = datagramHelp.datagram_43_analyse(onedatagram)
  347. console.log(info)
  348. let intervalTime = info['intervalTime'];
  349. let intervalTimeText = "";
  350. if (intervalTime == "5") {
  351. intervalTimeText = "5分钟";
  352. } else if (intervalTime == "60") {
  353. intervalTimeText = "1小时";
  354. } else if (intervalTime == "120") {
  355. intervalTimeText = "2小时";
  356. } else if (intervalTime == "180") {
  357. intervalTimeText = "3小时";
  358. } else if (intervalTime == "240") {
  359. intervalTimeText = "4小时";
  360. } else if (intervalTime == "360") {
  361. intervalTimeText = "6小时";
  362. } else if (intervalTime == "480") {
  363. intervalTimeText = "8小时";
  364. } else if (intervalTime == "720") {
  365. intervalTimeText = "12小时";
  366. } else if (intervalTime == "1440") {
  367. intervalTimeText = "24小时";
  368. }
  369. let runInfo = this.data.runInfo;
  370. runInfo['collect_interval'] = intervalTimeText;
  371. runInfo['water_level_base_point'] = info['water_level_base_point'];
  372. runInfo['water_level_correct_point'] = info['water_level_correct_point'];
  373. this.setData({
  374. runInfo: runInfo
  375. });
  376. } else if (funcode == '42') {
  377. var info = datagramHelp.datagram_42_analyse(onedatagram)
  378. console.log(info)
  379. } else if (funcode == '4A') {
  380. var info = datagramHelp.datagram_4A_analyse(onedatagram)
  381. console.log(info)
  382. } else if (funcode == '51') {
  383. var info = datagramHelp.datagram_51_analyse(onedatagram)
  384. console.log(info)
  385. let ct = info['collect_time'];
  386. if (ct != undefined && ct.length > 0) {
  387. let clockInfo = this.data.clockInfo;
  388. clockInfo['collect_time'] = ct;
  389. this.setData({
  390. clockInfo: clockInfo
  391. });
  392. }
  393. } else if (funcode == 'f3') {
  394. var info = datagramHelp.datagram_f3_analyse(onedatagram)
  395. console.log(info)
  396. }
  397. if (datagram.length - datagramlength * 2 > 0) {
  398. let tmp = datagram.substring(datagramlength * 2, datagram.length);
  399. this.setData({
  400. datagramBuff: tmp
  401. })
  402. } else {
  403. this.setData({
  404. datagramBuff: ""
  405. })
  406. }
  407. } else {
  408. this.setData({
  409. datagramBuff: datagram
  410. })
  411. }
  412. } else {
  413. this.setData({
  414. datagramBuff: datagram
  415. })
  416. }
  417. } else {
  418. if (null != datagram && datagram.length > 0) {
  419. this.setData({
  420. datagramBuff: datagram
  421. })
  422. } else {
  423. this.setData({
  424. datagramBuff: ''
  425. })
  426. }
  427. }
  428. }
  429. },
  430. sendDatagramToRtu(datagram) {
  431. console.log("will send datagram " + datagram);
  432. let buffer = util.HexStr2Bytes(datagram);
  433. var that = this;
  434. let count = 0;
  435. let inView = new DataView(buffer);
  436. while (true) {
  437. if (buffer.byteLength - count > 20) {
  438. let tmpBuff = new ArrayBuffer(20);
  439. let outView = new DataView(tmpBuff);
  440. for (let i = 0; i < 20; i++) {
  441. outView.setUint8(i, inView.getUint8(count + i))
  442. }
  443. wx.writeBLECharacteristicValue({
  444. deviceId: that.data.devices['deviceId'],
  445. serviceId: that.data.devices['serviceId'],
  446. characteristicId: that.data.devices['characteristicId'],
  447. value: tmpBuff,
  448. success(res) {
  449. console.log('writeBLECharacteristicValue success', res.errMsg)
  450. wx.onBLECharacteristicValueChange((characteristic) => {
  451. console.log("read datagram==============", util.ab2hex(characteristic.value))
  452. var datagram = util.ab2hex(characteristic.value);
  453. that.pushDatagramBuff(datagram);
  454. })
  455. wx.readBLECharacteristicValue({
  456. deviceId: that.data.devices['deviceId'],
  457. serviceId: that.data.devices['serviceId'],
  458. characteristicId: that.data.devices['characteristicId'],
  459. success: function (res) {
  460. console.log('readBLECharacteristicValue')
  461. }
  462. })
  463. },
  464. fail(res) {
  465. console.log('writeBLECharacteristicValue success', res.errMsg)
  466. }
  467. })
  468. count += 20;
  469. } else {
  470. let len = buffer.byteLength - count;
  471. let tmpBuff = new ArrayBuffer(len);
  472. let outView = new DataView(tmpBuff);
  473. for (let i = 0; i < len; i++) {
  474. outView.setUint8(i, inView.getUint8(count + i))
  475. }
  476. wx.writeBLECharacteristicValue({
  477. deviceId: that.data.devices['deviceId'],
  478. serviceId: that.data.devices['serviceId'],
  479. characteristicId: that.data.devices['characteristicId'],
  480. value: tmpBuff,
  481. success(res) {
  482. console.log('writeBLECharacteristicValue success', res.errMsg)
  483. wx.onBLECharacteristicValueChange((characteristic) => {
  484. console.log("read datagram==============", util.ab2hex(characteristic.value))
  485. var datagram = util.ab2hex(characteristic.value);
  486. that.pushDatagramBuff(datagram);
  487. })
  488. wx.readBLECharacteristicValue({
  489. deviceId: that.data.devices['deviceId'],
  490. serviceId: that.data.devices['serviceId'],
  491. characteristicId: that.data.devices['characteristicId'],
  492. success: function (res) {
  493. console.log('readBLECharacteristicValue')
  494. }
  495. })
  496. },
  497. fail(res) {
  498. console.log('writeBLECharacteristicValue success', res.errMsg)
  499. }
  500. })
  501. count += len;
  502. }
  503. if (count >= buffer.byteLength) {
  504. wx.readBLECharacteristicValue({
  505. deviceId: that.data.devices['deviceId'],
  506. serviceId: that.data.devices['serviceId'],
  507. characteristicId: that.data.devices['characteristicId'],
  508. success: function (res) {
  509. console.log('readBLECharacteristicValue')
  510. }
  511. })
  512. break;
  513. }
  514. }
  515. },
  516. timeCallback() {
  517. let that = this;
  518. task_timer = setTimeout(function () {
  519. console.log("------------------------------------Time CallBack----------------------------");
  520. if (that.data.trySendCount == 0) {
  521. console.log("index " + that.data.datagramIndex);
  522. let datagram = that.data.datagramCache[that.data.datagramIndex];
  523. that.sendDatagramToRtu(datagram);
  524. if (that.data.datagramCache.length == that.data.datagramIndex + 1) {
  525. that.setData({
  526. datagramIndex: 0,
  527. trySendCount: 1
  528. })
  529. } else {
  530. that.setData({
  531. datagramIndex: that.data.datagramIndex + 1,
  532. trySendCount: 1
  533. })
  534. }
  535. } else {
  536. let count = that.data.trySendCount + 1;
  537. if (count >= 4) {
  538. count = 0;
  539. }
  540. that.setData({
  541. trySendCount: count
  542. })
  543. }
  544. that.timeCallback();
  545. }, 3000);
  546. },
  547. cancelTime() {
  548. if (task_timer != undefined) {
  549. clearTimeout(task_timer);
  550. task_timer = undefined;
  551. }
  552. this.setData({
  553. datagramIndex: 0,
  554. trySendCount: 0
  555. })
  556. }
  557. })