Commit 796f16005d713cc9576b908b6ae7ed9431b153a0
1 parent
60d719e58a
Exists in
master
sudah terima USSD command satu per satu
Showing 2 changed files with 106 additions and 28 deletions Inline Diff
index.js
1 | "use strict"; | 1 | "use strict"; |
2 | 2 | ||
3 | const express = require('express'); | 3 | const express = require('express'); |
4 | const app = express(); | 4 | const app = express(); |
5 | const SerialPort = require("serialport"); | 5 | const SerialPort = require("serialport"); |
6 | const config = require('./config.json'); | 6 | const config = require('./config.json'); |
7 | const request = require('request'); | 7 | const request = require('request'); |
8 | const Readline = require('@serialport/parser-readline'); | ||
9 | const Delimiter = require('@serialport/parser-delimiter'); | ||
8 | 10 | ||
11 | var count = 1; | ||
9 | var statusModem = "0K"; | 12 | var statusModem = "0K"; |
10 | var errorMessageModem= ""; | 13 | var errorMessageModem= ""; |
11 | var node_port = config.development.node_port; | 14 | var node_port = config.development.node_port; |
12 | var usb_port = config.development.usb_port; | 15 | var usb_port = config.development.usb_port; |
13 | var url_post = config.development.url_post; | 16 | var url_post = config.development.url_post; |
14 | var api_key = config.development.api_key; | 17 | var api_key = config.development.api_key; |
15 | 18 | ||
16 | //set serialport | 19 | //set serialport |
17 | const serialPort = new SerialPort(usb_port, { | 20 | const serialPort = new SerialPort(usb_port, { |
18 | baudRate: 115200, dataBits: 8, autoOpen: true, lock: false, | 21 | baudRate: 115200 |
19 | //parser: SerialPort.parsers.readline("\n") | ||
20 | }); | 22 | }); |
21 | 23 | ||
24 | const parser = serialPort.pipe(new Readline()); | ||
25 | |||
22 | serialPort.on("open", function () { | 26 | serialPort.on("open", function () { |
23 | console.log('Serial communication open'); | 27 | console.log('Serial communication open'); |
24 | // | 28 | // |
25 | serialPort.write("AT+CNMI?"); | 29 | serialPort.write("AT+CNMI?"); |
26 | serialPort.write("\r"); | 30 | serialPort.write("\r"); |
27 | serialPort.write("AT+CNMI=1,1,2,1,1"); | 31 | serialPort.write("AT+CNMI=1,1,2,1,1"); |
28 | serialPort.write("\r"); | 32 | serialPort.write("\r"); |
29 | console.log('receive sms ON'); | 33 | console.log('receive sms ON'); |
30 | 34 | ||
31 | }); | 35 | }); |
32 | 36 | ||
33 | serialPort.on('error', function(err) { | 37 | serialPort.on('error', function(err) { |
34 | statusModem = "NOT OK"; | 38 | statusModem = "NOT OK"; |
35 | errorMessageModem = err.message; | 39 | errorMessageModem = err.message; |
36 | console.log('Error!: ', err.message); | 40 | console.log('Error!: ', err.message); |
37 | process.exit(1); | 41 | process.exit(1); |
38 | }); | 42 | }); |
39 | 43 | ||
40 | serialPort.on('data', function(data) { | 44 | |
45 | parser.on('data', function(data) { | ||
41 | console.log("incoming data: " + data); | 46 | console.log("incoming data: " + data); |
42 | var lastData = data.toString(); | 47 | var lastData = data.toString(); |
43 | if (lastData.match(/\+CMTI:/)){ | 48 | if (lastData.match(/\+CMTI:/)){ |
44 | var numberPattern = /(\d+)/g; | 49 | var numberPattern = /(\d+)/g; |
45 | var slot = lastData.match(numberPattern); | 50 | var slot = lastData.match(numberPattern); |
46 | console.log("slot "+slot); | 51 | console.log("slot "+slot); |
47 | console.log("ada message baru"); | 52 | console.log("ada message baru"); |
48 | readSmsAuto(serialPort, slot); | 53 | readSmsAuto(serialPort, slot); |
49 | } else if (lastData.match(/\+CMGR:/)){ | 54 | } |
50 | console.log("read sms!" + data); | ||
51 | console.log("end read msg!"); | ||
52 | const lines = lastData.split(/\n/); | ||
53 | console.log("lines1 "+lines[1]); | ||
54 | console.log("lines2 "+lines[2]); | ||
55 | const content = lines[1].split(','); | ||
56 | console.log("content0 "+content[0]); | ||
57 | console.log("content1 "+content[1]); | ||
58 | console.log("content2 "+content[2]); | ||
59 | console.log("content3 "+content[3]); | ||
60 | console.log("content4 "+content[4]); | ||
61 | var nomor = content[1].toString(); | ||
62 | nomor = nomor.replace(/"/g,''); | ||
63 | nomor = nomor.replace(/\+/g,''); | ||
64 | var pesan = lines[2].toString(); | ||
65 | //console.log("nomor nya "+nomor); | ||
66 | postIncomingMessage(nomor, pesan); | ||
67 | } | ||
68 | }); | 55 | }); |
69 | 56 | ||
70 | //------------------function 2 000000000000 ----------------- | 57 | //------------------function 2 000000000000 ----------------- |
71 | //helloWorld | 58 | //helloWorld |
72 | function helloWorld(req, res, next){ | 59 | function helloWorld(req, res, next){ |
73 | console.log("hello world call!??"); | 60 | console.log("hello world call!??"); |
74 | res.send('hello world'); | 61 | res.send('hello world'); |
75 | 62 | ||
76 | } | 63 | } |
77 | //function delete message slot ke? | 64 | //function delete message slot ke? |
78 | function deleteMessage(serialPort, slot){ | 65 | function deleteMessage(serialPort, slot){ |
79 | serialPort.write("AT+CMGD="+slot); | 66 | serialPort.write("AT+CMGD="+slot); |
80 | serialPort.write("\r"); | 67 | serialPort.write("\r"); |
81 | console.log("delete pesan slot "+slot+" done!"); | 68 | console.log("delete pesan slot "+slot+" done!"); |
82 | 69 | ||
83 | } | 70 | } |
84 | //post to end point url | 71 | //post to end point url |
85 | function postIncomingMessage(nomor, pesan){ | 72 | function postIncomingMessage(nomor, pesan){ |
86 | console.log("----------------------------post incoming message-------------------------"); | 73 | console.log("----------------------------post incoming message-------------------------"); |
87 | pesan = pesan.replace(/\s+$/, ''); | 74 | pesan = pesan.replace(/\s+$/, ''); |
88 | //post to URL end Point | 75 | //post to URL end Point |
89 | request(url_post+"/gtwjs?msg="+pesan+"&number="+nomor, function (error, response, body) { | 76 | request(url_post+"?msg="+pesan+"&number="+nomor, function (error, response, body) { |
90 | if (error) { console.log("error post! "+nomor+" msg; \""+pesan+"\" errornya; "+error.message); } | 77 | if (error) { console.log("error post! "+nomor+" msg; \""+pesan+"\" errornya; "+error.message); } |
91 | else if (!error && response.statusCode == 200) {console.log("success post "+nomor+" msg; \""+pesan+"\" resp; "+body);} | 78 | else if (!error && response.statusCode == 200) {console.log("success post "+nomor+" msg; \""+pesan+"\" resp; "+body);} |
92 | }); | 79 | }); |
93 | //delete incoming message after send to komod | 80 | //delete incoming message after send to komod |
94 | } | 81 | } |
95 | //sendSms | 82 | //sendSms |
96 | function sendSms (req, res, next){ | 83 | function sendSms (req, res, next){ |
97 | var msg = req.query.msg; | 84 | var msg = req.query.msg; |
98 | var number = req.query.number; | 85 | var number = req.query.number; |
99 | var reqid = req.query.reqid; | 86 | var reqid = req.query.reqid; |
100 | var apikey = req.query.apikey; | 87 | var apikey = req.query.apikey; |
101 | //api_key="746573206D6F64656D2074656C6D6F73656C20666C617368"; | 88 | //api_key="746573206D6F64656D2074656C6D6F73656C20666C617368"; |
102 | if(!reqid||!apikey){ | 89 | if(!reqid||!apikey){ |
103 | console.log("invalid reqid or apikey;msg "+msg+" number "+number); | 90 | console.log("invalid reqid or apikey;msg "+msg+" number "+number); |
104 | res.json({"status": "invalid parameter", "msg": msg, "number": number, "apikey" : apikey, "reqid": reqid}); | 91 | res.json({"status": "invalid parameter", "msg": msg, "number": number, "apikey" : apikey, "reqid": reqid}); |
105 | return; | 92 | return; |
106 | } else if (apikey !== api_key){ | 93 | } else if (apikey !== api_key){ |
107 | console.log("invalid api_key;msg \""+msg+"\" number \""+number+"\" reqid \""+reqid); | 94 | console.log("invalid api_key;msg \""+msg+"\" number \""+number+"\" reqid \""+reqid); |
108 | res.json({"status": "invalid parameter", "msg": msg, "number": number, "apikey" : apikey, "reqid": reqid}); | 95 | res.json({"status": "invalid parameter", "msg": msg, "number": number, "apikey" : apikey, "reqid": reqid}); |
109 | return; | 96 | return; |
110 | 97 | ||
111 | } | 98 | } |
112 | console.log("msg "+ msg + " number " +number); | 99 | console.log("msg "+ msg + " number " +number); |
113 | //---------------- | 100 | //---------------- |
114 | serialPort.write("AT+CMGF=1"); | 101 | serialPort.write("AT+CMGF=1"); |
115 | serialPort.write('\r'); | 102 | serialPort.write('\r'); |
116 | 103 | ||
117 | sendingSMS(serialPort, msg, "+"+number, reqid); | 104 | sendingSMS(serialPort, msg, "+"+number, reqid); |
118 | console.log('resp; status '+statusModem+" reqid "+reqid); | 105 | console.log('resp; status '+statusModem+" reqid "+reqid); |
119 | //--------------- | 106 | //--------------- |
120 | res.json({"status": statusModem+" "+errorMessageModem, "msg": msg, "number": number}); | 107 | res.json({"status": statusModem+" "+errorMessageModem, "msg": msg, "number": number}); |
121 | } | 108 | } |
109 | //send ussd | ||
110 | function sendUSSD (req, res, next){ | ||
111 | var msg = req.query.msg; | ||
112 | var reqid = req.query.reqid; | ||
113 | var apikey = req.query.apikey; | ||
114 | //api_key="746573206D6F64656D2074656C6D6F73656C20666C617368"; | ||
115 | if(!reqid||!apikey){ | ||
116 | console.log("invalid reqid or apikey;msg "+msg); | ||
117 | res.json({"status": "invalid parameter", "msg": msg, "apikey" : apikey, "reqid": reqid}); | ||
118 | return; | ||
119 | } else if (apikey !== api_key){ | ||
120 | console.log("invalid api_key;msg \""+msg+"\"reqid \""+reqid); | ||
121 | res.json({"status": "invalid parameter", "msg": msg, "apikey" : apikey, "reqid": reqid}); | ||
122 | return; | ||
122 | 123 | ||
123 | function readSmsAuto(serialPort, slot){ | 124 | } |
125 | console.log("msg "+ msg+" - "+reqid); | ||
126 | |||
127 | count++; | ||
128 | console.log("count "+ count); | ||
129 | if (count > 2){ | ||
130 | console.log("modem busy!"); | ||
131 | count--; | ||
132 | res.json({status: "reject", msg: "modem busy,try a few second"}); | ||
133 | return; | ||
134 | } | ||
124 | 135 | ||
125 | serialPort.write("AT+CMGF=1"); | 136 | //---------------- |
137 | serialPort.write("AT+CUSD=1,\""+msg+"\""); | ||
126 | serialPort.write('\r'); | 138 | serialPort.write('\r'); |
139 | |||
140 | //parse response USSD | ||
141 | const parserUSSD = serialPort.pipe(new Delimiter({ delimiter: '\",0'})); | ||
142 | var respUssd = null; | ||
143 | parserUSSD.on('data',function(dataUSSD){ | ||
144 | //console.log("incoming datad "+dataD); | ||
145 | var lastData = dataUSSD.toString(); | ||
146 | console.log("incoming dataUSSD "+lastData); | ||
147 | respUssd = lastData; | ||
148 | serialPort.unpipe(parserUSSD); | ||
149 | }); | ||
150 | |||
151 | console.log('resp; status '+statusModem+" reqid "+reqid); | ||
152 | //--------------- | ||
153 | let countDown = 8;// max witing response USSD 8 detik | ||
154 | var waitingRespUssd = setInterval (() => { | ||
155 | console.log(countDown+" second for reqid "+reqid); | ||
156 | countDown--; | ||
157 | if (respUssd || countDown < 2){ | ||
158 | console.log("response USSD; "+respUssd); | ||
159 | count--; | ||
160 | res.json({ | ||
161 | "response_ussd": respUssd, | ||
162 | "status": statusModem+" "+errorMessageModem, | ||
163 | "msg": msg, | ||
164 | "reqid": reqid | ||
165 | }); | ||
166 | clearInterval(waitingRespUssd); | ||
167 | } | ||
168 | },1000); | ||
169 | } | ||
170 | |||
171 | |||
172 | |||
173 | function readSmsAuto(serialPort, slot){ | ||
174 | |||
127 | serialPort.write("AT+CMGR="+slot);// read only slot 1 | 175 | serialPort.write("AT+CMGR="+slot);// read only slot 1 |
128 | serialPort.write('\r'); | 176 | serialPort.write('\r'); |
177 | |||
178 | const parserD = serialPort.pipe(new Delimiter({ delimiter: '\r\nOK\r\n' })); | ||
179 | parserD.on('data',function(dataD){ | ||
180 | //console.log("incoming datad "+dataD); | ||
181 | var lastData = dataD.toString(); | ||
182 | console.log("incoming datad "+lastData); | ||
183 | if (lastData.match(/\+CMGR:/)){ | ||
184 | console.log("incoming SMS "+lastData); | ||
185 | // try to parse dataD | ||
186 | const lines = lastData.split(/\n/); | ||
187 | console.log("lines1 "+lines[1]); | ||
188 | console.log("lines2 "+lines[2]); | ||
189 | const content = lines[1].split(','); | ||
190 | console.log("content0 "+content[0]); | ||
191 | console.log("content1 "+content[1]); | ||
192 | console.log("content2 "+content[2]); | ||
193 | console.log("content3 "+content[3]); | ||
194 | console.log("content4 "+content[4]); | ||
195 | var nomor = content[1].toString(); | ||
196 | nomor = nomor.replace(/"/g,''); | ||
197 | nomor = nomor.replace(/\+/g,''); | ||
198 | var pesan = lines[2].toString(); | ||
199 | console.log("nomor nya "+nomor); | ||
200 | serialPort.unpipe(parserD); | ||
201 | postIncomingMessage(nomor, pesan); | ||
202 | } | ||
203 | }); | ||
204 | |||
129 | console.log("pesan slot "+slot+" sudah di baca"); | 205 | console.log("pesan slot "+slot+" sudah di baca"); |
206 | |||
130 | setTimeout(function(){ | 207 | setTimeout(function(){ |
131 | serialPort.write("AT+CMGD="+slot); | 208 | serialPort.write("AT+CMGD="+slot); |
132 | serialPort.write("\r"); | 209 | serialPort.write("\r"); |
133 | console.log("delete pesan slot "+slot+" done!"); | 210 | console.log("delete pesan slot "+slot+" done!"); |
134 | }, 2000); | 211 | }, 2000); |
135 | |||
136 | } | 212 | } |
137 | 213 | ||
138 | 214 | ||
139 | function readSms(req, res, next){ | 215 | function readSms(req, res, next){ |
140 | 216 | ||
141 | serialPort.write("AT+CMGF=1"); | 217 | serialPort.write("AT+CMGF=1"); |
142 | serialPort.write('\r'); | 218 | serialPort.write('\r'); |
143 | serialPort.write('AT+CMGR=0');// read only slot 1 | 219 | serialPort.write('AT+CMGR=0');// read only slot 1 |
144 | serialPort.write('\r'); | 220 | serialPort.write('\r'); |
145 | res.send('sms readed'); | 221 | res.send('sms readed'); |
146 | 222 | ||
147 | } | 223 | } |
148 | 224 | ||
149 | function sendingSMS(serial, message, phone_no) { | 225 | function sendingSMS(serial, message, phone_no) { |
package.json
1 | { | 1 | { |
2 | "name": "modemX", | 2 | "name": "modemX", |
3 | "version": "1.0.0", | 3 | "version": "1.0.0", |
4 | "description": "", | 4 | "description": "", |
5 | "main": "index.js", | 5 | "main": "index.js", |
6 | "scripts": { | 6 | "scripts": { |
7 | "test": "echo \"Error: no test specified\" && exit 1" | 7 | "test": "echo \"Error: no test specified\" && exit 1" |
8 | }, | 8 | }, |
9 | "author": "", | 9 | "author": "", |
10 | "license": "ISC", | 10 | "license": "ISC", |
11 | "dependencies": { | 11 | "dependencies": { |
12 | "@serialport/parser-delimiter": "^2.0.2", | ||
13 | "@serialport/parser-readline": "^2.0.2", | ||
12 | "express": "^4.16.4", | 14 | "express": "^4.16.4", |
13 | "request": "^2.88.0", | 15 | "request": "^2.88.0", |
14 | "serialport": "^4.0.7" | 16 | "serialport": "^6.2.2" |
15 | } | 17 | } |
16 | } | 18 | } |
17 | 19 |