0

我有几个 AIS(船舶位置数据)接收器(带有 RTL 棒的 PI)向我发送数据。我使用一些 pythonscripting 来接收数据。

因为接收器是外部的,所以我无法在源中做任何事情(Pi 提供数据)。所以我必须在pythoncode中找到解决方案。

我收到消息,每条消息都以:“!AIVDM”开头,以“\n”结尾

不幸的是,无法提前确定消息的长度。因为我使用的缓冲区大小为 100,所以有时部分字符串会分成 2 个。我尝试将这些与“溢出”变量匹配。

但是,在 2 条消息之间切换时,我会丢失以下字符串中的一些字符,从而导致消息损坏。

您是否有更好的建议将它们粘合在一起,或者确保消息不是按缓冲区大小划分,而是按分隔符划分?

import socket
import threading
import time
from datetime import datetime
#import pyAISm

UDP_IP = "0.0.0.0"
UDP_PORT = 6309
sock = socket.socket(socket.AF_INET, # Internet
                    socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))

def start():
    overflow = ""
    while True:
        data, addr = sock.recvfrom(100) # buffer size is 1024 bytes
        print('##############################################################')
        print(f'Test: {data}')
        data = data.decode('ascii')
        data1 = overflow+data
        data2 = data1.split("\n")
        for d in data2:
            d = d.strip("\r")
            check = d[-3:][0]
            if check == "*":
               print(f'OK  {check} | {d}')
               temp = ""
            else:
               print(f'NOK {check} | {d}')
               overflow = d

        #thread.start()
start()

我的输出:

##############################################################
Test: b'AIVDM,1,1,,1,83aDoUhj2d<t<t>NM0PPI3WE3i00,0*29\r\n!AIVDM,1,1,,1,13`iHnPP00PGHw>MipRN4?wT2@MR,0*60\r\n!AI'
OK  * | AIVDM,1,1,,1,83aDoUhj2d<t<t>NM0PPI3WE3i00,0*29
OK  * | !AIVDM,1,1,,1,13`iHnPP00PGHw>MipRN4?wT2@MR,0*60
NOK ! | !AI
##############################################################
Test: b'HMiHbN4?v@25RH,0*4F\r\n!AIVDM,1,1,,1,13`iHnPP00PGHw:MipQv4?vD20RL,0*3F\r\n!AIVDM,2,1,6,1,53aFfrT000010CG'
OK  * | !AIHMiHbN4?v@25RH,0*4F
OK  * | !AIVDM,1,1,,1,13`iHnPP00PGHw:MipQv4?vD20RL,0*3F
NOK 0 | !AIVDM,2,1,6,1,53aFfrT000010CG
##############################################################
Test: b'13aDqO@P1N0GK9NMiSVEr?w6RHE`,0*3C\r\n!AIVDM,1,1,,1,13aJGC@P00PGDL0MhbBP0?w:28F?,0*20\r\n!AIVDM,1,1,,1,13'
OK  * | !AIVDM,2,1,6,1,53aFfrT000010CG13aDqO@P1N0GK9NMiSVEr?w6RHE`,0*3C
OK  * | !AIVDM,1,1,,1,13aJGC@P00PGDL0MhbBP0?w:28F?,0*20
NOK , | !AIVDM,1,1,,1,13
##############################################################
Test: b'7,0*52\r\n!AIVDM,1,1,,1,13aGD2gP00PG>abMh:iS2Owh2@QQ,0*2C\r\n!AIVDM,1,1,,1,83aJGqPj2d<dtLfMeiD@Tga@8k00,'
OK  * | !AIVDM,1,1,,1,137,0*52
OK  * | !AIVDM,1,1,,1,13aGD2gP00PG>abMh:iS2Owh2@QQ,0*2C
NOK 0 | !AIVDM,1,1,,1,83aJGqPj2d<dtLfMeiD@Tga@8k00,
##############################################################
Test: b'IVDM,1,1,,1,133vqAPP180GFtlMjB9UugvH00RT,0*22\r\n!AIVDM,1,1,,1,Dh2E:t1l4Nfp00N006Dq,0*3F\r\n!AIVDM,1,1,,'
OK  * | !AIVDM,1,1,,1,83aJGqPj2d<dtLfMeiD@Tga@8k00,IVDM,1,1,,1,133vqAPP180GFtlMjB9UugvH00RT,0*22
OK  * | !AIVDM,1,1,,1,Dh2E:t1l4Nfp00N006Dq,0*3F
NOK 1 | !AIVDM,1,1,,
##############################################################
Test: b'220Ri,0*40\r\n!AIVDM,1,1,,2,13aL>VOP00PGHQ`MkCbP0?w220SF,0*69\r\n!AIVDM,1,1,,1,13aPPBPP130G?FLMl7SP7gw20'
OK  * | !AIVDM,1,1,,220Ri,0*40
OK  * | !AIVDM,1,1,,2,13aL>VOP00PGHQ`MkCbP0?w220SF,0*69
NOK w | !AIVDM,1,1,,1,13aPPBPP130G?FLMl7SP7gw20
4

0 回答 0