datagramHelp.js 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  1. /*
  2. * A JavaScript implementation of the datagram create and analyse
  3. */
  4. var util = require('../utils/util.js');
  5. var crc16 = require('../utils/crc16.js');
  6. function crcCheck(datagram) {
  7. if (datagram.length > 4) {
  8. let content = datagram.substring(0, datagram.length - 4);
  9. let crcCode = datagram.substring(datagram.length - 4);
  10. crcCode = "" + crcCode.toLowerCase();
  11. let crc = crc16.hexStrToCrc16(content)
  12. crc = "" + crc.toLowerCase();
  13. if (crcCode === crc) {
  14. return true;
  15. } else {
  16. console.log("------------------------------------crc check error!----------------------------");
  17. console.log("crc code:" + crcCode + " " + crc);
  18. console.log(datagram);
  19. return false;
  20. }
  21. } else {
  22. console.log("------------------------------------crc check error!----------------------------");
  23. console.log(datagram);
  24. return false;
  25. }
  26. }
  27. /**
  28. * F6报文 ,与设备进行握手通信
  29. */
  30. function datagram_f6() {
  31. var datagram = "7E7E0000000000910000F680000205F728";
  32. return datagram;
  33. }
  34. /**
  35. * F6 报文,报文解析
  36. */
  37. function datagram_f6_analyse(datagram) {
  38. if (datagram.length > 0) {
  39. if (datagram.indexOf("7e7e") >= 0) {
  40. if (datagram.length >= 50) {
  41. var funcode = datagram.substring(20, 22);
  42. if (funcode == 'f6') {
  43. var data = {}
  44. data['func'] = 'f6'
  45. return data;
  46. }
  47. }
  48. }
  49. }
  50. return null;
  51. }
  52. /**
  53. * 查询设备状态
  54. */
  55. function datagram_f7() {
  56. var datagram = "7E7E0000000000910000F7800002053715";
  57. return datagram;
  58. }
  59. function datagram_f7_analyse(datagram) {
  60. console.log("------------------------------------find f7 datagram----------------------------");
  61. console.log(datagram);
  62. var tmprtuInfo = {
  63. datagram_idx: '',
  64. collect_time: '',
  65. acc_rain: '',
  66. fiveMinute_rain: '',
  67. hour_rain: '',
  68. weater_level: '',
  69. power_v: '',
  70. rtu_ver: '',
  71. rtu_uuid: '',
  72. bt_v: '',
  73. rtu_rssi: '',
  74. rtu_temperature: '',
  75. lua_ver: '',
  76. func: 'f7'
  77. }
  78. var count = 20;
  79. var funcode = datagram.substring(count, count + 2);
  80. count += 2;
  81. //上行标识及长度
  82. var len = datagram.substring(count, count + 4);
  83. count += 4;
  84. //起始符
  85. var s = datagram.substring(count, count + 2);
  86. count += 2;
  87. //流水号
  88. var idx = datagram.substring(count, count + 4);
  89. var idx_buff = util.HexStr2Bytes(idx);
  90. var idx_v = util.getView(idx_buff).getUint16();
  91. tmprtuInfo['datagram_idx'] = idx_v.toString();
  92. count += 4;
  93. //时间
  94. var collect_time = datagram.substring(count, count + 12);
  95. tmprtuInfo['collect_time'] = "20" + collect_time.substring(0, 2) + "-" + collect_time.substring(2, 4) + "-" + collect_time.substring(4, 6) + " " + collect_time.substring(6, 8) + ":" + collect_time.substring(8, 10) + ":" + collect_time.substring(10, 12);
  96. count += 12;
  97. while (true) {
  98. if (count >= (datagram.length - 3 * 2)) {
  99. break
  100. }
  101. var value_code = datagram.substring(count, count + 2);
  102. count += 2;
  103. if (value_code == 'ff') {
  104. value_code = datagram.substring(count, count + 2);
  105. count += 2;
  106. var value_len = datagram.substring(count, count + 2);
  107. count += 2;
  108. let len_buff = util.HexStr2Bytes(value_len);
  109. let len_v = util.getView(len_buff).getUint8();
  110. len_v = len_v >> 3;
  111. console.log("func ff" + value_code);
  112. if (value_code == '80') {
  113. //RTU版本
  114. var value = datagram.substring(count, count + len_v * 2);
  115. var v_buff = util.HexStr2Bytes(value);
  116. var v = util.byteToString(v_buff);
  117. tmprtuInfo['rtu_ver'] = v;
  118. //count += 36;
  119. count += len_v * 2;
  120. } else if (value_code == '81') {
  121. //唯一识别码UID
  122. var value = datagram.substring(count, count + len_v * 2);
  123. var v_buff = util.HexStr2Bytes(value);
  124. var v = util.byteToString(v_buff);
  125. tmprtuInfo['rtu_uuid'] = v;
  126. // count += 18;
  127. count += len_v * 2;
  128. } else if (value_code == '50') {
  129. //信号强度
  130. var value = datagram.substring(count, count + 4);
  131. value = value.substring(0, 2) + "." + value.substring(2, 4);
  132. var v = parseFloat(value)
  133. tmprtuInfo['rtu_rssi'] = v.toFixed(2)
  134. console.log('50' + value + " " + v + " " + v.toFixed(2));
  135. count += 4;
  136. } else if (value_code == '51') {
  137. //电源电压
  138. var value = datagram.substring(count, count + 4);
  139. value = value.substring(0, 2) + "." + value.substring(2, 4);
  140. var v = parseFloat(value)
  141. tmprtuInfo['power_v'] = v.toFixed(2)
  142. count += 4;
  143. } else if (value_code == '52') {
  144. //设备温度
  145. var value = datagram.substring(count, count + 4);
  146. value = value.substring(0, 2) + "." + value.substring(2, 4);
  147. var v = parseFloat(value)
  148. tmprtuInfo['rtu_temperature'] = v.toFixed(2)
  149. count += 4;
  150. } else if (value_code == '82') {
  151. //LUA版本
  152. var value = datagram.substring(count, count + len_v * 2);
  153. var v_buff = util.HexStr2Bytes(value);
  154. var v = util.byteToString(v_buff);
  155. tmprtuInfo['lua_ver'] = v;
  156. //count += 18;
  157. count += len_v * 2;
  158. } else {
  159. console.log("func unknrow ff " + value_code);
  160. count += len_v * 2;
  161. }
  162. } else if (value_code == '26') {
  163. console.log("func " + value_code);
  164. var value_len = datagram.substring(count, count + 2);
  165. count += 2;
  166. //累计雨量
  167. var value = datagram.substring(count, count + 6);
  168. value = value.substring(0, 5) + "." + value.substring(5, 6);
  169. var v = parseFloat(value)
  170. tmprtuInfo['acc_rain'] = v.toFixed(1)
  171. count += 6;
  172. } else if (value_code == '39') {
  173. console.log("func " + value_code);
  174. var value_len = datagram.substring(count, count + 2);
  175. count += 2;
  176. //瞬时水位
  177. var value = datagram.substring(count, count + 2);
  178. var sig = "";
  179. if (value == 'ff') {
  180. count += 2;
  181. var value = datagram.substring(count, count + 8);
  182. sig = "-";
  183. } else {
  184. var value = datagram.substring(count, count + 8);
  185. }
  186. value = sig + value.substring(0, 5) + "." + value.substring(5, 8);
  187. var v = parseFloat(value)
  188. tmprtuInfo['weater_level'] = v.toFixed(3)
  189. count += 8;
  190. } else if (value_code == '38') {
  191. console.log("func " + value_code);
  192. var value_len = datagram.substring(count, count + 2);
  193. count += 2;
  194. //电池电压
  195. var value = datagram.substring(count, count + 4);
  196. value = value.substring(0, 2) + "." + value.substring(2, 4);
  197. var v = parseFloat(value)
  198. tmprtuInfo['bt_v'] = v.toFixed(2)
  199. count += 4;
  200. } else {
  201. console.log("func unknrow " + value_code);
  202. var value_len = datagram.substring(count, count + 2);
  203. count += 2;
  204. let len_buff = util.HexStr2Bytes(value_len);
  205. let len_v = util.getView(len_buff).getUint8();
  206. len_v = len_v >> 3;
  207. count += len_v * 2;
  208. }
  209. }
  210. return tmprtuInfo;
  211. }
  212. /**
  213. * 查询版本号
  214. */
  215. function datagram_45() {
  216. var tsStr = util.datagramTime();
  217. var rtuCode = "0000000000";
  218. var message = "7E7E" + rtuCode;
  219. var funcCode = "45";
  220. message = message + "91" + "0000" + funcCode + "8008" + "02" + "0000" + tsStr + "05";
  221. var crc = crc16.hexStrToCrc16(message)
  222. message += crc;
  223. // message = "7E7E0000000001910000458008020000210428102601053B0E";
  224. return message;
  225. }
  226. function datagram_45_analyse(datagram) {
  227. if (datagram.length > 0) {
  228. if (datagram.indexOf("7e7e") >= 0) {
  229. var count = 20;
  230. var funcode = datagram.substring(count, count + 2);
  231. count += 2;
  232. if (funcode == '45') {
  233. console.log("------------------------------------find 45 datagram----------------------------");
  234. var tmprtuInfo = {
  235. datagram_idx: '',
  236. collect_time: '',
  237. rtu_ver: '',
  238. func: '45'
  239. }
  240. //上行标识及长度
  241. var len = datagram.substring(count, count + 4);
  242. count += 4;
  243. //起始符
  244. var s = datagram.substring(count, count + 2);
  245. count += 2;
  246. //流水号
  247. var idx = datagram.substring(count, count + 4);
  248. var idx_buff = util.HexStr2Bytes(idx);
  249. var idx_v = util.getView(idx_buff).getUint16();
  250. tmprtuInfo['datagram_idx'] = idx_v.toString();
  251. count += 4;
  252. //时间
  253. var collect_time = datagram.substring(count, count + 12);
  254. tmprtuInfo['collect_time'] = "20" + collect_time.substring(0, 2) + "-" + collect_time.substring(2, 4) + "-" + collect_time.substring(4, 6) + " " + collect_time.substring(6, 8) + ":" + collect_time.substring(8, 10) + ":" + collect_time.substring(10, 12);
  255. count += 12;
  256. //地址标识符
  257. count += 4;
  258. //遥测站地址
  259. count += 10;
  260. //长度
  261. var lenBuff = util.HexStr2Bytes(datagram.substring(count, count + 2));
  262. let dataView = new DataView(lenBuff);
  263. var len = dataView.getUint8(0);
  264. count += 2;
  265. var verBuff = util.HexStr2Bytes(datagram.substring(count, count + len * 2));
  266. var ver = util.byteToString(verBuff);
  267. tmprtuInfo['rtu_ver'] = ver;
  268. return tmprtuInfo;
  269. }
  270. }
  271. }
  272. return null;
  273. }
  274. /**
  275. * 设备存储重置
  276. */
  277. function datagram_47() {
  278. var tsStr = util.datagramTime();
  279. var rtuCode = "0000000000";
  280. var message = "7E7E" + rtuCode;
  281. var funcCode = "47";
  282. message = message + "91" + "0000" + funcCode + "800A" + "02" + "0000" + tsStr + "97" + "00" + "05";
  283. var crc = crc16.hexStrToCrc16(message)
  284. message += crc;
  285. return message;
  286. }
  287. /**
  288. * 设备存储设置回包
  289. */
  290. function datagram_47_analyse(datagram) {
  291. if (datagram.length > 0) {
  292. if (datagram.indexOf("7e7e") >= 0) {
  293. var count = 20;
  294. var funcode = datagram.substring(count, count + 2);
  295. count += 2;
  296. if (funcode == '47') {
  297. console.log("------------------------------------find 47 datagram----------------------------");
  298. var tmprtuInfo = {
  299. datagram_idx: '',
  300. collect_time: '',
  301. func: '47'
  302. }
  303. return tmprtuInfo;
  304. }
  305. }
  306. }
  307. return null;
  308. }
  309. /**
  310. * 恢复出厂
  311. */
  312. function datagram_48() {
  313. var tsStr = util.datagramTime();
  314. var rtuCode = "0000000000";
  315. var message = "7E7E" + rtuCode;
  316. var funcCode = "48";
  317. message = message + "91" + "0000" + funcCode + "800A" + "02" + "0000" + tsStr + "98" + "00" + "05";
  318. var crc = crc16.hexStrToCrc16(message)
  319. message += crc;
  320. return message;
  321. }
  322. function datagram_48_analyse(datagram) {
  323. if (datagram.length > 0) {
  324. if (datagram.indexOf("7e7e") >= 0) {
  325. var count = 20;
  326. var funcode = datagram.substring(count, count + 2);
  327. count += 2;
  328. if (funcode == '48') {
  329. console.log("------------------------------------find 48 datagram----------------------------");
  330. var tmprtuInfo = {
  331. datagram_idx: '',
  332. collect_time: '',
  333. func: '48'
  334. }
  335. return tmprtuInfo;
  336. }
  337. }
  338. }
  339. return null;
  340. }
  341. /**
  342. * 查询基本参数报文
  343. */
  344. function datagram_41() {
  345. let tsStr = util.datagramTime();
  346. let rtuCode = "0000000000";
  347. let content = "0250" + "0450" + "0650" + "0850" + "0A50" + "3450" + "3550" + "3650" + "3750" + "3008" + "3108" + "3808";
  348. let datagram = "7E7E";
  349. datagram += rtuCode;
  350. datagram += "01";
  351. datagram += "0000";
  352. datagram += "41";
  353. //报文长度
  354. let len = content.length / 2 + 2 + 6;
  355. let lenHex = util.shortToHexStr(len);
  356. datagram += "8" + lenHex.substring(1, 4);
  357. //起始符
  358. datagram += "02";
  359. //流水号
  360. datagram += "0001";
  361. //发报时间
  362. datagram += tsStr;
  363. //消息体
  364. datagram += content;
  365. //结束符
  366. datagram += "05";
  367. var crc = crc16.hexStrToCrc16(datagram)
  368. datagram += crc;
  369. return datagram;
  370. }
  371. /**
  372. * 查询基本参数
  373. * @param {} datagram
  374. */
  375. function datagram_41_analyse(datagram) {
  376. if (datagram.length > 0) {
  377. if (datagram.indexOf("7e7e") >= 0) {
  378. var count = 20;
  379. var funcode = datagram.substring(count, count + 2);
  380. count += 2;
  381. if (funcode == '41') {
  382. console.log("------------------------------------find 41 datagram----------------------------");
  383. var tmprtuInfo = {
  384. datagram_idx: '',
  385. collect_time: '',
  386. func: '41',
  387. rtu_code: '',
  388. ip1: '',
  389. ip1_port: '',
  390. ip2: '',
  391. ip2_port: '',
  392. ip3: '',
  393. ip3_port: '',
  394. ip4: '',
  395. ip4_port: '',
  396. net_model: '',
  397. collect_setting: {},
  398. workModel: '',
  399. rtuKind: '',
  400. ipV6Checked1: false,
  401. ipV6Checked2: false,
  402. ipV6Checked3: false,
  403. ipV6Checked4: false,
  404. net_model: '00',
  405. }
  406. //上行标识及长度
  407. var len = datagram.substring(count, count + 4);
  408. count += 4;
  409. //起始符
  410. var s = datagram.substring(count, count + 2);
  411. count += 2;
  412. //流水号
  413. var idx = datagram.substring(count, count + 4);
  414. var idx_buff = util.HexStr2Bytes(idx);
  415. var idx_v = util.getView(idx_buff).getUint16();
  416. tmprtuInfo['datagram_idx'] = idx_v.toString();
  417. count += 4;
  418. //时间
  419. var collect_time = datagram.substring(count, count + 12);
  420. tmprtuInfo['collect_time'] = "20" + collect_time.substring(0, 2) + "-" + collect_time.substring(2, 4) + "-" + collect_time.substring(4, 6) + " " + collect_time.substring(6, 8) + ":" + collect_time.substring(8, 10) + ":" + collect_time.substring(10, 12);
  421. count += 12;
  422. //地址标识符
  423. count += 4;
  424. //遥测站地址
  425. count += 10;
  426. let content = datagram.substring(count, datagram.length - 3 * 2);
  427. let index = 0;
  428. while (true) {
  429. if (index >= content.length) {
  430. break;
  431. }
  432. let flagCode = content.substring(index, index + 2);
  433. index += 2;
  434. let lenStr = content.substring(index, index + 2);
  435. let len = util.hexStrToInt(lenStr, 8);
  436. let dataTotalLen = len >> 3;
  437. let decimalLen = len & 7;
  438. index += 2;
  439. if (flagCode == "01") {
  440. let value = content.substring(index, index + dataTotalLen * 2);
  441. index += dataTotalLen * 2;
  442. } else if (flagCode == "02") {
  443. let value = content.substring(index, index + dataTotalLen * 2);
  444. index += dataTotalLen * 2;
  445. tmprtuInfo['rtu_code'] = value;
  446. } else if (flagCode == "03") {
  447. let value = content.substring(index, index + dataTotalLen * 2);
  448. index += dataTotalLen * 2;
  449. } else if (flagCode == "34") {
  450. dataTotalLen = 41;
  451. let value = content.substring(index, index + dataTotalLen * 2);
  452. index += dataTotalLen * 2;
  453. let ip = value.substring(0, 78);
  454. let ipByte = util.HexStr2Bytes(ip);
  455. let ipString = util.byteToString(ipByte);
  456. let port = parseInt(value.substring(78, 82), 16);
  457. if (port > 0) {
  458. tmprtuInfo['ip1'] = ipString;
  459. tmprtuInfo['ip1_port'] = "" + port;
  460. tmprtuInfo['ipV6Checked1'] = true;
  461. }
  462. } else if (flagCode == "35") {
  463. dataTotalLen = 41;
  464. let value = content.substring(index, index + dataTotalLen * 2);
  465. index += dataTotalLen * 2;
  466. let ip = value.substring(0, 78);
  467. let ipByte = util.HexStr2Bytes(ip);
  468. let ipString = util.byteToString(ipByte);
  469. let port = parseInt(value.substring(78, 82), 16);
  470. if (port > 0) {
  471. tmprtuInfo['ip2'] = ipString;
  472. tmprtuInfo['ip2_port'] = "" + port;
  473. tmprtuInfo['ipV6Checked2'] = true;
  474. }
  475. } else if (flagCode == "36") {
  476. dataTotalLen = 41;
  477. let value = content.substring(index, index + dataTotalLen * 2);
  478. index += dataTotalLen * 2;
  479. let ip = value.substring(0, 78);
  480. let ipByte = util.HexStr2Bytes(ip);
  481. let ipString = util.byteToString(ipByte);
  482. let port = parseInt(value.substring(78, 82), 16);
  483. if (port > 0) {
  484. tmprtuInfo['ip3'] = ipString;
  485. tmprtuInfo['ip3_port'] = "" + port;
  486. tmprtuInfo['ipV6Checked3'] = true;
  487. }
  488. } else if (flagCode == "37") {
  489. dataTotalLen = 41;
  490. let value = content.substring(index, index + dataTotalLen * 2);
  491. index += dataTotalLen * 2;
  492. let ip = value.substring(0, 78);
  493. let ipByte = util.HexStr2Bytes(ip);
  494. let ipString = util.byteToString(ipByte);
  495. let port = parseInt(value.substring(78, 82), 16);
  496. if (port > 0) {
  497. tmprtuInfo['ip4'] = ipString;
  498. tmprtuInfo['ip4_port'] = "" + port;
  499. tmprtuInfo['ipV6Checked4'] = true;
  500. }
  501. } else if (flagCode == "38") {
  502. let value = content.substring(index, index + dataTotalLen * 2);
  503. tmprtuInfo['net_model'] = value;
  504. index += dataTotalLen * 2;
  505. } else if (flagCode == "04") {
  506. let value = content.substring(index, index + dataTotalLen * 2);
  507. index += dataTotalLen * 2;
  508. if (dataTotalLen == 10 && value.indexOf("00") != 0) {
  509. let ip = util.toIp(value.substring(2, 14));
  510. let port = "" + parseInt(value.substring(14, 20), 10);
  511. tmprtuInfo['ip1'] = ip;
  512. tmprtuInfo['ip1_port'] = port;
  513. }
  514. } else if (flagCode == "05") {
  515. let value = content.substring(index, index + dataTotalLen * 2);
  516. index += dataTotalLen * 2;
  517. } else if (flagCode == "06") {
  518. let value = content.substring(index, index + dataTotalLen * 2);
  519. index += dataTotalLen * 2;
  520. if (dataTotalLen == 10 && value.indexOf("00") != 0) {
  521. let ip = util.toIp(value.substring(2, 14));
  522. let port = "" + parseInt(value.substring(14, 20), 10);
  523. tmprtuInfo['ip2'] = ip;
  524. tmprtuInfo['ip2_port'] = port;
  525. }
  526. } else if (flagCode == "07") {
  527. let value = content.substring(index, index + dataTotalLen * 2);
  528. index += dataTotalLen * 2;
  529. } else if (flagCode == "08") {
  530. let value = content.substring(index, index + dataTotalLen * 2);
  531. index += dataTotalLen * 2;
  532. if (dataTotalLen == 10 && value.indexOf("00") != 0) {
  533. let ip = util.toIp(value.substring(2, 14));
  534. let port = "" + parseInt(value.substring(14, 20), 10);
  535. tmprtuInfo['ip3'] = ip;
  536. tmprtuInfo['ip3_port'] = port;
  537. }
  538. } else if (flagCode == "09") {
  539. let value = content.substring(index, index + dataTotalLen * 2);
  540. index += dataTotalLen * 2;
  541. } else if (flagCode == "0A") {
  542. let value = content.substring(index, index + dataTotalLen * 2);
  543. index += dataTotalLen * 2;
  544. if (dataTotalLen == 10 && value.indexOf("00") != 0) {
  545. let ip = util.toIp(value.substring(2, 14));
  546. let port = "" + parseInt(value.substring(14, 20), 10);
  547. tmprtuInfo['ip4'] = ip;
  548. tmprtuInfo['ip4_port'] = port;
  549. }
  550. } else if (flagCode == "0B") {
  551. let value = content.substring(index, index + dataTotalLen * 2);
  552. index += dataTotalLen * 2;
  553. } else if (flagCode == "0C") {
  554. let value = content.substring(index, index + dataTotalLen * 2);
  555. index += dataTotalLen * 2;
  556. } else if (flagCode == "0D") {
  557. let value = content.substring(index, index + dataTotalLen * 2);
  558. index += dataTotalLen * 2;
  559. if (value.length == 8) {
  560. let data = {};
  561. tmprtuInfo['collect_setting'] = data;
  562. }
  563. } else if (flagCode == "0E") {
  564. let value = content.substring(index, index + dataTotalLen * 2);
  565. index += dataTotalLen * 2;
  566. } else if (flagCode == "0F") {
  567. let value = content.substring(index, index + dataTotalLen * 2);
  568. index += dataTotalLen * 2;
  569. } else if (flagCode == "30") {
  570. let value = content.substring(index, index + dataTotalLen * 2);
  571. index += dataTotalLen * 2;
  572. let m = parseInt(value, 10);
  573. if (m == 0) {
  574. tmprtuInfo['rtu_work_model'] = "0";
  575. } else {
  576. tmprtuInfo['rtu_work_model'] = "1";
  577. }
  578. } else if (flagCode == "31") {
  579. let value = content.substring(index, index + dataTotalLen * 2);
  580. index += dataTotalLen * 2;
  581. let k = util.hexStrToInt(value, 8);
  582. if (k == 0x50) {
  583. tmprtuInfo["rtu_kind"] = "P";
  584. } else if (k == 0x50) {
  585. tmprtuInfo["rtu_kind"] = "H";
  586. } else if (k == 0x48) {
  587. tmprtuInfo["rtu_kind"] = "H";
  588. } else if (k == 0x4B) {
  589. tmprtuInfo["rtu_kind"] = "K";
  590. } else if (k == 0x5A) {
  591. tmprtuInfo["rtu_kind"] = "Z";
  592. } else if (k == 0x44) {
  593. tmprtuInfo["rtu_kind"] = "D";
  594. } else if (k == 0x54) {
  595. tmprtuInfo["rtu_kind"] = "T";
  596. } else if (k == 0x4D) {
  597. tmprtuInfo["rtu_kind"] = "M";
  598. } else if (k == 0x47) {
  599. tmprtuInfo["rtu_kind"] = "G";
  600. } else if (k == 0x51) {
  601. tmprtuInfo["rtu_kind"] = "Q";
  602. } else if (k == 0x49) {
  603. tmprtuInfo["rtu_kind"] = "I";
  604. } else if (k == 0x4F) {
  605. tmprtuInfo["rtu_kind"] = "O";
  606. }
  607. } else {
  608. let value = content.substring(index, index + dataTotalLen * 2);
  609. index += dataTotalLen * 2;
  610. }
  611. }
  612. return tmprtuInfo;
  613. }
  614. }
  615. }
  616. return null;
  617. }
  618. /**
  619. * 设置基本参数报文
  620. */
  621. function datagram_40(jsonData) {
  622. let dataContent = "";
  623. //测站编码
  624. let v = jsonData["rtu_code"];
  625. let buff = util.createBcdBytes("02", v);
  626. dataContent += buff;
  627. //IP地址1
  628. let ip = jsonData['ip1'];
  629. let port = jsonData['ip1_port'];
  630. if (jsonData['ipV6Checked1']) {
  631. if (ip != undefined && ip.length > 0 && port != undefined && port.length > 0) {
  632. buff = util.createIpV6Bytes("34", ip, port);
  633. dataContent += buff;
  634. } else {
  635. // ip = "0000:0000:0000:0000:0000:0000:0000:0000";
  636. // port = "000000";
  637. }
  638. // buff = util.createIpV6Bytes("34", ip, port);
  639. // dataContent += buff;
  640. } else {
  641. if (ip != undefined && ip.length > 0 && port != undefined && port.length > 0) {
  642. v = ip + ":" + port;
  643. } else {
  644. v = "000.000.000.000:000000";
  645. }
  646. buff = util.createIpBytes("04", v);
  647. dataContent += buff;
  648. }
  649. //IP地址2
  650. ip = jsonData['ip2'];
  651. port = jsonData['ip2_port'];
  652. if (jsonData['ipV6Checked2']) {
  653. if (ip != undefined && ip.length > 0 && port != undefined && port.length > 0) {
  654. buff = util.createIpV6Bytes("35", ip, port);
  655. dataContent += buff;
  656. } else {
  657. // ip = "0000:0000:0000:0000:0000:0000:0000:0000";
  658. // port = "000000";
  659. }
  660. // buff = util.createIpV6Bytes("35", ip, port);
  661. // dataContent += buff;
  662. } else {
  663. if (ip != undefined && ip.length > 0 && port != undefined && port.length > 0) {
  664. v = ip + ":" + port;
  665. } else {
  666. v = "000.000.000.000:000000";
  667. }
  668. buff = util.createIpBytes("06", v);
  669. dataContent += buff;
  670. }
  671. //IP地址3
  672. ip = jsonData['ip3'];
  673. port = jsonData['ip3_port'];
  674. if (jsonData['ipV6Checked3']) {
  675. if (ip != undefined && ip.length > 0 && port != undefined && port.length > 0) {
  676. buff = util.createIpV6Bytes("36", ip, port);
  677. dataContent += buff;
  678. } else {
  679. // ip = "0000:0000:0000:0000:0000:0000:0000:0000";
  680. // port = "000000";
  681. }
  682. // buff = util.createIpV6Bytes("36", ip, port);
  683. // dataContent += buff;
  684. } else {
  685. if (ip != undefined && ip.length > 0 && port != undefined && port.length > 0) {
  686. v = ip + ":" + port;
  687. } else {
  688. v = "000.000.000.000:000000";
  689. }
  690. buff = util.createIpBytes("08", v);
  691. dataContent += buff;
  692. }
  693. //IP地址4
  694. ip = jsonData['ip4'];
  695. port = jsonData['ip4_port'];
  696. if (jsonData['ipV6Checked4']) {
  697. if (ip != undefined && ip.length > 0 && port != undefined && port.length > 0) {
  698. buff = util.createIpV6Bytes("37", ip, port);
  699. dataContent += buff;
  700. } else {
  701. // ip = "0000:0000:0000:0000:0000:0000:0000:0000";
  702. // port = "000000";
  703. }
  704. // buff = util.createIpV6Bytes("37", ip, port);
  705. // dataContent += buff;
  706. } else {
  707. if (ip != undefined && ip.length > 0 && port != undefined && port.length > 0) {
  708. v = ip + ":" + port;
  709. } else {
  710. v = "000.000.000.000:000000";
  711. }
  712. buff = util.createIpBytes("0A", v);
  713. dataContent += buff;
  714. }
  715. dataContent += "3808" + jsonData['netModel'];
  716. // if (jsonData['ipV6Checked1'] || jsonData['ipV6Checked2'] || jsonData['ipV6Checked3'] || jsonData['ipV6Checked4']) {
  717. // dataContent += "380804";
  718. // } else {
  719. // dataContent += "380800";
  720. // }
  721. //工作模式
  722. dataContent += "3008";
  723. v = jsonData["rtu_work_model"];
  724. if (v == "0") {
  725. dataContent += "00";
  726. } else if (v == "1") {
  727. dataContent += "01";
  728. }
  729. //测站类型
  730. dataContent += "3108";
  731. v = jsonData["rtu_kind"];
  732. if (v == "P" || v == "p") {
  733. dataContent += "50";
  734. } else if (v == "H" || v == "h") {
  735. dataContent += "48";
  736. } else if (v == "K" || v == "k") {
  737. dataContent += "4B";
  738. } else if (v == "Z" || v == "z") {
  739. dataContent += "5A";
  740. } else if (v == "D" || v == "d") {
  741. dataContent += "44";
  742. } else if (v == "T" || v == "t") {
  743. dataContent += "54";
  744. } else if (v == "M" || v == "m") {
  745. dataContent += "4D";
  746. } else if (v == "G" || v == "g") {
  747. dataContent += "47";
  748. } else if (v == "Q" || v == "q") {
  749. dataContent += "51";
  750. } else if (v == "I" || v == "i") {
  751. dataContent += "49";
  752. } else if (v == "O" || v == "o") {
  753. dataContent += "4F";
  754. }
  755. let rtuCode = "0000000000";
  756. let tsStr = util.datagramTime();
  757. let datagram = "7E7E";
  758. datagram += rtuCode;
  759. datagram += "01";
  760. datagram += "0000";
  761. datagram += "40";
  762. //报文长度
  763. let len = dataContent.length / 2 + 2 + 6;
  764. let lenHex = util.shortToHexStr(len);
  765. datagram += "8" + lenHex.substring(1, 4);
  766. datagram += "02"; //起始符
  767. datagram += "0001"; //流水号
  768. datagram += tsStr; //发报时间
  769. datagram += dataContent;
  770. //结束符
  771. datagram += "05";
  772. var crc = crc16.hexStrToCrc16(datagram)
  773. datagram += crc;
  774. return datagram;
  775. }
  776. function datagram_40_analyse(datagram) {
  777. if (datagram.length > 0) {
  778. if (datagram.indexOf("7e7e") >= 0) {
  779. var count = 20;
  780. var funcode = datagram.substring(count, count + 2);
  781. count += 2;
  782. if (funcode == '40') {
  783. console.log("------------------------------------find 40 datagram----------------------------");
  784. var tmprtuInfo = {
  785. datagram_idx: '',
  786. collect_time: '',
  787. func: '40'
  788. }
  789. return tmprtuInfo;
  790. }
  791. }
  792. }
  793. return null;
  794. }
  795. /**
  796. * 查询运行参数报文
  797. */
  798. function datagram_43() {
  799. let tsStr = util.datagramTime();
  800. let content = "2010" + "2110" + "2509" + "ff0108" + "ff0208" + "ff0310" + "ff0408" + "ff0508" + "ff0613" + "2210" + "2320" + "2410" + "2708" + "283B" + "302B" + "3810" + "4010" + "4110" + "4210" + "4310" + "4410" + "ff0723" + "ff0823" + "ff0923" + "ff0a23" + "ff0b23" + "ff0c23" + "ff0d23" + "ff0e23" + "ff0f23" + "ff1123" + "ff1223";
  801. let rtuCode = "0000000000";
  802. let datagram = "7E7E";
  803. datagram += rtuCode;
  804. datagram += "01";
  805. datagram += "0000";
  806. datagram += "43";
  807. //报文长度
  808. let len = content.length / 2 + 2 + 6;
  809. let lenHex = util.shortToHexStr(len);
  810. datagram += "8" + lenHex.substring(1, 4);
  811. datagram += "02"; //起始符
  812. datagram += "0001"; //流水号
  813. datagram += tsStr; //发报时间
  814. datagram += content;
  815. //结束符
  816. datagram += "05";
  817. var crc = crc16.hexStrToCrc16(datagram)
  818. datagram += crc;
  819. return datagram;
  820. }
  821. function datagram_43_analyse(datagram) {
  822. if (datagram.length > 0) {
  823. if (datagram.indexOf("7e7e") >= 0) {
  824. var count = 20;
  825. var funcode = datagram.substring(count, count + 2);
  826. count += 2;
  827. if (funcode == '43') {
  828. console.log("------------------------------------find 43 datagram----------------------------");
  829. var tmprtuInfo = {
  830. datagram_idx: '',
  831. collect_time: '',
  832. func: '43'
  833. }
  834. //上行标识及长度
  835. var len = datagram.substring(count, count + 4);
  836. count += 4;
  837. //起始符
  838. var s = datagram.substring(count, count + 2);
  839. count += 2;
  840. //流水号
  841. var idx = datagram.substring(count, count + 4);
  842. var idx_buff = util.HexStr2Bytes(idx);
  843. var idx_v = util.getView(idx_buff).getUint16();
  844. tmprtuInfo['datagram_idx'] = idx_v.toString();
  845. count += 4;
  846. //时间
  847. var collect_time = datagram.substring(count, count + 12);
  848. tmprtuInfo['collect_time'] = "20" + collect_time.substring(0, 2) + "-" + collect_time.substring(2, 4) + "-" + collect_time.substring(4, 6) + " " + collect_time.substring(6, 8) + ":" + collect_time.substring(8, 10) + ":" + collect_time.substring(10, 12);
  849. count += 12;
  850. //地址标识符
  851. count += 4;
  852. //遥测站地址
  853. count += 10;
  854. let content = datagram.substring(count, datagram.length - 3 * 2);
  855. let index = 0;
  856. while (true) {
  857. if (index >= content.length) {
  858. break;
  859. }
  860. let flagCode = content.substring(index, index + 2);
  861. index += 2;
  862. if (flagCode == "FF" || flagCode == "ff") {
  863. flagCode += content.substring(index, index + 2);
  864. index += 2;
  865. }
  866. let lenStr = content.substring(index, index + 2);
  867. let len = util.hexStrToInt(lenStr, 8);
  868. let dataTotalLen = len >> 3;
  869. let decimalLen = len & 7;
  870. index += 2;
  871. let value = content.substring(index, index + dataTotalLen * 2);
  872. index += dataTotalLen * 2;
  873. if (flagCode == "20") {
  874. //定时报时间间隔
  875. tmprtuInfo['intervalTime'] = "" + util.getBcdValue(value, decimalLen);
  876. } else if (flagCode == "21") {
  877. //加报时间间隔
  878. tmprtuInfo['addIntervalTime'] = "" + util.getBcdValue(value, decimalLen);
  879. } else if (flagCode == "28") {
  880. //水位基值1
  881. let dec = "" + util.getBcdValue(value, decimalLen);
  882. tmprtuInfo['water_level_base_point'] = dec;
  883. } else if (flagCode == "30") {
  884. //水位修正基值1
  885. let dec = "" + util.getBcdValue(value, decimalLen);
  886. tmprtuInfo['water_level_correct_point'] = dec;
  887. } else if (flagCode == "25") {
  888. //雨量计分辨率
  889. let dec = "" + util.getBcdValue(value, decimalLen);
  890. tmprtuInfo['rain_precision'] = dec;
  891. } else if (flagCode == "27") {
  892. //雨量计加报阈值
  893. let dec = "" + util.getBcdValue(value, decimalLen);
  894. tmprtuInfo['rain_extra_datagram_threshold'] = dec;
  895. } else if (flagCode == "ff01") {
  896. //水位计协议
  897. let dec = "" + util.getHexValue(value);
  898. tmprtuInfo['water_se_agreement'] = dec;
  899. } else if (flagCode == "ff02") {
  900. //水位计id
  901. let dec = "" + util.getHexValue(value);
  902. tmprtuInfo['water_se_id'] = dec;
  903. } else if (flagCode == "ff03") {
  904. //水位计地址
  905. let dec = "" + value;
  906. tmprtuInfo['water_se_address'] = dec;
  907. } else if (flagCode == "ff04") {
  908. //水位计格式
  909. let dec = "" + util.getHexValue(value);
  910. tmprtuInfo['water_se_format'] = dec;
  911. } else if (flagCode == "ff05") {
  912. //水位计调整
  913. let dec = "" + util.getHexValue(value);
  914. tmprtuInfo['water_se_adjust'] = dec;
  915. } else if (flagCode == "ff06") {
  916. //水位计符号
  917. let dec = "" + util.getBcdValue(value, decimalLen);
  918. tmprtuInfo['water_se_symbol'] = dec;
  919. } else if (flagCode == "ff07") {
  920. //河道深
  921. let dec = "" + util.getBcdValue(value, decimalLen);
  922. tmprtuInfo['riverDeep'] = dec;
  923. } else if (flagCode == "ff08") {
  924. //河道宽
  925. let dec = "" + util.getBcdValue(value, decimalLen);
  926. tmprtuInfo['riverWide'] = dec;
  927. } else if (flagCode == "ff09") {
  928. //河道坡度
  929. let dec = "" + util.getBcdValue(value, decimalLen);
  930. tmprtuInfo['riverAngle'] = dec;
  931. } else if (flagCode == "ff0a") {
  932. //探头高
  933. let dec = "" + util.getBcdValue(value, decimalLen);
  934. tmprtuInfo['radarHigh'] = dec;
  935. } else if (flagCode == "ff0b") {
  936. //断面系数
  937. let dec = "" + util.getBcdValue(value, decimalLen);
  938. tmprtuInfo['faceCoe'] = dec;
  939. } else if (flagCode == "ff0c") {
  940. //流速系数
  941. let dec = "" + util.getBcdValue(value, decimalLen);
  942. tmprtuInfo['speedCoe'] = dec;
  943. } else if (flagCode == "ff0d") {
  944. //流量模型系数
  945. let dec = "" + util.getBcdValue(value, decimalLen);
  946. tmprtuInfo['flowModelCoe'] = dec;
  947. } else if (flagCode == "ff0e") {
  948. //水位计类型
  949. let dec = util.getHexValue(value);
  950. tmprtuInfo['waterLevelSensorKind'] = dec;
  951. } else if (flagCode == "ff0f") {
  952. //流量计类型
  953. let dec = util.getHexValue(value);
  954. tmprtuInfo['flowRateSensorKind'] = dec;
  955. } else if (flagCode == "ff11") {
  956. //流量计协议
  957. let dec = util.getHexValue(value);
  958. tmprtuInfo['flowRateSensorProtocolType'] = dec;
  959. } else if (flagCode == "ff12") {
  960. //流量计ID
  961. let dec = util.getHexValue(value);
  962. tmprtuInfo['flowRateSensorId'] = "" + dec;
  963. }
  964. }
  965. return tmprtuInfo;
  966. }
  967. }
  968. }
  969. return null;
  970. }
  971. /**
  972. * 设置运行参数报文
  973. */
  974. function datagram_42(jsonData) {
  975. console.log(" 42 ", JSON.stringify(jsonData))
  976. let dataContent = "";
  977. //定时报时间间隔
  978. let v = jsonData["intervalTime"];
  979. if (v != null && v.length > 0) {
  980. let buff = util.createValueBytes("20", v, 0, 2);
  981. dataContent += buff;
  982. }
  983. //加报时间间隔
  984. v = jsonData["addIntervalTime"];
  985. if (v != null && v.length > 0) {
  986. let buff = util.createValueBytes("21", v, 0, 1);
  987. dataContent += buff;
  988. }
  989. //日降水量起始时间
  990. //if (jsonData.containsKey("rainTime")) {
  991. // v = jsonData["rainTime"];
  992. // buff = util.createValueBytes("22", v, 0, 1);
  993. // dataContent += buff;
  994. //}
  995. //采样间隔
  996. //if (jsonData.containsKey("collectInterval")) {
  997. // let v = jsonData["collectInterval"];
  998. // let buff = util.createValueBytes("23", v, 0, 2);
  999. // dataContent += buff;
  1000. //}
  1001. //数据存储间隔
  1002. // if (jsonData.containsKey("dataSaveInterval")) {
  1003. // let v = jsonData["dataSaveInterval"];
  1004. // let buff = util.createValueBytes("24", v, 0, 1);
  1005. // dataContent += buff;
  1006. // }
  1007. //雨量加报阀值
  1008. // if (jsonData.containsKey("rainAddValue")) {
  1009. // let v = jsonData["rainAddValue"];
  1010. // let buff = util.createValueBytes("27", v, 0, 1);
  1011. // dataContent += buff;
  1012. // }
  1013. //水位基值
  1014. v = jsonData["water_level_base_point"];
  1015. if (v != null && v.length > 0) {
  1016. let buff = util.createValueBytes("28", v, 3, 4);
  1017. dataContent += buff;
  1018. }
  1019. //水位修正基值
  1020. v = jsonData["water_level_correct_point"];
  1021. if (v != null && v.length > 0) {
  1022. let buff = util.createValueBytes("30", v, 3, 4);
  1023. dataContent += buff;
  1024. }
  1025. //雨量计分辨率
  1026. v = jsonData["rain_precision"];
  1027. if (v != null && v.length > 0) {
  1028. let buff = util.createValueBytes("25", v, 0, 1);
  1029. dataContent += buff;
  1030. }
  1031. //雨量计加报阈值
  1032. v = jsonData["rain_extra_datagram_threshold"];
  1033. if (v != null && v.length > 0) {
  1034. let buff = util.createValueBytes("27", v, 0, 1);
  1035. dataContent += buff;
  1036. }
  1037. //水位计协议
  1038. v = jsonData["water_se_agreement"];
  1039. if (v != null && v.length > 0) {
  1040. let buff = util.createDecToValueBytes("FF01", v, 1);
  1041. dataContent += buff;
  1042. }
  1043. //水位计id
  1044. v = jsonData["water_se_id"];
  1045. if (v != null && v.length > 0) {
  1046. let buff = util.createDecToValueBytes("FF02", v, 1);
  1047. dataContent += buff;
  1048. }
  1049. //水位计地址
  1050. v = jsonData["water_se_address"];
  1051. if (v != null && v.length > 0) {
  1052. let buff = util.createHexToValueBytes("FF03", v, 2);
  1053. dataContent += buff;
  1054. }
  1055. //水位计格式
  1056. v = jsonData["water_se_format"];
  1057. if (v != null && v.length > 0) {
  1058. let buff = util.createDecToValueBytes("FF04", v, 1);
  1059. dataContent += buff;
  1060. }
  1061. //水位计调整
  1062. v = jsonData["water_se_adjust"];
  1063. if (v != null && v.length > 0) {
  1064. let buff = util.createDecToValueBytes("FF05", v, 1);
  1065. dataContent += buff;
  1066. }
  1067. //水位计符号
  1068. v = jsonData["water_se_symbol"];
  1069. if (v != null && v.length > 0) {
  1070. let buff = util.createValueBytes("FF06", v, 3, 2);
  1071. dataContent += buff;
  1072. }
  1073. //河道深
  1074. v = jsonData["riverDeep"];
  1075. if (v != null && v.length > 0) {
  1076. let buff = util.createValueBytes("FF07", v, 3, 4);
  1077. dataContent += buff;
  1078. }
  1079. //河道宽
  1080. v = jsonData["riverWide"];
  1081. if (v != null && v.length > 0) {
  1082. let buff = util.createValueBytes("FF08", v, 3, 4);
  1083. dataContent += buff;
  1084. }
  1085. //河道坡度
  1086. v = jsonData["riverAngle"];
  1087. if (v != null && v.length > 0) {
  1088. let buff = util.createValueBytes("FF09", v, 3, 4);
  1089. dataContent += buff;
  1090. }
  1091. //探头高
  1092. v = jsonData["radarHigh"];
  1093. if (v != null && v.length > 0) {
  1094. let buff = util.createValueBytes("FF0A", v, 3, 4);
  1095. dataContent += buff;
  1096. }
  1097. //断面系数
  1098. v = jsonData["faceCoe"];
  1099. if (v != null && v.length > 0) {
  1100. let buff = util.createValueBytes("FF0B", v, 3, 4);
  1101. dataContent += buff;
  1102. }
  1103. //流速系数
  1104. v = jsonData["speedCoe"];
  1105. if (v != null && v.length > 0) {
  1106. let buff = util.createValueBytes("FF0C", v, 3, 4);
  1107. dataContent += buff;
  1108. }
  1109. //流量模型系数
  1110. v = jsonData["flowModelCoe"];
  1111. if (v != null && v.length > 0) {
  1112. let buff = util.createValueBytes("FF0D", v, 3, 4);
  1113. dataContent += buff;
  1114. }
  1115. let waterLevelSensorKind = jsonData.waterLevelSensorKind;
  1116. for (let i = 0; i < 3; i++) {
  1117. if (waterLevelSensorKind[i].checked) {
  1118. let buff = util.createDecToValueBytes("FF0E", "" + i, 1);
  1119. dataContent += buff;
  1120. break;
  1121. }
  1122. }
  1123. let flowRateSensorKind = jsonData.flowRateSensorKind;
  1124. for (let i = 0; i < 3; i++) {
  1125. if (flowRateSensorKind[i].checked) {
  1126. let buff = util.createDecToValueBytes("FF0F", "" + i, 1);
  1127. dataContent += buff;
  1128. break;
  1129. }
  1130. }
  1131. let flowRateSensorProtocolType = jsonData.flowRateSensorProtocolType;
  1132. for (let i = 0; i < 15; i++) {
  1133. if (flowRateSensorProtocolType[i].checked) {
  1134. let buff = util.createDecToValueBytes("FF11", "" + i, 1);
  1135. dataContent += buff;
  1136. break;
  1137. }
  1138. }
  1139. let flowRateSensorId = jsonData.flowRateSensorId;
  1140. if (flowRateSensorId != null && flowRateSensorId.length > 0) {
  1141. let buff = util.createDecToValueBytes("FF12", flowRateSensorId, 1);
  1142. dataContent += buff;
  1143. }
  1144. //}
  1145. //加报水位
  1146. //if (jsonData.containsKey("addWaterLevel")) {
  1147. // let v = jsonData["addWaterLevel"];
  1148. // let buff = util.createValueBytes("38", v, 2, 2);
  1149. // dataContent += buff;
  1150. // }
  1151. //水位以上加报阀值
  1152. // if (jsonData.containsKey("addWaterUpValue")) {
  1153. // let v = jsonData["addWaterUpValue"];
  1154. // let buff = util.createValueBytes("40", v, 2, 2);
  1155. // dataContent += buff;
  1156. // }
  1157. //水位以下加报阀值
  1158. // if (jsonData.containsKey("addWaterDownValue")) {
  1159. // let v = jsonData["addWaterDownValue"];
  1160. // let buff = util.createValueBytes("41", v, 2, 2);
  1161. // dataContent += buff;
  1162. // }
  1163. //流量加报阀值
  1164. // if (jsonData.containsKey("flowValue")) {
  1165. // let v = jsonData["flowValue"];
  1166. // let buff = util.createValueBytes("42", v, 3, 3);
  1167. // dataContent += buff;
  1168. // }
  1169. //流速加报阀值
  1170. // if (jsonData.containsKey("flowSpeetValue")) {
  1171. // let v = jsonData["flowSpeetValue"];
  1172. // let buff = util.createValueBytes("43", v, 3, 3);
  1173. // dataContent += buff;
  1174. // }
  1175. //闸位加报阀值
  1176. // if (jsonData.containsKey("waterGateValue")) {
  1177. // let v = jsonData["waterGateValue"];
  1178. // let buff = BytesHelp.createValueBytes("44", v, 2, 2);
  1179. // dataContent += buff;
  1180. // }
  1181. let rtuCode = "0000000000";
  1182. let tsStr = util.datagramTime();
  1183. let datagram = "7E7E";
  1184. datagram += rtuCode;
  1185. datagram += "01";
  1186. datagram += "0000";
  1187. datagram += "42";
  1188. //报文长度
  1189. let len = dataContent.length / 2 + 2 + 6;
  1190. let lenHex = util.shortToHexStr(len);
  1191. datagram += "8" + lenHex.substring(1, 4);
  1192. datagram += "02"; //起始符
  1193. datagram += "0001"; //流水号
  1194. datagram += tsStr; //发报时间
  1195. datagram += dataContent;
  1196. //结束符
  1197. datagram += "05";
  1198. var crc = crc16.hexStrToCrc16(datagram)
  1199. datagram += crc;
  1200. return datagram;
  1201. // let datagram = "7E7E";
  1202. // datagram += "0000000000";
  1203. // datagram += "01";
  1204. // datagram += "0000";
  1205. // datagram += "42";
  1206. // //报文长度
  1207. // let len = dataContent.length / 2 + 2 + 6;
  1208. // let lenHex = util.shortToHexStr(len);
  1209. // datagram += "8" + lenHex.substring(1, 4);
  1210. // datagram += "02"; //起始符
  1211. // datagram += "0001"; //流水号
  1212. // let tsStr = util.datagramTime();
  1213. // datagram += tsStr; //发报时间
  1214. // datagram += dataContent;
  1215. // //结束符
  1216. // datagram += "05";
  1217. // var crc = crc16.hexStrToCrc16(datagram)
  1218. // datagram += crc;
  1219. // return datagram;
  1220. }
  1221. function datagram_42_analyse(datagram) {
  1222. if (datagram.length > 0) {
  1223. if (datagram.indexOf("7e7e") >= 0) {
  1224. var count = 20;
  1225. var funcode = datagram.substring(count, count + 2);
  1226. count += 2;
  1227. if (funcode == '42') {
  1228. console.log("------------------------------------find 42 datagram----------------------------");
  1229. var tmprtuInfo = {
  1230. datagram_idx: '',
  1231. collect_time: '',
  1232. func: '42'
  1233. }
  1234. return tmprtuInfo;
  1235. }
  1236. }
  1237. }
  1238. return null;
  1239. }
  1240. /**
  1241. * 设置时钟
  1242. */
  1243. function datagram_4A(clock) {
  1244. var tsStr = clock.substr(2, clock.length - 2);
  1245. var rtuCode = "0000000000";
  1246. var message = "7E7E" + rtuCode;
  1247. var funcCode = "4A";
  1248. message = message + "91" + "0000" + funcCode + "8008" + "02" + "0000" + tsStr + "05";
  1249. var crc = crc16.hexStrToCrc16(message)
  1250. message += crc;
  1251. return message;
  1252. }
  1253. function datagram_4A_analyse(datagram) {
  1254. if (datagram.length > 0) {
  1255. if (datagram.indexOf("7e7e") >= 0) {
  1256. var count = 20;
  1257. var funcode = datagram.substring(count, count + 2);
  1258. count += 2;
  1259. if (funcode == '4a') {
  1260. console.log("------------------------------------find 4a datagram----------------------------");
  1261. var tmprtuInfo = {
  1262. datagram_idx: '',
  1263. collect_time: '',
  1264. func: '4a'
  1265. }
  1266. return tmprtuInfo;
  1267. }
  1268. }
  1269. }
  1270. return null;
  1271. }
  1272. /**
  1273. * 查询时钟
  1274. */
  1275. function datagram_51() {
  1276. var tsStr = util.datagramTime();
  1277. var rtuCode = "0000000000";
  1278. var message = "7E7E" + rtuCode;
  1279. var funcCode = "51";
  1280. message = message + "91" + "0000" + funcCode + "8008" + "02" + "0000" + tsStr + "05";
  1281. var crc = crc16.hexStrToCrc16(message)
  1282. message += crc;
  1283. return message;
  1284. }
  1285. function datagram_51_analyse(datagram) {
  1286. if (datagram.length > 0) {
  1287. if (datagram.indexOf("7e7e") >= 0) {
  1288. var count = 20;
  1289. var funcode = datagram.substring(count, count + 2);
  1290. count += 2;
  1291. if (funcode == '51') {
  1292. console.log("------------------------------------find 51 datagram----------------------------");
  1293. var tmprtuInfo = {
  1294. datagram_idx: '',
  1295. collect_time: '',
  1296. func: '51'
  1297. }
  1298. //上行标识及长度
  1299. var len = datagram.substring(count, count + 4);
  1300. count += 4;
  1301. //起始符
  1302. var s = datagram.substring(count, count + 2);
  1303. count += 2;
  1304. //流水号
  1305. var idx = datagram.substring(count, count + 4);
  1306. var idx_buff = util.HexStr2Bytes(idx);
  1307. var idx_v = util.getView(idx_buff).getUint16();
  1308. tmprtuInfo['datagram_idx'] = idx_v.toString();
  1309. count += 4;
  1310. //时间
  1311. var collect_time = datagram.substring(count, count + 12);
  1312. tmprtuInfo['collect_time'] = "20" + collect_time.substring(0, 2) + "-" + collect_time.substring(2, 4) + "-" + collect_time.substring(4, 6) + " " + collect_time.substring(6, 8) + ":" + collect_time.substring(8, 10) + ":" + collect_time.substring(10, 12);
  1313. count += 12;
  1314. //地址标识符
  1315. count += 4;
  1316. //遥测站地址
  1317. count += 10;
  1318. return tmprtuInfo;
  1319. }
  1320. }
  1321. }
  1322. return null;
  1323. }
  1324. /**
  1325. * 重启
  1326. */
  1327. function datagram_f3() {
  1328. var tsStr = util.datagramTime();
  1329. var rtuCode = "0000000000";
  1330. var message = "7E7E" + rtuCode;
  1331. var funcCode = "F3";
  1332. message = message + "91" + "0000" + funcCode + "8008" + "02" + "0000" + tsStr + "05";
  1333. var crc = crc16.hexStrToCrc16(message)
  1334. message += crc;
  1335. return message;
  1336. }
  1337. function datagram_f3_analyse(datagram) {
  1338. if (datagram.length > 0) {
  1339. if (datagram.indexOf("7e7e") >= 0) {
  1340. var count = 20;
  1341. var funcode = datagram.substring(count, count + 2);
  1342. count += 2;
  1343. if (funcode == 'f3') {
  1344. console.log("------------------------------------find f3 datagram----------------------------");
  1345. var tmprtuInfo = {
  1346. datagram_idx: '',
  1347. collect_time: '',
  1348. func: 'f3'
  1349. }
  1350. return tmprtuInfo;
  1351. }
  1352. }
  1353. }
  1354. return null;
  1355. }
  1356. module.exports = {
  1357. crcCheck: crcCheck,
  1358. datagram_f6: datagram_f6,
  1359. datagram_f6_analyse: datagram_f6_analyse,
  1360. datagram_f7: datagram_f7,
  1361. datagram_f7_analyse: datagram_f7_analyse,
  1362. datagram_40: datagram_40,
  1363. datagram_40_analyse: datagram_40_analyse,
  1364. datagram_45: datagram_45,
  1365. datagram_45_analyse: datagram_45_analyse,
  1366. datagram_47: datagram_47,
  1367. datagram_47_analyse: datagram_47_analyse,
  1368. datagram_48: datagram_48,
  1369. datagram_48_analyse: datagram_48_analyse,
  1370. datagram_4A: datagram_4A,
  1371. datagram_4A_analyse: datagram_4A_analyse,
  1372. datagram_51: datagram_51,
  1373. datagram_51_analyse: datagram_51_analyse,
  1374. datagram_f3: datagram_f3,
  1375. datagram_f3_analyse: datagram_f3_analyse,
  1376. datagram_43: datagram_43,
  1377. datagram_43_analyse: datagram_43_analyse,
  1378. datagram_41: datagram_41,
  1379. datagram_41_analyse: datagram_41_analyse,
  1380. datagram_42_analyse: datagram_42_analyse,
  1381. datagram_42: datagram_42
  1382. }