@starak/sim800c 0.0.20 → 2.0.1

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022 Ståle Raknes
3
+ Copyright (c) 2024 Ståle Raknes
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -10,29 +10,19 @@ $ npm install @starak/sim800c
10
10
 
11
11
  ### Usage
12
12
  ```js
13
- const {GSM, SerialPort} = require('@starak/sim800c');
13
+ const {SIM800C} = require('@starak/sim800c');
14
14
 
15
15
  (async () => {
16
- let SIM_PATH;
17
- await SerialPort.list().then((ports) => {
18
- const port = ports.find(p => p.path.includes('tty.usbserial'));
19
- if(port){
20
- console.log('Using SIM', port.path);
21
- SIM_PATH = port.path;
22
- }
16
+ const path = '/dev/serial0';
17
+
18
+ const gsm = new SIM800C({path});
19
+ await gsm.open();
20
+ await gsm.sendMessage('55512345', 'Hello from SIM800C');
21
+ console.log('Message sent');
22
+ gsm.on('message', async (message) => {
23
+ console.log('newMessage', message);
24
+ await gsm.deleteMessage(message.index);
23
25
  });
24
26
 
25
- if(SIM_PATH) {
26
- const gsm = new GSM(SIM_PATH);
27
- await gsm.ready();
28
- await gsm.sendMessage('55512345', 'Hello from SIM800C');
29
- console.log('Message sent');
30
- gsm.on('newMessage', async (message) => {
31
- console.log('newMessage', message);
32
- await gsm.deleteMessage(message.index);
33
- });
34
- }else{
35
- throw new Error('No SIM found');
36
- }
37
27
  })();
38
28
  ```
package/dist/index.d.ts CHANGED
@@ -1,68 +1,3 @@
1
- import EventEmitter from "eventemitter3";
2
- import PQueue from 'p-queue';
3
- import { SerialPort } from "serialport";
4
- import { pduMessage } from "pdu.ts";
5
- interface UDH {
6
- parts: number;
7
- current_part: number;
8
- reference_number: string;
9
- length: string;
10
- iei: string;
11
- }
12
- interface EpduMessage extends pduMessage {
13
- udh?: UDH;
14
- multipart: boolean;
15
- parts: number;
16
- parts_raw?: GsmMessage[];
17
- sender?: string;
18
- senderType?: number;
19
- time: Date;
20
- }
21
- interface GsmMessage {
22
- index: number;
23
- message: EpduMessage;
24
- raw: string;
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;
41
- }
42
1
  export * from "serialport";
43
- export declare class GSM extends EventEmitter {
44
- port: SerialPort;
45
- _ready: Promise<void>;
46
- _sendQueue: PQueue;
47
- constructor(path: string);
48
- ready(): Promise<void>;
49
- private onDataHandler;
50
- private sendCommand;
51
- reset(): Promise<void>;
52
- private setTextMode;
53
- private setPDUMode;
54
- private setRecipient;
55
- private setLength;
56
- private setMessage;
57
- rejectCalls(): Promise<void>;
58
- sendMessageTxt(number: string, message: string): Promise<void>;
59
- sendMessage(number: string, message: string): Promise<void>;
60
- sendQueue(number: string, message: string): Promise<void>;
61
- deleteMessage(msg: Message): Promise<void>;
62
- deleteAllMessages(): Promise<void>;
63
- getAllPDUMessages(): Promise<PDUMessage[]>;
64
- parsePDUMessage(msg: PDUMessage): ParsedPDUMessage;
65
- getMessages(): Promise<Message[]>;
66
- getMessage(index: number): Promise<Message>;
67
- static convertToCleanMessage(message: ParsedPDUMessage): Message;
68
- }
2
+ export type { Message } from './lib/types';
3
+ export { SIM800C } from "./lib/sim800c";
package/dist/index.js CHANGED
@@ -13,216 +13,9 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
13
13
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
- var __importDefault = (this && this.__importDefault) || function (mod) {
17
- return (mod && mod.__esModule) ? mod : { "default": mod };
18
- };
19
16
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.GSM = void 0;
21
- const eventemitter3_1 = __importDefault(require("eventemitter3"));
22
- const p_queue_1 = __importDefault(require("p-queue"));
23
- const serialport_1 = require("serialport");
24
- const pdu_ts_1 = require("pdu.ts");
25
- const debug_1 = require("./debug");
26
- // @ts-ignore
27
- const node_pdu_1 = __importDefault(require("node-pdu"));
17
+ exports.SIM800C = void 0;
28
18
  __exportStar(require("serialport"), exports);
