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