zabsalahid / serialport-gsm

SerialPort-GSM is a simplified plugin for communicating with gsm modems. (Primarily for sms) (Focused in PDU mode)
MIT License
91 stars 48 forks source link

Can't received message. #24

Closed iamqinglong closed 5 years ago

iamqinglong commented 5 years ago

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.


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,
            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.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)
})
zabsalahid commented 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.

Apollon77 commented 5 years ago

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?

iamqinglong commented 5 years ago

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

asa

zabsalahid commented 5 years ago

@iamqinglong can you try calling

    gsmModem.checkSimMemory(a => {
        console.log(a)
    })

after initializing.

Then check for receiving of messages.

iamqinglong commented 5 years ago

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)

123

Apollon77 commented 5 years ago

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?

iamqinglong commented 5 years ago

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?

Apollon77 commented 5 years ago

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?

Apollon77 commented 5 years ago

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

iamqinglong commented 5 years ago

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) )
iamqinglong commented 5 years ago

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"}}]}
zabsalahid commented 5 years ago

@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?

Apollon77 commented 5 years ago

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

iamqinglong commented 5 years ago

@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)
Apollon77 commented 5 years ago

Please show your code again. I really wonder.

zabsalahid commented 5 years ago

@iamqinglong pwede makita ano code mo ngayon? para matulungan kita.

iamqinglong commented 5 years ago

@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;
}
zabsalahid commented 5 years ago

@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"'

iamqinglong commented 5 years ago

@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)
zabsalahid commented 5 years ago

@iamqinglong may team viewer ka?

iamqinglong commented 5 years ago

@zabsalahid Wala eh, pero DL ko muna sir.

zabsalahid commented 5 years ago

@zabsalahid Wala eh, pero DL ko muna sir.

contact mo ako sa messenger, yun dun yung username ko

Apollon77 commented 5 years ago

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.

Apollon77 commented 5 years ago

@zabsalahid should we enhance readme to contain info on parsing stuff when using executeCommand?!

Apollon77 commented 5 years ago

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 commented 5 years ago

@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.

Apollon77 commented 5 years ago

Example I Plan to provide mine ;-) hopefully tonight

Apollon77 commented 5 years ago

@zabsalahid both said done in https://github.com/zabsalahid/serialport-gsm/pull/33

stale[bot] commented 5 years ago

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.

phundi commented 3 years ago

I have a similar issue. I am able . to send SMS messages but the onNewMessage event cant be fired

Apollon77 commented 3 years ago

@phundi what you mean with "can't be fired"?

phundi commented 3 years ago

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 .

Apollon77 commented 3 years ago

The please enable debug log and provide the log. Maybe your modem do not support that