现在的位置: 首页 > 综合 > 正文

[vb]短信PDU编码解码2

2013年09月22日 ⁄ 综合 ⁄ 共 7593字 ⁄ 字号 评论关闭

'///////////////////////////////////////////////////////////////////////
'验证参数的合法性函数。
'合法返回"真",不合法返回"假"
'1、不允许发送单个字符。2、手机号必须为数字。3、手机号长度必须为11位。
'///////////////////////////////////////////////////////////////////////
Private Function SMSParameterValidityTest(Sendstr As String, SIMnumber As String) As Boolean
SMSParameterValidityTest = True
If Len(Sendstr) "" Then
'删除字符串 Chr(13) & Chr(10)
Do While InStr(InputStr, Chr(13) & Chr(10))
StartPosition = InStr(InputStr, Chr(13) & Chr(10))
InputStr = Mid(InputStr, 1, StartPosition - 1) & " " & Mid(InputStr, StartPosition + 2)
Loop

'判断是否需要在输入字符前加入空行
If vAddblankline = True Then
txtStatus.Text = txtStatus.Text & Chr(13) & Chr(10) & time & ": " & InputStr & Chr(13) & Chr(10)
Else
txtStatus.Text = txtStatus.Text & time & ": " & InputStr & Chr(13) & Chr(10)
End If
txtStatus.SelStart = Len(txtStatus.Text)
End If

'自动保存提示信息到 "app.path/ComMsg"目录下
msgFileName = Right("0000" & Year(Now), 4) & Right("00" & Month(Now), 2) & Right("00" & Day(Now), 2) & ".txt"

'保存文件
CmdNum = FreeFile
Open App.Path & "/pubMsg/" & msgFileName For Append As CmdNum

If vAddblankline = True Then
Print #CmdNum, Chr(13) & Chr(10) & time & ": " & InputStr
Else
Print #CmdNum, time & ": " & InputStr
End If
Close CmdNum
End Sub

'/////////////////////////////////////////////////////////////////
'输入短信压缩后十六进制字符串,输出解压缩后字符串
'/////////////////////////////////////////////////////////////////
Public Function PubUnZip_English(ByVal InputStr As String) As String
Dim tempStr As String
Dim i As Integer

'输入字符串须为十六进制字符串
If IsHexStr(InputStr) = False Then
PubUnZip_English = ""
Exit Function
End If

If Len(InputStr) / 2 Int(Len(InputStr) / 2) Then
'MsgBox "输入的字符个数不能为奇数!"
PubUnZip_English = ""
Exit Function
End If

If Len(InputStr) = 14 Then
tempStr = HtoB_long(InputStr)
PubUnZip_English = PubUnZip_English + Mid(tempStr, 2, 7) + Mid(tempStr, 11, 6) + Mid(tempStr, 1, 1) _
+ Mid(tempStr, 20, 5) + Mid(tempStr, 9, 2) + Mid(tempStr, 29, 4) + Mid(tempStr, 17, 3) _
+ Mid(tempStr, 38, 3) + Mid(tempStr, 25, 4) + Mid(tempStr, 47, 2) + Mid(tempStr, 33, 5) _
+ Mid(tempStr, 56, 1) + Mid(tempStr, 41, 6)
Else
Do While Len(InputStr) >= 14
tempStr = HtoB_long(Mid(InputStr, 1, 14))
InputStr = Mid(InputStr, 15)
PubUnZip_English = PubUnZip_English + Mid(tempStr, 2, 7) + Mid(tempStr, 11, 6) + Mid(tempStr, 1, 1) _
+ Mid(tempStr, 20, 5) + Mid(tempStr, 9, 2) + Mid(tempStr, 29, 4) + Mid(tempStr, 17, 3) _
+ Mid(tempStr, 38, 3) + Mid(tempStr, 25, 4) + Mid(tempStr, 47, 2) + Mid(tempStr, 33, 5) _
+ Mid(tempStr, 56, 1) + Mid(tempStr, 41, 6) + Mid(tempStr, 49, 7)
Loop
If Len(InputStr) > 0 And Len(InputStr) Int(Len(vInputStr) / 2)) Then
PubUnZip_Chinese = ""
'Debug.Print Len(vInputStr)
Exit Function
End If

For i = 1 To Len(vInputStr) Step 4
PubUnZip_Chinese = PubUnZip_Chinese & ChrW(HtoD_2byte(Mid(vInputStr, i, 4)))
Next
End Function

