如何加入接收到的多部分短信(GSM调制解调器)(C#)

3
我正在开发一个接收来自GSM Modem(中兴公司)的短信(SMS)的应用程序,接收通知为+CMTI。我的程序已经完成,但当有多部分的短信时,我无法将它们连接起来,所有的信息都分别以单独的信息出现。(例如一条3部分的短信会分成3条不同的信息)。如何将它们连接起来,并理解哪个信息在哪个信息之后?(考虑到有人会连续发送两条3部分的信息,我该怎么区分这两条信息?)。
编程语言:C#
短信是以文本模式发送(AT+CMGF=1)。
3个回答

3
我找到了答案,通过PDU头我能够找到是否有更多的短信并且在用户数据头中区分数据包。

1

// 适用于gsmcomm用户

List<string> messagesList = new List<messageList>();
List<SmsPdu> multiPartMsg = new List<SmsPdu>();


foreach (var i in modem.ReadMessages(PhoneMessageStatus.All, PhoneStorageType.Phone))
{
    string msg;

    if (SmartMessageDecoder.IsPartOfConcatMessage(((SmsDeliverPdu)i.Data)))
    {

        multiPartMsg.Add(i.Data);
        try
        {
            if (SmartMessageDecoder.AreAllConcatPartsPresent(multiPartMsg))
            {

                msg= SmartMessageDecoder.CombineConcatMessageText(multiPartMsg);
                messagesList.Add(msg);
                multiPartMsg.Clear();


            }
        }
        catch (Exception ex) {}


    }
    else
    {
        msg = ((SmsDeliverPdu)i.Data).UserDataText;
        messagesList.Add(msg);

    }
}

我使用Nuget中的Gsmcomm 1.21版本遵循了以下代码片段。但是,当我使用SmartMessageDecoder.CombineConcatMessageText(multiPartMsg)时,我得到了随机字符或垃圾数据字符串响应。请给予建议。 - Benjsoft
你好,作为我的回复跟进,这是我收到的示例消息$eiSGYKAÅKÑKeCi§eARgAÜÑKAÜMAhQKADKgiABeiSGYKAneSiSÑOAh§§YAÜÑYSÑKABgARiAFCÑAdKoeSiKAjÑSckKAF§ÑiKÑiAL§eAr§keAnKEgSiKY¡DY§OAÜeAF§YYKOKY¡jÑSckKABeiSGYKgAFCÑARÑGeKCgKAr§keAnKEgSiKAdCÑWSÑOARÑAfKCeGQAJÑOSÑKgABÑIAFCÑANKiAZ§eKAheCMMSGAh§Ar§keAnKEgSiKÑΛkgiAfGe§YYADKY§oY¡BIIAhQKAVKso§eIAÜÑAhQKAh§aSGAr§kAnCÑiAh§ANKÑKdCiKABeiSGYKgABÑIAFYSGWANKÑKeCiKABeiSGYKgAh§ANKiALeKgQABeiSGYKgÑ@ - Benjsoft

0

是的,我尝试过诺基亚的智能短信概念来连接多部分消息,但似乎存在许多问题。最终,我发现了PDU头部中一些重要的内容,例如...

如果您的消息是多部分的,可以通过以下方式进行检查

bool Is_Multi_PART = SmartMessageDecoder.IsPartOfConcatMessage(SMSPDU);

请看这里...

DecodedShortMessage[] messages = comm.ReadMessages(PhoneMessageStatus.All, storage);
            foreach (DecodedShortMessage message in messages)
            {
                GsmComm.PduConverter.SmsDeliverPdu SMSPDU;
                SMSPDU = (GsmComm.PduConverter.SmsDeliverPdu)message.Data;
                bool Is_Multi_PART = SmartMessageDecoder.IsPartOfConcatMessage(SMSPDU); 
                byte[] element1 = message.Data.UserData;
                if (element1[0] == 5)
                {
                    byte[] numArray = new byte[2];
                    numArray[0] = element1[3];
                    numArray[1] = element1[2];
                    int referenceNumber = BitConverter.ToUInt16(numArray, 0);
                    int totalMessages = element1[4];
                    int currentNumber = element1[5];
                }
            }

如果您的消息是多部分消息,则应始终包含PDU标头,其中包括...

  1. 参考编号。
  2. 总消息数(消息/160)。
  3. 当前消息编号。(如果您有一条长度为250的1条消息,则同时为1,2)。

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