⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smsdeal.cls

📁 通过西门子模块收发短信
💻 CLS
📖 第 1 页 / 共 4 页
字号:
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 + -