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