29
- class GSM extends eventemitter3_1.default {
30
- constructor(path) {
31
- super();
32
- this._sendQueue = new p_queue_1.default({ concurrency: 1 });
33
- this.onDataHandler = async (data) => {
34
- if (data.includes('+CMTI:')) { // Incoming Message
35
- const index = data.toString().split(',')[1];
36
- const message = await this.getMessage(+index);
37
- if (message) {
38
- if (message.parts === message.indexes.length) {
39
- this.emit('newMessage', message);
40
- }
41
- }
42
- else {
43
- console.log('Error getting incoming message.', data.toString());
44
- throw new Error('Error getting incoming message.' + data.toString());
45
- }
46
- }
47
- };
48
- this.port = new serialport_1.SerialPort({ path: path, baudRate: 115200 });
49
- this.port.on('open', async () => {
50
- await this.reset();
51
- this.emit('ready');
52
- });
53
- this.port.on('data', (data) => {
54
- debug_1.logger_in.debug(data.toString());
55
- this.emit('data', data);
56
- setImmediate(() => this.onDataHandler(data));
57
- });
58
- this._ready = new Promise((resolve) => {
59
- this.on('ready', resolve);
60
- });
61
- }
62
- async ready() {
63
- return this._ready;
64
- }
65
- async sendCommand(command, terminator = '\r') {
66
- const { port } = this;
67
- return new Promise((resolve, reject) => {
68
- const listener = async (d) => {
69
- data += d.toString();
70
- if (data.includes('OK') || data.includes('>')) {
71
- port.removeListener('data', listener);
72
- resolve();
73
- }
74
- else if (data.includes('ERROR')) {
75
- port.removeListener('data', listener);
76
- reject('error');
77
- }
78
- else {
79
- //console.log('none', command, data);
80
- }
81
- };
82
- let data = '';
83
- port.on('data', listener);
84
- debug_1.logger_out.debug(command + terminator);
85
- port.write(`${command}${terminator}`);
86
- });
87
- }
88
- async reset() {
89
- return this.sendCommand('ATZ').then(() => this.rejectCalls());
90
- }
91
- async setTextMode() {
92
- return this.sendCommand('AT+CMGF=1');
93
- }
94
- async setPDUMode() {
95
- return this.sendCommand('AT+CMGF=0');
96
- }
97
- async setRecipient(number) {
98
- return this.sendCommand(`AT+CMGS="${number}"`);
99
- }
100
- async setLength(length) {
101
- return this.sendCommand(`AT+CMGS=${length}`);
102
- }
103
- async setMessage(message) {
104
- return this.sendCommand(`${message}`, '\x1a');
105
- }
106
- async rejectCalls() {
107
- return this.sendCommand('AT+GSMBUSY=1');
108
- }
109
- async sendMessageTxt(number, message) {
110
- await this.reset();
111
- await this.setTextMode();
112
- await this.setRecipient(number);
113
- await this.setMessage(message);
114
- }
115
- async sendMessage(number, message) {
116
- let submit = node_pdu_1.default.Submit();
117
- submit.setAddress(number.replace('+', ''));
118
- submit.setData(message);
119
- submit.getDcs().setUseMessageClass(false);
120
- const parts = submit.getParts();
121
- await this.reset();
122
- await this.setPDUMode();
123
- for (let i = 0; i < parts.length; i++) {
124
- await this.setLength((parts[i].toString().length / 2) - 1);
125
- await this.setMessage(parts[i].toString());
126
- }
127
- }
128
- async sendQueue(number, message) {
129
- return this._sendQueue.add(() => this.sendMessage(number, message));
130
- }
131
- async deleteMessage(msg) {
132
- if (!msg)
133
- return;
134
- for (const i of msg.indexes) {
135
- await this.sendCommand(`AT+CMGD=${i}`);
136
- }
137
- }
138
- async deleteAllMessages() {
139
- return this.sendCommand('AT+CMGD=1,4');
140
- }
141
- async getAllPDUMessages() {
142
- await this.reset();
143
- await this.setPDUMode();
144
- const { port } = this;
145
- let data = '', msgs = [], current = {};
146
- return new Promise((resolve, reject) => {
147
- const command = 'AT+CMGL=4\r';
148
- const listener = async (d) => {
149
- data += d.toString();
150
- const lines = data.split('\r\n');
151
- data = lines.pop() || '';
152
- for (const line of lines) {
153
- if (line.includes('OK')) {
154
- port.removeListener('data', listener);
155
- resolve(msgs);
156
- }
157
- else if (line.includes('ERROR')) {
158
- port.removeListener('data', listener);
159
- reject();
160
- }
161
- else if (line.startsWith('+CMGL: ')) {
162
- const [index, , raw] = line.replace(/^\+CMGL:\s/, '')
163
- .split(',')
164
- .map(s => s.replace(/"/g, ''));
165
- current = { index: +index, raw };
166
- msgs.push(current);
167
- }
168
- else {
169
- current.raw += line;
170
- }
171
- }
172
- };
173
- port.on('data', listener);
174
- port.write(command);
175
- });
176
- }
177
- parsePDUMessage(msg) {
178
- return {
179
- index: msg.index,
180
- message: pdu_ts_1.PDUParser.Parse(msg.raw)
181
- };
182
- }
183
- async getMessages() {
184
- let messages = (await this.getAllPDUMessages().then(msgs => msgs.map(m => this.parsePDUMessage(m))));
185
- messages = messages.map(m => {
186
- if (m.message.udh) {
187
- if (m.message.udh.current_part === 1) {
188
- const parts = messages
189
- .filter(m2 => m2.message.udh)
190
- .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); })
191
- .sort((a, b) => { var _a, _b; return (((_a = a.message.udh) === null || _a === void 0 ? void 0 : _a.current_part) || 0) - (((_b = b.message.udh) === null || _b === void 0 ? void 0 : _b.current_part) || 0); });
192
- return {
193
- ...m,
194
- message: {
195
- ...m.message,
196
- text: parts.map(m2 => m2.message.text).join(''),
197
- multipart: true,
198
- parts: m.message.udh.parts,
199
- parts_raw: parts
200
- }
201
- };
202
- }
203
- return undefined;
204
- }
205
- return { ...m, multipart: false, message: { ...m.message, parts: 1 } };
206
- }).filter(m => m !== undefined);
207
- return messages.map(m => GSM.convertToCleanMessage(m));
208
- }
209
- async getMessage(index) {
210
- const messages = await this.getMessages();
211
- let message = messages.find(m => m.index === index) || messages.find(m => m.indexes.find(m2 => m2 === index));
212
- return message || undefined;
213
- }
214
- static convertToCleanMessage(message) {
215
- var _a;
216
- const senderPrefix = message.message.senderType === 91 ? '' : '+';
217
- return {
218
- index: message.index,
219
- parts: message.message.parts,
220
- indexes: ((_a = message.message.parts_raw) === null || _a === void 0 ? void 0 : _a.map(m => m.index)) || [message.index],
221
- text: message.message.text,
222
- sender: senderPrefix + message.message.sender,
223
- time: message.message.time,
224
- };
225
- }
226
- }
227
- exports.GSM = GSM;
228
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrRUFBeUM7QUFDekMsc0RBQTZCO0FBQzdCLDJDQUFzQztBQUN0QyxtQ0FBNkM7QUFDN0MsbUNBQThDO0FBQzlDLGFBQWE7QUFDYix3REFBMkI7QUE2QzNCLDZDQUEyQjtBQUUzQixNQUFhLEdBQUksU0FBUSx1QkFBWTtJQUtqQyxZQUFZLElBQVk7UUFDcEIsS0FBSyxFQUFFLENBQUM7UUFIWixlQUFVLEdBQVcsSUFBSSxpQkFBTSxDQUFDLEVBQUMsV0FBVyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7UUF1QjFDLGtCQUFhLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLG1CQUFtQjtnQkFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlDLElBQUksT0FBTyxFQUFFO29CQUNULElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTt3QkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7cUJBQ3BDO2lCQUNKO3FCQUFNO29CQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7aUJB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
19
+ var sim800c_1 = require("./lib/sim800c");
20
+ Object.defineProperty(exports, "SIM800C", { enumerable: true, get: function () { return sim800c_1.SIM800C; } });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkI7QUFFM0IseUNBQXNDO0FBQTlCLGtHQUFBLE9BQU8sT0FBQSJ9
@@ -0,0 +1,14 @@
1
+ import EventEmitter from "eventemitter3";
2
+ import { Stream } from "./stream";
3
+ import { SendCommandResponse } from "./types";
4
+ export declare class AtSerial extends EventEmitter {
5
+ private readonly options;
6
+ serialStream: Stream;
7
+ private port;
8
+ private parser;
9
+ private commandQueue;
10
+ constructor(options?: {});
11
+ open(): Promise<void>;
12
+ close(): Promise<void>;
13
+ sendCommand(command: string, terminator?: string, timeout?: number): Promise<SendCommandResponse>;
14
+ }
@@ -0,0 +1,102 @@
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.AtSerial = void 0;
7
+ const serialport_1 = require("serialport");
8
+ const parser_readline_1 = require("@serialport/parser-readline");
9
+ const eventemitter3_1 = __importDefault(require("eventemitter3"));
10
+ const p_queue_1 = __importDefault(require("p-queue"));
11
+ const stream_1 = require("./stream");
12
+ const DEFAULT_PORT_OPTIONS = {
13
+ baudRate: 115200,
14
+ dataBits: 8,
15
+ stopBits: 1,
16
+ parity: 'none',
17
+ line_end: '\r\n',
18
+ read_time: 1000,
19
+ path: '',
20
+ };
21
+ class AtSerial extends eventemitter3_1.default {
22
+ constructor(options = {}) {
23
+ super();
24
+ this.serialStream = new stream_1.Stream();
25
+ this.commandQueue = new p_queue_1.default({ concurrency: 1 });
26
+ this.options = Object.assign({}, DEFAULT_PORT_OPTIONS, options);
27
+ }
28
+ open() {
29
+ return new Promise((resolve, reject) => {
30
+ this.port = new serialport_1.SerialPort(this.options);
31
+ this.parser = new parser_readline_1.ReadlineParser({ delimiter: '\r\n' });
32
+ this.parser.on('data', (data) => {
33
+ this.serialStream.incomming(data + '\n');
34
+ if (/\+CMTI:/.test(data)) { // Incoming Message
35
+ const index = data.split(',')[1];
36
+ this.emit('_incomming_message', index);
37
+ }
38
+ });
39
+ this.port.pipe(this.parser);
40
+ this.port.on('open', () => void resolve());
41
+ this.port.on('error', err => void reject(err));
42
+ });
43
+ }
44
+ close() {
45
+ return new Promise((resolve, reject) => {
46
+ var _a, _b;
47
+ (_a = this.port) === null || _a === void 0 ? void 0 : _a.unpipe();
48
+ (_b = this.port) === null || _b === void 0 ? void 0 : _b.close(err => err ? reject(err) : resolve());
49
+ });
50
+ }
51
+ async sendCommand(command, terminator = '\r', timeout = 30000) {
52
+ return this.commandQueue.add(() => new Promise((resolve, reject) => {
53
+ const start = new Date();
54
+ let end;
55
+ const { port, parser } = this;
56
+ const commands = command.split(/\s?>\s?/);
57
+ const terminators = terminator.split(/\s?>\s?/);
58
+ if (!port || !parser) {
59
+ throw new Error('Port not open');
60
+ }
61
+ let commandTimeout;
62
+ let response = [];
63
+ const listener = (chunkB) => {
64
+ const chunk = chunkB.toString();
65
+ response.push(chunk);
66
+ if (chunk.includes('ERROR')) {
67
+ clearTimeout(commandTimeout);
68
+ port.removeListener('data', listener);
69
+ reject(new Error('Command error'));
70
+ return;
71
+ }
72
+ if (chunk.includes('OK')) {
73
+ clearTimeout(commandTimeout);
74
+ port.removeListener('data', listener);
75
+ end = new Date();
76
+ resolve({
77
+ command,
78
+ start,
79
+ end,
80
+ executionTime: end.getTime() - start.getTime(),
81
+ response: response.join('\n'),
82
+ });
83
+ }
84
+ if (chunk.includes('>') && commands.length > 1) {
85
+ const c = `${commands[1]}${terminators[1]}`;
86
+ this.serialStream.outgoing(c);
87
+ port.write(c);
88
+ }
89
+ };
90
+ port.on('data', listener);
91
+ const c = `${commands[0]}${terminators[0]}`;
92
+ this.serialStream.outgoing(c.replace(/\r/g, '\n'));
93
+ port.write(c);
94
+ commandTimeout = setTimeout(() => {
95
+ port.removeListener('data', listener);
96
+ reject(new Error('Command timeout:' + command));
97
+ }, timeout);
98
+ }));
99
+ }
100
+ }
101
+ exports.AtSerial = AtSerial;
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXQtc2VyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9hdC1zZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQXNDO0FBQ3RDLGlFQUF1RTtBQUN2RSxrRUFBeUM7QUFDekMsc0RBQTRCO0FBQzVCLHFDQUFnQztBQUdoQyxNQUFNLG9CQUFvQixHQUFpQjtJQUN2QyxRQUFRLEVBQUcsTUFBTTtJQUNqQixRQUFRLEVBQUcsQ0FBQztJQUNaLFFBQVEsRUFBRyxDQUFDO0lBQ1osTUFBTSxFQUFLLE1BQU07SUFDakIsUUFBUSxFQUFHLE1BQU07SUFDakIsU0FBUyxFQUFFLElBQUk7SUFDZixJQUFJLEVBQU8sRUFBRTtDQUNoQixDQUFDO0FBRUYsTUFBYSxRQUFTLFNBQVEsdUJBQVk7SUFNdEMsWUFBYSxPQUFPLEdBQUcsRUFBRTtRQUNyQixLQUFLLEVBQUUsQ0FBQztRQUxMLGlCQUFZLEdBQUcsSUFBSSxlQUFNLEVBQUUsQ0FBQztRQUczQixpQkFBWSxHQUFVLElBQUksaUJBQUssQ0FBQyxFQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1FBR3RELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLElBQUk7UUFDUCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSx1QkFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0NBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLG1CQUFtQjtvQkFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDMUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sS0FBSztRQUNSLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7O1lBQ25DLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEIsTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQWUsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDL0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN6QixJQUFJLEdBQUcsQ0FBQztZQUNSLE1BQU0sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQ3BDO1lBRUQsSUFBSSxjQUE4QixDQUFDO1lBQ25DLElBQUksUUFBUSxHQUFhLEVBQUUsQ0FBQztZQUM1QixNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO2dCQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDekIsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDdEMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLE9BQU87aUJBQ1Y7Z0JBRUQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN0QixZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUN0QyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDakIsT0FBTyxDQUFDO3dCQUNKLE9BQU87d0JBQ1AsS0FBSzt3QkFDTCxHQUFHO3dCQUNILGFBQWEsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRTt3QkFDOUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNoQyxDQUFDLENBQUM7aUJBQ047Z0JBRUQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM1QyxNQUFNLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2pCO1lBRUwsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWQsY0FBYyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNwRCxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Q0FDSjtBQTVGRCw0QkE0RkMifQ==
@@ -0,0 +1,11 @@
1
+ /// <reference types="node" />
2
+ import { Readable, ReadableOptions } from "stream";
3
+ export declare class Logger extends Readable {
4
+ private debug;
5
+ private readonly console;
6
+ constructor(opts: ReadableOptions, debug?: boolean);
7
+ _read(_: number): void;
8
+ incomming(message?: string): void;
9
+ outgoing(message?: string): void;
10
+ log(message?: string): void;
11
+ }
@@ -0,0 +1,35 @@
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 = void 0;
7
+ const stream_1 = require("stream");
8
+ const console_stamp_1 = __importDefault(require("console-stamp"));
9
+ class Logger extends stream_1.Readable {
10
+ constructor(opts, debug = false) {
11
+ super(opts);
12
+ this.debug = debug;
13
+ this.console = new console.Console(process.stdout, process.stderr);
14
+ (0, console_stamp_1.default)(this.console, {
15
+ format: '(SIM800C).yellow :date(yyyy/mm/dd HH:MM:ss.l).white :label.cyan',
16
+ stdout: process.stdout,
17
+ stderr: process.stderr,
18
+ level: this.debug ? 'debug' : 'info',
19
+ });
20
+ }
21
+ _read(_) {
22
+ // No implementation needed for pushing data manually
23
+ }
24
+ incomming(message = '') {
25
+ this.push(`>> ${message.toString().replace(/ /g, '\u2e31')}`);
26
+ }
27
+ outgoing(message = '') {
28
+ this.push(`<< ${message.replace(/ /g, '\u2e31')}`);
29
+ }
30
+ log(message = '') {
31
+ this.console.debug(message);
32
+ }
33
+ }
34
+ exports.Logger = Logger;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbUNBQWlEO0FBQ2pELGtFQUE4QjtBQUU5QixNQUFhLE1BQU8sU0FBUSxpQkFBUTtJQUVoQyxZQUFZLElBQXFCLEVBQVUsUUFBUSxLQUFLO1FBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUQyQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBRXBELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBRSxDQUFDO1FBQ3JFLElBQUEsdUJBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsTUFBTSxFQUFFLGlFQUFpRTtZQUN6RSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU07U0FDdkMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFTO1FBQ1gscURBQXFEO0lBQ3pELENBQUM7SUFFRCxTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUU7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELEdBQUcsQ0FBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FDSjtBQTVCRCx3QkE0QkMifQ==
@@ -0,0 +1,15 @@
1
+ import { AtSerial } from "./at-serial";
2
+ import { Message, RawMessagePDU, SIM800COptions } from "./types";
3
+ export declare class SIM800C extends AtSerial {
4
+ private queue;
5
+ constructor(options: SIM800COptions);
6
+ reset(): Promise<void>;
7
+ rejectCalls(): Promise<void>;
8
+ private setPDUMode;
9
+ sendMessage(number: string, message: string): Promise<void>;
10
+ getAllPDUMessages(): Promise<RawMessagePDU[]>;
11
+ getMessages(): Promise<Message[]>;
12
+ getMessage(index: number): Promise<Message>;
13
+ deleteMessage(msg: Message): Promise<void>;
14
+ deleteAllMessages(): Promise<void>;
15
+ }
@@ -0,0 +1,109 @@
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.SIM800C = void 0;
7
+ const at_serial_1 = require("./at-serial");
8
+ const node_pdu_1 = require("node-pdu");
9
+ const p_queue_1 = __importDefault(require("p-queue"));
10
+ const utils_1 = require("./utils");
11
+ const console_stamp_1 = __importDefault(require("console-stamp"));
12
+ const logger = new console.Console(process.stdout, process.stderr);
13
+ (0, console_stamp_1.default)(logger, { level: 'warn' });
14
+ const CTRL_Z = '\x1a';
15
+ class SIM800C extends at_serial_1.AtSerial {
16
+ constructor(options) {
17
+ super(options);
18
+ this.queue = new p_queue_1.default({ concurrency: 1 });
19
+ this.on('_incomming_message', async (index) => {
20
+ const message = await this.getMessage(+index);
21
+ if (message) {
22
+ this.emit('message', message);
23
+ }
24
+ });
25
+ }
26
+ async reset() {
27
+ const c = await this.sendCommand('ATZ');
28
+ logger.debug(JSON.stringify(c));
29
+ await this.rejectCalls();
30
+ }
31
+ async rejectCalls() {
32
+ const c = await this.sendCommand('AT+GSMBUSY=1');
33
+ logger.debug(JSON.stringify(c));
34
+ }
35
+ async setPDUMode() {
36
+ const c = await this.sendCommand(`AT+CMGF=0`);
37
+ logger.debug(JSON.stringify(c));
38
+ }
39
+ async sendMessage(number, message) {
40
+ return this.queue.add(async () => {
41
+ message += "\u200B"; // Add zero-width space to the end of the message to force unicode as a workaround for the 7-bit bug in node-pdu.
42
+ let submit = new node_pdu_1.Submit(number, message);
43
+ submit.dataCodingScheme.setUseMessageClass(false);
44
+ const parts = submit.getPartStrings();
45
+ await this.reset();
46
+ await this.setPDUMode();
47
+ for (let i = 0; i < parts.length; i++) {
48
+ const pdu = parts[i];
49
+ const smscInfoLength = (parseInt(pdu.substring(0, 2), 16) + 1) * 2;
50
+ const userDataLength = (pdu.length - smscInfoLength) / 2;
51
+ const command = `AT+CMGS=${userDataLength} > ${pdu}`;
52
+ const terminator = `\r > ${CTRL_Z}`;
53
+ const c = await this.sendCommand(command, terminator);
54
+ logger.debug(JSON.stringify(c));
55
+ }
56
+ }).catch(e => {
57
+ throw e;
58
+ });
59
+ }
60
+ async getAllPDUMessages() {
61
+ await this.reset();
62
+ await this.setPDUMode();
63
+ const data = await this.sendCommand('AT+CMGL=4');
64
+ logger.debug(JSON.stringify(data));
65
+ const response = data.response.split('\r\n').filter(Boolean).slice(0, -1);
66
+ let messages = [];
67
+ let current = {};
68
+ for (const line of response) {
69
+ if (line.startsWith('+CMGL: ')) {
70
+ const [index] = line.replace(/^\+CMGL:\s/, '').split(',');
71
+ current = { index: +index, raw: '' };
72
+ messages.push(current);
73
+ }
74
+ else {
75
+ current.raw += line.replace(/\s/g, '');
76
+ }
77
+ }
78
+ return messages;
79
+ }
80
+ async getMessages() {
81
+ return this.queue.add(async () => {
82
+ const rawMessages = await this.getAllPDUMessages();
83
+ const parsedMessages = rawMessages.map(utils_1.parsePDUMessage);
84
+ const processedMessages = (0, utils_1.processMessages)(parsedMessages);
85
+ return processedMessages.map(utils_1.convertToCleanMessage);
86
+ });
87
+ }
88
+ async getMessage(index) {
89
+ const messages = await this.getMessages();
90
+ let message = messages.find(m => (m === null || m === void 0 ? void 0 : m.index) === index) || messages.find(m => { var _a; return (_a = m === null || m === void 0 ? void 0 : m.indexes) === null || _a === void 0 ? void 0 : _a.find(m2 => m2 === index); });
91
+ return message || undefined;
92
+ }
93
+ async deleteMessage(msg) {
94
+ return this.queue.add(async () => {
95
+ if (!msg)
96
+ return;
97
+ for (const i of msg.indexes) {
98
+ const c = await this.sendCommand(`AT+CMGD=${i}`);
99
+ logger.debug(JSON.stringify(c));
100
+ }
101
+ });
102
+ }
103
+ async deleteAllMessages() {
104
+ const c = this.queue.add(async () => this.sendCommand('AT+CMGD=1,4'));
105
+ logger.debug(JSON.stringify(c));
106
+ }
107
+ }
108
+ exports.SIM800C = SIM800C;
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltODAwYy0yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9zaW04MDBjLTIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQXFDO0FBQ3JDLHVDQUFnQztBQUNoQyxzREFBNEI7QUFFNUIsbUNBQWlGO0FBQ2pGLGtFQUErQjtBQUUvQixNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFFLENBQUM7QUFDckUsSUFBQSx1QkFBRSxFQUFFLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0FBQzVCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUV0QixNQUFhLE9BQVEsU0FBUSxvQkFBUTtJQUdqQyxZQUFZLE9BQXVCO1FBQy9CLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhYLFVBQUssR0FBRyxJQUFJLGlCQUFLLENBQUMsRUFBQyxXQUFXLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUl4QyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxLQUFhLEVBQUUsRUFBRTtZQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFHLE9BQU8sRUFBQztnQkFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNqQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2QsTUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FB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
@@ -0,0 +1,15 @@
1
+ import { AtSerial } from "./at-serial";
2
+ import { Message, RawMessagePDU, SIM800COptions } from "./types";
3
+ export declare class SIM800C extends AtSerial {
4
+ private queue;
5
+ constructor(options: SIM800COptions);
6
+ reset(): Promise<void>;
7
+ rejectCalls(): Promise<void>;
8
+ private setPDUMode;
9
+ sendMessage(number: string, message: string): Promise<void>;
10
+ getAllPDUMessages(): Promise<RawMessagePDU[]>;
11
+ getMessages(): Promise<Message[]>;
12
+ getMessage(index: number): Promise<Message>;
13
+ deleteMessage(msg: Message): Promise<void>;
14
+ deleteAllMessages(): Promise<void>;
15
+ }
@@ -0,0 +1,109 @@
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.SIM800C = void 0;
7
+ const at_serial_1 = require("./at-serial");
8
+ const node_pdu_1 = require("node-pdu");
9
+ const p_queue_1 = __importDefault(require("p-queue"));
10
+ const utils_1 = require("./utils");
11
+ const console_stamp_1 = __importDefault(require("console-stamp"));
12
+ const logger = new console.Console(process.stdout, process.stderr);
13
+ const CTRL_Z = '\x1a';
14
+ class SIM800C extends at_serial_1.AtSerial {
15
+ constructor(options) {
16
+ super(options);
17
+ this.queue = new p_queue_1.default({ concurrency: 1 });
18
+ (0, console_stamp_1.default)(logger, { level: options.logLevel || 'warn' });
19
+ this.on('_incomming_message', async (index) => {
20
+ const message = await this.getMessage(+index);
21
+ if (message) {
22
+ this.emit('message', message);
23
+ }
24
+ });
25
+ }
26
+ async reset() {
27
+ const c = await this.sendCommand('ATZ');
28
+ logger.debug(JSON.stringify(c));
29
+ await this.rejectCalls();
30
+ }
31
+ async rejectCalls() {
32
+ const c = await this.sendCommand('AT+GSMBUSY=1');
33
+ logger.debug(JSON.stringify(c));
34
+ }
35
+ async setPDUMode() {
36
+ const c = await this.sendCommand(`AT+CMGF=0`);
37
+ logger.debug(JSON.stringify(c));
38
+ }
39
+ async sendMessage(number, message) {
40
+ return this.queue.add(async () => {
41
+ message += "\u200B"; // Add zero-width space to the end of the message to force unicode as a workaround for the 7-bit bug in node-pdu.
42
+ let submit = new node_pdu_1.Submit(number, message);
43
+ submit.dataCodingScheme.setUseMessageClass(false);
44
+ const parts = submit.getPartStrings();
45
+ await this.reset();
46
+ await this.setPDUMode();
47
+ for (let i = 0; i < parts.length; i++) {
48
+ const pdu = parts[i];
49
+ const smscInfoLength = (parseInt(pdu.substring(0, 2), 16) + 1) * 2;
50
+ const userDataLength = (pdu.length - smscInfoLength) / 2;
51
+ const command = `AT+CMGS=${userDataLength} > ${pdu}`;
52
+ const terminator = `\r > ${CTRL_Z}`;
53
+ const c = await this.sendCommand(command, terminator);
54
+ logger.debug(JSON.stringify(c));
55
+ }
56
+ }).catch(e => {
57
+ throw e;
58
+ });
59
+ }
60
+ async getAllPDUMessages() {
61
+ await this.reset();
62
+ await this.setPDUMode();
63
+ const data = await this.sendCommand('AT+CMGL=4');
64
+ logger.debug(JSON.stringify(data));
65
+ const response = data.response.split('\r\n').filter(Boolean).slice(0, -1);
66
+ let messages = [];
67
+ let current = {};
68
+ for (const line of response) {
69
+ if (line.startsWith('+CMGL: ')) {
70
+ const [index] = line.replace(/^\+CMGL:\s/, '').split(',');
71
+ current = { index: +index, raw: '' };
72
+ messages.push(current);
73
+ }
74
+ else {
75
+ current.raw += line.replace(/\s/g, '');
76
+ }
77
+ }
78
+ return messages;
79
+ }
80
+ async getMessages() {
81
+ return this.queue.add(async () => {
82
+ const rawMessages = await this.getAllPDUMessages();
83
+ const parsedMessages = rawMessages.map(utils_1.parsePDUMessage);
84
+ const processedMessages = (0, utils_1.processMessages)(parsedMessages);
85
+ return processedMessages.map(utils_1.convertToCleanMessage);
86
+ });
87
+ }
88
+ async getMessage(index) {
89
+ const messages = await this.getMessages();
90
+ let message = messages.find(m => (m === null || m === void 0 ? void 0 : m.index) === index) || messages.find(m => { var _a; return (_a = m === null || m === void 0 ? void 0 : m.indexes) === null || _a === void 0 ? void 0 : _a.find(m2 => m2 === index); });
91
+ return message || undefined;
92
+ }
93
+ async deleteMessage(msg) {
94
+ return this.queue.add(async () => {
95
+ if (!msg)
96
+ return;
97
+ for (const i of msg.indexes) {
98
+ const c = await this.sendCommand(`AT+CMGD=${i}`);
99
+ logger.debug(JSON.stringify(c));
100
+ }
101
+ });
102
+ }
103
+ async deleteAllMessages() {
104
+ const c = this.queue.add(async () => this.sendCommand('AT+CMGD=1,4'));
105
+ logger.debug(JSON.stringify(c));
106
+ }
107
+ }
108
+ exports.SIM800C = SIM800C;
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltODAwYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvc2ltODAwYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQ0FBcUM7QUFDckMsdUNBQWdDO0FBQ2hDLHNEQUE0QjtBQUU1QixtQ0FBaUY7QUFDakYsa0VBQStCO0FBRS9CLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBRSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUUsQ0FBQztBQUNyRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFFdEIsTUFBYSxPQUFRLFNBQVEsb0JBQVE7SUFHakMsWUFBWSxPQUF1QjtRQUMvQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIWCxVQUFLLEdBQUcsSUFBSSxpQkFBSyxDQUFDLEVBQUMsV0FBVyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7UUFJeEMsSUFBQSx1QkFBRSxFQUFFLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDaEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDbEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBRyxPQUFPLEVBQUM7Z0JBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDakM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNkLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxD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
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from "stream";
3
+ export declare class Stream extends Readable {
4
+ _read(_: number): void;
5
+ incomming(message?: string): void;
6
+ outgoing(message?: string): void;
7
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Stream = void 0;
4
+ const stream_1 = require("stream");
5
+ class Stream extends stream_1.Readable {
6
+ _read(_) {
7
+ // No implementation needed for pushing data manually
8
+ }
9
+ incomming(message = '') {
10
+ this.push(`>> ${message.toString().replace(/ /g, '\u2e31')}`);
11
+ }
12
+ outgoing(message = '') {
13
+ this.push(`<< ${message.replace(/ /g, '\u2e31')}`);
14
+ }
15
+ }
16
+ exports.Stream = Stream;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9zdHJlYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWdDO0FBRWhDLE1BQWEsTUFBTyxTQUFRLGlCQUFRO0lBQ2hDLEtBQUssQ0FBQyxDQUFTO1FBQ1gscURBQXFEO0lBQ3pELENBQUM7SUFDRCxTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUU7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsUUFBUSxDQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztDQUNKO0FBVkQsd0JBVUMifQ==
@@ -0,0 +1,8 @@
1
+ import { Message, RawMessagePDU, TempMessageParsed } from "./types";
2
+ export declare function convertToCleanMessage(message?: TempMessageParsed): Message;
3
+ export declare function parsePDUMessage(msg: RawMessagePDU): TempMessageParsed;
4
+ export declare function isValidHex(hexString?: string): boolean;
5
+ export declare function getRelatedMessages(currentMessage: TempMessageParsed, allMessages: TempMessageParsed[]): TempMessageParsed[];
6
+ export declare function combineMessages(message: TempMessageParsed, parts: TempMessageParsed[]): TempMessageParsed;
7
+ export declare function processMessage(message: TempMessageParsed, allMessages: TempMessageParsed[]): TempMessageParsed | undefined;
8
+ export declare function processMessages(messages: TempMessageParsed[]): TempMessageParsed[];
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processMessages = exports.processMessage = exports.combineMessages = exports.getRelatedMessages = exports.isValidHex = exports.parsePDUMessage = exports.convertToCleanMessage = void 0;
4
+ const node_pdu_1 = require("node-pdu");
5
+ function convertToCleanMessage(message) {
6
+ var _a;
7
+ if (message) {
8
+ try {
9
+ const senderPrefix = message.message.sender.length < 10 ? '' : '+';
10
+ return {
11
+ index: message.index,
12
+ parts: message.message.parts || 1,
13
+ indexes: ((_a = message.message.parts_raw) === null || _a === void 0 ? void 0 : _a.map(m => m.index)) || [message.index],
14
+ text: message.message.text,
15
+ sender: senderPrefix + message.message.sender,
16
+ time: message.message.time,
17
+ };
18
+ }
19
+ catch (e) {
20
+ console.error(e, message);
21
+ return {};
22
+ }
23
+ }
24
+ else {
25
+ return {};
26
+ }
27
+ }
28
+ exports.convertToCleanMessage = convertToCleanMessage;
29
+ function parsePDUMessage(msg) {
30
+ if (isValidHex(msg.raw)) {
31
+ const pdu = (0, node_pdu_1.parse)(msg.raw);
32
+ return {
33
+ index: msg.index,
34
+ message: {
35
+ ...pdu.data.parts[0],
36
+ time: pdu.serviceCenterTimeStamp.getIsoString(),
37
+ sender: pdu.address.phone,
38
+ }
39
+ };
40
+ }
41
+ else {
42
+ return {
43
+ error: 'Invalid hex string',
44
+ };
45
+ }
46
+ }
47
+ exports.parsePDUMessage = parsePDUMessage;
48
+ function isValidHex(hexString = '') {
49
+ const regex = /^[0-9A-Fa-f]+$/;
50
+ return regex.test(hexString);
51
+ }
52
+ exports.isValidHex = isValidHex;
53
+ function getRelatedMessages(currentMessage, allMessages) {
54
+ return allMessages
55
+ .filter(msg => { var _a, _b, _c, _d; return ((_b = (_a = msg.message) === null || _a === void 0 ? void 0 : _a.header) === null || _b === void 0 ? void 0 : _b.getPointer()) === ((_d = (_c = currentMessage.message) === null || _c === void 0 ? void 0 : _c.header) === null || _d === void 0 ? void 0 : _d.getPointer()); })
56
+ .sort((a, b) => { var _a, _b, _c, _d; return (((_b = (_a = a.message) === null || _a === void 0 ? void 0 : _a.header) === null || _b === void 0 ? void 0 : _b.getCurrent()) || 0) - (((_d = (_c = b.message) === null || _c === void 0 ? void 0 : _c.header) === null || _d === void 0 ? void 0 : _d.getCurrent()) || 0); });
57
+ }
58
+ exports.getRelatedMessages = getRelatedMessages;
59
+ function combineMessages(message, parts) {
60
+ var _a;
61
+ return {
62
+ ...message,
63
+ message: {
64
+ ...message.message,
65
+ text: parts.map(part => part === null || part === void 0 ? void 0 : part.message.text).join(''),
66
+ multipart: true,
67
+ parts: (_a = message.message.header) === null || _a === void 0 ? void 0 : _a.getSegments(),
68
+ parts_raw: parts
69
+ }
70
+ };
71
+ }
72
+ exports.combineMessages = combineMessages;
73
+ function processMessage(message, allMessages) {
74
+ if (!message || message.error || !message.message || !message.message.header) {
75
+ return { ...message, message: { ...message === null || message === void 0 ? void 0 : message.message, multipart: false, parts: 1 } };
76
+ }
77
+ if (message.message.header.getCurrent() === 1) {
78
+ const relatedMessages = getRelatedMessages(message, allMessages);
79
+ if (relatedMessages.length !== message.message.header.getSegments()) {
80
+ // Not all parts are present
81
+ return undefined;
82
+ }
83
+ return combineMessages(message, relatedMessages);
84
+ }
85
+ return undefined;
86
+ }
87
+ exports.processMessage = processMessage;
88
+ function processMessages(messages) {
89
+ return messages
90
+ .map(message => processMessage(message, messages))
91
+ .filter(message => message !== undefined);
92
+ }
93
+ exports.processMessages = processMessages;
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVDQUF3QztBQUV4QyxTQUFnQixxQkFBcUIsQ0FBQyxPQUEyQjs7SUFDN0QsSUFBRyxPQUFPLEVBQUU7UUFDUixJQUFJO1lBQ0EsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDbkUsT0FBTztnQkFDSCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLEtBQUssRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsQ0FBQSxNQUFBLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUywwQ0FBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN4RSxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUMxQixNQUFNLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTztnQkFDOUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSTthQUNsQixDQUFDO1NBQ2hCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxQixPQUFPLEVBQWEsQ0FBQztTQUN4QjtLQUNKO1NBQU07UUFDSCxPQUFPLEVBQWEsQ0FBQztLQUN4QjtBQUNMLENBQUM7QUFuQkQsc0RBbUJDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLEdBQWtCO0lBQzlDLElBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENB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
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@starak/sim800c",
3
- "version": "0.0.20",
3
+ "version": "2.0.1",
4
4
  "description": "Simple library for sending and receiving messages with sim800c",
5
5
  "main": "dist/index.js",
6
6
  "files": [
7
7
  "dist/**/*"
8
8
  ],
9
9
  "scripts": {
10
- "build": "tsc"
10
+ "build": "tsc",
11
+ "dev": "nodemon local.ts"
11
12
  },
12
13
  "author": {
13
14
  "name": "Ståle Raknes",
@@ -22,13 +23,15 @@
22
23
  "dependencies": {
23
24
  "console-stamp": "^3.1.1",
24
25
  "eventemitter3": "^5.0.0",
25
- "node-pdu": "^1.0.15",
26
+ "node-pdu": "^2.0.2",
26
27
  "p-queue": "^6.6.2",
27
- "pdu.ts": "^1.1.4",
28
28
  "serialport": "^10.5.0"
29
29
  },
30
30
  "devDependencies": {
31
+ "@starak/sim800c": "^0.0.20",
31
32
  "@types/node": "^17.0.21",
33
+ "dotenv": "^16.3.1",
34
+ "nodemon": "^3.0.1",
32
35
  "ts-node": "^10.9.1",
33
36
  "typescript": "^4.9.5"
34
37
  },
package/dist/debug.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export declare const logger_out: Console;
2
- export declare const logger_in: Console;
package/dist/debug.js DELETED
@@ -1,29 +0,0 @@
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=