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

时间:2013-06-19 09:57:32

标签: c# sms gsm at-command

我正在编写一个从 GSM调制解调器(中兴通讯公司)收到短消息(短信)的应用程序( + CMTI通知

我已经完成了我的程序,但是当有多部分短信时,我无法将它们彼此连接,并且所有这些都是单独的消息。(例如,3部分消息有3个不同的消息)。我如何连接它们并了解哪一个是哪一个? (考虑某人一个接一个地向我发送两个3部分的消息,我如何区分这两个消息?)

  • 编程语言:C#
  • 文字模式下的短信(AT + CMGF = 1)

3 个答案:

答案 0 :(得分:2)

我发现它,通过PDU Header我可以发现,如果有更多的smss和用户数据头,我可以区分数据包。

答案 1 :(得分: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. 当前消息数。 (如果你有1条消息,250长度,那么它同时1,2)。

答案 2 :(得分:0)

//对于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);

    }
}