zabsalahid / serialport-gsm

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

Unable to get the number of a postpaid sim using "modem.getOwnNumber(callback)" #139

Closed justlester closed 2 days ago

justlester commented 2 weeks ago

Hi!

I have a gsm modem with 16 sim slots and used 2 sims, (prepaid sim and postpaid sim) just for testing.

The serialport-gsm detected both sims and tried to run with the code below. It works smoothly with the prepaid sim, but when I try to use the postpaid sim, it throws a timeout error that modem.getOwnNumber() is unable to get the number of the postpaid sim. I also tried to increase the timeout, still same error.

getOwnNumber error: timeout:
{"_events":{},"_eventsCount":1,"command":"ATZ","add_time":"2024-06-20T05:36:11.827Z","id":2,"timeout":10000,"inProgress":true,"execute_time":"2024-06-20T05:36:11.831Z"}

I commented on the modem.getOwnNumber() just to run the full process and everything works with getting the sim number! I hope you can check this out, this package is really awsome by the way!

Here is my full code:

const serialportgsm = require('serialport-gsm');
const readlineSync = require('readline-sync');

// Prompt the user to enter the port name
const portName = readlineSync.question('Enter the serial port name (e.g., COM12 or /dev/ttyUSB0): ');
const mobileNumber = readlineSync.question('Enter the mobile number: ');
const smsMessage = readlineSync.question('Enter the sms message: ');

// Validate user input (optional)
if (!portName) {
  console.log('No serial port name provided. Exiting.');
  process.exit(1);
}

if (!mobileNumber) {
  console.log('No mobile number provided. Exiting.');
  process.exit(1);
}

if (!smsMessage) {
  console.log('No sms message provided. Exiting.');
  process.exit(1);
}

const modemOptions = {
  baudRate: 115200,
  dataBits: 8,
  stopBits: 1,
  parity: 'none',
  rtscts: false, 
  xon: false,
  xoff: false,
  xany: false,
  autoDeleteOnReceive: true,
  enableConcatenation: true,
  // logger: console
};

// Create a modem instance
const modem = new serialportgsm.Modem();

// Event listener for 'open' event
modem.on('open', async () => {
  console.log(`Modem connected to ${portName} successfully.`);

  try {

    modem.initializeModem((res, err) => {
      if(err){
        console.log('initializeModem error:', err);
      }else{
        console.log('initializeModem result:',res);
      }
    });

    modem.setModemMode((res, err) => {
      if(err){
        console.log('setModemMode error:',err);
      }else{
        console.log('setModemMode result:',res);
      }
    },'PDU');

    //modem.getOwnNumber((res,err)=> {
      //if(err){
       // console.log('getOwnNumber error:',err);
      //}else{
       // console.log('getOwnNumber result:', res);
     // }
    //},60000);

    modem.getNetworkSignal((res,err)=> {
      if(err){
        console.log('getNetworkSignal error:',err);
      }else{
        console.log('getNetworkSignal result:', res);
      }
    });

    modem.sendSMS(mobileNumber, smsMessage, false, (res,err) => {
      if(err){
        console.log('sendSMS error:',err);
      }else{
        console.log('sendSMS result:',res);
      }
    });

  } catch (err) {
    console.error('Error executing command:', err);
  }
});

// Event listener for 'error' event
modem.on('error', (err) => {
  console.error('Modem error:', err);
});

// Event listener for 'close' event
modem.on('close', () => {
  console.log('Modem connection closed.');
});

// Open Modem
modem.open(portName, modemOptions, (error, result) => {
    if(error){
        console.log('Open Modem error:',error);
    }else{
        console.log('Open Modem success',result);
    }
});
soukicz commented 2 days ago

I have read somewhere that it is not guaranteed to have own number stored on SIM. I had implemented fallback that sends me SMS from this new SIM with unknown number, I respond with its number and script uses setOwnNumber() to store it on SIM. Next call to getOwnNumber works as expected. It is not great and I don't like to guess what that timeout means but it mostly works.

justlester commented 2 days ago

Thanks! I have already solve this by the way and forgot to close