一个 TCP 拆包 器

来源:互联网 发布:mui demo源码下载 编辑:程序博客网 时间:2024/06/03 18:58
Public Function GetMsgNote(bReceive() As Byte, Optional GSM_OR_GPRS As String = "GPRS", Optional islast As Integer) As Boolean    '////////////////////////////////////////////////////////////////////////////////    'Meaning:最新解析数据包过程    'Date:2004-05-04    'Author:  这里不能出现原作者的名字,免得惹麻烦    Dim i As Long, j As Long    Dim sTemp As String    Dim XorResult As Integer    Dim aMsgNote() As Byte '组合数据包    Dim sMsgNote() As Byte '合法数据包    Dim iMsgType As Integer    Dim M_Doevents_Flag As Boolean     On Error GoTo GetMsgNoteErr    '//////////////////////////////////////////////////////////////////////    '判断上一次是否有没有解析的包,若有则组合数据包    If GSM_OR_GPRS = "GPRS" Then        If UBound(g_tMsgNote) = 0 Then            ReDim aMsgNote(UBound(bReceive))            aMsgNote = bReceive        Else            ReDim aMsgNote(UBound(g_tMsgNote) + 1 + UBound(bReceive))            For i = 0 To UBound(g_tMsgNote)                aMsgNote(i) = g_tMsgNote(i)            Next            For i = 0 To UBound(bReceive)                aMsgNote(i + UBound(g_tMsgNote) + 1) = bReceive(i)            Next            ReDim g_tMsgNote(0)        End If     Else        ReDim aMsgNote(UBound(bReceive))        aMsgNote = bReceive    End If    For i = 0 To UBound(aMsgNote)         '/////////////////////////////////////////////////////////////////        '判断包中没有解析的数据的长度是否大于或等于4,大于或等于4是因为要读包头、信令类型、包长        If UBound(aMsgNote) - i >= 4 Then            '////////////////////////////////////////////////////////////////////            '找单个数据包的包头                  If (aMsgNote(i) = 41 And aMsgNote(i + 1) = 41) Or (aMsgNote(i) = 36 And aMsgNote(i + 1) = 36) Then   '兼容协议                '/////////////////////////////////////////////////////////////////                '判断包中没有解析的数据的长度是否大于或等于包长加4,加4是因为要读包头、信令类型、包长有5位                If (UBound(aMsgNote) - i) >= (aMsgNote(i + 3) * 256 + aMsgNote(i + 4) + 4) Then                 '兼容协议                             '//////////////////////////////////////////////////////////////////                            '从数据包中分离出包尾为0A的单个数据包                            ReDim sMsgNote(aMsgNote(i + 3) * 256 + aMsgNote(i + 4) + 4)                            For j = 0 To UBound(sMsgNote)                                sMsgNote(j) = aMsgNote(i + j)                            Next                            '////////////////////////////////////////////////////////////////////                            '根据数据包的校验和检测包的正确性                            XorResult = sMsgNote(2)                            For j = 3 To UBound(sMsgNote) - 2                                XorResult = XorResult Xor sMsgNote(j)                            Next                            '//////////////////////////////////////////////////////////////////                            '若异或结果等于校验和,则解析这个数据包                            If XorResult = sMsgNote(UBound(sMsgNote) - 1) Then                                '/////////////////////////////////////////////////////////////////                                '解析单个数据包(sMsgNote)                                iMsgType = GetMsgType(sMsgNote, GSM_OR_GPRS)                                                                '//////////////////////////////////////////////////////////////////                                '将i的位置移动到下当前记录的末尾                                i = i + UBound(sMsgNote)                            End If                       Else                    '数据包不全,或剩余包不全,保留剩余包退出循环                                             ReDim g_tMsgNote(UBound(aMsgNote) - i)                        For j = 0 To UBound(aMsgNote) - i                            g_tMsgNote(j) = aMsgNote(i + j)                        Next                        Exit For                                   End If            End If        Else            '数据包不全,或剩余包不全,保留剩余包退出循环                           ReDim g_tMsgNote(UBound(aMsgNote) - i)                For j = 0 To UBound(aMsgNote) - i                    g_tMsgNote(j) = aMsgNote(i + j)                Next                Exit For                    End If    Next          GetMsgNote = True '解包成功函数返回1    Erase aMsgNote    Erase sMsgNote    Exit FunctionGetMsgNoteErr:         GetMsgNote = False '解包错误函数返回0    Exit FunctionEnd Function




