Closed iamqinglong closed 5 years ago
Hey @iamqinglong! How's it going? have you managed to get it working? Your code seems to be good, the modem was initialized and set to pdu mode.
I saw other reports ... sometimes you need to correctly set the "storage".
try to add a executeCommand with
AT+CPMS="SM","SM","SM"
Does ist work after this?
No luck guys, I only get messages from SIM Inbox. And I still didn't receive any message. @Apollon77 I tried to use that command but I got errors. What I want to achieve guys is that since I can't receive any message from my SIM(all new message was redirected to my GPRS/USB modem ) , I want to get all messages from my GPRS/USB modem rather than in my SIM. How do i able to achieve this ?
const gsmModem = serialportgsm.Modem();
const options = {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
xon: false,
rtscts: false,
xoff: false,
xany: false,
// autoDeleteOnReceive: true,
enableConcatenation: true,
incomingCallIndication: true,
onNewMessageIndicator: true,
onNewMessage:true,
// autoOpen: true,
}
app.post('/openModem',(req,response,next)=>{
try {
gsmModem.open(req.body.modemPort, options,async (err,data) => {
if (err) {
console.log(`Error opening modem`);
response.send({status: false, message: 'Opening modem failed'})
modemStatus = false
console.log('Modem status ', modemStatus)
return
}
else{
console.log('Opening port: ', portStatus)
gsmModem.initializeModem(async (msg,err) =>
{
if(err)
{
console.log("Initialize Modem Failed")
response.send({status: false, message: 'Initialize Modem Failed'})
gsmModem.close((err) => {
console.log('port closed', err);
})
return
}
console.log('initialize msg:', msg.data)
gsmModem.setModemMode(async(msgMode,err) => {
if (err) {
console.log("Gateway", `Error Setting Modem Mode`);
response.send({status: false, message: 'Error Setting Modem Mode'})
gsmModem.close((err) => {
console.log('port closed', err);
})
return
}
gsmModem.getOwnNumber(async (msg,err) => {
if(err)
{
console.log("Gateway", `Error getting own number`);
response.send({status: false, message: 'Error getting own number'})
gsmModem.close((err) => {
console.log('port closed', err);
})
}
else{
gsmModem.executeCommand("AT+CPMS=\"SM\",\"SM\",\"SM\"", (data => {
console.log("Result from execute command: ", data)
// res.send(data)
}), false, 30000)
gsmModem.getSimInbox((result, err) => {
if(err) {
console.log(`Failed to get SimInbox ${err}`);
} else {
console.log(`Sim Inbox Result: ${JSON.stringify(result)}`);
}
});
response.send({status: true, message: 'Modem succesfully connected'})
}
})
}, "PDU");
});
}
});
} catch (error) {
return next(error)
}
})
gsmModem.on('onNewMessageIndicator', data => {
//indicator for new message only (sender, timeSent)
console.log(data)
})
gsmModem.on('onNewMessage', data => {
//whole message data
console.log(data)
})
@iamqinglong can you try calling
gsmModem.checkSimMemory(a => {
console.log(a)
})
after initializing.
Then check for receiving of messages.
This is the output which I think is correct cuz I got 3 message from sim. But sir I want to get message from GPRS/Usb modem not from SIM because I can't receive any message.
gsmModem.open(req.body.modemPort, options,async (err,data) => {
if (err) {
console.log(`Error opening modem`);
response.send({status: false, message: 'Opening modem failed'})
modemStatus = false
console.log('Modem status ', modemStatus)
return
}
else{
console.log('Opening port: ', portStatus)
gsmModem.initializeModem(async (msg,err) =>
{
if(err)
{
console.log("Initialize Modem Failed")
response.send({status: false, message: 'Initialize Modem Failed'})
gsmModem.close((err) => {
console.log('port closed', err);
})
return
}
console.log('initialize msg:', msg.data)
What you exactly mean with that the messages are redirected to the modem? The command is end should make sure that messages are stored into SIM mem when being received. Whey this is no option for you?
Ya that's what exactly happening, I can't receive new sms because it redirected to modem not in my SIM, And I think the event gsmModem('onNewMessage') listen only to new sms from SIM.
Can I also get inbox from my modem not from my sim inbox?
Thats why I proposed AT+CPMS="SM","SM","SM" (see https://www.developershome.com/sms/cpmsCommand.asp)
that should set all the stores to Sim ... you told you got errors? Which?
PS: It could also be interesting how +CNMI AT setset ... or try the newest 3.0.0 please, there CNMI is set to a correct value hopefully. Any maybe try together with CPMS command (you can now also set this using options.customInitCommand
I'm lost. @Apollon77 I tried the AT+CPMS="SM","SM","SM" command again and give me an errors
{"_events":{},"_eventsCount":1,"command":"AT+CPMS=\"SM\",\"SM\",\"SM\"","add_time":"2019-04-30T04:33:57.016Z","id":11,"timeout":30000,"inProgress":true,"execute_time":"2019-04-30T04:33:57.035Z"}
at EventEmitter.item.on (C:\Users\Qing\project\capstone\server\node_modules\serialport-gsm\lib\functions\modem.js:853:27)
at EventEmitter.emit (events.js:189:13)
at Timeout.timeouts.(anonymous function).setTimeout [as _onTimeout] (C:\Users\Qing\project\capstone\server\node_modules\serialport-gsm\lib\functions\modem.js:900:14)
at ontimeout (timers.js:436:11)
at tryOnTimeout (timers.js:300:5)
at listOnTimeout (timers.js:263:5)
at Timer.processTimers (timers.js:223:10) )
This is my latest code and I updated to 3.0.0 . Please help guys.
const gsmModem = serialportgsm.Modem();
const options = {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
xon: false,
rtscts: false,
xoff: false,
xany: false,
// autoDeleteOnReceive: true,
enableConcatenation: true,
// incomingCallIndication: true,
// incomingSMSIndication: true,
customInitCommand: "AT+CNMI=?",
// onNewMessage:true,
// autoOpen: true,
logger: console,
}
app.post('/openModem',(req,response,next)=>{
try {
gsmModem.open(req.body.modemPort, options,async (err,data) => {
if (err) {
console.log(`Error opening modem`);
response.send({status: false, message: 'Opening modem failed'})
modemStatus = false
console.log('Modem status ', modemStatus)
return
}
else{
// modemStatus = true
console.log('Opening port: ', portStatus)
gsmModem.initializeModem(async (msg,err) =>
{
if(err)
{
console.log("Initialize Modem Failed")
response.send({status: false, message: 'Initialize Modem Failed'})
// modemStatus = false
console.log('Modem status ', modemStatus)
gsmModem.close((err) => {
console.log('port closed', err);
})
return
}
console.log('initialize msg:', msg.data)
gsmModem.checkSimMemory(a => {
console.log(a)
})
// gsmModem add at+qnwinfo (carrier info), and at+qspn (service provider name) for debug logs
gsmModem.setModemMode(async(msgMode,err) => {
if (err) {
console.log("Gateway", `Error Setting Modem Mode`);
response.send({status: false, message: 'Error Setting Modem Mode'})
// modemStatus = false
console.log('Modem status ', modemStatus)
gsmModem.close((err) => {
console.log('port closed', err);
})
return
}
gsmModem.getOwnNumber(async (msg,err) => {
if(err)
{
console.log("Gateway", `Error getting own number`);
response.send({status: false, message: 'Error getting own number'})
// modemStatus = false
console.log('Modem status ', modemStatus)
gsmModem.close((err) => {
console.log('port closed', err);
})
}
else{
console.log("AT+CPMS: ","AT+CPMS=\"SM\",\"SM\",\"SM\"")
gsmModem.executeCommand(`AT+CPMS=\"SM\",\"SM\",\"SM\"`, ((data,err) => {
if(err)
{
console.log('Exec Error: ',err)
}
else{
console.log("Result from execute command: ", data)
}
}), false, 30000)
gsmModem.getSimInbox((result, err) => {
if(err) {
console.log(`Failed to get SimInbox ${err}`);
} else {
console.log(`Sim Inbox Result: ${JSON.stringify(result)}`);
}
});
console.log(msg)
console.log(`Set Mode: ${msgMode.data}`);
modemStatus = true
console.log('Modem status ', modemStatus)
let res = await axios.post(`http://${ip.address()}:${process.env.PORT}/api/createNotification`,{
subject : `Modem succesfully connected`,
message: `Modem at ${data.data.modem} status ${data.data.status}`
})
modemPort = data.data.modem
portStatus = true;
aedes.publish({
qos: 0,
topic: '/notification',
payload: JSON.stringify(res.data.result),
retain: false
});
response.send({status: true, message: 'Modem succesfully connected'})
}
})
}, "PDU");
});
}
});
} catch (error) {
return next(error)
}
})
And this is the full output.
C:\Users\Qing\project\capstone\server>npm run dev
> capstone_final@1.0.0 dev C:\Users\Qing\project\capstone\server
> nodemon index.js
[nodemon] 1.18.11
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node index.js`
MQTT Server listening on 1883 , ::
Web Server running at 8000 , 192.168.1.24
on open result: { status: 'success',
request: 'connectModem',
data: { modem: 'COM4', status: 'Online' } }
Opening port: false
Modem Write: ATZ
Modem Received: ATZ
Activate Message Processing for: ATZ
Modem Received:
Modem Received: OK
Call callback for: ATZ
Modem Write: ATE1
Modem Received: ATE1
Activate Message Processing for: ATE1
Modem Received:
Modem Received: OK
Call callback for: ATE1
Modem Write: AT+CPIN?
Modem Received: AT+CPIN?
Activate Message Processing for: AT+CPIN?
Modem Received:
Modem Received: +CPIN: READY
Call callback for: AT+CPIN?
Modem Received:
Modem Received: OK
initialize msg: Modem Echo Successfully Activated
Modem Write: AT+CMEE=1;+CREG=2
Modem Received: AT+CMEE=1;+CREG=2
Activate Message Processing for: AT+CMEE=1;+CREG=2
Modem Received:
Modem Received: OK
Call callback for: AT+CMEE=1;+CREG=2
Modem Write: AT+CNMI=?
Modem Received: AT+CNMI=?
Activate Message Processing for: AT+CNMI=?
Modem Received:
Modem Received: +CNMI: (0-2),(0-3),(0,2),(0-2),(0,1)
Modem Received:
Modem Received: OK
Call callback for: AT+CNMI=?
Modem Write: AT+CPMS="SM"
Modem Received: AT+CPMS="SM"
Activate Message Processing for: AT+CPMS="SM"
Modem Received:
Modem Received: +CPMS: 3,40,3,40,3,40
Call callback for: AT+CPMS="SM"
Modem Write: AT+CMGF=0
Modem Received:
Ignore Data:
Modem Received: OK
Ignore Data: OK
{ status: 'success',
request: 'checkSimMemory',
data: { used: 3, total: 40 } }
Modem Received: AT+CMGF=0
Activate Message Processing for: AT+CMGF=0
Modem Received:
Modem Received: OK
Call callback for: AT+CMGF=0
Modem Write: AT+CNMI=2,1,0,2,0
Modem Received: AT+CNMI=2,1,0,2,0
Activate Message Processing for: AT+CNMI=2,1,0,2,0
Modem Received:
Modem Received: OK
Call callback for: AT+CNMI=2,1,0,2,0
Modem Write: AT+CNUM
Modem Received: AT+CNUM
Activate Message Processing for: AT+CNUM
Modem Received:
Modem Received: +CNUM: "","+639972287458",145
Call callback for: AT+CNUM
Modem Received:
Modem Received: OK
AT+CPMS: AT+CPMS="SM","SM","SM"
{ status: 'success',
request: 'getOwnNumber',
data: { name: '', number: '+639972287458' } }
Set Mode: PDU_Mode
Modem status true
Modem Write: AT+CPMS="SM","SM","SM"
Modem Received: AT+CPMS="SM","SM","SM"
Activate Message Processing for: AT+CPMS="SM","SM","SM"
Ignore Data: AT+CPMS="SM","SM","SM"
Modem Received:
Ignore Data:
Modem Received: +CPMS: 3,40,3,40,3,40
Ignore Data: +CPMS: 3,40,3,40,3,40
Modem Received:
Ignore Data:
Modem Received: OK
Ignore Data: OK
Mongodb connection succeeded
Modem succesfully connected
Exec Error: Error: timeout:
{"_events":{},"_eventsCount":1,"command":"AT+CPMS=\"SM\",\"SM\",\"SM\"","add_time":"2019-04-30T04:51:50.548Z","id":11,"timeout":30000,"inProgress":true,"execute_time":"2019-04-30T04:51:50.561Z"}
at EventEmitter.item.on (C:\Users\Qing\project\capstone\server\node_modules\serialport-gsm\lib\functions\modem.js:853:27)
at EventEmitter.emit (events.js:189:13)
at Timeout.timeouts.(anonymous function).setTimeout [as _onTimeout] (C:\Users\Qing\project\capstone\server\node_modules\serialport-gsm\lib\functions\modem.js:900:14)
at ontimeout (timers.js:436:11)
at tryOnTimeout (timers.js:300:5)
at listOnTimeout (timers.js:263:5)
at Timer.processTimers (timers.js:223:10)
Modem Write: AT+CMGL=4
Modem Received: AT+CMGL=4
Activate Message Processing for: AT+CMGL=4
Modem Received:
Modem Received: +CMGL: 0,1,,37
Modem Received: 0791361907002099040C9136699668287300009140820151932314E139393C2787E7E4F09C1C9E93C37372780E
Modem Received: +CMGL: 1,1,,36
Modem Received: 0791361907002099040C9136493514826300009140821141342313E139393C2787E764500C249BC564A0980C
Modem Received: +CMGL: 2,1,,38
Modem Received: 0791361907002099040C913649351482630000914082118120231574747A0E4ACF4166F9BB0D0A9BE5E5F2BC3D07
Modem Received:
Modem Received: OK
Call callback for: AT+CMGL=4
Sim Inbox Result: {"status":"success","request":"getSimInbox","data":[{"sender":"639669868237","message":"asdasdasdasdasdasdas","index":0,"dateTimeSent":"2019-04-28T02:15:39.000Z","header":{"encoding":"7bit","smsc":"639170000299","smscType":"INTERNATIONAL","smscPlan":"ISDN"}},{"sender":"639453412836","message":"asdasdasd 1 2312 12","index":1,"dateTimeSent":"2019-04-28T03:14:43.000Z","header":{"encoding":"7bit","smsc":"639170000299","smscType":"INTERNATIONAL","smscPlan":"ISDN"}},{"sender":"639453412836","message":"this is from afreesms","index":2,"dateTimeSent":"2019-04-28T03:18:02.000Z","header":{"encoding":"7bit","smsc":"639170000299","smscType":"INTERNATIONAL","smscPlan":"ISDN"}}]}
@iamqinglong remove your code executing
AT+CPMS="SM","SM","SM"
as this
Modem Write: AT+CPMS="SM"
Modem Received: AT+CPMS="SM"
Activate Message Processing for: AT+CPMS="SM"
Modem Received:
Modem Received: +CPMS: 3,40,3,40,3,40
Call callback for: AT+CPMS="SM"
already set it to use SIM memory.
Then activate message processing. How do you process the incoming messages? Do you refresh at a certain n times?
else I think the reason was the escaping of the double quote ... ?! thsi is notmally not needed when you use the other quotes like AT+CPMS=\"SM\",\"SM\",\"SM\"
... would be in any case interesting if the command works then ;-)
@zabsalahid Sir still no luck, I got response. I tried AT+CPMS="SM"
Modem Write: AT+CPMS="SM"
Modem Received: AT+CPMS="SM"
Activate Message Processing for: AT+CPMS="SM"
Ignore Data: AT+CPMS="SM"
Modem Received:
Ignore Data:
Modem Received: +CPMS: 4,40,4,40,4,40
Ignore Data: +CPMS: 4,40,4,40,4,40
Modem Received:
Ignore Data:
Modem Received: OK
Ignore Data: OK
Exec Error: Error: timeout:
{"_events":{},"_eventsCount":1,"command":"AT+CPMS=\"SM\"","add_time":"2019-05-01T02:53:42.420Z","id":12,"timeout":30000,"inProgress":true,"execute_time":"2019-05-01T02:53:42.420Z"}
at EventEmitter.item.on (C:\Users\Qing\project\capstone\server\node_modules\serialport-gsm\lib\functions\modem.js:853:27)
at EventEmitter.emit (events.js:189:13)
at Timeout.timeouts.(anonymous function).setTimeout [as _onTimeout] (C:\Users\Qing\project\capstone\server\node_modules\serialport-gsm\lib\functions\modem.js:900:14)
at ontimeout (timers.js:436:11)
at tryOnTimeout (timers.js:300:5)
at listOnTimeout (timers.js:263:5)
at Timer.processTimers (timers.js:223:10)
Please show your code again. I really wonder.
@iamqinglong pwede makita ano code mo ngayon? para matulungan kita.
@zabsalahid @Apollon77 . This is my entire index.js code. I am using Huawei E359. Sorry for some bad code practice I just started using node js last month. @zabsalahid Patulong sir.
require('./config/config');
require('./models/db');
require('./config/passportConfig')
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const http = require('http')
const websocket = require('websocket-stream')
const aedes = require('aedes')()
const mqtt = require('net').createServer(aedes.handle);
const passport = require('passport')
const app = express(http);
const web = http.createServer(app);
const rtsIndex = require('./routes/index.router')
const serialPort = require('serialport');
const readLine = serialPort.parsers.Readline;
const axios = require('axios');
const ip = require('ip')
const mosca = require('mosca')
const _sms = require('./sms')
const serialportgsm = require('serialport-gsm')
// const router = require('./node_modules/huawei-router-api');
let modemPort="COM4"; // default serial port for modemy
const gsmModem = serialportgsm.Modem();
const options = {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
xon: false,
rtscts: false,
xoff: false,
xany: false,
// autoDeleteOnReceive: true,
enableConcatenation: true,
// incomingCallIndication: true,
// incomingSMSIndication: true,
customInitCommand: "AT+CNMI=?",
// onNewMessage:true,
// autoOpen: true,
logger: console,
}
let modemStatus = false;
let modemNumber = null
let modemSignal = null;
let portStatus = false;
let balanceStatus = false;
app.use(cors());
app.use(bodyParser.json());
app.use( bodyParser.urlencoded({ extended : false }) );
app.use(passport.initialize())
app.use(passport.session());
app.use('/api',rtsIndex)
const error = require('./error_handler/error.handler')
app.use(error)
// _sms.openModem()
//MQTT AND WEB SERVER INITIALIZATION
var mqtt_port = process.env.MQTT_PORT || 1883
mqtt.listen(mqtt_port, () => {
console.log(`MQTT Server listening on ${mqtt_port} , ${mqtt.address().address}`)
});
web.listen(process.env.PORT, ip.address(),() => {
console.log(`Web Server running at ${process.env.PORT} , ${web.address().address}`)
})
websocket.createServer({server: web}, aedes.handle);
//SMS INITIALIZATION
axios.post(`http://${ip.address()}:${process.env.PORT}/openModem`,{
modemPort: modemPort
}).then(response => {
console.log(response.data.message)
})
.catch(error => {
console.log(error)
})
//SMS EVENTS
gsmModem.on('open', async(msg) => { console.log('on open result: ',msg)
})
gsmModem.on('close', async (msg,err) => {
console.log('on close msg:' , (msg))
if(msg == undefined)
{
console.log('No modem detected during close')
}else{
if(portStatus)
{
let res = await axios.post(`http://${ip.address()}:${process.env.PORT}/api/createNotification`,{
subject : `Modem disconnected`,
message: `Modem at ${msg.modem} status is ${msg.status}`
// message: `Modem at ${msg}`
})
aedes.publish({
qos: 0,
topic: '/notification',
payload: JSON.stringify(res.data.result),
retain: false
});
}
modemStatus = false
console.log('Modem status ', modemStatus)
}
});
//AEDES EVENTS
aedes.on('clientError', function (client, err, subscriptions) {
console.log('client error', client.id)
console.log('error topics : ', client.subscriptions)
})
aedes.on('connectionError', function (client, err) {
console.log('client error', client, err.message, err.stack)
})
aedes.on('clientDisconnect', function(client, subscriptions, topic) {
console.log('client disconnected : ', client.id, ' disconnected topic : ', subscriptions)
});
aedes.on('publish', async (packet, client, topic ) => {
// console.log(packet)
if(!client) return
packet.payloadString = packet.payload.toString();
packet.payloadLength = packet.payload.length;
packet.payload = JSON.stringify(packet.payload);
packet.timestamp = new Date();
console.log('Publisher : ',client.id, ' Value : ', packet.payloadString, ' Topic : ', packet.topic)
try{
let events = await axios.get(`http://${ip.address()}:${process.env.PORT}/api/getEventByTopic/?topic=${packet.topic}`)
if(events.data.length != 0 || events.data == null)
{
events.data[0].events.forEach(async (element) => {
if( element.statement == 'goes more than' )
{
if(packet.payloadString > element.value )
{
console.log(element.value)
let res = await axios.post(`http://${ip.address()}:${process.env.PORT}/api/createNotification`,{
subject : `${events.data[0].device_name} is high`,
message: `${events.data[0].device_name} is ${packet.payloadString} which is greater than the maximum threshold ${element.value}`
})
aedes.publish({
qos: 0,
topic: '/notification',
payload: JSON.stringify(res.data.result),
retain: false
});
let technician = await axios.get(`http://${ip.address()}:${process.env.PORT}/api/getDeviceTechnicianByTopic/?topic=${packet.topic}`)
if(modemStatus)
{
technician.data.device[0].technicians_numbers.forEach(async(element) => {
// console.log(element,res.data.result[0].message)
sendSMS(element,`${res.data.result[0].message} , This is an automated service. Please do not reply`)
})
}
}
}
else if( element.statement === 'goes less than' )
{
if(packet.payloadString < element.value )
{
//console.log(element.value)
let res = await axios.post(`http://${ip.address()}:${process.env.PORT}/api/createNotification`,{
subject : `${events.data[0].device_name} is low`,
message: `${events.data[0].device_name} is ${packet.payloadString} which lower than the minimum threshold ${element.value}`
})
aedes.publish({
qos: 0,
topic: '/notification',
payload: JSON.stringify(res.data.result),
retain: false
});
let technician = await axios.get(`http://${ip.address()}:${process.env.PORT}/api/getDeviceTechnicianByTopic/?topic=${packet.topic}`)
if(modemStatus)
{
technician.data.device[0].technicians_numbers.forEach(async(element) => {
// console.log(element,res.data.result[0].message)
sendSMS(element,`${res.data.result[0].message} , This is an automated service. Please do not reply`)
})
}
}
}
});
}
let reading = await axios.post(`http://${ip.address()}:${process.env.PORT}/api/insertReading`,{
// device_id:
topic: packet.topic,
value: packet.payloadString
})
if(reading.data.status) console.log(reading.data.message)
}catch(error){
console.log(error)
}
})
aedes.on('subscribe', async (subscriptions, client) => {
if (client) {
let id = client.id.split('_')
if(id[0] === 'device'){
let events = await axios.put(`http://${ip.address()}:${process.env.PORT}/api/updateStatusByTopic/?topic=${subscriptions[0].topic}`,
{status : true})
aedes.publish({
qos: 0,
topic: '/status',
payload: subscriptions[0].topic,
retain: false
});
let device = await axios.get(`http://${ip.address()}:${process.env.PORT}/api/getDeviceByTopic/?topic=${subscriptions[0].topic}`)
let res = await axios.post(`http://${ip.address()}:${process.env.PORT}/api/createNotification`,{
subject : `${device.data.device.device_name} is reconnected`,
message: `${device.data.device.device_name} is back to business`
})
aedes.publish({
qos: 0,
topic: '/notification',
payload: JSON.stringify(res.data.result),
retain: false
});
// console.log('Device: ', device.data)
console.log('Subscribe client: ' , client.id)
console.log('topics : ' , subscriptions[0].topic)
return;
}
console.log('Subscribe client: ' , client.id)
console.log('topics : ' , subscriptions)
}
})
aedes.on('client', function (client) {
console.log('new client', client.id)
})
aedes.on('unsubscribe', async (subscriptions, client) => {
try {
let id = client.id.split('_')
if(id[0] === 'device'){
subscriptions.forEach(async (element) => {
let events = await axios.put(`http://${ip.address()}:${process.env.PORT}/api/updateStatusByTopic/?topic=${element}`,
{status : false})
aedes.publish({
qos: 0,
topic: '/status',
payload: element,
retain: false
});
let device = await axios.get(`http://${ip.address()}:${process.env.PORT}/api/getDeviceByTopic/?topic=${element}`)
let res = await axios.post(`http://${ip.address()}:${process.env.PORT}/api/createNotification`,{
subject : `${device.data.device.device_name} is disconnected`,
message: `${device.data.device.device_name} is interrupted, Please check the device condition.`
})
aedes.publish({
qos: 0,
topic: '/notification',
payload: JSON.stringify(res.data.result),
retain: false
});
if(modemStatus)
{
console.log(res.data.result)
sendSMS(element,`${res.data.result[0].message} , This is an automated service. Please do not reply`)
}
})
console.log('Unsubs client: ' , id[0])
console.log('topics : ' , subscriptions)
return;
}
console.log('Unsubs client: ' , client.id)
console.log('topics : ' , subscriptions)
} catch (error) {
console.log(error)
}
});
app.post('/openModem',(req,response,next)=>{
try {
gsmModem.open(req.body.modemPort, options,async (err,data) => {
if (err) {
console.log(`Error opening modem`);
response.send({status: false, message: 'Opening modem failed'})
modemStatus = false
console.log('Modem status ', modemStatus)
return
}
else{
// modemStatus = true
console.log('Opening port: ', portStatus)
gsmModem.initializeModem(async (msg,err) =>
{
if(err)
{
console.log("Initialize Modem Failed")
response.send({status: false, message: 'Initialize Modem Failed'})
// modemStatus = false
console.log('Modem status ', modemStatus)
gsmModem.close((err) => {
console.log('port closed', err);
})
return
}
console.log('initialize msg:', msg.data)
gsmModem.checkSimMemory(a => {
console.log(a)
})
gsmModem.setModemMode(async(msgMode,err) => {
if (err) {
/
console.log(`Error Setting Modem Mode`);
response.send({status: false, message: 'Error Setting Modem Mode'})
// modemStatus = false
console.log('Modem status ', modemStatus)
gsmModem.close((err) => {
console.log('port closed', err);
})
return
}
gsmModem.getOwnNumber(async (msg,err) => {
if(err)
{
console.log( `Error getting own number`);
response.send({status: false, message: 'Error getting own number'})
// modemStatus = false
console.log('Modem status ', modemStatus)
gsmModem.close((err) => {
console.log('port closed', err);
})
}
else{
// console.log("AT+CPMS: ","AT+CPMS=\"SM\",\"SM\",\"SM\"")
gsmModem.executeCommand(`AT+CPMS=\"SM\",\"SM\",\"SM\"`, ((data,err) => {
if(err)
{
console.log('Exec Error: ',err)
}
else{
console.log("Result from execute command: ", data)
gsmModem.getSimInbox((result, err) => {
if(err) {
console.log(`Failed to get SimInbox ${err}`);
} else {
console.log(`Sim Inbox Result: ${JSON.stringify(result)}`);
}
});
}
}), false, 30000)
// console.log(msg)
console.log(`Set Mode: ${msgMode.data}`);
modemStatus = true
console.log('Modem status ', modemStatus)
let res = await axios.post(`http://${ip.address()}:${process.env.PORT}/api/createNotification`,{
subject : `Modem succesfully connected`,
message: `Modem at ${data.data.modem} status ${data.data.status}`
})
modemPort = data.data.modem
portStatus = true;
aedes.publish({
qos: 0,
topic: '/notification',
payload: JSON.stringify(res.data.result),
retain: false
});
response.send({status: true, message: 'Modem succesfully connected'})
}
})
}, "PDU");
});
}
});
} catch (error) {
return next(error)
}
})
app.get('/getModemDetails', (req,res,next) => {
var details ={ number: null, signal: null}
if(modemStatus){
gsmModem.getOwnNumber( (msg,err) => {
if (err) {
console.log(`Error retrieving Signal Strength`);
res.send({status: modemStatus})
return
} else {
console.log(msg);
gsmModem.getNetworkSignal(async (sigStrength, err) => {
if (err) {
console.log( `Error retrieving Signal Strength`);
res.send({status: modemStatus})
return
} else {
res.send({status: modemStatus, comPort: modemPort, number: msg.data.number, sigStrength: sigStrength.data.signalQuality})
return
}
});
// res.send({number: msg.data.number})
}
})
}
else{
res.send({status: modemStatus})
}
})
app.post('/execAtCommand', async (req,res,next) => {
gsmModem.executeCommand(req.body.command, ((data,err) => {
if(err)
{
console.log('Exec Error: ',err)
res.send("Error")
}
else{
console.log("Result from execute command: ", data)
res.send(data)
}
}), false, 30000)
})
app.post('/sendSMS', async (req,response,next) =>{
try {
//send balance
if(balanceStatus)
{
let res = await sendSMS(req.body.number, req.body.message)
// console.log(res)
response.send({'Balance status: ': true})
}
else{
let res = await sendSMS(req.body.number, req.body.message)
// console.log(res)
response.send({'Balance status: ': false})
}
} catch (error) {
return next(error)
}
})
gsmModem.on('onNewMessageIndicator', data => {
//indicator for new message only (sender, timeSent)
console.log(data)
})
gsmModem.on('onNewMessage', data => {
//whole message data
console.log(data)
})
async function sendSMS(number,message){
let status = false;
gsmModem.sendSMS(number,message, true, async (response) => {
console.log("message status: ", response)
status = true
});
return status;
}
@iamqinglong palitan mo muna to, tanggalin mo escape tutal nag backtick ka.
gsmModem.executeCommand(`AT+CPMS=\"SM\",\"SM\",\"SM\"`, ((data, err) => {
if (err) {
console.log('Exec Error: ', err)
}
else {
console.log("Result from execute command: ", data)
gsmModem.getSimInbox((result, err) => {
if (err) {
console.log(`Failed to get SimInbox ${err}`);
} else {
console.log(`Sim Inbox Result: ${JSON.stringify(result)}`);
}
});
}
}), false, 30000)
palitan mo to
gsmModem.executeCommand(`AT+CPMS="SM","SM","SM"`,
or sa customInitCommand: 'AT+CPMS="SM","SM","SM"'
@zabsalahid Ganon parin yung response.
Modem Write: AT+CPMS="SM","SM","SM"
Modem Received: AT+CPMS="SM","SM","SM"
Activate Message Processing for: AT+CPMS="SM","SM","SM"
Ignore Data: AT+CPMS="SM","SM","SM"
Modem Received:
Ignore Data:
Modem Received: +CPMS: 4,40,4,40,4,40
Ignore Data: +CPMS: 4,40,4,40,4,40
Modem Received:
Ignore Data:
Modem Received: OK
Ignore Data: OK
Mongodb connection succeeded
Modem succesfully connected
Exec Error: Error: timeout:
{"_events":{},"_eventsCount":1,"command":"AT+CPMS=\"SM\",\"SM\",\"SM\"","add_time":"2019-05-01T14:02:09.251Z","id":11,"timeout":30000,"inProgress":true,"execute_time":"2019-05-01T14:02:09.257Z"}
at EventEmitter.item.on (C:\Users\Qing\project\capstone\server\node_modules\serialport-gsm\lib\functions\modem.js:853:27)
at EventEmitter.emit (events.js:189:13)
at Timeout.timeouts.(anonymous function).setTimeout [as _onTimeout] (C:\Users\Qing\project\capstone\server\node_modules\serialport-gsm\lib\functions\modem.js:900:14)
at ontimeout (timers.js:436:11)
at tryOnTimeout (timers.js:300:5)
at listOnTimeout (timers.js:263:5)
at Timer.processTimers (timers.js:223:10)
@iamqinglong may team viewer ka?
@zabsalahid Wala eh, pero DL ko muna sir.
@zabsalahid Wala eh, pero DL ko muna sir.
contact mo ako sa messenger, yun dun yung username ko
Aahhh yes, send as executeCommand without and defined parsing logic the timeout would be expected. When send as customInitCommand it should not give any timeout.
But in fact zu can also ignore that timeout because the command was executed correctly. But if it still not work you need to check more reasons
Maybe try google with the name of your modem and “receive sms/message” and maybe additional “smstools” (that is a Linux program that is doing the same as this lib and mostly have users with comparable problems in their forum.
@zabsalahid should we enhance readme to contain info on parsing stuff when using executeCommand?!
Or define default logic which checks for return that starts like the command but without AT?!
So for command AT+XYZ=1 the default logic could check for +XYZ at beginning and is returning this as result. And can be overwritten if needed ... I will try that later I think.
@zabsalahid should we enhance readme to contain info on parsing stuff when using executeCommand?!
I think so, and we don't have a sample file too.
Example I Plan to provide mine ;-) hopefully tonight
@zabsalahid both said done in https://github.com/zabsalahid/serialport-gsm/pull/33
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
I have a similar issue. I am able . to send SMS messages but the onNewMessage event cant be fired
@phundi what you mean with "can't be fired"?
What i mean is that i am not able to receive sms using the onNewMessage event. I am sending sms from my phone to the SIM in my modem.
On Thu, 3 Jun 2021, 01:14 Ingo Fischer, @.***> wrote:
@phundi https://github.com/phundi what you mean with "can't be fired"?
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/zabsalahid/serialport-gsm/issues/24#issuecomment-853442027, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAP4IP36EZPARXCAJTV7OBTTQ23N3ANCNFSM4HI5VCCQ .
The please enable debug log and provide the log. Maybe your modem do not support that
How to deal with this? I can't receive message because message never went to SIM inbox but rather than to GPRS/USB modem. I tried calling getSimInbox(), I got only messages from SIM, however my recent received message was in GPS/USB modem.