📄 smsdeal.cls
字号:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "smsdeal"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit
Option Compare Text
Private blnExceed As Boolean '超时标志
Private strContent As String '定义PDU码最终解析得到的内容
Private strSMSCode As String '原始PDU码
Private strSMSLen As String '原始PDU码长度
Private I As Long, J As Long '常用循环变量
Private Index As Long '短信位置
Private strSMSComin As String '串口读入数据
Private sglBasetime As Single '基准时间
Private InSMSList As String '读入的原始短信息序列
Private DealString As String '原始短信息
Private UseComList As String, PortSum As Long, PortList As String '初始化后的串口对象序列
Private PartContPdu As String
Public Type PartCon '两条信息首结构
strPhone As String
strCon As String
End Type
Dim FirstList(100) As PartCon, SecondList(100) As PartCon, ThirdList(100) As PartCon, FourthList(100) As PartCon, FifthList(100) As PartCon, SixthList(100) As PartCon
'读取手机模块信息
Public Function ReadSMS(PortNo As Long) As String
Dim CountMe As Long
Dim strRemainPart As String
Dim longLOCATION As Long '定义信息特征字位置
Dim strPDUHANDNUM As String '定义手机号码对应pdu码
Dim strHandNum As String '定义手机号码
Dim strUType As String '定义用户类型
Dim strSMSType As String '定义读入SMS类型
Dim strCodeSys As String '定义编码格式
Dim strLenthCode As String '定义长度码
Dim longCodeNum As Long '定义文字码
Dim longCodeLenth As Long '定义文字码长度
Dim strPDUContent As String '定义文字pdu码
Dim strUnicode As String '定义累加中的unicode码
Dim longRlt1 As Long, longRlt2 As Long, longRlt3 As Long, longRlt4 As Long
Dim HeadTag As String, MidTag As String
Dim SumTag As String, TurnTag As String
Dim NumLen As Long, NumPDU As String
Dim MList As String, CList As String, BaseTime As Single
On Error GoTo ErrorDeal
If frmMain.MSComm(PortNo).PortOpen = False Then
frmMain.MSComm(PortNo).PortOpen = True
End If
CountMe = 0
frmMain.MSComm(PortNo).Output = "AT+CMGL=4" & Chr(13)
Call WaitA(PortNo)
If blnExceed = True Then
ReadSMS = "ERROR/超时错误"
frmMain.MSComm(PortNo).PortOpen = False
Exit Function
End If
If InStr(strSMSComin, "CMGL:") = 0 Then
frmMain.MSComm(PortNo).PortOpen = False
strSMSComin = ""
ReadSMS = "ERROR/没有短信"
Exit Function
Else
Do
DoEvents
DealString = GetBetweenPart(strSMSComin, "+", ",,")
If DealString <> "" Then
InSMSList = InSMSList + GetBetweenPart(DealString, "CMGL: ", ",") + ","
strSMSComin = GetRightPart(strSMSComin, ",,")
Else
Exit Do
End If
Loop Until InStr(strSMSComin, "CMGL") = 0
strSMSComin = ""
End If
If InStr(InSMSList, ",") = 0 Then
Exit Function
End If
BaseTime = Timer
Do
DoEvents
CountMe = CountMe + 1
Index = GetLeftPart(InSMSList, ",")
frmMain.MSComm(PortNo).Output = "AT+CMGR=" & Index & Chr(13)
InSMSList = GetRightPart(InSMSList, ",")
Call WaitA(PortNo)
If InStr(strSMSComin, "ERROR") > 0 Or blnExceed = True Then '判断出错
strSMSComin = ""
GoTo Escape
ElseIf InStr(strSMSComin, "0,,0") > 0 Then
strSMSComin = ""
GoTo Escape
ElseIf InStr(strSMSComin, "0D9168") > 0 Then '判断为个人信息
longLOCATION = InStr(strSMSComin, "0D9168")
strSMSType = "用户"
ElseIf InStr(strSMSComin, "0D9068") > 0 Then '判断为个人信息
longLOCATION = InStr(strSMSComin, "0D9068")
strSMSType = "用户"
ElseIf InStr(strSMSComin, "0DA168") > 0 Then
longLOCATION = InStr(strSMSComin, "0DA168")
strSMSType = "用户"
ElseIf InStr(strSMSComin, "0FA18156") > 0 Then
longLOCATION = InStr(strSMSComin, "0FA18156")
strSMSType = "香港"
ElseIf InStr(strSMSComin, "0B91") Then
longLOCATION = InStr(strSMSComin, "0B91")
strSMSType = "联通"
ElseIf InStr(strSMSComin, "0BA1") > 0 Then
longLOCATION = InStr(strSMSComin, "0BA1")
strSMSType = "外地"
ElseIf InStr(strSMSComin, "0B91") > 0 Then
longLOCATION = InStr(strSMSComin, "0B91")
strSMSType = "外地"
ElseIf InStr(strSMSComin, "A12185F0") > 0 Then '判断为秘书台信息
longLOCATION = InStr(strSMSComin, "A12185F0")
strSMSType = "秘书台"
ElseIf InStr(strSMSComin, "A1218500") > 0 Then
longLOCATION = InStr(strSMSComin, "A1218500")
strSMSType = "上海秘书台"
ElseIf InStr(strSMSComin, "912185F0") > 0 Then '判断为秘书台信息
longLOCATION = InStr(strSMSComin, "912185F0")
strSMSType = "秘书台"
ElseIf InStr(strSMSComin, "0991") > 0 And InStr(strSMSComin, "2185F0") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "2185F0")
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "0791201552F8") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "0791201552F8")
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "089120155208") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "089120155208")
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "05A15099F8") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "05A15099F8")
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "05A12185F1") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "05A12185F1")
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "05912185F1") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "05912185F1")
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "05BB2185F0") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "05BB2185F0")
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "1091218510") > 0 Then
strRemainPart = Right(GetRightPart(strSMSComin, "1091218510"), Len(GetRightPart(strSMSComin, "1091218510")) - 10)
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "08A1") > 0 And InStr(strSMSComin, "2185") > 0 And InStr(strSMSComin, "2185") - InStr(strSMSComin, "08A1") = 8 Then
strRemainPart = GetRightPart(strSMSComin, "2185")
strSMSType = "外地秘书台"
ElseIf InStr(strSMSComin, "04A17852") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "04A17852")
strSMSType = "蔚蓝联通"
ElseIf InStr(strSMSComin, "0AA17096100111") > 0 Then
strRemainPart = GetRightPart(strSMSComin, "0AA17096100111")
strSMSType = "东莞移动"
ElseIf InStr(strSMSComin, "910106") > 0 Then
longLOCATION = InStr(strSMSComin, "910106") - 2
strSMSType = "小灵通"
NumPDU = Right(Left(strSMSComin, longLOCATION + 1), 2)
If Left(NumPDU, 1) <> "0" Then
NumLen = 16 + Chex(Right(NumPDU, 1))
Else
NumLen = Chex(Right(NumPDU, 1))
End If
ElseIf InStr(strSMSComin, "10106") >= 40 Then
longLOCATION = InStr(strSMSComin, "10106") - 3
strSMSType = "小灵通"
NumPDU = Right(Left(strSMSComin, longLOCATION + 1), 2)
If Left(NumPDU, 1) <> "0" Then
NumLen = 16 + Chex(Right(NumPDU, 1))
Else
NumLen = Chex(Right(NumPDU, 1))
End If
Else
Call DelSMS(Index, PortNo)
GoTo Escape
End If
If InStr(strSMSType, "秘书台") > 0 Then '通过PDU码判断短信中的基本信息,手机号码/时间
strHandNum = "12580"
ElseIf strSMSType = "蔚蓝联通" Then
strHandNum = "8725"
ElseIf strSMSType = "东莞移动" Then
strHandNum = "0769011011"
ElseIf strSMSType = "联通" Or strSMSType = "外地" Then
strPDUHANDNUM = Right(Left(strSMSComin, longLOCATION + 15), 12)
strHandNum = Right(Left(strPDUHANDNUM, 2), 1) + Left(strPDUHANDNUM, 1) + Right(Left(strPDUHANDNUM, 4), 1) + Right(Left(strPDUHANDNUM, 3), 1) + Right(Left(strPDUHANDNUM, 6), 1) + Right(Left(strPDUHANDNUM, 5), 1) + Right(Left(strPDUHANDNUM, 8), 1) + Right(Left(strPDUHANDNUM, 7), 1) + Right(Left(strPDUHANDNUM, 10), 1) + Right(Left(strPDUHANDNUM, 9), 1) + Right(Left(strPDUHANDNUM, 12), 1)
ElseIf strSMSType = "香港" Then
strPDUHANDNUM = Right(Left(strSMSComin, longLOCATION + 19), 12)
strHandNum = Right(Left(strPDUHANDNUM, 2), 1) + Left(strPDUHANDNUM, 1) + Right(Left(strPDUHANDNUM, 4), 1) + Right(Left(strPDUHANDNUM, 3), 1) + Right(Left(strPDUHANDNUM, 6), 1) + Right(Left(strPDUHANDNUM, 5), 1) + Right(Left(strPDUHANDNUM, 8), 1) + Right(Left(strPDUHANDNUM, 7), 1) + Right(Left(strPDUHANDNUM, 10), 1) + Right(Left(strPDUHANDNUM, 9), 1) + Right(Left(strPDUHANDNUM, 12), 1)
ElseIf strSMSType = "小灵通" Then
If NumLen Mod 2 <> 0 Then
NumLen = NumLen + 1
End If
strPDUHANDNUM = Right(Left(strSMSComin, longLOCATION + NumLen + 3), NumLen)
strHandNum = ""
For I = 1 To NumLen / 2
strHandNum = strHandNum + Right(Left(strPDUHANDNUM, 2), 1) + Left(Left(strPDUHANDNUM, 2), 1)
strPDUHANDNUM = Right(strPDUHANDNUM, Len(strPDUHANDNUM) - 2)
Next I
strHandNum = Right(strHandNum, Len(strHandNum) - 3)
If Right(strHandNum, 1) = "F" Or Right(strHandNum, 1) = "f" Then
strHandNum = Left(strHandNum, Len(strHandNum) - 1)
End If
Else
strPDUHANDNUM = Right(Left(strSMSComin, longLOCATION + 17), 12)
strHandNum = Right(Left(strPDUHANDNUM, 2), 1) + Left(strPDUHANDNUM, 1) + Right(Left(strPDUHANDNUM, 4), 1) + Right(Left(strPDUHANDNUM, 3), 1) + Right(Left(strPDUHANDNUM, 6), 1) + Right(Left(strPDUHANDNUM, 5), 1) + Right(Left(strPDUHANDNUM, 8), 1) + Right(Left(strPDUHANDNUM, 7), 1) + Right(Left(strPDUHANDNUM, 10), 1) + Right(Left(strPDUHANDNUM, 9), 1) + Right(Left(strPDUHANDNUM, 12), 1)
End If
If strSMSType = "秘书台" Then '获取PDU编码格式
strCodeSys = Right(Left(strSMSComin, longLOCATION + 11), 2)
ElseIf strSMSType = "上海秘书台" Then
strCodeSys = Right(Left(strSMSComin, longLOCATION + 9), 2)
ElseIf strSMSType = "外地秘书台" Or strSMSType = "蔚蓝联通" Or strSMSType = "东莞移动" Then
strCodeSys = Right(Left(strRemainPart, 4), 2)
ElseIf strSMSType = "联通" Or strSMSType = "外地" Then
strCodeSys = Right(Left(strSMSComin, longLOCATION + 19), 2)
ElseIf strSMSType = "香港" Then
strCodeSys = Right(Left(strSMSComin, longLOCATION + 23), 2)
ElseIf strSMSType = "小灵通" Then
strCodeSys = Right(Left(strSMSComin, longLOCATION + 7 + NumLen), 2)
Else
strCodeSys = Right(Left(strSMSComin, longLOCATION + 21), 2)
End If
If strCodeSys = "00" Or strCodeSys = "02" Then '判断编码格式并获取相应信息
Call ChangeMode(Index, PortNo) '英文编码,改变读写模式为文本方式
ElseIf strCodeSys = "08" Or strCodeSys = "0A" Or strCodeSys = "19" Then
If strSMSType = "用户" Then
strLenthCode = Right(Left(strSMSComin, longLOCATION + 37), 2)
HeadTag = ""
If InStr(Right(strSMSComin, Len(strSMSComin) - 80), "0500") >= 4 And InStr(Right(strSMSComin, Len(strSMSComin) - 80), "0500") <= 10 Then
HeadTag = "0500"
ElseIf InStr(Right(strSMSComin, Len(strSMSComin) - 80), "0608") >= 4 And InStr(Right(strSMSComin, Len(strSMSComin) - 80), "0608") <= 10 Then
HeadTag = "0608"
End If
If HeadTag <> "" Then
PartContPdu = GetBetweenPart(Right(strSMSComin, Len(strSMSComin) - 80), HeadTag, Chr(13) & Chr(10))
MidTag = Left(PartContPdu, 8)
PartContPdu = Right(PartContPdu, Len(PartContPdu) - 8)
SumTag = Right(Left(MidTag, 6), 1)
TurnTag = Right(MidTag, 1)
Select Case TurnTag
Case "1"
Call WriteFirst(strHandNum, PartContPdu)
Case "2"
Call WriteSecond(strHandNum, PartContPdu)
Case "3"
Call WriteThird(strHandNum, PartContPdu)
Case "4"
Call WriteFourth(strHandNum, PartContPdu)
End Select
Select Case SumTag
Case "2"
longRlt1 = SearchFirst(strHandNum)
longRlt2 = SearchSecond(strHandNum)
If longRlt1 >= 0 And longRlt2 >= 0 Then
strPDUContent = FirstList(longRlt1).strCon + SecondList(longRlt2).strCon
FirstList(longRlt1).strPhone = ""
FirstList(longRlt1).strCon = ""
SecondList(longRlt2).strPhone = ""
SecondList(longRlt2).strCon = ""
longCodeLenth = Len(strPDUContent) / 2
Else
Call DelSMS(Index, PortNo)
GoTo Escape
End If
Case "3"
longRlt1 = SearchFirst(strHandNum)
longRlt2 = SearchSecond(strHandNum)
longRlt3 = SearchThird(strHandNum)
If longRlt1 >= 0 And longRlt2 >= 0 And longRlt3 >= 0 Then
strPDUContent = FirstList(longRlt1).strCon + SecondList(longRlt2).strCon + ThirdList(longRlt3).strCon
FirstList(longRlt1).strPhone = ""
FirstList(longRlt1).strCon = ""
SecondList(longRlt2).strPhone = ""
SecondList(longRlt2).strCon = ""
ThirdList(longRlt3).strPhone = ""
ThirdList(longRlt3).strCon = ""
longCodeLenth = Len(strPDUContent) / 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -