首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# AT命令发送带有CS2编码和用户数据报头的多部分短信

C# AT命令发送带有CS2编码和用户数据报头的多部分短信
EN

Stack Overflow用户
提问于 2021-11-20 01:40:51
回答 1查看 40关注 0票数 1

我想在C#中使用AT命令发送sms。现在,它只适用于一条消息。它带有自然的字符。它是用UCS2编码的。但我不能发送更长的消息,因为我添加User Data Header时有奇怪的字符。我的代码:

代码语言:javascript
复制
string messageSmsEncoded1 = "050003CC0201" + UnicodeStr2HexStr("dddd");
targetPhoneNo = UnicodeStr2HexStr(PhoneNumber);
                          
    
    string phone_number = Char.ConvertFromUtf32(34) + targetPhoneNo + Char.ConvertFromUtf32(34);
    serialPort.Write("AT");
    Thread.Sleep(100);
    var responseAt = serialPort.ReadExisting();
    serialPort.Write("AT+CSCS = ?" + Char.ConvertFromUtf32(13));
    Thread.Sleep(100);
    var responseCscs = serialPort.ReadExisting();
    serialPort.Write("AT+CSCS=\"UCS2\"" + Char.ConvertFromUtf32(13));
    Thread.Sleep(100);
    var responseUcs2 = serialPort.ReadExisting();
    serialPort.Write("AT+CMGF=1" + Char.ConvertFromUtf32(13));
    Thread.Sleep(100);
    var responseCmgf = serialPort.ReadExisting();
    // set data coding scheme
    serialPort.Write("AT+CSMP=17,167,0,8" + Char.ConvertFromUtf32(13));
    Thread.Sleep(100);
    var responseCsmp = serialPort.ReadExisting();
    serialPort.Write("AT+CMGS=" + phone_number + Char.ConvertFromUtf32(13));
    Thread.Sleep(100);
    var responseCmgs = serialPort.ReadExisting();
    serialPort.Write(messageSmsEncoded1 + Char.ConvertFromUtf32(26) + char.ConvertFromUtf32(13));

我得到了:

代码语言:javascript
复制
Ԁόȁdddd

如何在UCS2编码的消息中添加UDH

EN

回答 1

Stack Overflow用户

发布于 2021-11-27 23:40:23

在这里,您有几件事需要修复。

使用Thread.Sleep绝对是最糟糕的做法。。例如,您的代码

代码语言:javascript
复制
serialPort.Write("AT");
Thread.Sleep(100);
var responseAt = serialPort.ReadExisting();

有一个错误,因为这里缺少"\r"命令行终止符,因此调制解调器上实际上没有执行任何命令,也不会返回任何响应。但是,由于您没有解析响应,因此不会被检测到。

正如您不会编写一个完全忽略来自http服务器的所有响应的http客户端一样,您也不应该向调制解调器发送AT命令,而完全忽略它发回的响应。你必须对调制解调器发回给你的所有内容进行读取和解析。其他任何东西都不会可靠地工作。

那么Char.ConvertFromUtf32(13)就错了;您应该直接用'\r'字符(一个8位字节)来结束AT命令行,AT+CSCS编码与此完全无关。

您尝试将字符串编码为UCS2似乎没问题,除了Char.ConvertFromUtf32(34)是错误的,原因与回车符相同。最好从phone_number变量中去掉双引号字符,只需写成

代码语言:javascript
复制
"AT+CMGS=\"" + phone_number + "\"\r"

或者实际上,这是一个很好的机会,可以开始使用ucs2_phone_numberphone_number_ucs2来制作wrong code look wrong

对于AT+CMGS命令,您必须等待调制解调器发出信号,表明它已准备好接收数据有效负载。否则,在最坏的情况下,您将中止命令。在最好的情况下,它可能会起作用,但如果发送得太早,可能会丢失一些有效负载。请参阅this answer的第一部分。

最后,为了发送包含User Data Header的短信,您必须以AT+CMGF=0模式发送短信。有关详细信息,请参阅27.005规范(任何非旧版本都可以)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70042622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档