как отправить арабские смс с помощью команды в c # - PullRequest
2 голосов
/ 22 ноября 2010

Как я могу отправить арабское SMS с помощью команды at в C #?При отправке арабских сообщений отображаются неправильные символы.

Я пытался использовать этот код:

serialPort1.BaseStream.Flush();

            string cb = char.ConvertFromUtf32(26);

            System.Threading.Thread.Sleep(2000);

            this.serialPort1.Write("AT+CMGF=1\r");
            this.serialPort1.Write("AT+CSCA=servicecenter\r\n");//Ufone Service Center

            this.serialPort1.Write("AT+CSCS=\"" + "HEX" + "\"\r\n");
            this.serialPort1.Write("AT+CSMP=\"" + 1 + "," + 167 + "," + 0 + ","  +8+ "\"\r\n");
            this.serialPort1.Write("AT+CMGS=\"" + textBox1.Text + "\"\r\n");// message sending
            this.serialPort1.Write(textBox2.Text + cb);//message text

, и я написал 06450631062D06280627 в текстовом поле.

Ответы [ 5 ]

2 голосов
/ 16 марта 2013

У меня была похожая проблема с Unicodes (персидские или арабские сообщения).Пожалуйста, проверьте мой вопрос и ответьте в этой теме .В этой теме вы можете узнать, как правильно отправлять сообщения Unicode, и ваша проблема будет решена.

Сначала прочитайте эту статью , затем преобразуйте свое сообщение Unicode в шестнадцатеричный формат и установите AT+CSCS="UCS2",Ядро вашего кода должно выглядеть так:

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("06450631062D0628062706450631062D0628062706450631062D06280627" + "\x1A");

"06450631062D06280627" - это шестнадцатеричный формат "مرحبا"!

2 голосов
/ 22 ноября 2010

Похоже, вам нужно сначала преобразовать строки в юникоде в шестнадцатеричное.

С http://www.smssolutions.net/tutorials/gsm/sendsmsat/:

Отправка SMS-сообщения в Юникоде

Некоторые модемы также имеют возможность отправлять сообщения Unicode или UCS2 без кодирования PDU. Вы можете отправлять сообщения Unicode, только преобразовав данные Unicode в строку HEX и отправив эту строку модему.

Чтобы проверить, поддерживает ли ваш модем этот режим, просто введите следующую команду: AT + CSCS =?

Эта команда отображает кодовые страницы, поддерживаемые модемом. Модем ответит так: + CSCS: («GSM», «PCCP437», «CUSTOM», «HEX»)

Если эта строка содержит «HEX» или «UCS2», Unicode, похоже, поддерживается. Чтобы указать, что вы будете использовать строку HEX для отправки сообщения, установите кодовую страницу на «HEX» или «UCS2» в зависимости от ответа модема. В нашем примере мы установим модем на «HEX»: AT + CSCS = "HEX"

Далее мы должны указать правильную DCS (схему кодирования данных) для сообщений Unicode, которая равна 0x08. Мы можем установить это значение, изменив четвертый параметр команды AT + CSMP на «8»: AT + CSMP = 1 167,0,8

Модем теперь готов отправлять сообщения в формате Unicode. Сейчас самое время отправить собственное сообщение: AT + CMGS = "+ 31638740161"

Замените вышеуказанный номер телефона своим номером мобильного телефона. Модем ответит: >

Единственное, что вам нужно запрограммировать самостоятельно, - это простая процедура, которая преобразует строку Unicode в шестнадцатеричную строку, например так: مرحبا

То, что по-арабски «Hello», будет преобразовано так: "06450631062D06280627"

Вы можете отправить эту шестнадцатеричную строку на модем: 06450631062D06280627

Через несколько секунд модем ответит идентификатором сообщения, сообщив, что сообщение было отправлено правильно: + CMGS: 63

Сообщение придет на мобильный телефон в ближайшее время.

1 голос
/ 01 июня 2014

Я пытаюсь отправить смс на фарси в соответствии с этой статьей: http://www.smssolutions.net/tutorials/gsm/sendsmsat/ и это было так легко. это мой код в C #:

string recievedData = ExecCommand(port, "AT+CSCS=\"HEX\"", 300, "Failed to set message encoding.");
            recievedData = ExecCommand(port, "AT+CSMP=1,167,0,8", 300, "Failed to set message format.");
            //recievedData = ExecCommand(port, "AT+CMGF=1", 300, "Failed to set message format.");

            String command = "AT+CMGS=\"" + Str2Hex(PhoneNo) + "\"";
            recievedData = ExecCommand(port, command, 300, "Failed to accept phoneNo");

            command = Str2Hex(Message) + char.ConvertFromUtf32(26) + "\r";

            recievedData = ExecCommand(port, command, 3000, "Failed to send message"); //3 seconds

ExecCommand - это процедура, которая отправляет команду на последовательный порт в ожидании получения ответа от порта.

Milad


    public static string Str2Hex(string strMessage)
    {
        byte[] ba = Encoding.BigEndianUnicode.GetBytes(strMessage);
        string strHex = BitConverter.ToString(ba);
        strHex = strHex.Replace("-", "");
        return strHex;
    }
0 голосов
/ 20 января 2018

Это работает для отправки банглы или любого языка, а также для отправки в Юникоде AT Command

   SP.Write("AT\r");
    Thread.Sleep(2000);
    progressSending.Value = 40;
    SP.Write("AT+CSCS=HEX\r\n");
    Thread.Sleep(2000);
    progressSending.Value = 50;
    SP.Write("AT+CMGF=1\r\n");
    Thread.Sleep(2000);
    progressSending.Value = 60;
    SP.Write("AT+CSMP=1,173,0,8\r\n");
    Thread.Sleep(2000);
    progressSending.Value = 70;
    SP.Write("AT+CMGS=" + here write receive number + Char.ConvertFromUtf32(13));
    Thread.Sleep(2000);           
    progressSending.Value = 80;                          
    SP.Write(Str2Hex(your stirng value) + "\x1A" + "\r\n");
    Thread.Sleep(2000);
    progressSending.Value = 90;

Это преобразованная строка в шестнадцатеричный

public static string Str2Hex(string strMessage)
{
    byte[] ba = Encoding.BigEndianUnicode.GetBytes(strMessage);
    string strHex = BitConverter.ToString(ba);
    strHex = strHex.Replace("-", "");
    return strHex;
 }
0 голосов
/ 29 ноября 2011

Похоже, вам следует использовать PDU формат.

начать с этой ссылки !

...