第一次收到: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左右。 —————————————————————————————————— 
但是我们如果以socket 接收过程中,是以Byte格式的数组接收时,每个数组里边存放1个字节(十进制的数字)。 现在问题是: 
        我如何来截去第14个字节(我们已经写好了解析函数,只需把要处理的字节数组和起始位两个参数传递给函数) 
如:Public Function GetLongitude(bReceive() As Byte, iStart As Integer) As Double 
但是:每个bReceive()中有很多条数据, GetLongitude(Receive_Byte, 14 + NodataI * 46) '我传递参数来获得经度、 receive_byte数组是SOCKET接收到的TCP数据流, NodataI 是我用了一个循环在一个包中纪录多少条数据(以24 24来判断) 
但是由于各种原因,每条数据的字节数不能确定,即不一定是46的倍数,如果一个包中,第二条传递出错,则剩下的全部出错。在使用中发现,有大约80%的数据被丢弃,是GPS数据时间上间隔太常了, 还有没有其他更好的办法??

解决方案 »

  1.   

    在数据中,以在一个数据段第22个字节以后的内容中查找 0A 24 24, 判断是否找到本数据的尾部和下一个数据头部,再以该内容中的 24 为一个新的数据段, 向下取第 14~21 个字节,以此获得下面的经纬度数据.循环执行.当然这种方法要求 0A 24 24 必须能唯一确定为数据头的才行,即其他数据中不包含 0A 24 24.
      

  2.   

    好眼熟的协议,甲天行?
    0x24 24头  0x0A尾是吗看看下面这个涵数能不能正确拆包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 Function
    GetMsgNoteErr:     
        GetMsgNote = False '解包错误函数返回0
        Exit Function
    End Function