我正在编写一个从GSM 调制解调器(ZTE Corporation)(+CMTI 通知)接收短消息( SMS)的应用程序。
我已经完成了我的程序,但是当有一个多部分的 SMS时,我无法将它们相互连接,并且它们都来自单独的消息。(例如,3 部分消息来自 3 个不同的消息)。我怎样才能连接它们并了解哪个在哪个之后?(考虑有人一个接一个地给我发送两条三部分的消息,我如何区分这两条消息?)
- 编程语言:C#
- 短信模式(AT+CMGF=1)
我正在编写一个从GSM 调制解调器(ZTE Corporation)(+CMTI 通知)接收短消息( SMS)的应用程序。
我已经完成了我的程序,但是当有一个多部分的 SMS时,我无法将它们相互连接,并且它们都来自单独的消息。(例如,3 部分消息来自 3 个不同的消息)。我怎样才能连接它们并了解哪个在哪个之后?(考虑有人一个接一个地给我发送两条三部分的消息,我如何区分这两条消息?)
我找到了它,通过 PDU 标头我可以发现如果有更多的 smss 和用户数据标头,我可以区分数据包。
// 对于 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);
}
}
是的,我尝试了诺基亚的智能消息概念,用于连接多部分消息,但似乎有很多问题。所以最后我找到了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 标头