如何在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。
答案 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;
}