请教,关于PDU解码

szpublice 2008-03-01 05:11:14
以下是我的PDU解码函数:

''' <summary>
''' 实现对收到的短信进行PDU解码
''' </summary>
''' <remarks></remarks>
Public Class PDUDeCoding
''' <summary>
''' 将短信内容从UniCode转换为中文及正常字符
''' </summary>
''' <param name="str"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function UniCode2c(ByVal str As String) As String
Dim retStr As String = ""
If str.Length Mod 4 = 0 Then '表明数据合法,每四位表示一个字符
Dim I As Integer
For I = 1 To str.Length Step 4
Dim aa As String = Mid(str, I, 4)
retStr += ChrW(Hex2Int(aa))
Next
End If
Return retStr
End Function
''' <summary>
''' 将收到的短信进行PDU解码!解码后返回对象DeCodingCls,该对象存储了发送人号码,短信内容,发送时间。
''' </summary>
''' <param name="PDUstr"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function DeCodingsms(ByVal PDUstr As String) As DeCodingCls
Dim de As New DeCodingCls
'1:取前两位16进制以获得短信中心长度,转换为10进制长度
Dim smsConterlen As Integer = Hex2Int(Strings.Left(PDUstr, 2)) * 2
'2:取得短信中心
de.smsCentent = DeCodingSMSCentent(Mid(PDUstr, 3, smsConterlen))
'3:基本参数,对于00(无回复地址)的信息需要进行测试以调试程序。
Dim pType As String = Mid(PDUstr, 3 + smsConterlen, 2) '基本参数(TP-MTI/MMS/RP) 接收,08(无更多消息,有回复地址),00(无回复地址)
'4:取回复地址个数,即发送人号码,不包括91 和‘F’
Dim addrlen As Integer = Hex2Int(Mid(PDUstr, 5 + smsConterlen, 2))
Dim Addr As String = Mid(PDUstr, 7 + smsConterlen, addrlen + 3)
'5:解码发送人地址,不知道特服号的解码是否与普通手机号解码方法相同,有待测试
de.smsFrom = DeCodingSMSCentent(Addr)
'6:取协议标识(TP-PID) 是普通GSM 类型,点到点方式
Dim bs As String = Mid(PDUstr, 10 + smsConterlen + addrlen, 2)
'7:用户信息编码方式(TP-DCS) UCS2 编码,08表示UCS2编码,否则是其他编码,需要对其进行相应解码以获得短消息内容
Dim EnCodeType As String = Mid(PDUstr, 12 + smsConterlen + addrlen, 2)
'8:服务时间戳(TP-SCTS),获得时间,时间的长度为14位,取回后将每两位分别对调
Dim UCTime As String = Mid(PDUstr, 14 + smsConterlen + addrlen, 14)
de.smsTime = DeCodingTime(UCTime).ToString
'9:取用户信息长度
Dim Textlen As Integer = Hex2Int(Mid(PDUstr, 28 + smsConterlen + addrlen, 2))
'10:读取未解码的信息内容
Dim smsText As String = Mid(PDUstr, 30 + smsConterlen + addrlen, Textlen * 2)
If EnCodeType = "08" Then
'UCS2编码,做PDU解码获得短消息内容
de.smsContent = UniCode2c(smsText)
Else
de.smsContent = "编码方式:" + EnCodeType + "非UCS2编码!程序未配置对非UCS2编码的解码!请联系软件作者!"
End If
Return de
End Function
''' <summary>
''' 对短信中心及发送人的号码进行解码的函数
''' </summary>
''' <param name="PDUTel">要解码的内容</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function DeCodingSMSCentent(ByVal PDUTel As String) As String
If Strings.Left(PDUTel, 2) = "91" Then
PDUTel = Strings.Right(PDUTel, PDUTel.Length - 2)
End If
Dim ReturnTelnumber As String = ""
Dim I As Integer
For I = 1 To PDUTel.Length Step 2
Dim tmp As String = Mid(PDUTel, I, 2)
ReturnTelnumber += Strings.Right(tmp, 1) + Strings.Left(tmp, 1)
Next
ReturnTelnumber = Replace(ReturnTelnumber, "F", "")
If Strings.Left(ReturnTelnumber, 2) = "86" Then
ReturnTelnumber = Strings.Right(ReturnTelnumber, ReturnTelnumber.Length - 2)
End If
Return ReturnTelnumber
End Function
''' <summary>
''' 对服务时间进行解码
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Private Function DeCodingTime(ByVal TimeString As String) As String
If TimeString.Length <> 14 Then
Return Now
End If
Dim returnTime As String = ""
Dim I As Integer
For I = 1 To TimeString.Length Step 2
Dim tmp As String = Mid(TimeString, I, 2)
returnTime += Strings.Right(tmp, 1) + Strings.Left(tmp, 1)
Next
returnTime = "20" + Strings.Left(returnTime, 2) + "-" + Mid(returnTime, 3, 2) + "-" + Mid(returnTime, 5, 2) + " " + Mid(returnTime, 7, 2) + ":" + Mid(returnTime, 9, 2) + ":" + Mid(returnTime, 11, 2)
Return returnTime
End Function
End Class

