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