Pergunta

Estou enviando SMS por comandos AT com o telefone móvel GSM. Eu quero enviar em massa de mensagem como milhares. Eu li que por GSM podemos enviar 6-8 sms por minuto. Mas quando eu enviar mensagens então alguém está indo e alguém não. Estou recebendo informações de arquivo excel significa número de destino e texto da mensagem. Você pode me dizer por que algumas sms estão indo e alguns não. Meu código é

        SmsFields smsObj = null;
        List<SmsFields> smsColl = null;
        SerialPort serialport = null;
        StringBuilder strbuild = new StringBuilder();
        try
        {
            //Validate the form 
            if (!Validation()) return;

            serialport = new SerialPort();

            ////Sets the properties of serial port object
            serialport.PortName = cboPort.SelectedItem.ToString();
            serialport.BaudRate = 9600;
            serialport.Parity = Parity.None;
            serialport.DataBits = 8;
            serialport.StopBits = StopBits.One;
            serialport.Handshake = Handshake.RequestToSend;
            serialport.DtrEnable = true;
            serialport.RtsEnable = true;

            //Open the port to send sms
            serialport.Open();

            //Check if port is opened or not
            if (!serialport.IsOpen)
            {
                MessageBox.Show("Serial port is not opened. Please try with other port");
                return;
            }

            //Create smsFields class's object and fill the data in the generic collection
            smsObj = SmsFields.Instance;
            smsColl = smsObj.FillData(txtFilePath.Text);

            if (smsColl == null)
            {
                MessageBox.Show("No data found in the excel table");
                return;
            }
            //Gets the single record from SmsFields class and sends the message
            foreach (SmsFields sms in smsColl)
            {

                //checks phone status
                serialport.WriteLine("AT" + Environment.NewLine);
                //Configures message as SMS (0 for PDU format) and (1 for text format)
                serialport.WriteLine("AT+CMGF=1" + Environment.NewLine);

                //Sets message center number
                serialport.WriteLine("AT+CSCA=\"" + txtServiceNo.Text + "\"" + Environment.NewLine);

                //Sets destination number
                serialport.WriteLine("AT+CMGS=\"" + sms.DestinationNo + "\"" + Environment.NewLine);

                //Specifies message and sends Ctrl+z
                serialport.WriteLine(sms.Message + (char)26);

                //Displays buffer containing output messages
                System.Threading.Thread.Sleep(4000);
   }
Foi útil?

Solução

Eu acho que o problema é que você não está esperando o código final resultado (ou seja OK, ERROR e alguns outros) antes de enviar o próximo comando. O problema com isso é que o novo comando irá desencadear uma anulação do comando em curso, se não está terminado. Para citar V.250 :

5.6.1 abortar comandos

...

abortar de comandos é realizado pela transmissão do DTE ao DCE de qualquer personagem.

Assim Sempre ao enviar comandos AT, você deve espera para o código resultado final antes de enviar o próximo comando.

Posso sugerir refatoração serialport.WriteLine("ATxxx" + Environment.NewLine) em uma função sendCommand(serialport, "ATxxx")? E então você pode adicionar à espera do código de resultado final no fim dessa função.

Outras dicas

Tente ver se há um padrão para as mensagens que não são enviadas. Porque então pode haver um problema com o formato de número ou caracteres inválidos na mensagem.

Além disso, algumas notas:

  1. Você não está fazendo nenhuma verificação de erro. Gostaria de ter certeza que eu tenho a resposta esperada depois de chamar cada comando.

  2. Você está usando Environment.NewLine para terminar cada linha. Eu suponho que esta é uma propriedade que muda com o sistema operacional subjacente. O padrão AT é no entanto muito claro sobre exatamente quais caracteres para uso para terminar comandos de linha.

  3. Os telefones móveis são bastardos reais. Só porque você seguir a especificação ou documentação não significa que eles fazem. Suponha que cada modelo de telefone se comporta diferente de todos os outros. Ver ponto 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top