Commit 9c53c89b5642e9b62ddf9b949b95715b8cf12046

Authored by Nur Fajar Wibowo
1 parent 796f16005d
Exists in master

kirim resp USSDnya hasilnya saja [ex: +CUSD: 2,"Maaf sistem sedang sibuk silahkan coba kembali"]

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