Commit b77537954016b76f0e03f3f8f2a90d68c6e3a76a

Authored by Adhidarma Hadiwinoto
1 parent 890ade1c41
Exists in master

queryIMSI

Showing 2 changed files with 23 additions and 1 deletions Inline Diff

lib/modem-commands.js
1 const MUTEX_COMMAND = 'COMMAND'; 1 const MUTEX_COMMAND = 'COMMAND';
2 // const MUTEX_SUBCOMMAND = 'SUBCOMMAND'; 2 // const MUTEX_SUBCOMMAND = 'SUBCOMMAND';
3 3
4 const ParserRegex = require('@serialport/parser-regex'); 4 const ParserRegex = require('@serialport/parser-regex');
5 5
6 const logger = require('komodo-sdk/logger'); 6 const logger = require('komodo-sdk/logger');
7 const mutex = require('./mutex-common'); 7 const mutex = require('./mutex-common');
8 const parsers = require('./serialport-parsers'); 8 const parsers = require('./serialport-parsers');
9 const modemInfo = require('./modem-info'); 9 const modemInfo = require('./modem-info');
10 10
11 let port; 11 let port;
12 12
13 function writeToPort(data) { 13 function writeToPort(data) {
14 return new Promise((resolve) => { 14 return new Promise((resolve) => {
15 port.write(data, (err, bytesWritten) => { 15 port.write(data, (err, bytesWritten) => {
16 if (err) logger.warn(`ERROR: ${err.toString()}`); 16 if (err) logger.warn(`ERROR: ${err.toString()}`);
17 17
18 logger.verbose('OUTGOING', { bytesWritten, data: data.toString() }); 18 logger.verbose('OUTGOING', { bytesWritten, data: data.toString() });
19 resolve(bytesWritten); 19 resolve(bytesWritten);
20 }); 20 });
21 }); 21 });
22 } 22 }
23 23
24 exports.sleep = function sleep(ms) { 24 exports.sleep = function sleep(ms) {
25 return new Promise((resolve) => { 25 return new Promise((resolve) => {
26 setTimeout(() => { 26 setTimeout(() => {
27 resolve(); 27 resolve();
28 }, ms || 0); 28 }, ms || 0);
29 }); 29 });
30 }; 30 };
31 31
32 32
33 exports.setPort = function setPort(val) { 33 exports.setPort = function setPort(val) {
34 port = val; 34 port = val;
35 }; 35 };
36 36
37 exports.querySignalQuality = function querySignalQuality() { 37 exports.querySignalQuality = function querySignalQuality() {
38 return new Promise(async (resolve) => { 38 return new Promise(async (resolve) => {
39 if (!mutex.tryLock(MUTEX_COMMAND, 'querySignalQuality')) { 39 if (!mutex.tryLock(MUTEX_COMMAND, 'querySignalQuality')) {
40 resolve(false); 40 resolve(false);
41 return; 41 return;
42 } 42 }
43 43
44 await writeToPort('AT+CSQ\r'); 44 await writeToPort('AT+CSQ\r');
45 mutex.unlock(MUTEX_COMMAND, 'querySignalQuality'); 45 mutex.unlock(MUTEX_COMMAND, 'querySignalQuality');
46 resolve(true); 46 resolve(true);
47 }); 47 });
48 }; 48 };
49 49
50 exports.queryCOPS = function querySignalQuality() { 50 exports.queryCOPS = function querySignalQuality() {
51 return new Promise(async (resolve) => { 51 return new Promise(async (resolve) => {
52 await mutex.lock(MUTEX_COMMAND, 'queryCOPS'); 52 await mutex.lock(MUTEX_COMMAND, 'queryCOPS');
53 await writeToPort('AT+COPS?\r'); 53 await writeToPort('AT+COPS?\r');
54 mutex.unlock(MUTEX_COMMAND, 'queryCOPS'); 54 mutex.unlock(MUTEX_COMMAND, 'queryCOPS');
55 resolve(true); 55 resolve(true);
56 }); 56 });
57 }; 57 };
58 58
59 exports.queryIMEI = function queryIMEI() { 59 exports.queryIMEI = function queryIMEI() {
60 return new Promise(async (resolve) => { 60 return new Promise(async (resolve) => {
61 const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); 61 const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
62 parser.on('data', (data) => { 62 parser.on('data', (data) => {
63 logger.verbose('INCOMING', { parser: 'parserIMEI', data: data.toString() }); 63 logger.verbose('INCOMING', { parser: 'parserIMEI', data: data.toString() });
64 port.unpipe(parser); 64 port.unpipe(parser);
65 mutex.unlock(MUTEX_COMMAND, 'queryIMEI'); 65 mutex.unlock(MUTEX_COMMAND, 'queryIMEI');
66 modemInfo.imei = data.toString().trim(); 66 modemInfo.imei = data.toString().trim();
67 resolve(modemInfo.imei); 67 resolve(modemInfo.imei);
68 }); 68 });
69 69
70 await mutex.lock(MUTEX_COMMAND, 'queryIMEI'); 70 await mutex.lock(MUTEX_COMMAND, 'queryIMEI');
71 71
72 port.pipe(parser); 72 port.pipe(parser);
73 await writeToPort('AT+CGSN\r'); 73 await writeToPort('AT+CGSN\r');
74 }); 74 });
75 }; 75 };
76
77 exports.queryIMSI = function queryIMSI() {
78 return new Promise(async (resolve) => {
79 const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
80 parser.on('data', (data) => {
81 logger.verbose('INCOMING', { parser: 'parserIMSI', data: data.toString() });
82 port.unpipe(parser);
83 mutex.unlock(MUTEX_COMMAND, 'queryIMSI');
84 modemInfo.imsi = data.toString().trim();
85 resolve(modemInfo.imsi);
86 });
87
88 await mutex.lock(MUTEX_COMMAND, 'queryIMSI');
89
90 port.pipe(parser);
91 await writeToPort('AT+CIMI\r');
92 });
93 };
76 94
1 const SerialPort = require('serialport'); 1 const SerialPort = require('serialport');
2 2
3 const config = require('komodo-sdk/config'); 3 const config = require('komodo-sdk/config');
4 const logger = require('komodo-sdk/logger'); 4 const logger = require('komodo-sdk/logger');
5 5
6 6
7 const ParserInterByteTimeout = require('@serialport/parser-inter-byte-timeout'); 7 const ParserInterByteTimeout = require('@serialport/parser-inter-byte-timeout');
8 8
9 const parsers = require('./lib/serialport-parsers'); 9 const parsers = require('./lib/serialport-parsers');
10 const modemCommands = require('./lib/modem-commands'); 10 const modemCommands = require('./lib/modem-commands');
11 11
12 const parserInterByteTimeout = new ParserInterByteTimeout({ interval: 1000 }); 12 const parserInterByteTimeout = new ParserInterByteTimeout({ interval: 1000 });
13 parserInterByteTimeout.on('data', (data) => { 13 parserInterByteTimeout.on('data', (data) => {
14 logger.verbose('INCOMING', { parser: 'parserInterByteTimeout', data: data.toString() }); 14 logger.verbose('INCOMING', { parser: 'parserInterByteTimeout', data: data.toString() });
15 }); 15 });
16 16
17 let port; 17 let port;
18 18
19 function sleep(ms) { 19 function sleep(ms) {
20 return new Promise((resolve) => { 20 return new Promise((resolve) => {
21 setTimeout(() => { 21 setTimeout(() => {
22 resolve(); 22 resolve();
23 }, ms || 0); 23 }, ms || 0);
24 }); 24 });
25 } 25 }
26 26
27 function writeToPort(data) { 27 function writeToPort(data) {
28 return new Promise((resolve) => { 28 return new Promise((resolve) => {
29 port.write(data, (err, bytesWritten) => { 29 port.write(data, (err, bytesWritten) => {
30 if (err) logger.warn(`ERROR: ${err.toString()}`); 30 if (err) logger.warn(`ERROR: ${err.toString()}`);
31 31
32 logger.verbose('OUTGOING', { bytesWritten, data: data.toString() }); 32 logger.verbose('OUTGOING', { bytesWritten, data: data.toString() });
33 resolve(bytesWritten); 33 resolve(bytesWritten);
34 }); 34 });
35 }); 35 });
36 } 36 }
37 37
38 async function writeToPortDelayed(data, ms) { 38 async function writeToPortDelayed(data, ms) {
39 await sleep(ms || 500); 39 await sleep(ms || 500);
40 const result = writeToPort(data); 40 const result = writeToPort(data);
41 return result; 41 return result;
42 } 42 }
43 43
44 port = new SerialPort(config.modem.device, { baudRate: 115200 }, async (err) => { 44 port = new SerialPort(config.modem.device, { baudRate: 115200 }, async (err) => {
45 if (err) { 45 if (err) {
46 logger.warn(`Error opening modem. ${err}. Terminating modem ${config.modem.device}.`); 46 logger.warn(`Error opening modem. ${err}. Terminating modem ${config.modem.device}.`);
47 process.exit(1); 47 process.exit(1);
48 } 48 }
49 49
50 await writeToPortDelayed('AT\r'); 50 await writeToPortDelayed('AT\r');
51 51
52 const commands = [ 52 const commands = [
53 'AT&FE0\r', 53 'AT&FE0\r',
54 'AT+CIMI\r',
55 'AT+CMGF=0\r', 54 'AT+CMGF=0\r',
56 'AT+CNMI=1,2,0,1,0\r', 55 'AT+CNMI=1,2,0,1,0\r',
57 ]; 56 ];
58 57
59 const commandsCount = commands.length; 58 const commandsCount = commands.length;
60 // eslint-disable-next-line no-plusplus 59 // eslint-disable-next-line no-plusplus
61 for (let i = 0; i < commandsCount; i++) { 60 for (let i = 0; i < commandsCount; i++) {
62 // eslint-disable-next-line no-await-in-loop 61 // eslint-disable-next-line no-await-in-loop
63 await writeToPortDelayed(commands[i], 2000); 62 await writeToPortDelayed(commands[i], 2000);
64 } 63 }
65 64
66 if (config && config.modem_tester && config.modem_tester.commands 65 if (config && config.modem_tester && config.modem_tester.commands
67 && config.modem_tester.commands.length) { 66 && config.modem_tester.commands.length) {
68 const additionalCommandsLength = config.modem_tester.commands.length; 67 const additionalCommandsLength = config.modem_tester.commands.length;
69 // eslint-disable-next-line no-plusplus 68 // eslint-disable-next-line no-plusplus
70 for (let i = 0; i < additionalCommandsLength; i++) { 69 for (let i = 0; i < additionalCommandsLength; i++) {
71 // eslint-disable-next-line no-await-in-loop 70 // eslint-disable-next-line no-await-in-loop
72 await writeToPortDelayed(config.modem_tester.commands[i], 2000); 71 await writeToPortDelayed(config.modem_tester.commands[i], 2000);
73 } 72 }
74 } 73 }
75 74
76 const imei = await modemCommands.queryIMEI(); 75 const imei = await modemCommands.queryIMEI();
77 logger.info(`**** IMEI: ${imei}`); 76 logger.info(`**** IMEI: ${imei}`);
77
78 const imsi = await modemCommands.queryIMSI();
79 logger.info(`**** IMSI: ${imsi}`);
80
78 const cops = await modemCommands.queryCOPS(); 81 const cops = await modemCommands.queryCOPS();
79 logger.info(`**** COPS: ${cops}`); 82 logger.info(`**** COPS: ${cops}`);
83
80 const signalQuality = await modemCommands.querySignalQuality(); 84 const signalQuality = await modemCommands.querySignalQuality();
81 logger.info(`**** Signal Quality: ${signalQuality}`); 85 logger.info(`**** Signal Quality: ${signalQuality}`);
82 86
83 setInterval(() => { 87 setInterval(() => {
84 modemCommands.querySignalQuality(); 88 modemCommands.querySignalQuality();
85 }, 30000); 89 }, 30000);
86 }); 90 });
87 91
88 parsers.setPort(port); 92 parsers.setPort(port);
89 modemCommands.setPort(port); 93 modemCommands.setPort(port);
90 94
91 if (config && config.modem_tester && config.modem_tester.parser === 'regex') { 95 if (config && config.modem_tester && config.modem_tester.parser === 'regex') {
92 logger.info('Using parserWaitForOkOrError'); 96 logger.info('Using parserWaitForOkOrError');
93 port.pipe(parsers.parserWaitForOkOrError); 97 port.pipe(parsers.parserWaitForOkOrError);
94 } else if (config && config.modem_tester && config.modem_tester.parser === 'interbyte') { 98 } else if (config && config.modem_tester && config.modem_tester.parser === 'interbyte') {
95 logger.info('Using parserInterByteTimeout'); 99 logger.info('Using parserInterByteTimeout');
96 port.pipe(parserInterByteTimeout); 100 port.pipe(parserInterByteTimeout);
97 } else { 101 } else {
98 logger.info('Using parserReadline'); 102 logger.info('Using parserReadline');
99 port.pipe(parsers.parserReadline); 103 port.pipe(parsers.parserReadline);
100 } 104 }