Blame view

lib/serialport-parsers.js 5.66 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;
  };
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  let ussdCallback = null;
  function setUssdCallback(cb) {
      ussdCallback = cb;
  }
  exports.setUssdCallback = setUssdCallback;
  
  function isAlphaNumeric(str) {
      const len = str.length;
      // eslint-disable-next-line no-plusplus
      for (let i = 0; i < len; i++) {
          const code = str.charCodeAt(i);
          if (!(code > 47 && code < 58) // numeric (0-9)
              && !(code > 64 && code < 91) // upper alpha (A-Z)
              && !(code > 96 && code < 123)) { // lower alpha (a-z)
              return false;
          }
      }
      return true;
  }
  
  function parsePdu(_data) {
      const data = _data && _data.toString().trim().toUpperCase();
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
48
      if (!data) return null;
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
49
      if (!isAlphaNumeric(data)) return null;
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
50
51
  
      try {
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
52
          const result = nodePdu.parse(data);
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
53
54
55
56
57
          return result;
      } catch (e) {
          return null;
      }
  }
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
58
59
  function onCSQ(data) {
      const val = data.toString().trim().match(/\+CSQ:\s*(.*)/);
cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
60
      if (!val || !val[1]) return null;
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
61

caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
62
      const [, signalStrength] = val;
cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
63
      logger.info('Signal quality extracted', { signalQuality: val[1] });
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
64
65
66
67
68
69
  
      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
70
  }
9d73afe29   Adhidarma Hadiwinoto   Deteksi non Deliv...
71
  function onPduDeliver(data, parsedData) {
d87943efc   Adhidarma Hadiwinoto   PDU processed
72
73
74
75
76
      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
77
78
79
      const ts = new Date(parsedData.getScts().getIsoString());
  
      logger.verbose('PDU processed', { ts, from, msg });
d87943efc   Adhidarma Hadiwinoto   PDU processed
80
81
      return { from, msg };
  }
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
82
  function onCOPS(data) {
cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
83
84
85
86
      const val = data.toString().trim().match(/\+COPS:\s*(.*)/);
      if (!val || !val[1]) return null;
  
      const cops = val[1];
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
87
88
89
90
  
      if (!cops) return null;
      const [mode, format, networkId] = cops.split(',');
      const networkName = networkId ? dbCops[networkId] || networkId : null;
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
91
      logger.info('COPS extracted', {
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
92
93
          cops, mode, format, networkId, networkName,
      });
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
94
      modemInfo.cops = cops;
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
95
96
      modemInfo.networkId = networkId || null;
      modemInfo.networkName = networkName || null;
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
97

9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
98
99
100
101
      return {
          cops, mode, format, networkId, networkName,
      };
  }
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  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...
122
      modemInfo.lastReadTs = new Date();
9883a918f   Adhidarma Hadiwinoto   Urutan log
123
      logger.verbose('INCOMING', { data: `${data.toString()}${PARSER_READLINE_DELIMITER}`, parser: 'parserReadLine' });
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
124
125
  
      if (!data) return;
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
126
127
  
      const pduParsed = parsePdu(data);
9d73afe29   Adhidarma Hadiwinoto   Deteksi non Deliv...
128
      if (pduParsed && pduParsed.constructor.name !== 'Deliver') {
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
129
130
          const pduType = pduParsed.getType();
          logger.warn('WARN-9DA32C41: Unknown PDU message type name. PLEASE REPORT IT TO DEVELOPER AT TEKTRANS', { typeName: pduParsed.constructor.name, pduType, data: data.toString().trim() });
9d73afe29   Adhidarma Hadiwinoto   Deteksi non Deliv...
131
      }
02b47ac39   Adhidarma Hadiwinoto   detect pdu by size
132
      if (pduParsed && pduParsed.constructor.name === 'Deliver' && pduParsed.getData().getSize()) {
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
133
134
          const pduType = pduParsed.getType();
          logger.verbose('Got a PDU SMS-DELIVER', { pduType });
9d73afe29   Adhidarma Hadiwinoto   Deteksi non Deliv...
135
          onPduDeliver(data, pduParsed);
2e49a3d20   Adhidarma Hadiwinoto   pduParsed
136
      } else if (isResultCodeIs(data, 'CSQ')) {
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
137
          logger.verbose('Got a signal quality report', { data: data.toString() });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
138
          onCSQ(data);
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
139
140
      } else if (isResultCodeIs(data, 'COPS:')) {
          logger.verbose('Got a COPS report', { data: data.toString() });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
141
          onCOPS(data);
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
142
143
144
145
      } 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() });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
146
147
148
149
150
151
152
153
      } else if (isResultCodeIs(data, 'CUSD')) {
          logger.verbose('Got a USSD command response', { data: data.toString() });
          if (ussdCallback && typeof ussdCallback === 'function') {
              logger.verbose('Calling USSD callback');
              ussdCallback(data.toString());
          } else {
              logger.verbose('Skip unwanted USSD response');
          }
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
154
155
      }
  });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
156
157
  const parserWaitForOkOrError = new ParserRegex({ regex: PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
  parserWaitForOkOrError.on('data', (data) => {
9883a918f   Adhidarma Hadiwinoto   Urutan log
158
      logger.verbose('INCOMING', { data: data.toString(), parser: 'parserWaitForOkOrError' });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
159
  });
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
160
161
  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...
162
  exports.parserReadline = parserReadline;
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
163
  exports.parserWaitForOkOrError = parserWaitForOkOrError;