当前位置: 首页 > 知识库问答 >
问题:

利用AT命令在GSM上发送多部分短信

陆沈浪
2023-03-14

我有一个windows应用程序发送短信连接到GSM调制解调器。我只使用AT命令连接到端口和发送文本。

ExecCommand(port, "AT", 300, "No phone connected at " + strPortName + ".");
ExecCommand(port, "AT+CMGF=1", 300, "Failed to set message format.");
var command = "AT+CSCS=\"" + "HEX" + "\"";
ExecCommand(port, command, 300, "Failed to support unicode");
ExecCommand(port, "AT+CSMP=1,167,0,8", 300, "Failed to set message properties.");
command = "AT+CMGS=\"" + phoneNo + "\"";
ExecCommand(port, command, 300, "Failed to accept phoneNo");
message = message.ToCharArray().Select(Convert.ToInt32).Select(value => String.Format("{0:X}", value)).Aggregate("", (current, hexOutput) => current + hexOutput.PadLeft(4, '0'));
command = message + char.ConvertFromUtf32(26) + "\r";
var recievedData = ExecCommand(port, command, 3000, "Failed to send message"); 

下面是ExecCommand方法

    public string ExecCommand(SerialPort port, string command, int responseTimeout, string errorMessage)
    {
        try
        {
            // receiveNow = new AutoResetEvent();
            port.DiscardOutBuffer();
            port.DiscardInBuffer();
            receiveNow.Reset();
            port.Write(command + "\r");

            //Thread.Sleep(3000); //3 seconds
            string input = ReadResponse(port, responseTimeout);
            if ((input.Length == 0) || ((!input.EndsWith("\r\n> ")) && (!input.EndsWith("\r\nOK\r\n"))))
                throw new ApplicationException("No success message was received.");
            return input;
        }
        catch (Exception ex)
        {
            throw new ApplicationException(errorMessage, ex);
        }
    }

共有1个答案

邢博涛
2023-03-14

您在正确的轨道上,我很高兴看到几个基本的事情做对了(以\r结束命令行,等待“\r\n>”在+cmgs等待“\r\n>”,以及等待OK最终结果代码而不是睡眠),非常好的开始!

但是,您确实需要对结构进行一些更改。首先,您需要处理所有其他最终结果代码,而不仅仅是OK。您应该将at+cmgs命令与其他命令区别对待,因为您应该等待该命令的两件事情(首先是前缀,然后是发送消息文本后的最终结果代码),而不是只等待一件事情(例如,最终结果代码)。此外,来自调制解调器的所有响应都是完整的行(除了“\r\n>”前缀),因此更改算法以逐行处理响应。

String input;
do {
        input = ReadLine(port, responseTimeout);
} while (!isFinalResultCode(input));

问题中使用的命令都不会产生中间响应,但是如果要在+cpbr处运行类似的命令,您将在该循环中使用这些中间响应(并且在尝试使用该行作为中间响应之前,您必须将最终结果测试移到该循环中)。

您可以在atinout中看到is_final_result函数,或者在ST-Ericsson的U300 RIL中看到相应的函数(请参见此答案中的链接和注释)。

我认为这在文本模式下是不可能的。有关PDU模式下多部分短信的详细信息,请参见Naser Asadi建议的链接。在http://mobiletidings.com/2009/02/18/sombination-sms-messages/和http://developer.nokia.com/community/discussion/showthread.php/109602-concatenated-sms-in-pdu-mode也有一些有用的信息。

 类似资料:
  • 我已成功发送多部分pdu短信, 问题是,当我试图将此SMS发送到不同网络上的号码时,它会给我以下错误: 请谁能告诉我我该怎么做。

  • 问题内容: 有人可以帮助我使用Python中的AT命令发送和接收SMS吗? 万一重要,我正在使用Fedora 8。 哪款手机搭配Linux(诺基亚,索尼爱立信,三星等)会更好?所有电话都支持使用AT命令发送和接收SMS吗? 问题答案: 以下是一些示例代码,可以帮助您入门(在Python 3000中): 您还需要做两件事: 用适当的格式编码消息(主要是GSM 03.38,unicode.org上有一

  • AT 命令简介 AT 命令(AT Commands)最早是由发明拨号调制解调器(MODEM)的贺氏公司(Hayes)为了控制 MODEM 而发明的控制协议。后来随着网络带宽的升级,速度很低的拨号 MODEM 基本退出一般使用市场,但是 AT 命令保留下来。当时主要的移动电话生产厂家共同为 GSM 研制了一整套 AT 命令,用于控制手机的 GSM 模块。AT 命令在此基础上演化并加入 GSM 07.

  • 最好的方法是什么?我读过,但大多数话题都过时了。大多数示例都使用“COM”端口,但我在COM连接(在设备管理器中)中找不到USB调制解调器,而不是在“网卡”中。

  • 我读过很多关于发送短信和多部分短信的帖子,如: 在Android系统中发送短信,在Android系统中发送和接收短信和彩信(pre-Kit Kat Android 4.4),Android系统PendingEvent extras,BroadcastReceiver未接收 ... 但他们似乎没有检查消息的所有部分是否成功发送。 据我所知,对于多部分消息,您可以为每个消息部分添加一个PendingE

  • 本文向大家介绍PHP发送AT指令实例代码,包括了PHP发送AT指令实例代码的使用技巧和注意事项,需要的朋友参考一下 需求: 发送短信到用户输入手机, 要求可以自定义信息内容 问题: 没有电信猫, 使用免费api接口无法自定义短信内容 解决方案: 通过4G网卡, 接在服务器上, 通过AT指令操作网卡, 发送短信 查阅发现, AT质量发送需要对信息进行多重编码, 而且发送超时, 但实际发送成功, 问题