Saya mencoba skrip dasar yang harus disesuaikan nanti, tetapi untuk saat ini saya membutuhkannya untuk mengirim umpan kamera dari jaringan raspberry Pi yang terhubung ke beberapa laptop di jaringan yang sama.

Saya menggunakan streaming udp ke satu perangkat dengan alamat perangkat tertentu dengan kode di bawah ini sebagai a dan itu berfungsi seperti pesona tanpa masalah apa pun

pengirim

class FrameSegment():
    """ this class inits the socket in the main file then sends the frames of a video in a loop with the udp_frame method """
    MAX_IMAGE_DGRAM = 2**16 - 64 # minus 64 bytes in case UDP frame overflown

    def __init__(self, port=5000):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # for linux use SO_REUSEPORT
        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        self.s.settimeout(0.2)
        self.PORT = port

    def udp_frame(self, img):
        compress_img = cv2.imencode(".jpg", img)[1]
        dat = compress_img.tostring()
        size = len(dat)
        num_of_segments = math.ceil(size/(self.MAX_IMAGE_DGRAM))
        array_pos_start = 0

        while num_of_segments:
            array_pos_end = min(size, array_pos_start + self.MAX_IMAGE_DGRAM)
            msg = struct.pack("B", num_of_segments) + dat[array_pos_start:array_pos_end]
            self.s.sendto(msg, ('192.168.1.110', self.PORT))
            array_pos_start = array_pos_end
            num_of_segments -= 1

Penerima

class RovCam():
    """ inits the socket in main then reads the transmitted data from said socket in a loop to display the video """
    MAX_DGRAM = 2**16 - 16

    def __init__(self,port=5000):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # for linux use SO_REUSEPORT
        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        self.s.bind(("", port))
        self.dat = b''
        self.dump_buffer()
        print("ROV CAM : Connected successfully")

    def dump_buffer(self):
        while True:
            seg, addr = self.s.recvfrom(self.MAX_DGRAM)
            if struct.unpack("B", seg[0:1])[0] == 1:
                break

    def read(self):
        seg, addr = self.s.recvfrom(self.MAX_DGRAM)
        while struct.unpack("B", seg[0:1])[0] > 1:
            self.dat += seg[1:]
            seg, addr = self.s.recvfrom(self.MAX_DGRAM)
            
        self.dat += seg[1:]
        img = cv2.imdecode(np.fromstring(self.dat, dtype=np.uint8), 1)
        self.dat = b''
        return img

Namun Masalahnya adalah jika saya mengubah alamat perangkat penerima ke alamat siaran seperti itu ** di file pengirim**

self.s.sendto(msg, ('192.168.1.255', self.PORT))

Itu berhenti bekerja dan perangkat penerima tidak dapat membaca apa pun.

Saya kemudian mengkonfirmasi dengan alat tcpdump bahwa perangkat penerima memang menerima aliran yang dikirim melalui port yang ditentukan tetapi skrip sulit melihatnya.

0
karimkohel 9 Mei 2021, 03:24

1 menjawab

Jawaban Terbaik

Ternyata itu adalah kesalahan jaringan dan ketika saya menghapus router dari jaringan dan membuat jaringan yang lebih kecil hanya dengan sakelar dan server DHCP terpasang di salah satu perangkat yang digunakan, koneksi berhasil ditangani

0
karimkohel 12 Mei 2021, 16:27