Blame view

lib/modem-commands/index.js 7.28 KB
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
1
  const MUTEX_COMMAND = 'COMMAND';
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
2
  exports.MUTEX_COMMAND = MUTEX_COMMAND;
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
3
  const MUTEX_SUBCOMMAND = 'SUBCOMMAND';
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
4
  exports.MUTEX_SUBCOMMAND = MUTEX_SUBCOMMAND;
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
5

ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
6
  const pdu = require('node-pdu');
8f7f6a139   Adhidarma Hadiwinoto   writeToPortAndWai...
7
  const ParserReadline = require('@serialport/parser-readline');
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
8
  const ParserRegex = require('@serialport/parser-regex');
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
9
  const logger = require('komodo-sdk/logger');
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
10
11
12
  const mutex = require('../mutex-common');
  const parsers = require('../serialport-parsers');
  const modemInfo = require('../modem-info');
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
13
14
15
16
17
  
  let port;
  
  function writeToPort(data) {
      return new Promise((resolve) => {
3522ae5bc   Adhidarma Hadiwinoto   MODEM-INFO: stuck...
18
          modemInfo.lastWriteTs = new Date();
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
19
20
          port.write(data, (err, bytesWritten) => {
              if (err) logger.warn(`ERROR: ${err.toString()}`);
9883a918f   Adhidarma Hadiwinoto   Urutan log
21
              logger.verbose('OUTGOING', { data: data.toString(), bytesWritten, err });
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
22
23
24
25
              resolve(bytesWritten);
          });
      });
  }
8f7f6a139   Adhidarma Hadiwinoto   writeToPortAndWai...
26
  exports.writeToPortAndWaitForReadline = function writeToPortAndWaitForReadline(cmd, lockName) {
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
27
      let resolved = false;
8f7f6a139   Adhidarma Hadiwinoto   writeToPortAndWai...
28
29
30
      return new Promise(async (resolve) => {
          const parser = new ParserReadline({ delimiter: parsers.PARSER_READLINE_DELIMITER });
          parser.on('data', (data) => {
afe1003d1   Adhidarma Hadiwinoto   Using modemComman...
31
32
              port.unpipe(parser);
              mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim());
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
33
34
35
36
              if (!resolved) {
                  resolved = true;
                  resolve(data);
              }
afe1003d1   Adhidarma Hadiwinoto   Using modemComman...
37
38
39
40
41
42
43
44
45
46
          });
  
          await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim());
          port.pipe(parser);
          await writeToPort(cmd);
      });
  };
  
  exports.writeToPortAndWaitForOkOrError = function writeToPortAndWaitForOkOrError(cmd, lockName) {
      return new Promise(async (resolve) => {
5b0551633   Adhidarma Hadiwinoto   Regex on writeToP...
47
48
          const parser = new ParserRegex({ regex: /(?:OK|ERROR)\r
  / });
afe1003d1   Adhidarma Hadiwinoto   Using modemComman...
49
          parser.on('data', (data) => {
8f7f6a139   Adhidarma Hadiwinoto   writeToPortAndWai...
50
51
52
53
54
55
56
57
58
59
              port.unpipe(parser);
              mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim());
              resolve(data);
          });
  
          await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim());
          port.pipe(parser);
          await writeToPort(cmd);
      });
  };
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
60
61
62
63
64
65
66
  exports.sleep = function sleep(ms) {
      return new Promise((resolve) => {
          setTimeout(() => {
              resolve();
          }, ms || 0);
      });
  };
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  exports.setPort = function setPort(val) {
      port = val;
  };
  
  exports.querySignalQuality = function querySignalQuality() {
      return new Promise(async (resolve) => {
          if (!mutex.tryLock(MUTEX_COMMAND, 'querySignalQuality')) {
              resolve(false);
              return;
          }
  
          await writeToPort('AT+CSQ\r');
          mutex.unlock(MUTEX_COMMAND, 'querySignalQuality');
          resolve(true);
      });
  };
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
83

47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
84
  exports.queryCOPS = function queryCOPS(lockName) {
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
85
      return new Promise(async (resolve) => {
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
86
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryCOPS');
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
87
          await writeToPort('AT+COPS?\r');
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
88
89
90
91
          mutex.unlock(lockName || MUTEX_COMMAND, 'queryCOPS');
          resolve(true);
      });
  };
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
92
  exports.queryCOPSAndSignalQuality = function queryCOPSAndSignalQuality(skipOnLocked) {
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
93
      return new Promise(async (resolve) => {
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
94
95
96
          if (!skipOnLocked) {
              await mutex.lock(MUTEX_COMMAND);
          } else if (!mutex.tryLock(MUTEX_COMMAND, 'queryCOPSAndSignalQuality')) {
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
97
98
99
              resolve(false);
              return;
          }
e14021d4c   Adhidarma Hadiwinoto   queryCOPSAndSigna...
100
101
          await this.writeToPortAndWaitForOkOrError('AT+COPS?\r', MUTEX_SUBCOMMAND);
          await this.writeToPortAndWaitForOkOrError('AT+CSQ\r', MUTEX_SUBCOMMAND);
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
102
103
  
          mutex.unlock(MUTEX_COMMAND, 'queryCopsAndSignalQuality');
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
104
105
106
          resolve(true);
      });
  };
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
107

