Рубрики
Без рубрики

Отправка двоичных команд в Python через TCP / IP

Недавно я начал работать с компанией, где ее бизнес-модель обернута вокруг устройств IoT … Теги с Python.

Я недавно начал работать с компанией, где ее бизнес-модель обернута вокруг устройств IoT в поле. Я недавно был поручен написать программу Python, которая отправит команды с сервера на устройство.

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

Убедитесь, что вы испытали TCP-соединение между обеими сторонами. Убедитесь, что ваш назначенный порт открыт, затем проверьте соединение, возможно, что правила вашего IP-таблиц/брандмауэра могут блокировать соединения TCP от внешних хостов. Для этого запустите команду NCAT.

nc -vv address port

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

nc -vlp 9100

Если все хорошо, вы должны получить сообщение, которое говорит, что соединение установлено.

Первый шаг состоит в том, чтобы создать разъем и установить соединение между двумя сторонами.

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((dns, 9100))

После того, как соединение было установлено, пришло время отправить команду. Чтобы отправить пакет, вы должны сначала кодировать команду. Наиболее распространенное использование является Command.encode («UTF-8»)

В этом случае я храням строковое значение в байтовом массиве и объединяющим ASCII 27 и ASCII 13 в начале и конце.

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

packet = bytearray("\x1b" + command + "\x0d")
s.send(packet)
s.shutdown(socket.SHUT_WR)

Чтобы получить ответ, используйте S.RECV () и размер пакета будет отмечен в способе. При получении сообщения мы разбираем пакет, и теперь у нас есть ответ.

result = s.recv(1024)
response = result.split('\0', 1)[0].strip()

Этот пример показывает только сценарий, который используется с помощью Anbible для отправки команд многим устройствам. Для того, чтобы устройство получить и ответить, ему также понадобится сценарий Python, который примет соединение, получать, анализ и отвечать.

import socket
import sys
def send_command(dns, command):
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((dns, 9100))
except (socket.error,socket.herror,socket.gaierror) as (errno,

strErr):
    raise Exception("Failed to connect to device" + dns + ": " + 

    strErr)
try:
    packet = bytearray("\x1b" + command + "\x0d")
    s.send(packet)
    s.shutdown(socket.SHUT_WR)
    result = s.recv(1024)
    response = result.split('\0', 1)[0].strip() 
    print(response)
    return response
except (socket.error,socket.herror,socket.gaierror) as (errno,        strErr):
    raise Exception("Failed to communicate with device" +    dns   + 
    ": " + strErr)
finally:
    s.close()
def main():
    dns = sys.argv[1]
    command = sys.argv[2]
    send_command(dns, command)
if __name__ == "__main__":
    main()

Наконец, я запускаю файл и пропустите требуемые args.

python name_of_file.py "host" "command"

Оригинал: “https://dev.to/teaglebuilt/sending-binary-commands-in-python-over-tcp-ip-4pp9”