2

我正在编写一个从GSM 调制解调器(ZTE Corporation)(+CMTI 通知)接收短消息( SMS)的应用程序。

我已经完成了我的程序,但是当有一个多部分的 SMS时,我无法将它们相互连接,并且它们都来自单独的消息。(例如,3 部分消息来自 3 个不同的消息)。我怎样才能连接它们并了解哪个在哪个之后?(考虑有人一个接一个地给我发送两条三部分的消息,我如何区分这两条消息?)

  • 编程语言:C#
  • 短信模式(AT+CMGF=1)
4

3 回答 3

3

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

于 2013-06-22T11:28:32.827 回答
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);

    }
}
于 2019-05-25T13:53:31.077 回答
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)。
于 2016-06-10T08:08:39.887 回答