c# unicode sms gsm at-command

Envío de mensajes Unicode(como en persa y árabe) en C#usando comandos AT a través del módem GSM



sms at-command (3)

En primer lugar, compruebe el soporte de su módem unicode luego cambie su código a este
tenemos que especificar el DCS correcto (esquema de codificación de datos) para mensajes Unicode, que es 0x08.

Podemos establecer este valor cambiando el cuarto parámetro del comando AT + CSMP a ''8'':

AT + CSMP = 1,167,0,8

GSMPort.Write("AT/r"); Thread.Sleep(1000); GSMPort.Write("AT+CSCS=/"UCS2/"/r"); Thread.Sleep(1000); GSMPort.Write("AT+CMGF=1/r"); Thread.Sleep(1000); GSMPort.Write("AT+CSMP=1,167,0,8/r"); //AT+CSMP=1,167,0,8 Thread.Sleep(1000); GSMPort.WriteLine("AT+CMGS=/"" + destinationNumber + "/"/r/n"); Thread.Sleep(1000); GSMPort.WriteLine("0633064406270645" + "/x1A");

Estoy desarrollando una aplicación para módems GSM (D-Link DWM-156) en C # .Net usando comandos AT. Tengo un problema al enviar mensajes Unicode (como mensajes escritos en persa o en árabe). Aquí está el núcleo de mi programa:

SerialPort GSMPort = new SerialPort(); GSMPort.PortName = "COM6"; GSMPort.BaudRate = 9600; GSMPort.Parity = Parity.None; GSMPort.DataBits = 8; GSMPort.StopBits = StopBits.One; GSMPort.Handshake = HandShake.RequestToSend; GSMPort.DtrEnable = true; GSMPort.RtsEnable = true; GSMPort.Open(); GSMPort.Write("AT/r"); Thread.Sleep(1000); GSMPort.Write("AT+CMGF=1/r"); Thread.Sleep(1000); GSMPort.Write("AT+CMGS=/"" + destinationNumber + "/"/r/n"); Thread.Sleep(1000); GSMPort.Write(shortMessage+ "/x1A");

Funciona bien para letras en inglés y ASCII. He leído este artículo y puedo enviar mensajes Unicode en Hyperterminal usando comandos AT:

AT [Enter] OK AT+CSCS="UCS2" or AT+CSCS="HEX" [Enter] ---> We have to convert our message to hex OK AT+CMGF=1 [Enter] OK AT+CMGS="destinationNumber" [Enter] > 0633064406270645002006450631062D06280627 ---> The hex format of our message (سلام مرحبا) +CMGS: 139 OK

Como estos comandos funcionan correctamente, he agregado GSMPort.Write("AT+CSCS=/"UCS2/"/r"); a mi solicitud, e intenté enviar 0645 0631 062D 0628 0627 (مرحبا) o 0633 0644 0627 0645 (سلام).

GSMPort.Write("AT/r"); Thread.Sleep(1000); GSMPort.Write("AT+CSCS=/"UCS2/"/r"); Thread.Sleep(1000); GSMPort.Write("AT+CMGF=1/r"); Thread.Sleep(1000); GSMPort.Write("AT+CMGS=/"" + destinationNumber + "/"/r/n"); Thread.Sleep(1000); GSMPort.Write("0633064406270645" + "/x1A");

Pero a diferencia de los comandos AT en Hyperterminal, el destino no recibe las letras correctas. ¿Cuál es la diferencia entre estos comandos AT en el código C # y el código Hyperterminal? Apreciaré si me ayudas a resolver este problema.

Información adicional: Como usted sabe, no tengo problemas para enviar mensajes Unicode (como letras persas) por hyperterminal y usando comandos AT. En el código siguiente trato de enviar سلام, y "0633064406270645" es la forma hexadecimal de él. Pero recibo □□□□ en mi teléfono.

GSMPort.Encoding = UnicodeEncoding.GetEncoding(1256); GSMPort.Write("AT/r"); Thread.Sleep(1000); GSMPort.Write("AT+CSCS=/"UCS2/"/r"); Thread.Sleep(1000); GSMPort.Write("AT+CMGF=1/r"); Thread.Sleep(1000); GSMPort.Write("AT+CMGS=/"" + destinationNumber + "/"/r/n"); Thread.Sleep(1000); GSMPort.Write("0633064406270645" + "/x1A");

En el entorno hiperterminal, por otro lado, todo va bien y recibo سلام.

AT [Enter] OK AT+CSCS="UCS2" OK AT+CMGF=1 [Enter] OK AT+CMGS="destinationNumber" [Enter] > 0633064406270645 [Ctrl+Z] +CMGS: 139 OK

Me he dado cuenta de que en las propiedades hiperterminales si compruebo que la "línea de envío termina con alimentaciones de línea" (está en propiedades-> Configuración-> Configuraciones ASCII, por favor revise la imagen a continuación), tendré el mismo problema que tuve en C # código. Creo que "enviar línea termina con alimentaciones de línea" está habilitado en GSMPort.Write de forma predeterminada? Si es así, ¿cómo puedo desactivarlo?


La codificación predeterminada para SerialPort es Encoding.ASCII . SerialPort.Encoding en una codificación para que sea compatible con el conjunto de caracteres que esté utilizando (como Encoding.UTF32 ) o use SerialPort.Write(char[], int, int) y convierta su cadena Unicode a bytes de la forma que prefiera. .


Finalmente descubrí cómo resolver este problema. Como dije en la sección "Información adicional" de mi pregunta, el envío de la línea termina con las alimentaciones de línea causó esta falta de coincidencia entre SerialPort en C # y los comandos AT en hyperterminal para enviar mensajes Unicode. Acabo de reemplazar /r con /n alimentaciones de línea. El código modificado es el siguiente:

GSMPort.Write("AT/n"); Thread.Sleep(1000); GSMPort.Write("AT+CSCS=/"UCS2/"/n"); Thread.Sleep(1000); GSMPort.Write("AT+CMGF=1/n"); Thread.Sleep(1000); GSMPort.Write("AT+CMGS=/"" + destinationNumber + "/"/n"); Thread.Sleep(1000); GSMPort.Write("0633064406270645" + "/x1A");

Deje sin cambios las propiedades de SerialPort.Encoding y SerialPort.NewLine . No es necesario cambiar sus valores predeterminados, simplemente configure AT+CSCS="UCS2" para enviar mensajes en formato Unicode.