Blame view

lib/serialport-parsers.js 4.76 KB
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
1
2
  const PARSER_READLINE_DELIMITER = '\r
  ';
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
3
4
5
  const PARSER_WAIT_FOR_OK_OR_ERROR_REGEX = /
  (?:OK|ERROR)\r
  /;
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
6

caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
7
  const moment = require('moment');
62c6c2398   Adhidarma Hadiwinoto   Alternative pdu p...
8
  const nodePdu = require('node-pdu');
ee68aca72   Adhidarma Hadiwinoto   Tanpa alternative...
9
  // const pdu = require('pdu');
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
10
  const ParserReadline = require('@serialport/parser-readline');
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
11
  const ParserRegex = require('@serialport/parser-regex');
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
12
  const logger = require('komodo-sdk/logger');
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
13
  const dbCops = require('./db-cops');
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
14
  const modemInfo = require('./modem-info');
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
15

fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
16
17
18
19
20
21
22
23
24
25
  let port;
  
  exports.setPort = function setPort(val) {
      logger.info('SERIALPORT-PARSERS: setting port');
      port = val;
  };
  
  exports.getPort = function getPort() {
      return port;
  };
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
26
27
28
29
  function parsePdu(data) {
      if (!data) return null;
  
      try {
62c6c2398   Adhidarma Hadiwinoto   Alternative pdu p...
30
          const result = nodePdu.parse(data.toString().trim() || '');
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
31
32
33
34
35
          return result;
      } catch (e) {
          return null;
      }
  }
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
36
37
  function onCSQ(data) {
      const val = data.toString().trim().match(/\+CSQ:\s*(.*)/);
cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
38
      if (!val || !val[1]) return null;
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
39

caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
40
      const [, signalStrength] = val;
cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
41
      logger.info('Signal quality extracted', { signalQuality: val[1] });
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
42
43
44
45
46
47
  
      modemInfo.signalStrength = signalStrength;
      modemInfo.signalStrengthTs = new Date();
      modemInfo.signalStrengthTsReadable = moment(modemInfo.signalStrengthTs).format('YYYY-MM-DD HH:mm:ss');
  
      return signalStrength;
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
48
  }
9d73afe29   Adhidarma Hadiwinoto   Deteksi non Deliv...
49
  function onPduDeliver(data, parsedData) {
d87943efc   Adhidarma Hadiwinoto   PDU processed
50
51
52
53
54
      const from = parsedData.getAddress && parsedData.getAddress().getPhone
          ? parsedData.getAddress().getPhone() : null;
  
      const msg = parsedData.getData && parsedData.getData().getData
          ? parsedData.getData().getData() : null;
8914d7abb   Adhidarma Hadiwinoto   onPduDeliver ts
55
56
57
      const ts = new Date(parsedData.getScts().getIsoString());
  
      logger.verbose('PDU processed', { ts, from, msg });
d87943efc   Adhidarma Hadiwinoto   PDU processed
58
59
      return { from, msg };
  }
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
60
  function onCOPS(data) {
cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
61
62
63
64
      const val = data.toString().trim().match(/\+COPS:\s*(.*)/);
      if (!val || !val[1]) return null;
  
      const cops = val[1];
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
65
66
67
68
  
      if (!cops) return null;
      const [mode, format, networkId] = cops.split(',');
      const networkName = networkId ? dbCops[networkId] || networkId : null;
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
69
      logger.info('COPS extracted', {
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
70
71
          cops, mode, format, networkId, networkName,
      });
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
72
      modemInfo.cops = cops;
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
73
74
      modemInfo.networkId = networkId || null;
      modemInfo.networkName = networkName || null;
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
75

9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
76
77
78
79
      return {
          cops, mode, format, networkId, networkName,
      };
  }
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  function isResultCodeIs(data, resultCode) {
      if (!data) return false;
      const cleanedData = (data.toString() || '').trim();
      if (!cleanedData) return false;
  
      if (resultCode.indexOf('+') !== 0) {
          // eslint-disable-next-line no-param-reassign
          resultCode = `+${resultCode}`;
      }
  
      if (resultCode.search(/:$/) < 0) {
          // eslint-disable-next-line no-param-reassign
          resultCode += ':';
      }
  
      return cleanedData.indexOf(resultCode) === 0;
  }
  
  const parserReadline = new ParserReadline({ delimiter: PARSER_READLINE_DELIMITER });
  parserReadline.on('data', (data) => {
3522ae5bc   Adhidarma Hadiwinoto   MODEM-INFO: stuck...
100
      modemInfo.lastReadTs = new Date();
9883a918f   Adhidarma Hadiwinoto   Urutan log
101
      logger.verbose('INCOMING', { data: `${data.toString()}${PARSER_READLINE_DELIMITER}`, parser: 'parserReadLine' });
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
102
103
  
      if (!data) return;
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
104
105
106
  
      const pduParsed = parsePdu(data);
      if (pduParsed) {
2f1b961dd   Adhidarma Hadiwinoto   Perbailan penanga...
107
          logger.verbose('PDU parsed', { type: (typeof pduParsed.getType === 'function') && pduParsed.getType() });
e74c83d19   Adhidarma Hadiwinoto   FILTER pdu DELIVER
108
      }
9d73afe29   Adhidarma Hadiwinoto   Deteksi non Deliv...
109
      if (pduParsed && pduParsed.constructor.name !== 'Deliver') {
e18eb1b3b   Adhidarma Hadiwinoto   WARN 9DA32C41
110
          logger.warn('WARN-9DA32C41: Unknown PDU message type name. PLEASE REPORT IT TO DEVELOPER AT TEKTRANS', { typeName: pduParsed.constructor.name, type: pduParsed.getType(), data: data.toString().trim() });
9d73afe29   Adhidarma Hadiwinoto   Deteksi non Deliv...
111
      }
02b47ac39   Adhidarma Hadiwinoto   detect pdu by size
112
      if (pduParsed && pduParsed.constructor.name === 'Deliver' && pduParsed.getData().getSize()) {
e74c83d19   Adhidarma Hadiwinoto   FILTER pdu DELIVER
113
          logger.verbose('Got a PDU SMS-DELIVER', { type: pduParsed.getType() });
9d73afe29   Adhidarma Hadiwinoto   Deteksi non Deliv...
114
          onPduDeliver(data, pduParsed);
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
115
      } else if (isResultCodeIs(data, 'CSQ')) {
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
116
          logger.verbose('Got a signal quality report', { data: data.toString() });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
117
          onCSQ(data);
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
118
119
      } else if (isResultCodeIs(data, 'COPS:')) {
          logger.verbose('Got a COPS report', { data: data.toString() });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
120
          onCOPS(data);
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
121
122
123
124
125
126
      } else if (isResultCodeIs(data, 'CMT')) {
          logger.verbose('Got a new message report', { data: data.toString() });
      } else if (isResultCodeIs(data, 'CMTI')) {
          logger.verbose('Got a new message notification report', { data: data.toString() });
      }
  });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
127
128
  const parserWaitForOkOrError = new ParserRegex({ regex: PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
  parserWaitForOkOrError.on('data', (data) => {
9883a918f   Adhidarma Hadiwinoto   Urutan log
129
      logger.verbose('INCOMING', { data: data.toString(), parser: 'parserWaitForOkOrError' });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
130
  });
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
131
132
  exports.PARSER_READLINE_DELIMITER = PARSER_READLINE_DELIMITER;
  exports.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX = PARSER_WAIT_FOR_OK_OR_ERROR_REGEX;
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
133
  exports.parserReadline = parserReadline;
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
134
  exports.parserWaitForOkOrError = parserWaitForOkOrError;