'***********************************************************************************
'正常SIM卡号转化为发送格式SIM卡号,输入11字符,输出12位字符
'***********************************************************************************
Public Function SIMSendChange(SIMString As String)
Dim i As Integer
i = 2
Do While i 0 Then
StartPosition = InStr(StrArray(i), "08916831")
If StartPosition - 4 > 0 Then
'
'There's no '86' before the source SIM no in the SMS from NanJing,need add '68' into the SMS before deal with it.
Dim intP As Integer
intP = 0
If Mid(StrArray(i), StartPosition + 24, 2) "68" Then
intP = 1
If intP = 1 Then
PubStatus "该短信未包含86内容:" & StrArray(i)
End If
StrArray(i) = Mid(StrArray(i), 1, StartPosition + 23) & "68" & Mid(StrArray(i), StartPosition + 24)
End If
'

PubSimNumber = SIMReceiveChange(Mid(StrArray(i), StartPosition + 26, 12))
If Mid(StrArray(i), StartPosition + 40, 2) = "00" Then
'短信按英文方式处理 注:SMSContentLen是整条短信的长度。
'
'SMSContentLen = Val(Mid(StrArray(i), StartPosition - 4, 2)) - 20
SmsContentLen = Val(Mid(StrArray(i), StartPosition - 4, 2)) - 20 + intP
'

SMSContent = Mid(StrArray(i), StartPosition + 58, SmsContentLen * 2)
UnZipStr = PubUnZip_English(SMSContent)

PubStatus "收到" & PubSimNumber & "发来短信。", True
'
PubStatus "短信:" & StrArray(i)
'

PubStatus "短信内容:" & SMSContent
PubStatus "解压内容:" & UnZipStr
If Len(UnZipStr) > 0 Then
If Len(UnZipStr) >= 5 And Len(UnZipStr) "" Then
'AnlisysAndSend UnZipStr, PubSimNumber
End If
Debug.Print StrArray(i)
'保存当前信息编号
If IsNumeric(Mid(StrArray(i), StartPosition - 14, 3)) Then
DelNum = Val(Mid(StrArray(i), StartPosition - 14, 3))
End If
'如果有已读过短信,则删除
If DelNum -1 Then
' DelSMS_G18 DelNum
End If
ElseIf Mid(StrArray(i), StartPosition + 40, 2) = "08" Then
'短信按中文方式处理 注:SMSContentLen是整条短信的长度。
'
SmsContentLen = Val(HtoD_1byte(Mid(StrArray(i), StartPosition + 56, 2))) * 2
SMSContent = Mid(StrArray(i), StartPosition + 58, SmsContentLen)
'SMSContentLen = Val(Mid(StrArray(i), StartPosition - 4, 2)) - 20 + intP
'SMSContent = Mid(StrArray(i), StartPosition + 58, SMSContentLen * 2)
'

UnZipStr = PubUnZip_Chinese(SMSContent)

PubStatus "收到" & PubSimNumber & "发来短信。", True
'
PubStatus "短信:" & StrArray(i)
'

PubStatus "短信内容:" & SMSContent
PubStatus "解压内容:" & UnZipStr
If Len(UnZipStr) > 0 Then
If Len(UnZipStr) >= 5 And Len(UnZipStr) "" Then
'AnlisysAndSend UnZipStr, PubSimNumber
End If
'保存当前信息编号
If IsNumeric(Mid(StrArray(i), StartPosition - 14, 3)) Then
DelNum = Val(Mid(StrArray(i), StartPosition - 14, 3))
End If
'如果有已读过短信,则删除
If DelNum -1 Then
' DelSMS_G18 DelNum
End If
Else
PubStatus "不可识别的信息类型:" & Mid(StrArray(i), StartPosition + 40, 2)
'保存当前信息编号
If IsNumeric(Mid(StrArray(i), StartPosition - 14, 3)) Then
DelNum = Val(Mid(StrArray(i), StartPosition - 14, 3))
End If
'保存不可识别信息到通讯文本文件
PubStatus "收到不可识别的信息类型,信息内容:" & StrArray(i), True
'如果有已读过短信,则删除
If DelNum -1 Then
' DelSMS_G18 DelNum
End If
End If
Else
PubStatus "短信长度非法。StrArray(" & i & ")=" & StrArray(i)
End If

