Как отправить неподписанные символы через TCP в этом формате протокола связи в Python? - PullRequest
0 голосов
/ 24 мая 2018

Итак, я работаю над проектом с проприетарным протоколом связи.Мне нужно отправить данные в заданном формате и координаты вверх, вниз, влево и вправо на определенный IP-адрес.Связь происходит через TCP, и мне нужно запрограммировать клиента TCP на python для отправки данных в следующем формате:

IP-адрес / адрес рукопожатия: 192.166.166.166

Это формат данных .

Тип данных - беззнаковый символ 0-255 (8-битный двоичный код), а длина данных - 6-64 бит.

Длина данных каждого кадра составляет 10-64 бита.

Итак, если я хочу переместить объект с 1.0.0.1 в (23, 45, 67, 89), это следующая инструкция:

Отправка 255 255 10 3 1 0 0 123 45 67 89 по указанному IP-адресу.Я предполагаю, что указанный IP-адрес 192.166.166.166.Вы можете обратиться к формату данных, чтобы понять эти данные, которые я должен отправить.Это довольно просто.

Вопрос в том, как мне отправить эту серию неподписанных символов через TCP в python?

Я пробовал следующее:

import socket
host = '192.166.166.166'
port = 80                   # 80 Because TCP

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

data = '255 255 10 3 1 0 0 1 23 45 67 89'
s.sendall(data)
result = s.recv(1024)
s.close()
print('Received', repr(result))

Очевидно, это не работает.Я не указал unsigned char и просто отправляю необработанные данные и пробелы.

Вот что я получаю взамен с сервера:

('Received', '\'HTTP/1.0 400 Bad Request\\r\\nServer: Mini-IoT-314\\r\\nDate: , 31  1969 23:59:59 GMT\\r\\nPragma: no-
cache\\r\\nCache-Control: no-cache\\r\\nContent-Type: 
text/html\\r\\nConnection: close\\r\\n\\r\\n<HTML><HEAD><TITLE>400 Bad 
Request</TITLE></HEAD>\\n<BODY BGCOLOR="#cc9999"><H4>400 Bad 
Request</H4>\\nCan\\\'t parse request.\\n</BODY></HTML>\\n\'')

Теперь я не уверен, что делать и как отправлять эти данные, чтобы сервер мог обработать эти данные надлежащим образом.Я был бы очень признателен за помощь здесь.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

1) Я протестировал ваш код в python 3.5 с небольшими изменениями, а не отправил строку, я отправил байты, преобразовав строку в байты

bytes(data,'utf-8')

2) Не используйте порт 80, возможно, ваш http-серверработает на этом порту, попробуйте использовать другой порт.это будет работать

0 голосов
/ 24 мая 2018

Не совсем моя область знаний, просто идея: вам может потребоваться отправить данные в виде структуры.

Посмотрите на типы Python: https://docs.python.org/3/library/ctypes.html#structured-data-types

from ctypes import *

class payload(Structure):
    _fields_ = [("data_sign1", c_ubyte),
                  ...]
...