📄 decoder.vb
字号:
Public Class EMS_RECEIVED
Inherits SMS_RECEIVED
Public Structure InfoElem 'See document "How to create EMS"
Public Identifier As Byte
Public Length As Byte
Public Data As String
End Structure
Public TP_UDHL As Byte
Public IE() As InfoElem
Sub New(ByVal PDUCode As String)
MyBase.New(PDUCode)
End Sub
Public Overrides Sub GetOrignalData(ByVal PDUCode As String)
SCAddressLength = GetByte(PDUCode)
SCAddressType = GetByte(PDUCode)
SCAddressValue = GetAddress(GetString(PDUCode, (SCAddressLength - 1) * 2))
FirstOctet = GetByte(PDUCode)
SrcAddressLength = GetByte(PDUCode)
SrcAddressType = GetByte(PDUCode)
SrcAddressLength += SrcAddressLength Mod 2
SrcAddressValue = GetAddress((GetString(PDUCode, SrcAddressLength)))
TP_PID = GetByte(PDUCode)
TP_DCS = GetByte(PDUCode)
TP_SCTS = GetDate(GetString(PDUCode, 14), TP_TIMEZONE)
TP_UDL = GetByte(PDUCode)
TP_UDHL = GetByte(PDUCode)
IE = GetIE(GetString(PDUCode, TP_UDHL * 2))
TP_UD = GetString(PDUCode, TP_UDL * 2)
End Sub
'Get Informat Elements
Shared Function GetIE(ByVal IECode As String) As InfoElem()
Dim tmp As String = IECode, t As Integer = 0
Dim result() As InfoElem
result = Nothing
Do Until IECode = ""
ReDim Preserve result(t)
With result(t)
.Identifier = GetByte(IECode)
.Length = GetByte(IECode)
.Data = GetString(IECode, .Length * 2)
End With
t += 1
Loop
Return result
End Function
End Class
Public Class EMS_SUBMIT
Inherits SMS_SUBMIT
Sub New(ByVal PDUCode As String)
MyBase.New(PDUCode)
Type = SMSType.EMS_SUBMIT
End Sub
Public TP_UDHL As Byte
Public IE() As EMS_RECEIVED.InfoElem
Public Overrides Sub GetOrignalData(ByVal PDUCode As String)
SCAddressLength = GetByte(PDUCode)
SCAddressType = GetByte(PDUCode)
SCAddressValue = GetAddress(GetString(PDUCode, (SCAddressLength - 1) * 2))
FirstOctet = GetByte(PDUCode)
TP_MR = GetByte(PDUCode)
DesAddressLength = GetByte(PDUCode)
DesAddressType = GetByte(PDUCode)
DesAddressLength += DesAddressLength Mod 2
DesAddressValue = GetAddress(GetString(PDUCode, DesAddressLength))
TP_PID = GetByte(PDUCode)
TP_DCS = GetByte(PDUCode)
TP_VP = GetByte(PDUCode)
TP_UDL = GetByte(PDUCode)
TP_UDHL = GetByte(PDUCode)
IE = EMS_RECEIVED.GetIE(GetString(PDUCode, TP_UDHL * 2))
TP_UD = GetString(PDUCode, TP_UDL * 2)
End Sub
End Class
Public Class SMS_STATUS_REPORT
Inherits SMS_RECEIVED
Public TP_MR As Byte
Public TP_DP As Date
Public Status As EnumStatus
Public Enum EnumStatus
Success = 0
NotSend = 96
NoResponseFromSME = 98
End Enum
Sub New(ByVal PDUCode As String)
MyBase.New(PDUCode)
Type = SMSType.SMS_STATUS_REPORT
End Sub
Public Overrides Sub GetOrignalData(ByVal PDUCode As String)
SCAddressLength = GetByte(PDUCode)
SCAddressType = GetByte(PDUCode)
SCAddressValue = GetAddress(GetString(PDUCode, (SCAddressLength - 1) * 2))
FirstOctet = GetByte(PDUCode)
TP_MR = GetByte(PDUCode)
SrcAddressLength = GetByte(PDUCode)
SrcAddressType = GetByte(PDUCode)
SrcAddressLength += SrcAddressLength Mod 2
SrcAddressValue = GetAddress(GetString(PDUCode, SrcAddressLength))
TP_SCTS = GetDate(GetString(PDUCode, 14), TP_TIMEZONE)
TP_DP = GetDate(GetString(PDUCode, 14), TP_TIMEZONE)
Status = GetByte(PDUCode)
'Status report do not have content so I set it a zero length string
TP_UD = ""
End Sub
End Class
Public Class PDUDecoder
Public Structure BaseInfo
Public SourceNumber As String
Public DestinationNumber As String
Public ReceivedDate As Date
Public TimeZone As String
Public Text As String
Public Type As SMS.SMSType
Public EMSTotolPiece As Integer
Public EMSCurrentPiece As Integer
Public StatusFromReport As SMS_STATUS_REPORT.EnumStatus
Public DestinationReceivedDate As Object
End Structure
Sub New(ByVal PDUCode As String)
Decode(PDUCode)
End Sub
Public Shared Function Decode(ByVal PDUCode As String) As BaseInfo
Dim result As BaseInfo
result = Nothing
Try
Dim s As Object = Nothing
Dim T As SMSType = SMSBase.GetSMSType(PDUCode)
result.Type = T
Select Case T
Case SMSType.EMS_RECEIVED
s = New EMS_RECEIVED(PDUCode)
result.SourceNumber = s.SrcAddressValue
If s.SrcAddressType = &H91 Then result.SourceNumber = "+" + result.SourceNumber
result.ReceivedDate = s.TP_SCTS
If Not (s.IE Is Nothing) Then
Dim Data As String = s.IE(0).Data
result.EMSTotolPiece = CInt(Mid(Data, 5, 2))
result.EMSCurrentPiece = CInt(Mid(Data, 7, 2))
End If
Case SMSType.SMS_RECEIVED
s = New SMS_RECEIVED(PDUCode)
result.SourceNumber = s.SrcAddressValue
If s.SrcAddressType = &H91 Then result.SourceNumber = "+" + result.SourceNumber
result.ReceivedDate = s.TP_SCTS
Case SMSType.EMS_SUBMIT
s = New EMS_SUBMIT(PDUCode)
result.DestinationNumber = s.DesAddressValue
If s.DesAddressType = &H91 Then result.DestinationNumber = "+" + result.DestinationNumber
If Not (s.IE Is Nothing) Then
Dim Data As String = s.IE(0).Data
result.EMSTotolPiece = CInt(Mid(Data, 5, 2))
result.EMSCurrentPiece = CInt(Mid(Data, 7, 2))
End If
Case SMSType.SMS_SUBMIT
s = New SMS_SUBMIT(PDUCode)
result.DestinationNumber = s.DesAddressValue
If s.DesAddressType = &H91 Then result.DestinationNumber = "+" + result.DestinationNumber
Case SMSType.SMS_STATUS_REPORT
s = New SMS_STATUS_REPORT(PDUCode)
result.SourceNumber = s.SrcAddressValue
If s.SrcAddressType = &H91 Then result.SourceNumber = "+" + result.SourceNumber
result.ReceivedDate = s.TP_SCTS
result.DestinationReceivedDate = s.TP_DP()
result.StatusFromReport = s.status
Case Else
Stop
End Select
'###########################
'Correct when s is SMS type, no TP_UDL is found.
'Note:Only EMS has the TP_UDHL and TP_UDH see 3GPP TS 23.040 V6.5.0 (2004-09)
'###########################
If s.tp_DCS = 0 Or _
s.tp_DCS = 242 Then
If T = SMSType.SMS_RECEIVED Or T = SMSType.SMS_STATUS_REPORT Or T = SMSType.SMS_SUBMIT Then
'#############################
'add a parameter
'############################
result.Text = s.decode7bit(s.tp_UD, s.TP_UDL)
End If
If T = SMSType.EMS_RECEIVED Or T = SMSType.EMS_SUBMIT Then
result.Text = s.decode7bit(s.tp_ud, s.tp_udl - 8 * (1 + s.tp_udhl) / 7)
End If
ElseIf s.tp_DCS = 246 Then
result.Text = s.DecodeUnicode(s.TP_UD)
Else
result.Text = s.DecodeUnicode(s.TP_UD)
End If
Catch err As System.Exception
result.Text = "PDU decoding exception:" & PDUCode
End Try
Return result
End Function
End Class
End Namespace
End Namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -