zabsalahid / serialport-gsm

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

Ussd query issues #104

Closed spidy0x0 closed 2 years ago

spidy0x0 commented 2 years ago

hi, i am trying to make a simple ussd query to check balance and i have been struggling for hours. My brain hurts. this is my code

let serialportgsm = require('serialport-gsm')
const ussd = require('./node_modules/serialport-gsm/lib/functions/ussd.js');
let modem = serialportgsm.Modem();
ussd(modem);

let options = {
    baudRate: 115200,
    dataBits: 8,
    stopBits: 1,
    parity: 'none',
    rtscts: false,
    xon: false,
    xoff: false,
    xany: false,
    autoDeleteOnReceive: true,
    enableConcatenation: true,
    incomingCallIndication: true,
    incomingSMSIndication: true,
    pin: '',
    customInitCommand: '',
    cnmiCommand: 'AT+CNMI=2,1,0,2,1',
    logger: console
}

modem.open('/dev/ttyUSB0', options);

modem.on('open', () => {

    console.log(`Modem Sucessfully Opened`);

    modem.initializeModem(() => {

        modem.on('onNewIncomingUSSD', (data) => {
            console.log('onNewIncomingUSSD', {
                data
            });
        })

        async function main() {

            await modem.setModemMode(msg => {console.log('set pdu msg:', msg)}, 'PDU');

            let command = '*124#';
            try {
                let r = await modem.sendUSSD(command);
                console.log(r);
            } catch (err) {
                console.error(err);
                // handle the error here
            }
        }
        main();

    });

})

after running it,this is the output i get

Modem Sucessfully Opened
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
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+CLIP=1
Modem Received: AT+CLIP=1
Activate Message Processing for: AT+CLIP=1
Modem Received: 
Modem Received: OK
Call callback for: AT+CLIP=1
Modem Write: AT+CMGF=0
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+CUSD=1,"*124#",15
set pdu msg: { status: 'success', request: 'modemMode', data: 'PDU_Mode' }
Modem Received: AT+CUSD=1,"*124#",15
Activate Message Processing for: AT+CUSD=1,"*124#",15
Modem Received: 
Modem Received: +CME ERROR: 100

is there anything i am doing wrong? Please help

spidy0x0 commented 2 years ago

after the changing the command to 7-bit

*124# --> 2A31323423

i get this output

Modem Sucessfully Opened
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
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+CLIP=1
Modem Received: AT+CLIP=1
Activate Message Processing for: AT+CLIP=1
Modem Received: 
Modem Received: OK
Call callback for: AT+CLIP=1
Modem Write: AT+CMGF=0
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+CUSD=1,"2A31323423",15
set pdu msg: { status: 'success', request: 'modemMode', data: 'PDU_Mode' }
Modem Received: AT+CUSD=1,"2A31323423",15
Activate Message Processing for: AT+CUSD=1,"2A31323423",15
Modem Received: 
Modem Received: OK
Call callback for: AT+CUSD=1,"2A31323423",15
Modem Write: AT+CNMI=2,1,0,2,1
{ status: 'success', request: 'ussd', data: 'OK' }
Modem Received: AT+CNMI=2,1,0,2,1
Activate Message Processing for: AT+CNMI=2,1,0,2,1
Modem Received: 
Modem Received: OK
Call callback for: AT+CNMI=2,1,0,2,1
Modem Received: 
Modem Received: +CUSD: 2
onNewIncomingUSSD {
  data: {
    status: 'Incoming USSD',
    data: {
      text: undefined,
      follow: 'terminated by network',
      followCode: '2'
    }
  }
}

i am not getting the balance message

spidy0x0 commented 2 years ago

After days of intense suffering, i found the solution.

first run this : AT+CSCS="IRA"

goto http://www.rednaxela.net/pdu.php

alphabet size: 7

enter USSD code (eg. *124#) , click convert

in the 2nd box, copy the third line

add it to your ussd section: AT+CUSD=1,"AA988C3602", 15

after getting the output in 7bit (CUSD=1,"xxxxxxxxxx..7bit"), copy it

goto http://smstools3.kekekasvi.com/topic.php?id=288

in the "USSD Entry/Display" section, select GSM 7bit packed

paste the result you had from the modem

click convert

spidy0x0 commented 2 years ago

after the changing the command to 7-bit *124# --> 2A31323423

the issue here is, i was using the 8-bit alphabet conversion. 7-bit solved the issue

to do this programmatically, use https://www.npmjs.com/package/ussd-pdu-text-converter

spidy0x0 commented 2 years ago

My full working ussd example

let serialportgsm = require('serialport-gsm')
const ussd = require('./node_modules/serialport-gsm/lib/functions/ussd.js');
let modem = serialportgsm.Modem();
ussd(modem);
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));

let options = {
    baudRate: 115200,
    dataBits: 8,
    stopBits: 1,
    parity: 'none',
    rtscts: false,
    xon: false,
    xoff: false,
    xany: false,
    autoDeleteOnReceive: true,
    enableConcatenation: true,
    incomingCallIndication: true,
    incomingSMSIndication: true,
    pin: '',
    customInitCommand: '',
    cnmiCommand: 'AT+CNMI=2,1,0,2,1',
    logger: console
}

modem.on('open', () => {

    console.log(`\nModem Sucessfully Opened\n`);

    modem.initializeModem(() => {

        async function main() {

            await modem.setModemMode(async (msg, err) => {
                if (err) {
                    console.log(`Error Setting Modem Mode - ${err}`);
                } else {
                    console.log(`Set Mode: ${JSON.stringify(msg)}`);

                    modem.executeCommand('AT+CSCS="IRA"', (result, err) => {
                        if (err) {
                            console.log(`Error - ${err}`);
                        } else {
                            console.log(`Result ${JSON.stringify(result)}`);
                        }
                    });

                    //*170#
                    let rootCmd = 'AAD80D3602';
                    try {
                        await modem.sendUSSD(rootCmd);
                        await sleep(3000); //sleep for 3secs
                        await modem.sendUSSD('31');  //response to request
                    } catch (err) {
                        console.error(err);
                        // handle the error here
                    }

                }
            }, 'PDU');

        }
        main();

        modem.on('onNewIncomingUSSD', (data) => {
            console.log('onNewIncomingUSSD ', {
                data
            });
        })

    });

})

modem.open('/dev/ttyUSB0', options);