第一次收到:24 24 57 00 29 E8 3A 94 84 04 12 15 43 09 02 93 22 39 10 63 07 02 00 00 02 09 C9 05 00 00 01 00 FF 32 AA AA 00 00 22 D0 00 00 94 A4 C0 0A 第二次收到:24 24 57 00 29 ED 75 C5 D2 04 12 15 43 11 02 93 32 45 10 63 23 68 00 14 02 60 C8 05 00 00 01 00 FF 23 AA AA 00 00 2E 4B 00 00 C8 88 3D 0A 24 24 57 00 29 E8 3A B4 2D 04 12 15 43 11 02 92 80 39 10 63 23 53 00 22 00 08 C8 05 00 00 01 00 FF 32 20 F4 00 00 39 BC 00 00 EB 4C 93 0A 24 24 57 00 21 D0 A3 91 5B 04 12 15 42 48 02 93 65 01 10 63 26 84 00 00 00 78 C6 05 00 00 01 00 00 32 00 01 6B 0A 24 24 57 00 21 D0 A3 91 5B 04 12 15 43 08 02 93 65 02 10 63 26 85 00 00 00 78 C9 05 00 00 01 00 00 32 00 01 27 0A 24 24 57 00 29 E8 39 57 4F 04 12 15 43 11 02 93 04 97 10 63 42 07 00 00 00 00 D4 05 00 00 01 00 FF 3C 38 AA 00 00 04 48 00 00 0D 05 17 0A 24 24 57 00 29 E8 39 48 8F 04 12 15 43 11 02 92 94 99 10 62 89 82 00 09 01 77 C7 05 00 00 01 00 E7 32 AA AA 00 00 01 E4 00 00 2E F5 8A 0A 24 24 57 00 29 D8 D5 1A 67 04 12 15 43 10 02 93 26 94 10 63 13 36 00 01 02 07 C8 05 00 00 01 00 EF 32 AA AA 00 00 00 54 00 00 15 01 7E 0A 24 24 57 00 29 ED 74 55 35 04 12 15 43 10 02 92 90 42 10 62 91 18 00 00 02 32 C9 05 00 00 01 00 FF 32 AA AA 00 00 09 0D 00 00 25 DF A0 0A 24 24 57 00 29 ED 75 F1 17 04 12 15 43 10 02 93 66 27 10 63 02 55 00 00 03 23 10 05 00 00 01 00 FF 32 AA AA 00 00 09 F6 00 00 29 00 8B 0A 24 24 45 00 1E D8 D3 8D 9B 04 12 15 43 09 00 AA CA 14 48 01 2C 00 00 01 2C 00 00 00 00 25 CA 9E 03 41 0A 24 24 57 00 29 ED 76 75 D2 04 12 15 43 11 02 93 48 72 10 63 37 58 00 11 03 17 C9 05 00 00 01 00 FF 28 AA AA 00 00 3E 7C 00 00 FC 7F 7A 0A 24 24 57 00 29 E8 39 44 80 04 12 15 43 11 02 93 23 80 10 63 35 88 00 00 01 76 CB 05 00 00 01 00 EF 32 AA AA 00 00 01 2C 00 00 2A 06 A2 0A 24 24 57 00 29 CD C2 F2 6C 04 12 15 43 10 02 95 19 68 10 62 37 20 00 01 02 40 C7 05 00 00 01 00 FF 32 AA AA 00 00 3A 96 00 00 F9 2B 0F 0A 24 24 57 00 29 ED 74 4D 90 04 12 15 43 11 02 93 16 12 10 62 90 74 00 00 00 65 C8 05 00 00 01 00 FF 37 AA AA 00 00 4B 9C 00 00 BF 28 49 0A 24 24 57 00 29 E8 3A 90 8C 04 12 15 43 10 02 93 13 96 10 63 16 02 00 35 02 71 C8 05 00 00 01 00 FF 32 AA AA 00 00 3B 1D 00 00 FD BC B3 0A 24 24 57 00 29 CD CD 95 15 04 12 15 43 09 02 93 37 38 10 62 83 21 00 00 02 81 C9 05 00 00 01 00 E7 32 AA AA 00 00 01 5A 00 00 2D 4E 5A 0A 24 24 57 00 29 ED 75 DF 2A 04 12 15 43 11 02 93 39 85 10 63 49 01 00 06 02 35 C6 05 00 00 01 00 FF 32 AA AA 00 00 3C BA 00 01 03 C6 28 0A 24 24 57 00 29 ED 74 6E E2 04 12 15 43 09 02 94 05 27 10 61 81 63 00 04 01 39 C6 05 00 00 01 00 FF 32 AA AA 00 00 36 5D 00 00 7F 9E BC 0A 24 24 57 00 29 ED 75 BA AE 04 12 15 43 23 02 93 18 25 10 63 28 07 00 00 00 00 10 05 00 00 01 00 FF 32 AA AA 00 00 29 D7 00 00 B7 30 C1 0A 24 24 57 00 29 ED 76 4F A5 04 12 15 43 11 02 93 49 76 10 63 35 40 00 25 03 37 C6 05 00 00 01 00 FF 28 AA AA 00 00 3A B1 00 00 FF 69 EF 0A 24 24 57 00 29 ED 75 DC DD 04 12 15 43 11 02 93 47 14 10 62 57 90 00 10 00 08 C8 05 00 00 01 00 FF 32 AA AA 00 00 27 E5 00 00 A0 AF 15 0A 24 24 57 00 29 CD C2 F2 79 04 12 15 43 10 02 94 94 08 10 62 60 28 00 00 03 16 C9 05 00 00 01 00 FF 32 AA AA 00 00 35 61 00 00 D4 CC C3 0A 24 24 57 00 29 ED 75 F6 DE 04 12 15 43 10 02 93 26 09 10 63 08 16 00 25 02 63 C4 05 00 00 01 00 FF 32 AA AA 00 00 3E 5E 00 01 08 16 7B 0A 24 24 57 00 29 ED 75 9F C3 04 12 15 43 11 02 93 09 75 10 63 07 76 00 01 02 02 C6 05 00 00 01 00 FF 32 AA AA 00 00 40 13 00 01 01 30 69 0A 24 24 45 00 1E D8 D3 8D C0 04 12 15 43 10 00 AA C8 14 48 01 2C 00 00 01 2C 00 00 00 00 25 CA 9E 28 2A 0A 24 24 57 00 29 CD CD A6 BD 04 12 15 43 11 02 93 40 28 10 63 32 22 00 06 02 23 D3 05 00 00 01 00 FF 32 AA AA 00 00 01 8B 00 00 34 37 1A 0A 24 24 57 00 29 EE 2F CA A4 04 12 15 43 11 02 93 37 49 10 62 82 76 00 00 02 89 C9 05 00 00 01 00 FF 32 AA AA 00 00 41 2D 00 01 16 00 19 0A 24 24 57 00 29 DF AF 9D C3 04 12 15 43 10 02 93 05 63 10 63 05 59 00 00 01 87 C6 05 00 00 01 00 FF 28 AA AA 00 00 16 E2 00 00 A4 39 22 0A 24 24 57 00 29 E8 3A 90 73 04 12 15 43 10 02 93 26 12 10 62 76 39 00 17 02 28 C4 05 00 00 01 00 FF 32 AA AA 00 00 16 21 00 01 2C B0 1D 0A 24 24 57 00 29 E8 3A 98 4D 04 12 15 43 11 02 93 02 50 10 63 04 37 00 00 02 12 C5 05 00 00 01 00 FF 28 AA F4 00 00 27 C5 00 00 8E 71 EE 0A 24 24 57 00 29 ED 76 26 E3 04 12 15 43 10 02 93 55 68 10 63 12 26 00 38 01 64 D4 05 00 00 01 00 FF 32 AA AA 00 00 31 C6 00 00 D7 E2 19 0A 数据是以24 24(16进制)开始,以0A结束。 这个是接收到的一个完整的数据包。 期间可能包括很多条数据。 其中14-17 四个字节代表纬度 如:02 93 34 65     18-21 四个字节代表经度 如:10 63 32 49 解析后的结果应该是纬度在29 左右,经度在106左右。 





0 0
原创粉丝点击