我有几个 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