Отправить UDP датаграммы, используя Python - PullRequest
1 голос
/ 23 марта 2020

Я хочу отправить запрос данных через udp с помощью API сокета. Формат запроса следующий:

ID | Data_Length | Data

Запрос содержит следующие параметры: Идентификатор (ID), (Data_Length) - это размер (Data) и (Data), который представляет собой данные для (Data) имеет переменный размер.

Код, который я написал, выглядит следующим образом:

def send_request():
    request_format="bbs" # 1 Byte for the ID 1 Byte for Data_Length and s for data
    data_buff=np.array([1,2,3,4,5,6,7,8,9]) # Data to be sent
    msg = struct.pack(request_format,0x01,0x09,data_buff.tobytes())
    print("msg = ", msg)
    s0.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s0.sendto(msg, (UDP_BC_IP, UDP_SERVER_PORT))    

Мои вопросы:

1 - При помощи Wireshark я вижу что только 1-й байт данных был отправлен почему? enter image description here

2- Вывод команды печати: msg = b'\x01\t\x01' почему я получил этот вывод, я ждал что-то похожее на [0x01,0x09,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09]

1 Ответ

1 голос
/ 23 марта 2020

Проверьте dtype из data_buff - это int64, если вы не используете:

data_buff = np.array([1,2,3,4,5,6,7,8,9], dtype=np.uint8)

Затем повторите ваш s спецификатор в соответствии с размером массива:

request_format="bb" + str(data_buff.size) + "s"

Теперь вы можете упаковать:

msg = struct.pack(request_format,0x01,0x09,data_buff.tobytes())

, и ваше сообщение будет выглядеть так:

b'\x01\t\x01\x02\x03\x04\x05\x06\x07\x08\t'

Символ табуляции - это код ASCII 9, поэтому вы увидите \t где ваши данные 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...