Public Module SMS
''' <summary>
''' 转换十六进制数为十进制数
''' </summary>
''' <param name="str"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Hex2Int(ByVal str As String) As Integer
Dim s As Integer = 0
Dim i As Integer
Dim w As String
For i = 0 To Len(str) - 1
w = Mid(str, Len(str) - i, 1)
If w = "a" Or w = "A" Then w = 10
If w = "b" Or w = "B" Then w = 11
If w = "c" Or w = "C" Then w = 12
If w = "d" Or w = "D" Then w = 13
If w = "e" Or w = "E" Then w = 14
If w = "f" Or w = "F" Then w = 15
w = Val(w)
s = s + w * (16 ^ i)
Next i
Return s
End Function

End Module
''' <summary>
''' 用于存储对某条短信解码后的类对象
''' </summary>
''' <remarks></remarks>
Public Class DeCodingCls

Private _smsContent As String = ""
Private _smsFrom As String = ""
Private _smsTime As String = ""
Private _smsCentent As String = ""
''' <summary>
''' 获得或设置短信中的短信中心号码!
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property smsCentent() As String
Get
Return _smsCentent
End Get
Set(ByVal value As String)
_smsCentent = value
End Set
End Property
''' <summary>
''' 获得或设置短信的信息内容
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property smsContent() As String
Get
Return _smsContent
End Get
Set(ByVal value As String)
_smsContent = value
End Set
End Property
''' <summary>
''' 获得或设置短信的发送人号码
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property smsFrom() As String
Get
Return _smsFrom
End Get
Set(ByVal value As String)
_smsFrom = value
End Set
End Property
''' <summary>
''' 获得或设置短信的发送时间
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property smsTime() As String
Get
Return _smsTime
End Get
Set(ByVal value As String)
_smsTime = value
End Set
End Property
End Class
...全文
533 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
h07021040410 2010-03-23
  • 打赏
  • 举报
回复
我知道:
那是因为现在手机发出短信的模式不一样,短信猫你可能设置的是PDU模式,你用飞信发短信试一试,一定能解码。
lizhengnan 2008-03-11
  • 打赏
  • 举报
回复
呵呵,真大方,非常感谢.
szpublice 2008-03-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lizhengnan 的回复:]
呵呵,那我接分
[/Quote]

结贴,分就给你.
lizhengnan 2008-03-10
  • 打赏
  • 举报
回复
呵呵,那我接分
szpublice 2008-03-01
  • 打赏
  • 举报
回复
回复就给分,自已解决了.FK
szpublice 2008-03-01
  • 打赏
  • 举报
回复
现在的问题是:

如果是使用正常的手机号码向该手机号发送短信时,
从串口读取的PDU串可以正常解码出各个内容,例如我用自已的手机
向该号码发送后读到的内容:
089168310870550040D91683129436065F6000880208211616023044F60597D5F0

这句可以正常解码,但问题是如果是特服号(SP号)下发到手机上,从串口读出来的PDU进行解码时就会有错误,难道SP下发的短信的解码方式和手机发送的短信的解码方式不同吗?下面是一个SP发下来的短信从串口读出来的PDU串:

0891683108401705F2240CA10166198691080008802082419244
00626B648D448BAF57474E3A4E456E387F5165D74E0B6E38620F63D
04F9BFF0C6BCF53F778016BCF5929965090014E245F205361FF0C56D
E590D0047004B0050770B8D448BAFFF0C5BA2670D003000350037003
100380038003800350036003800390038

解码时出错,在网上找了四五天资料啊,一个也没有,都是关于普通短信的解码.有经验的朋友帮帮忙.看看,指点一下.谢谢了...

16,718

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