Envoi de SMS donne CMS erreur 304

Je travaille sur un programme en C# qui permet d'envoyer un SMS à partir de mon ordinateur à l'aide de mon modem GSM, et j'ai obtenu la plupart de mon programme de travail.

Je peux envoyer la plupart des commandes AT Hayes genre: "À" et "AT+CGMI;+CGMM", qui renvoie le message "OK", donc je sais que je peux communiquer avec le modem.

Cependant, j'ai des problèmes pour envoyer un standard 7 bits codés message du modem de mon téléphone portable.

Avec l'aide de PDUspy j'ai un peu confiance, je suis d'encodage de mon message.

Cependant le code suivant échoue lamentablement:

public string SendEncodedSms(string reciever, string message)
{
  string response = GetResponse("AT+CMGF=0");
  if (isFine(response))
  {
    string encodedBody = "000100" + EncodedReceiver(reciever) + "0000";
    encodedBody += EncodeToSeptet(message);

    int cmgs_header = encodedBody.Length / 2;

    port.WriteLine("AT+CMGS=" + cmgs_header.ToString() + "\r\n");
    port.WriteLine(encodedBody + (char)26);

    return ReadResponse(300);
  }
  else throw new ApplicationException("Cant go into SMS PDU mode");
}

Il y a cinq appels de fonction à l'intérieur:

  • GetResponse() est la fonction qui fonctionne comme un wrapper lors de la communication avec le modem - toujours s'assurer que chaque commande se termine par un "\r", et renvoie OK ou Erreur en fonction de la réponse du modem.

  • isFine() est une fonction simple qui vérifier si oui ou non la réponse de GetResponse() contenait un message "OK".

  • ReadResponse() renvoie la réponse de l'modem si c'est OK ou tous les messages d'erreur et tout ce qu'il y a également peut être incorporée entre la commande et le message d'état.

  • EncodeReceiver() codent pour les récepteurs numéro de téléphone inverse de grignoter de la notation. E. g. 12345678 devient 21436587.

  • EncodeToSeptet() Code pour le message de 8bit notation à 7bit notation.

Toutes les fonctions ont été confirmés pour travailler amende à l'aide du PDU de l'espion et les réponses envoyées à la fenêtre de débogage.

Appel SendEncodedSms("<my phone number>", "test") retourne:

AT+CMGS=17

0001000A91xxxxxxxxxx000004F4F29C0E

+CMS ERROR: 304

J'ai remplacé mon codés numéro de téléphone pour les questions de vie privée... 😉

  • Est qu'il ya quelqu'un qui peut me donner un indice de ce que je suis en situation d'échec?

Mise à JOUR:

Lien laissé entendre que j'était en train de calculer cmgs_header mal.

Après un peu de nettoyage de code j'ai:

public string SendEncodedSms(string receiver, string message)
{
  if(isFine("AT+CMGF=0"))
  {
     string encodedBody = EncodedReceiver(receiver) + "0000";
     encodedBody += EncodeToSeptet(message);

     /* The +2 in calculation is a hack. Its probleby two of the octets 
      * in 000100 that should be a part of length calculation. But need 
      * to verify in against severeal sites.
      */
     int cmgs_header = (encodedBody.Length / 2) + 2;

     encodedBody = "000100" + encodedBody;

     //Rest is as before.

    ...

  }

  else ...
}
  • Je dois mentionner "port" est un exemple de SerialPort.