如何在C#中使用AT命令发送阿拉伯文短信

3
如何在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。


可能是[使用GSM调制解调器通过AT命令在C#中发送Unicode消息(例如波斯语和阿拉伯语)]的重复问题(https://dev59.com/j2_Xa4cB1Zd3GeqP0266)。 - miken32
5个回答

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
AT+CSMP=1,167,0,8 的结果是错误。 - mahdi

2
我曾经遇到过类似的问题,涉及到Unicode(波斯或阿拉伯信息)。请查看此线程中我的问题和答案。在这个线程中,您可以找到如何正确发送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

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

这行代码出错了: recievedData = ExecCommand(port, "AT+CSMP=1,167,0,8", 300, "Failed to set message format."); 请帮忙解决一下,谢谢! - Leebeedev

0

这可以用来发送孟加拉语或任何语言,也可以发送 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;

这是将字符串转换为十六进制的结果

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

0

看起来你应该使用PDU格式。

从这里link开始!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接