Xbee image transfer python

#python #raspberry-pi #xbee #binascii

#python #raspberry-pi #xbee #binascii

Вопрос:

Привет, я совсем новичок в XBee и борюсь с передачей данных. Моя цель — сделать снимок с помощью Raspberry pi wide и отправить его обратно на компьютер через XBee, преобразовав это изображение в код hexlify. после получения кода с помощью python на компьютере я использую библиотеку binascii, чтобы превратить этот код обратно в изображение с помощью этого кода

ASCII в IMG:

 import binascii
with open("file.txt", "r") as f:
    data=f.read()
data = data.strip()
data = data.replace('n', '')
data = binascii.a2b_hex(data)
with open('image.png', 'wb') as image_file:
    image_file.write(data)
 

но после запуска этого кода изображение повреждено. Итак, я начинаю просматривать код приема, но я не уверен, что код правильный, потому что в текстовом файле, который я получил, много «0»

Получение кода:

 from digi.xbee.devices import XBeeDevice
PORT = 'COM11'
BAUD = 19200
ser = XBeeDevice(PORT, BAUD)

try :
    ser.open()
    def data_receive_callback(xbee_message):
        data = xbee_message.data.decode("utf-8")
        with open("file.txt","a") as f:
            f.write(data)

    ser.add_data_received_callback(data_receive_callback)

    print("Waiting for data...n")
    input()

finally:
    if ser is not None and ser.is_open():
        ser.close()
 

код камеры в RPi:

 from picamera import PiCamera
import serial
import binascii
ser =serial.Serial(
     port='/dev/ttyS0',
     baudrate=19200,
     parity= serial.PARITY_NONE,
     stopbits=serial.STOPBITS_ONE,
     bytesize=serial.EIGHTBITS,
     timeout=1
)
camera=PiCamera()
camera.resolution(1920,1080)
camera.capture("img.png")
with open("image.png",'rb') as f:
       content=f.read()
a=binascii.hexlify(content)
ser.write(a)
ser.close 
 

Что мне делать или попытаться исправить код. Я думаю, что основной проблемой является код приема.

Ps. я уже пытаюсь преобразовать файл изображения в hexlify как на компьютере, так и на Raspberry Pi и вернуть его обратно, и он по-прежнему работает нормально.

Комментарии:

1. Пожалуйста, покажите простейший возможный код, который захватывает изображение и отправляет его. Пожалуйста, также поделитесь файлом, содержащим изображение — возможно, с помощью Google Диска или Dropbox, если вы не можете опубликовать его здесь.

2. Хорошо, поэтому я тщательно проверяю код, и пока все в порядке. Но я перепроверяю принимающий пакет и выяснил, что причина, по которой он не работает, связана с потерей пакета. сообщение, которое я получил, теряется примерно 14 раз (каждый пакет состоит из 114 символов). есть ли способ предотвратить потерю пакета в xbee???

Ответ №1:

Вопросы:

Почему вы используете XBee вместо Wi-Fi и стандартного протокола TCP, такого как HTTP или FTP?

Работайте над отладкой части вашей системы за раз. Вместо того, чтобы записывать изображение на Pi, используйте небольшой текстовый файл и посмотрите, правильно ли он передается. Будет легче увидеть, отбрасываете ли вы байты в середине, начале или конце файла.

При использовании модуля XBee обязательно включите аппаратное управление потоком (контакты D6 и D7), чтобы не потерять какие-либо последовательные данные. Благодаря аппаратному управлению потоком каждая сторона соединения имеет возможность сигнализировать другой стороне временно прекратить отправку, пока она обрабатывает данные.

Я также рекомендую увеличить скорость передачи данных до 115200 или даже 230400 бит / с. Это, в сочетании с аппаратным управлением потоком, приведет к более быстрой передаче без потери байтов.

Нет необходимости в шестнадцатеричном преобразовании данных — XBee способен отправлять 8-битные байты при работе в прозрачном последовательном режиме (по сути, замена последовательного кабеля).

Тем не менее, у вас нет никакого способа указать начало или конец файла — получатель не знает, когда начинается изображение или когда заканчивать и закрывать файл. Если вы продолжаете шестнадцатеричную обработку данных, вы можете отправлять символы, отличные от 0-9a-f, чтобы указать, что это начало изображения или изображение завершено.