c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
108
  exports.queryIMEI = function queryIMEI(lockName) {
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
109
110
111
      return new Promise(async (resolve) => {
          const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
          parser.on('data', (data) => {
9883a918f   Adhidarma Hadiwinoto   Urutan log
112
              logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMEI' });
4cb2459b1   Adhidarma Hadiwinoto   queryIMEI unpipe ...
113
              port.unpipe(parser);
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
114
              mutex.unlock(lockName || MUTEX_COMMAND, 'queryIMEI');
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
115
              modemInfo.imei = data.toString().trim() || null;
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
116
              logger.info('IMEI extracted', { imei: modemInfo.imei });
7f00b5aeb   Adhidarma Hadiwinoto   modemInfo.imei
117
              resolve(modemInfo.imei);
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
118
          });
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
119
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryIMEI');
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
120
121
122
  
          port.pipe(parser);
          await writeToPort('AT+CGSN\r');
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
123
124
      });
  };
b77537954   Adhidarma Hadiwinoto   queryIMSI
125

c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
126
  exports.queryIMSI = function queryIMSI(lockName) {
b77537954   Adhidarma Hadiwinoto   queryIMSI
127
128
129
      return new Promise(async (resolve) => {
          const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
          parser.on('data', (data) => {
9883a918f   Adhidarma Hadiwinoto   Urutan log
130
              logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMSI' });
b77537954   Adhidarma Hadiwinoto   queryIMSI
131
              port.unpipe(parser);
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
132
              mutex.unlock(lockName || MUTEX_COMMAND, 'queryIMSI');
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
133
              modemInfo.imsi = data.toString().trim() || null;
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
134
              logger.info('IMSI extracted', { imsi: modemInfo.imsi });
b77537954   Adhidarma Hadiwinoto   queryIMSI
135
136
              resolve(modemInfo.imsi);
          });
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
137
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryIMSI');
b77537954   Adhidarma Hadiwinoto   queryIMSI
138
139
140
141
142
  
          port.pipe(parser);
          await writeToPort('AT+CIMI\r');
      });
  };
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
143
144
145
  
  exports.queryIMEIAndIMSI = async function queryIMEIAndIMSI() {
      await mutex.lock(MUTEX_COMMAND, 'queryIMEIAndIMSI');
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
146
147
      const imei = await this.queryIMEI(MUTEX_SUBCOMMAND);
      const imsi = await this.queryIMSI(MUTEX_SUBCOMMAND);
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
148

08d2d23e1   Adhidarma Hadiwinoto   Perbaikan mutex u...
149
      await mutex.unlock(MUTEX_COMMAND, 'queryIMEIAndIMSI');
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
150
      return { imei, imsi };
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
151
  };
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
152

ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
  exports.queryManufacturer = function queryManufacturer(lockName) {
      return new Promise(async (resolve) => {
          const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
          parser.on('data', (data) => {
              logger.verbose('INCOMING', { data: data.toString(), parser: 'parserManufacturer' });
              port.unpipe(parser);
              mutex.unlock(lockName || MUTEX_COMMAND, 'parserManufacturer');
              modemInfo.manufacturer = data.toString().trim() || null;
              logger.info('Manufacturer extracted', { manufacturer: modemInfo.manufacturer });
              resolve(modemInfo.manufacturer);
          });
  
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryManufacturer');
  
          port.pipe(parser);
          await writeToPort('AT+CGMI\r');
      });
  };
  
  exports.queryModel = function queryModel(lockName) {
      return new Promise(async (resolve) => {
          const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
          parser.on('data', (data) => {
              logger.verbose('INCOMING', { data: data.toString(), parser: 'parserModel' });
              port.unpipe(parser);
              mutex.unlock(lockName || MUTEX_COMMAND, 'parserModel');
              modemInfo.model = data.toString().trim() || null;
              logger.info('Model extracted', { model: modemInfo.model });
              resolve(modemInfo.model);
          });
  
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryModel');
  
          port.pipe(parser);
          await writeToPort('AT+CGMM\r');
      });
  };
  
  exports.sendSMS = function sendSMS(destination, msg) {
      return new Promise(async (resolve) => {
          
      });
  };
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
196
197
  exports.initATCommands = async function initATCommands() {
      await mutex.lock(MUTEX_COMMAND, 'INIT MODEM');
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
198
      await this.writeToPortAndWaitForOkOrError('\rATE0\r', MUTEX_SUBCOMMAND);
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
199
200
201
202
      await this.writeToPortAndWaitForOkOrError('AT+CMGF=0\r', MUTEX_SUBCOMMAND);
      await this.writeToPortAndWaitForOkOrError('AT+CNMI=1,2,0,1,0\r', MUTEX_SUBCOMMAND);
      mutex.unlock(MUTEX_COMMAND, 'INIT MODEM');
  };