GSMComm 短信发送报告



我一直在尝试在C#应用程序中使用GSMComm库,以便使用手机(通过USB电缆连接)作为GSM调制解调器发送SMS消息。我已经阅读了SO中的所有类似线程,但没有帮助。

一切都运行良好,除了交付报告。我将 RequestStatusReport 设置为 true 并启用了通知(EnableMessageNotifications())。

问题是我无法阅读收到的交付报告,尽管我知道它的存储(它总是"SR")和索引号。我不断收到 321 错误代码(索引无效),因为当我尝试从中读取 SR 存储时,它看起来是空的

消息接收事件代码和相应的报告如下,任何帮助将不胜感激!

private static void Comm_MessageReceived(object sender, MessageReceivedEventArgs e)
{
    IMessageIndicationObject obj = e.IndicationObject;
    if (obj is MemoryLocation)
    {
        MemoryLocation loc = (MemoryLocation)obj;
        Util.AddLog(string.Format("New message received in storage "{0}", index {1}.", loc.Storage, loc.Index));
        DecodedShortMessage msg = Comm.ReadMessage(loc.Index, loc.Storage);
        if (((SmsPdu)msg.Data) is SmsStatusReportPdu)
        {
            SmsStatusReportPdu data = (SmsStatusReportPdu)msg.Data;
            Util.AddLog("rec msg ref #: " + data.MessageReference.ToString());
        }
    }
    else
    {
        Util.AddLog("Error: Unknown notification object!");
    }
}

报告:

New message received in storage "SR", index 0.
[GSM_LOG]  17:08:49.528 Reading message...
[Catch in MessageReceived]  ##### ERROR: Message service error 321 occurred.
[GSM_LOG]  17:08:49.501 [gsmphone] >> 
[GSM_LOG]  17:08:49.501 [gsmphone]    +CDSI: "SR",0
[GSM_LOG]  17:08:49.501 [gsmphone]    
[GSM_LOG]  17:08:49.501 [gsmphone] Unsolicited message: New SMS-STATUS-REPORT received (indicated by memory location)
[GSM_LOG]  17:08:49.501 [gsmphone] Firing async MessageReceived event.
[GSM_LOG]  17:08:49.528 [gsmphone] Selecting "SR" as read storage...
[GSM_LOG]  17:08:49.528 [gsmphone] << AT+CPMS="SR"
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone] >> AT+CPMS="SR"
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone]    +CPMS: 0,0,0,23,1,40
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone]    OK
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone] Memory status: 0/0 (0% used)
[GSM_LOG]  17:08:49.528 [gsmphone] Activating PDU mode...
[GSM_LOG]  17:08:49.528 [gsmphone] << AT+CMGF=0
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone] >> AT+CMGF=0
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone]    OK
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone] Reading message from index 0...
[GSM_LOG]  17:08:49.528 [gsmphone] << AT+CMGR=0
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone] >> AT+CMGR=0
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.528 [gsmphone]    +CMS ERROR: 321
[GSM_LOG]  17:08:49.528 [gsmphone]    
[GSM_LOG]  17:08:49.545 [gsmphone] Failed. Phone reports message service (MS) error 321.
[GSM_LOG]  17:08:49.545 [gsmphone] AT+CMGR=0
[GSM_LOG]  17:08:49.545 [gsmphone] 
[GSM_LOG]  17:08:49.545 [gsmphone] +CMS ERROR: 321
[GSM_LOG]  17:08:49.545 [gsmphone] 
[GSM_LOG]  17:08:49.548 [gsmphone] Ending async MessageReceivedEventHandler call

指示对象可以是 MemoryLocation 或 ShortMessage。对于收到的短消息(用于传递状态),无需再次从内存位置读取,因为您已经拥有该对象并且只需要对其进行解码。以下内容对我有用

private void comm_MessageReceived(object sender, MessageReceivedEventArgs e)
    {
        try
        {
            IMessageIndicationObject obj = e.IndicationObject;
            if (obj is MemoryLocation)
            {
                MemoryLocation loc = (MemoryLocation)obj;
                log.InfoFormat("New message received in storage {0}, index {1}.", loc.Storage, loc.Index);
            }
            else if (obj is ShortMessage)
            {
                ShortMessage msg = (ShortMessage)obj;
                SmsPdu pdu = comm.DecodeReceivedMessage(msg);                  
                //Here can be delivery status or received message so cast to the right type by doing type checks for SmsDeliverPdu or SmsStatusReportPdu

            }
            else
            {
                log.ErrorFormat("Unknown notification message received");
                log.InfoFormat("Message indication object is {0}", e.IndicationObject);
            }
        }
        catch (Exception ex)
        {
            log.ErrorFormat("An error occurred while message ws received. Error: {0}", ex.Message);
            log.Error(ex);
        }

最新更新