@starak/sim800c 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/debug.d.ts +2 -0
- package/dist/debug.js +29 -0
- package/dist/index.d.ts +26 -8
- package/dist/index.js +39 -48
- package/package.json +1 -1
package/dist/debug.d.ts
ADDED
package/dist/debug.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logger_in = exports.logger_out = void 0;
|
|
7
|
+
const console_stamp_1 = __importDefault(require("console-stamp"));
|
|
8
|
+
exports.logger_out = new console.Console(process.stdout, process.stderr);
|
|
9
|
+
exports.logger_in = new console.Console(process.stdout, process.stderr);
|
|
10
|
+
(0, console_stamp_1.default)(exports.logger_out, {
|
|
11
|
+
format: '([<-]).white :debug.cyan',
|
|
12
|
+
level: process.env.DEBUG_SIM ? 'debug' : 'error',
|
|
13
|
+
tokens: {
|
|
14
|
+
debug: ({ msg }) => msg.replace(/\r\n/g, '\n')
|
|
15
|
+
.replace(/\r/g, '')
|
|
16
|
+
},
|
|
17
|
+
preventDefaultMessage: true
|
|
18
|
+
});
|
|
19
|
+
(0, console_stamp_1.default)(exports.logger_in, {
|
|
20
|
+
format: '([->]).white :debug.green',
|
|
21
|
+
level: process.env.DEBUG_SIM ? 'debug' : 'error',
|
|
22
|
+
tokens: {
|
|
23
|
+
debug: ({ msg }) => msg.replace(/\r\n/g, '\n')
|
|
24
|
+
.replace(/\r/g, '')
|
|
25
|
+
},
|
|
26
|
+
preventDefaultMessage: true
|
|
27
|
+
});
|
|
28
|
+
exports.logger_in.debug('Debugging is enabled');
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVidWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0VBQTBDO0FBRTdCLFFBQUEsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqRSxRQUFBLFNBQVMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFN0UsSUFBQSx1QkFBYSxFQUFDLGtCQUFVLEVBQUU7SUFDdEIsTUFBTSxFQUFFLDBCQUEwQjtJQUNsQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztJQUNoRCxNQUFNLEVBQUU7UUFDSixLQUFLLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7YUFDdkMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7S0FDMUI7SUFDRCxxQkFBcUIsRUFBRSxJQUFJO0NBQzlCLENBQUMsQ0FBQztBQUVILElBQUEsdUJBQWEsRUFBQyxpQkFBUyxFQUFFO0lBQ3JCLE1BQU0sRUFBRSwyQkFBMkI7SUFDbkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87SUFDaEQsTUFBTSxFQUFFO1FBQ0osS0FBSyxFQUFFLENBQUMsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO2FBQ3ZDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0tBQzFCO0lBQ0QscUJBQXFCLEVBQUUsSUFBSTtDQUM5QixDQUFDLENBQUM7QUFFSCxpQkFBUyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDIn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -2,26 +2,42 @@
|
|
|
2
2
|
import EventEmitter from "events";
|
|
3
3
|
import { SerialPort } from "serialport";
|
|
4
4
|
import { pduMessage } from "pdu.ts";
|
|
5
|
-
|
|
5
|
+
interface UDH {
|
|
6
6
|
parts: number;
|
|
7
7
|
current_part: number;
|
|
8
8
|
reference_number: string;
|
|
9
9
|
length: string;
|
|
10
10
|
iei: string;
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
interface EpduMessage extends pduMessage {
|
|
13
13
|
udh?: UDH;
|
|
14
14
|
multipart: boolean;
|
|
15
15
|
parts: number;
|
|
16
16
|
parts_raw?: GsmMessage[];
|
|
17
17
|
sender?: string;
|
|
18
18
|
senderType?: number;
|
|
19
|
+
time: Date;
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
interface GsmMessage {
|
|
21
22
|
index: number;
|
|
22
23
|
message: EpduMessage;
|
|
23
24
|
raw: string;
|
|
24
|
-
|
|
25
|
+
}
|
|
26
|
+
export interface Message {
|
|
27
|
+
index: number;
|
|
28
|
+
parts: number;
|
|
29
|
+
indexes: number[];
|
|
30
|
+
text: string;
|
|
31
|
+
sender: string;
|
|
32
|
+
time: Date;
|
|
33
|
+
}
|
|
34
|
+
interface ParsedPDUMessage {
|
|
35
|
+
index: number;
|
|
36
|
+
message: EpduMessage;
|
|
37
|
+
}
|
|
38
|
+
interface PDUMessage {
|
|
39
|
+
index: number;
|
|
40
|
+
raw: string;
|
|
25
41
|
}
|
|
26
42
|
export * from "serialport";
|
|
27
43
|
export declare class GSM extends EventEmitter {
|
|
@@ -38,9 +54,11 @@ export declare class GSM extends EventEmitter {
|
|
|
38
54
|
private setMessage;
|
|
39
55
|
rejectCalls(): Promise<void>;
|
|
40
56
|
sendMessage(number: string, message: string): Promise<void>;
|
|
41
|
-
deleteMessage(msg:
|
|
57
|
+
deleteMessage(msg: Message): Promise<void>;
|
|
42
58
|
deleteAllMessages(): Promise<void>;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
59
|
+
getAllPDUMessages(): Promise<PDUMessage[]>;
|
|
60
|
+
parsePDUMessage(msg: PDUMessage): ParsedPDUMessage;
|
|
61
|
+
getMessages(): Promise<Message[]>;
|
|
62
|
+
getMessage(index: number): Promise<Message>;
|
|
63
|
+
static convertToCleanMessage(message: ParsedPDUMessage): Message;
|
|
46
64
|
}
|
package/dist/index.js
CHANGED
|
@@ -21,42 +21,23 @@ exports.GSM = void 0;
|
|
|
21
21
|
const events_1 = __importDefault(require("events"));
|
|
22
22
|
const serialport_1 = require("serialport");
|
|
23
23
|
const pdu_ts_1 = require("pdu.ts");
|
|
24
|
-
const
|
|
25
|
-
const logger_out = new console.Console(process.stdout, process.stderr);
|
|
26
|
-
const logger_in = new console.Console(process.stdout, process.stderr);
|
|
27
|
-
(0, console_stamp_1.default)(logger_out, {
|
|
28
|
-
format: '([<-]).white :debug.red',
|
|
29
|
-
level: process.env.DEBUG_SIM ? 'debug' : 'error',
|
|
30
|
-
tokens: {
|
|
31
|
-
debug: ({ msg }) => msg.replace(/\r\n/g, '\n')
|
|
32
|
-
.replace(/\r/g, '')
|
|
33
|
-
},
|
|
34
|
-
preventDefaultMessage: true
|
|
35
|
-
});
|
|
36
|
-
(0, console_stamp_1.default)(logger_in, {
|
|
37
|
-
format: '([->]).white :debug.green',
|
|
38
|
-
level: process.env.DEBUG_SIM ? 'debug' : 'error',
|
|
39
|
-
tokens: {
|
|
40
|
-
debug: ({ msg }) => msg.replace(/\r\n/g, '\n')
|
|
41
|
-
.replace(/\r/g, '')
|
|
42
|
-
},
|
|
43
|
-
preventDefaultMessage: true
|
|
44
|
-
});
|
|
45
|
-
logger_in.debug('Debugging is enabled');
|
|
24
|
+
const debug_1 = require("./debug");
|
|
46
25
|
__exportStar(require("serialport"), exports);
|
|
47
26
|
class GSM extends events_1.default {
|
|
48
27
|
constructor(path) {
|
|
49
28
|
super();
|
|
50
29
|
this.onDataHandler = async (data) => {
|
|
51
|
-
var _a;
|
|
52
30
|
if (data.includes('+CMTI:')) { // Incoming Message
|
|
53
31
|
const index = data.toString().split(',')[1];
|
|
54
32
|
const message = await this.getMessage(+index);
|
|
55
33
|
if (message) {
|
|
56
|
-
if (
|
|
34
|
+
if (message.parts === message.indexes.length) {
|
|
57
35
|
this.emit('newMessage', message);
|
|
58
36
|
}
|
|
59
37
|
}
|
|
38
|
+
else {
|
|
39
|
+
console.log('Error getting incoming message.', data.toString());
|
|
40
|
+
}
|
|
60
41
|
}
|
|
61
42
|
};
|
|
62
43
|
this.port = new serialport_1.SerialPort({ path: path, baudRate: 115200 });
|
|
@@ -65,7 +46,7 @@ class GSM extends events_1.default {
|
|
|
65
46
|
this.emit('ready');
|
|
66
47
|
});
|
|
67
48
|
this.port.on('data', (data) => {
|
|
68
|
-
logger_in.debug(data.toString());
|
|
49
|
+
debug_1.logger_in.debug(data.toString());
|
|
69
50
|
this.emit('data', data);
|
|
70
51
|
setImmediate(() => this.onDataHandler(data));
|
|
71
52
|
});
|
|
@@ -95,7 +76,7 @@ class GSM extends events_1.default {
|
|
|
95
76
|
};
|
|
96
77
|
let data = '';
|
|
97
78
|
port.on('data', listener);
|
|
98
|
-
logger_out.debug(command + terminator);
|
|
79
|
+
debug_1.logger_out.debug(command + terminator);
|
|
99
80
|
port.write(`${command}${terminator}`);
|
|
100
81
|
});
|
|
101
82
|
}
|
|
@@ -124,22 +105,16 @@ class GSM extends events_1.default {
|
|
|
124
105
|
await this.setMessage(message);
|
|
125
106
|
}
|
|
126
107
|
async deleteMessage(msg) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
indexes = ((_a = msg.message.parts_raw) === null || _a === void 0 ? void 0 : _a.map(m => m.index)) || [];
|
|
131
|
-
}
|
|
132
|
-
else if (msg) {
|
|
133
|
-
indexes = [msg.index];
|
|
134
|
-
}
|
|
135
|
-
for (const i of indexes) {
|
|
108
|
+
if (!msg)
|
|
109
|
+
return;
|
|
110
|
+
for (const i of msg.indexes) {
|
|
136
111
|
await this.sendCommand(`AT+CMGD=${i}`);
|
|
137
112
|
}
|
|
138
113
|
}
|
|
139
114
|
async deleteAllMessages() {
|
|
140
115
|
return this.sendCommand('AT+CMGD=1,4');
|
|
141
116
|
}
|
|
142
|
-
async
|
|
117
|
+
async getAllPDUMessages() {
|
|
143
118
|
await this.reset();
|
|
144
119
|
await this.setPDUMode();
|
|
145
120
|
const { port } = this;
|
|
@@ -153,17 +128,17 @@ class GSM extends events_1.default {
|
|
|
153
128
|
for (const line of lines) {
|
|
154
129
|
if (line.includes('OK')) {
|
|
155
130
|
port.removeListener('data', listener);
|
|
156
|
-
resolve(msgs
|
|
131
|
+
resolve(msgs);
|
|
157
132
|
}
|
|
158
133
|
else if (line.includes('ERROR')) {
|
|
159
134
|
port.removeListener('data', listener);
|
|
160
135
|
reject();
|
|
161
136
|
}
|
|
162
137
|
else if (line.startsWith('+CMGL: ')) {
|
|
163
|
-
const [index,
|
|
138
|
+
const [index, , raw] = line.replace(/^\+CMGL:\s/, '')
|
|
164
139
|
.split(',')
|
|
165
140
|
.map(s => s.replace(/"/g, ''));
|
|
166
|
-
current = { index: +index,
|
|
141
|
+
current = { index: +index, raw };
|
|
167
142
|
msgs.push(current);
|
|
168
143
|
}
|
|
169
144
|
else {
|
|
@@ -172,13 +147,19 @@ class GSM extends events_1.default {
|
|
|
172
147
|
}
|
|
173
148
|
};
|
|
174
149
|
port.on('data', listener);
|
|
175
|
-
logger_out.debug(command);
|
|
176
150
|
port.write(command);
|
|
177
151
|
});
|
|
178
152
|
}
|
|
153
|
+
parsePDUMessage(msg) {
|
|
154
|
+
return {
|
|
155
|
+
index: msg.index,
|
|
156
|
+
message: pdu_ts_1.PDUParser.Parse(msg.raw)
|
|
157
|
+
};
|
|
158
|
+
}
|
|
179
159
|
async getMessages() {
|
|
180
|
-
|
|
181
|
-
|
|
160
|
+
let messages = (await this.getAllPDUMessages().then(msgs => msgs.map(m => this.parsePDUMessage(m))));
|
|
161
|
+
console.log('msg count', messages.length);
|
|
162
|
+
messages = messages.map(m => {
|
|
182
163
|
if (m.message.udh) {
|
|
183
164
|
if (m.message.udh.current_part === 1) {
|
|
184
165
|
const parts = messages
|
|
@@ -197,17 +178,27 @@ class GSM extends events_1.default {
|
|
|
197
178
|
}
|
|
198
179
|
return undefined;
|
|
199
180
|
}
|
|
200
|
-
return { ...m, multipart: false, parts: 1 };
|
|
181
|
+
return { ...m, multipart: false, message: { ...m.message, parts: 1 } };
|
|
201
182
|
}).filter(m => m !== undefined);
|
|
183
|
+
return messages.map(m => GSM.convertToCleanMessage(m));
|
|
202
184
|
}
|
|
203
185
|
async getMessage(index) {
|
|
204
186
|
const messages = await this.getMessages();
|
|
205
|
-
let message = messages.find(m => m.index === index);
|
|
206
|
-
if (!message) {
|
|
207
|
-
message = messages.find(m => { var _a; return (_a = m.message.parts_raw) === null || _a === void 0 ? void 0 : _a.find(m2 => m2.index === index); });
|
|
208
|
-
}
|
|
187
|
+
let message = messages.find(m => m.index === index) || messages.find(m => m.indexes.find(m2 => m2 === index));
|
|
209
188
|
return message || undefined;
|
|
210
189
|
}
|
|
190
|
+
static convertToCleanMessage(message) {
|
|
191
|
+
var _a;
|
|
192
|
+
const senderPrefix = message.message.senderType === 91 ? '' : '+';
|
|
193
|
+
return {
|
|
194
|
+
index: message.index,
|
|
195
|
+
parts: message.message.parts,
|
|
196
|
+
indexes: ((_a = message.message.parts_raw) === null || _a === void 0 ? void 0 : _a.map(m => m.index)) || [message.index],
|
|
197
|
+
text: message.message.text,
|
|
198
|
+
sender: senderPrefix + message.message.sender,
|
|
199
|
+
time: message.message.time,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
211
202
|
}
|
|
212
203
|
exports.GSM = GSM;
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBa0M7QUFDbEMsMkNBQXNDO0FBQ3RDLG1DQUE2QztBQUM3QyxtQ0FBOEM7QUE2QzlDLDZDQUEyQjtBQUUzQixNQUFhLEdBQUksU0FBUSxnQkFBWTtJQUlqQyxZQUFZLElBQVk7UUFDcEIsS0FBSyxFQUFFLENBQUM7UUFvQkosa0JBQWEsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsbUJBQW1CO2dCQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxPQUFPLEVBQUU7b0JBQ1QsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO3dCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDcEM7aUJBQ0o7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztpQkFDbkU7YUFDSjtRQUNMLENBQUMsQ0FBQTtRQS9CRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksdUJBQVUsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUss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
|