Я недавно начал работать с компанией, где ее бизнес-модель обернута вокруг устройств 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”