微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Socket.bind 缓冲区大小

如何解决Python Socket.bind 缓冲区大小

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

因为接收器是外部的,所以我不能在源中做任何事情(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,83aDoUhj2d<t<t>NM0PPI3WE3i00,0*29\r\n!AIVDM,13`iHnPP00PGHw>MipRN4?wT2@MR,0*60\r\n!AI'
OK  * | AIVDM,0*29
OK  * | !AIVDM,0*60
NOK ! | !AI
##############################################################
Test: b'HMiHbN4?v@25RH,0*4F\r\n!AIVDM,13`iHnPP00PGHw:MipQv4?vD20RL,0*3F\r\n!AIVDM,2,6,53aFfrT000010CG'
OK  * | !AIHMiHbN4?v@25RH,0*4F
OK  * | !AIVDM,0*3F
NOK 0 | !AIVDM,53aFfrT000010CG
##############################################################
Test: b'13aDqO@P1N0GK9NMisver?w6RHE`,0*3C\r\n!AIVDM,13aJGC@P00PGDL0MhbBP0?w:28F?,0*20\r\n!AIVDM,13'
OK  * | !AIVDM,53aFfrT000010CG13aDqO@P1N0GK9NMisver?w6RHE`,0*3C
OK  * | !AIVDM,0*20
NOK,| !AIVDM,13
##############################################################
Test: b'7,0*52\r\n!AIVDM,13aGD2gP00PG>abMh:iS2Owh2@QQ,0*2C\r\n!AIVDM,83aJGqPj2d<dtLfMeiD@Tga@8k00,'
OK  * | !AIVDM,137,0*52
OK  * | !AIVDM,0*2C
NOK 0 | !AIVDM,##############################################################
Test: b'IVDM,133vqAPP180GFtlMjB9UugvH00RT,0*22\r\n!AIVDM,Dh2E:t1l4Nfp00N006Dq,IVDM,0*22
OK  * | !AIVDM,0*3F
NOK 1 | !AIVDM,##############################################################
Test: b'220Ri,0*40\r\n!AIVDM,13aL>VOP00PGHQ`MkCbP0?w220SF,0*69\r\n!AIVDM,13aPPBPP130G?FLMl7SP7gw20'
OK  * | !AIVDM,220Ri,0*40
OK  * | !AIVDM,0*69
NOK w | !AIVDM,13aPPBPP130G?FLMl7SP7gw20

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。