@starak/sim800c 0.0.5 → 0.0.7
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/README.md +2 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.js +41 -35
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
import EventEmitter from "events";
|
|
3
3
|
import { SerialPort } from "serialport";
|
|
4
4
|
import { pduMessage } from "pdu.ts";
|
|
5
|
+
export interface UDH {
|
|
6
|
+
parts: number;
|
|
7
|
+
current_part: number;
|
|
8
|
+
reference_number: string;
|
|
9
|
+
length: string;
|
|
10
|
+
iei: string;
|
|
11
|
+
}
|
|
5
12
|
export interface EpduMessage extends pduMessage {
|
|
6
|
-
udh
|
|
13
|
+
udh?: UDH;
|
|
7
14
|
multipart: boolean;
|
|
8
|
-
parts
|
|
15
|
+
parts: number;
|
|
9
16
|
parts_raw?: GsmMessage[];
|
|
10
17
|
sender?: string;
|
|
11
18
|
senderType?: number;
|
|
@@ -29,8 +36,9 @@ export declare class GSM extends EventEmitter {
|
|
|
29
36
|
private setPDUMode;
|
|
30
37
|
private setRecipient;
|
|
31
38
|
private setMessage;
|
|
39
|
+
rejectCalls(): Promise<void>;
|
|
32
40
|
sendMessage(number: string, message: string): Promise<void>;
|
|
33
|
-
deleteMessage(
|
|
41
|
+
deleteMessage(msg: GsmMessage): Promise<void>;
|
|
34
42
|
deleteAllMessages(): Promise<void>;
|
|
35
43
|
private Messages;
|
|
36
44
|
getMessages(): Promise<GsmMessage[]>;
|
package/dist/index.js
CHANGED
|
@@ -22,33 +22,38 @@ const events_1 = __importDefault(require("events"));
|
|
|
22
22
|
const serialport_1 = require("serialport");
|
|
23
23
|
const pdu_ts_1 = require("pdu.ts");
|
|
24
24
|
const console_stamp_1 = __importDefault(require("console-stamp"));
|
|
25
|
-
|
|
26
|
-
(
|
|
27
|
-
|
|
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',
|
|
28
29
|
level: process.env.DEBUG_SIM ? 'debug' : 'error',
|
|
29
30
|
tokens: {
|
|
30
31
|
debug: ({ msg }) => msg.replace(/\r\n/g, '\n')
|
|
32
|
+
.replace(/\r/g, '')
|
|
31
33
|
},
|
|
32
34
|
preventDefaultMessage: true
|
|
33
35
|
});
|
|
34
|
-
|
|
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');
|
|
35
46
|
__exportStar(require("serialport"), exports);
|
|
36
|
-
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
37
47
|
class GSM extends events_1.default {
|
|
38
48
|
constructor(path) {
|
|
39
49
|
super();
|
|
40
50
|
this.onDataHandler = async (data) => {
|
|
41
|
-
var _a;
|
|
51
|
+
var _a, _b;
|
|
42
52
|
if (data.includes('+CMTI:')) { // Incoming Message
|
|
43
53
|
const index = data.toString().split(',')[1];
|
|
44
54
|
const message = await this.getMessage(+index);
|
|
45
55
|
if (message) {
|
|
46
|
-
if (message.message.multipart
|
|
47
|
-
// We need to wait for the rest of the message
|
|
48
|
-
await sleep(500);
|
|
49
|
-
setImmediate(() => this.onDataHandler(data));
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
56
|
+
if (!message.message.multipart || ((_a = message.message.udh) === null || _a === void 0 ? void 0 : _a.parts) === ((_b = message.message.udh) === null || _b === void 0 ? void 0 : _b.current_part)) {
|
|
52
57
|
this.emit('newMessage', message);
|
|
53
58
|
}
|
|
54
59
|
}
|
|
@@ -60,7 +65,7 @@ class GSM extends events_1.default {
|
|
|
60
65
|
this.emit('ready');
|
|
61
66
|
});
|
|
62
67
|
this.port.on('data', (data) => {
|
|
63
|
-
|
|
68
|
+
logger_in.debug(data.toString());
|
|
64
69
|
this.emit('data', data);
|
|
65
70
|
setImmediate(() => this.onDataHandler(data));
|
|
66
71
|
});
|
|
@@ -90,6 +95,7 @@ class GSM extends events_1.default {
|
|
|
90
95
|
};
|
|
91
96
|
let data = '';
|
|
92
97
|
port.on('data', listener);
|
|
98
|
+
logger_out.debug(command + terminator);
|
|
93
99
|
port.write(`${command}${terminator}`);
|
|
94
100
|
});
|
|
95
101
|
}
|
|
@@ -108,22 +114,23 @@ class GSM extends events_1.default {
|
|
|
108
114
|
async setMessage(message) {
|
|
109
115
|
return this.sendCommand(`${message}`, '\x1a');
|
|
110
116
|
}
|
|
117
|
+
async rejectCalls() {
|
|
118
|
+
return this.sendCommand('AT+GSMBUSY=1');
|
|
119
|
+
}
|
|
111
120
|
async sendMessage(number, message) {
|
|
112
121
|
await this.reset();
|
|
113
122
|
await this.setTextMode();
|
|
114
123
|
await this.setRecipient(number);
|
|
115
124
|
await this.setMessage(message);
|
|
116
125
|
}
|
|
117
|
-
async deleteMessage(
|
|
126
|
+
async deleteMessage(msg) {
|
|
118
127
|
var _a;
|
|
119
|
-
const messages = await this.getMessages();
|
|
120
|
-
const current = messages.find(m => m.index === index);
|
|
121
128
|
let indexes = [];
|
|
122
|
-
if (
|
|
123
|
-
indexes = ((_a =
|
|
129
|
+
if (msg && msg.message.multipart) {
|
|
130
|
+
indexes = ((_a = msg.message.parts_raw) === null || _a === void 0 ? void 0 : _a.map(m => m.index)) || [];
|
|
124
131
|
}
|
|
125
|
-
else if (
|
|
126
|
-
indexes = [index];
|
|
132
|
+
else if (msg) {
|
|
133
|
+
indexes = [msg.index];
|
|
127
134
|
}
|
|
128
135
|
for (const i of indexes) {
|
|
129
136
|
await this.sendCommand(`AT+CMGD=${i}`);
|
|
@@ -136,21 +143,17 @@ class GSM extends events_1.default {
|
|
|
136
143
|
await this.reset();
|
|
137
144
|
await this.setPDUMode();
|
|
138
145
|
const { port } = this;
|
|
146
|
+
let data = '', msgs = [], current = {};
|
|
139
147
|
return new Promise((resolve, reject) => {
|
|
140
|
-
|
|
148
|
+
const command = 'AT+CMGL=4\r';
|
|
141
149
|
const listener = async (d) => {
|
|
142
150
|
data += d.toString();
|
|
143
151
|
const lines = data.split('\r\n');
|
|
144
152
|
data = lines.pop() || '';
|
|
145
153
|
for (const line of lines) {
|
|
146
154
|
if (line.includes('OK')) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
port.removeListener('data', listener);
|
|
152
|
-
resolve(msgs.map(m => ({ ...m, message: pdu_ts_1.PDUParser.Parse(m.raw) })));
|
|
153
|
-
}
|
|
155
|
+
port.removeListener('data', listener);
|
|
156
|
+
resolve(msgs.map(m => ({ ...m, message: pdu_ts_1.PDUParser.Parse(m.raw) })));
|
|
154
157
|
}
|
|
155
158
|
else if (line.includes('ERROR')) {
|
|
156
159
|
port.removeListener('data', listener);
|
|
@@ -162,16 +165,15 @@ class GSM extends events_1.default {
|
|
|
162
165
|
.map(s => s.replace(/"/g, ''));
|
|
163
166
|
current = { index: +index, state, raw, message: {} };
|
|
164
167
|
msgs.push(current);
|
|
165
|
-
init = true;
|
|
166
168
|
}
|
|
167
169
|
else {
|
|
168
170
|
current.raw += line;
|
|
169
171
|
}
|
|
170
172
|
}
|
|
171
173
|
};
|
|
172
|
-
let data = '', msgs = [], current = {};
|
|
173
174
|
port.on('data', listener);
|
|
174
|
-
|
|
175
|
+
logger_out.debug(command);
|
|
176
|
+
port.write(command);
|
|
175
177
|
});
|
|
176
178
|
}
|
|
177
179
|
async getMessages() {
|
|
@@ -181,7 +183,7 @@ class GSM extends events_1.default {
|
|
|
181
183
|
if (m.message.udh.current_part === 1) {
|
|
182
184
|
const parts = messages
|
|
183
185
|
.filter(m2 => m2.message.udh)
|
|
184
|
-
.filter(m2 => m2.message.udh.reference_number === m.message.udh.reference_number);
|
|
186
|
+
.filter(m2 => { var _a, _b; return ((_a = m2.message.udh) === null || _a === void 0 ? void 0 : _a.reference_number) === ((_b = m.message.udh) === null || _b === void 0 ? void 0 : _b.reference_number); });
|
|
185
187
|
return {
|
|
186
188
|
...m,
|
|
187
189
|
message: {
|
|
@@ -195,13 +197,17 @@ class GSM extends events_1.default {
|
|
|
195
197
|
}
|
|
196
198
|
return undefined;
|
|
197
199
|
}
|
|
198
|
-
return { ...m, multipart: false };
|
|
200
|
+
return { ...m, multipart: false, parts: 1 };
|
|
199
201
|
}).filter(m => m !== undefined);
|
|
200
202
|
}
|
|
201
203
|
async getMessage(index) {
|
|
202
204
|
const messages = await this.getMessages();
|
|
203
|
-
|
|
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
|
+
}
|
|
209
|
+
return message || undefined;
|
|
204
210
|
}
|
|
205
211
|
}
|
|
206
212
|
exports.GSM = GSM;
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBa0M7QUFDbEMsMkNBQXNDO0FBQ3RDLG1DQUE2QztBQUM3QyxrRUFBMEM7QUFHMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZFLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV0RSxJQUFBLHVCQUFhLEVBQUMsVUFBVSxFQUFFO0lBQ3RCLE1BQU0sRUFBRSx5QkFBeUI7SUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87SUFDaEQsTUFBTSxFQUFFO1FBQ0osS0FBSyxFQUFFLENBQUMsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO2FBQ3ZDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0tBQzFCO0lBQ0QscUJBQXFCLEVBQUUsSUFBSTtDQUM5QixDQUFDLENBQUM7QUFFSCxJQUFBLHVCQUFhLEVBQUMsU0FBUyxFQUFFO0lBQ3JCLE1BQU0sRUFBRSwyQkFBMkI7SUFDbkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87SUFDaEQsTUFBTSxFQUFFO1FBQ0osS0FBSyxFQUFFLENBQUMsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFP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
|