'延时,防止接收多个短信时,ReceiveTime重复
PubDelay 1000
End If
Next i

End Sub

''/////////////////////////////////////////////
''清空短信串口接收和发送缓冲区
''/////////////////////////////////////////////
'Public Sub ClrSMSInputOutputBuffer()
' G18.Output = "AT" & Chr(13)
' PubDelay (300)
' Do While G18.InBufferCount 0
' G18.InBufferCount = 0
' PubDelay (200)
' Loop
' G18.OutBufferCount = 0
'End Sub

'////////////////////////////////////////////
'处理短信
'////////////////////////////////////////////
Private Sub SMSTrac(ByVal vInputStr As String)
Dim StartPosition As Integer
Dim SmsContentLen As Integer
Dim SMSContent As String
Dim PubSimNumber As String
Dim SMSStr As String
Dim UnZipStr As String
Dim i As Integer
Dim tmpStr As String
If Len(vInputStr) = 0 Then
Exit Sub
End If
If InStr(vInputStr, "08916831") 0 Then
StartPosition = InStr(vInputStr, "08916831")
If StartPosition - 4 > 0 Then
PubSimNumber = SIMReceiveChange(Mid(vInputStr, StartPosition + 26, 12))
If Mid(vInputStr, StartPosition + 40, 2) = "00" Then
''短信按英文方式处理 注:SMSContentLen是整条短信的长度。
'SMSContentLen = Val(HtoD_1byte(Mid(vInputStr, StartPosition + 56, 2))) * 2
SmsContentLen = Val(Mid(vInputStr, StartPosition - 5, 3)) - 20
SMSContent = (Mid(vInputStr, StartPosition + 58, SmsContentLen * 2))
UnZipStr = PubUnZip_English(SMSContent)
PubStatus "收到" & PubSimNumber & "发来短信。", True
'PubStatus "短信内容:" & SMSContent
'//////////////
'//存入数据库
'///////////////
' SmsSaveDataBase Now, PubSimNumber, UnZipStr
PubStatus "发来内容:" & UnZipStr
'APIBeep 2000, 3000
ElseIf Mid(vInputStr, StartPosition + 40, 2) = "08" Then
'短信按中文方式处理 注:SMSContentLen是整条短信的长度。
PubStatus "短信内容:" & vInputStr
SmsContentLen = Val(HtoD_1byte(Mid(vInputStr, StartPosition + 56, 2))) * 2
SMSContent = Mid(vInputStr, StartPosition + 58, SmsContentLen)
UnZipStr = PubUnZip_Chinese(SMSContent)
PubStatus "收到" & PubSimNumber & "发来短信。", True
'PubStatus "短信内容:" & SMSContent
'////////////
'//存入数据库
'/////////////
' SmsSaveDataBase Now, PubSimNumber, UnZipStr
PubStatus "发来内容:" & UnZipStr
' APIBeep 2000, 3000

Else
PubStatus "不可识别的信息类型:" & Mid(vInputStr, StartPosition + 40, 2)
'保存不可识别信息到通讯文本文件
'SmsSaveDataBase Now, "", ""
PubStatus "收到不可识别的信息类型,信息内容:" & vInputStr, True
End If
Else
PubStatus "短信长度非法。"
End If
End If
End Sub

'////////////////////////////////////////////////////
'检验用户手机叫参数是否合法
'////////////////////////////////////////////////////
Private Function TestParameter(ByVal vInputStr As String) As Boolean
Dim tempArray() As String
Dim i As Integer

TestParameter = True

'长度不允许小于7个字节且不大于40个字节
If Len(vInputStr) 40 Then
TestParameter = False
Exit Function
End If

vInputStr = Mid(vInputStr, 6)
tempArray = Split(vInputStr, "0")

For i = LBound(tempArray) To UBound(tempArray)
If Not (tempArray(i) = "11" Or tempArray(i) = "21" Or tempArray(i) = "31" Or tempArray(i) = "41" Or _
tempArray(i) = "51" Or tempArray(i) = "61" Or tempArray(i) = "71" Or tempArray(i) = "12" _
Or tempArray(i) = "22" Or tempArray(i) = "32" Or tempArray(i) = "42" Or tempArray(i) = "52") Then
TestParameter = False
End If
Next
End Function

抱歉!评论已关闭.