如何在c#中使用at命令发送阿拉伯语短信

时间:2010-11-22 18:01:22

标签: c# sms arabic at-command

如何在C#中使用at命令发送阿拉伯语短信?当我发送阿拉伯语消息时,它显示不正确的字符。

我尝试使用此代码:

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 个答案:

答案 0 :(得分:2)

看起来你必须先将你的unicode字符串转换为十六进制。

来自http://www.smssolutions.net/tutorials/gsm/sendsmsat/

发送Unicode短信

某些调制解调器还能够在不编码PDU的情况下发送Unicode或UCS2消息。您可以通过仅将Unicode数据转换为HEX字符串并将此字符串发送到调制解调器来发送Unicode消息。

要检查您的调制解调器是否支持此模式,只需键入以下命令: AT + CSCS =?

此命令显示调制解调器支持的代码页。调制解调器会这样回复: + CSCS :(“GSM”,“PCCP437”,“CUSTOM”,“HEX”)

如果此字符串包含“HEX”或“UCS2”,则似乎支持Unicode。要指定您将使用HEX字符串发送消息,请根据调制解调器响应将代码页设置为“HEX”或“UCS2”。在我们的示例中,我们将调制解调器设置为“HEX”: AT + CSCS =“HEX”

接下来,我们必须为Unicode消息指定正确的DCS(数据编码方案),即0x08。我们可以通过将AT + CSMP命令的第四个参数更改为“8”来设置此值: AT + CSMP = 1,167,0,8

现在,调制解调器已准备好以Unicode格式发送消息。现在是发送实际消息的时候了: AT + CMGS =“+ 31638740161”

用您自己的手机号码替换上述电话号码。调制解调器将响应: >

您必须自己编程,这是一个简单的例程,它将Unicode字符串转换为十六进制字符串,如下所示: مرحبا

阿拉伯语中的'Hello'将按如下方式转换: “06450631062D06280627”

您可以将此十六进制字符串发送到调制解调器: 06450631062D06280627

几秒钟后,调制解调器将使用消息的消息ID进行响应,表明消息已正确发送: + CMGS:63

短信很快就会传到手机上。

答案 1 :(得分:2)

我遇到类似Unicodes的问题(波斯语或阿拉伯语消息)。请在this thread中查看我的问题和答案。在此主题中,您可以找到如何正确发送Unicode消息,并解决您的问题。

首先请阅读this article,然后将您的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 :(得分:1)

我尝试根据这篇文章用波斯语发送短信: 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;
    }

答案 3 :(得分:0)

您似乎应该使用PDU格式。

从这个link开始!

答案 4 :(得分:0)

这是发送bangla或任何语言,也是unicode发送AT命令

   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;

这是将转换后的字符串转换为HexaDecimal

public static string Str2Hex(string strMessage)
{
    byte[] ba = Encoding.BigEndianUnicode.GetBytes(strMessage);
    string strHex = BitConverter.ToString(ba);
    strHex = strHex.Replace("-", "");
    return strHex;
 }