Commit 796f16005d713cc9576b908b6ae7ed9431b153a0

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

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) {
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