Commit bf525c786b326d1130383353b2a1f5a8419e3639

Authored by Nur Fajar Wibowo
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

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