Blame view
lib/modem-commands/index.js
7.28 KB
e509607c5
|
1 |
const MUTEX_COMMAND = 'COMMAND'; |
fad855259
|
2 |
exports.MUTEX_COMMAND = MUTEX_COMMAND; |
47910cce6
|
3 |
const MUTEX_SUBCOMMAND = 'SUBCOMMAND'; |
fad855259
|
4 |
exports.MUTEX_SUBCOMMAND = MUTEX_SUBCOMMAND; |
e509607c5
|
5 |
|
ea7f35320
|
6 |
const pdu = require('node-pdu'); |
8f7f6a139
|
7 |
const ParserReadline = require('@serialport/parser-readline'); |
e77dfd454
|
8 |
const ParserRegex = require('@serialport/parser-regex'); |
e509607c5
|
9 |
const logger = require('komodo-sdk/logger'); |
ea7f35320
|
10 11 12 |
const mutex = require('../mutex-common'); const parsers = require('../serialport-parsers'); const modemInfo = require('../modem-info'); |
e509607c5
|
13 14 15 16 17 |
let port; function writeToPort(data) { return new Promise((resolve) => { |
3522ae5bc
|
18 |
modemInfo.lastWriteTs = new Date(); |
e509607c5
|
19 20 |
port.write(data, (err, bytesWritten) => { if (err) logger.warn(`ERROR: ${err.toString()}`); |
9883a918f
|
21 |
logger.verbose('OUTGOING', { data: data.toString(), bytesWritten, err }); |
e509607c5
|
22 23 24 25 |
resolve(bytesWritten); }); }); } |
8f7f6a139
|
26 |
exports.writeToPortAndWaitForReadline = function writeToPortAndWaitForReadline(cmd, lockName) { |
47910cce6
|
27 |
let resolved = false; |
8f7f6a139
|
28 29 30 |
return new Promise(async (resolve) => { const parser = new ParserReadline({ delimiter: parsers.PARSER_READLINE_DELIMITER }); parser.on('data', (data) => { |
afe1003d1
|
31 32 |
port.unpipe(parser); mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim()); |
47910cce6
|
33 34 35 36 |
if (!resolved) { resolved = true; resolve(data); } |
afe1003d1
|
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
|
47 48 |
const parser = new ParserRegex({ regex: /(?:OK|ERROR)\r / }); |
afe1003d1
|
49 |
parser.on('data', (data) => { |
8f7f6a139
|
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
|
60 61 62 63 64 65 66 |
exports.sleep = function sleep(ms) { return new Promise((resolve) => { setTimeout(() => { resolve(); }, ms || 0); }); }; |
e509607c5
|
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
|
83 |
|
47910cce6
|
84 |
exports.queryCOPS = function queryCOPS(lockName) { |
dee2ba97a
|
85 |
return new Promise(async (resolve) => { |
47910cce6
|
86 |
await mutex.lock(lockName || MUTEX_COMMAND, 'queryCOPS'); |
dee2ba97a
|
87 |
await writeToPort('AT+COPS?\r'); |
47910cce6
|
88 89 90 91 |
mutex.unlock(lockName || MUTEX_COMMAND, 'queryCOPS'); resolve(true); }); }; |
c5e93b5ea
|
92 |
exports.queryCOPSAndSignalQuality = function queryCOPSAndSignalQuality(skipOnLocked) { |
47910cce6
|
93 |
return new Promise(async (resolve) => { |
c5e93b5ea
|
94 95 96 |
if (!skipOnLocked) { await mutex.lock(MUTEX_COMMAND); } else if (!mutex.tryLock(MUTEX_COMMAND, 'queryCOPSAndSignalQuality')) { |
47910cce6
|
97 98 99 |
resolve(false); return; } |
e14021d4c
|
100 101 |
await this.writeToPortAndWaitForOkOrError('AT+COPS?\r', MUTEX_SUBCOMMAND); await this.writeToPortAndWaitForOkOrError('AT+CSQ\r', MUTEX_SUBCOMMAND); |
47910cce6
|
102 103 |
mutex.unlock(MUTEX_COMMAND, 'queryCopsAndSignalQuality'); |
dee2ba97a
|
104 105 106 |
resolve(true); }); }; |
e77dfd454
|
107 |
|
c5e93b5ea
|
108 |
exports.queryIMEI = function queryIMEI(lockName) { |
e77dfd454
|
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
|
112 |
logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMEI' }); |
4cb2459b1
|
113 |
port.unpipe(parser); |
c5e93b5ea
|
114 |
mutex.unlock(lockName || MUTEX_COMMAND, 'queryIMEI'); |
fad855259
|
115 |
modemInfo.imei = data.toString().trim() || null; |
caac94e43
|
116 |
logger.info('IMEI extracted', { imei: modemInfo.imei }); |
7f00b5aeb
|
117 |
resolve(modemInfo.imei); |
e77dfd454
|
118 |
}); |
c5e93b5ea
|
119 |
await mutex.lock(lockName || MUTEX_COMMAND, 'queryIMEI'); |
e77dfd454
|
120 121 122 |
port.pipe(parser); await writeToPort('AT+CGSN\r'); |
e77dfd454
|
123 124 |
}); }; |
b77537954
|
125 |
|
c5e93b5ea
|
126 |
exports.queryIMSI = function queryIMSI(lockName) { |
b77537954
|
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
|
130 |
logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMSI' }); |
b77537954
|
131 |
port.unpipe(parser); |
c5e93b5ea
|
132 |
mutex.unlock(lockName || MUTEX_COMMAND, 'queryIMSI'); |
fad855259
|
133 |
modemInfo.imsi = data.toString().trim() || null; |
caac94e43
|
134 |
logger.info('IMSI extracted', { imsi: modemInfo.imsi }); |
b77537954
|
135 136 |
resolve(modemInfo.imsi); }); |
c5e93b5ea
|
137 |
await mutex.lock(lockName || MUTEX_COMMAND, 'queryIMSI'); |
b77537954
|
138 139 140 141 142 |
port.pipe(parser); await writeToPort('AT+CIMI\r'); }); }; |
c5e93b5ea
|
143 144 145 |
exports.queryIMEIAndIMSI = async function queryIMEIAndIMSI() { await mutex.lock(MUTEX_COMMAND, 'queryIMEIAndIMSI'); |
caac94e43
|
146 147 |
const imei = await this.queryIMEI(MUTEX_SUBCOMMAND); const imsi = await this.queryIMSI(MUTEX_SUBCOMMAND); |
c5e93b5ea
|
148 |
|
08d2d23e1
|
149 |
await mutex.unlock(MUTEX_COMMAND, 'queryIMEIAndIMSI'); |
caac94e43
|
150 |
return { imei, imsi }; |
c5e93b5ea
|
151 |
}; |
fad855259
|
152 |
|
ea7f35320
|
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
|
196 197 |
exports.initATCommands = async function initATCommands() { await mutex.lock(MUTEX_COMMAND, 'INIT MODEM'); |
ea7f35320
|
198 |
await this.writeToPortAndWaitForOkOrError('\rATE0\r', MUTEX_SUBCOMMAND); |
fad855259
|
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'); }; |