modem-commands.js
5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
const MUTEX_COMMAND = 'COMMAND';
const MUTEX_SUBCOMMAND = 'SUBCOMMAND';
const ParserReadline = require('@serialport/parser-readline');
const ParserRegex = require('@serialport/parser-regex');
const logger = require('komodo-sdk/logger');
const mutex = require('./mutex-common');
const parsers = require('./serialport-parsers');
const modemInfo = require('./modem-info');
let port;
function writeToPort(data) {
return new Promise((resolve) => {
port.write(data, (err, bytesWritten) => {
if (err) logger.warn(`ERROR: ${err.toString()}`);
logger.verbose('OUTGOING', { data: data.toString(), bytesWritten, err });
resolve(bytesWritten);
});
});
}
exports.writeToPortAndWaitForReadline = function writeToPortAndWaitForReadline(cmd, lockName) {
let resolved = false;
return new Promise(async (resolve) => {
const parser = new ParserReadline({ delimiter: parsers.PARSER_READLINE_DELIMITER });
parser.on('data', (data) => {
port.unpipe(parser);
mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim());
if (!resolved) {
resolved = true;
resolve(data);
}
});
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) => {
const parser = new ParserRegex({ regex: /(?:OK|ERROR)\r\n/ });
parser.on('data', (data) => {
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);
});
};
exports.sleep = function sleep(ms) {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, ms || 0);
});
};
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);
});
};
exports.queryCOPS = function queryCOPS(lockName) {
return new Promise(async (resolve) => {
await mutex.lock(lockName || MUTEX_COMMAND, 'queryCOPS');
await writeToPort('AT+COPS?\r');
mutex.unlock(lockName || MUTEX_COMMAND, 'queryCOPS');
resolve(true);
});
};
exports.queryCOPSAndSignalQuality = function queryCOPSAndSignalQuality(skipOnLocked) {
return new Promise(async (resolve) => {
if (!skipOnLocked) {
await mutex.lock(MUTEX_COMMAND);
} else if (!mutex.tryLock(MUTEX_COMMAND, 'queryCOPSAndSignalQuality')) {
resolve(false);
return;
}
await this.writeToPortAndWaitForOkOrError('AT+COPS?\r', MUTEX_SUBCOMMAND);
await this.writeToPortAndWaitForOkOrError('AT+CSQ\r', MUTEX_SUBCOMMAND);
mutex.unlock(MUTEX_COMMAND, 'queryCopsAndSignalQuality');
resolve(true);
});
};
exports.queryIMEI = function queryIMEI(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: 'parserIMEI' });
port.unpipe(parser);
mutex.unlock(lockName || MUTEX_COMMAND, 'queryIMEI');
modemInfo.imei = data.toString().trim();
logger.info('IMEI extracted', { imei: modemInfo.imei });
resolve(modemInfo.imei);
});
await mutex.lock(lockName || MUTEX_COMMAND, 'queryIMEI');
port.pipe(parser);
await writeToPort('AT+CGSN\r');
});
};
exports.queryIMSI = function queryIMSI(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: 'parserIMSI' });
port.unpipe(parser);
mutex.unlock(lockName || MUTEX_COMMAND, 'queryIMSI');
modemInfo.imsi = data.toString().trim();
logger.info('IMSI extracted', { imsi: modemInfo.imsi });
resolve(modemInfo.imsi);
});
await mutex.lock(lockName || MUTEX_COMMAND, 'queryIMSI');
port.pipe(parser);
await writeToPort('AT+CIMI\r');
});
};
exports.queryIMEIAndIMSI = async function queryIMEIAndIMSI() {
await mutex.lock(MUTEX_COMMAND, 'queryIMEIAndIMSI');
const imei = await this.queryIMEI(MUTEX_SUBCOMMAND);
const imsi = await this.queryIMSI(MUTEX_SUBCOMMAND);
await mutex.unlock(MUTEX_COMMAND, 'queryIMEIAndIMSI');
return { imei, imsi };
};