Не могу получить Hex ответ от доски Imatic
Добрый день,
Это будет долго. Я пытаюсь установить связь с платой "SainSmart iMatic with RJ45", которая используется вместе с "16-канальным релейным модулем SainSmart 12 В".
В принципе, я могу отправлять шестнадцатеричные команды на доску, но не могу получить ответ от доски, когда это необходимо. Что я имею в виду под этим?
У меня есть ноутбук с Ubuntu 14.04.4 LTS, подключенный напрямую к плате через прямой Ethernet-кабель (больше не требуется кроссовер). У меня есть конфигурация для этого типа сети (только два устройства). IP-адрес платы imatic является фиксированным, 192.168.1.4 с портом 3000. IP-адрес моего ноутбука имеет фиксированный IP-адрес 192.168.1.2, с маской сети 255.255.255.0 и без шлюза.
Я использую netcat (в режиме протокола TCP) на своем ноутбуке для отправки команд на плату в этом формате в терминале: echo '580112000000016C' | xxd -r -p | nc 192.168.1.4 3000 Как узнать, что это работает? Ну, в основном реле от вторичной платы включены успешно ("16-канальный релейный модуль SainSmart 12 В").
Есть список шестнадцатеричных команд для включения и выключения каждого реле. В предыдущей инструкции я говорю плате включить реле номер 1, оставив остальные 15 выключенными. Строка '580112000000016C' преобразуется из шестнадцатеричного в двоичный с помощью xxd, а затем отправляется в netcat. Эта часть работает.
Единственная инструкция, которая не работает, это: echo '580113000000006C' | xxd -r -p | nc 192.168.1.4 3000 Эта инструкция запрашивает только плату, реле которой в данный момент выключены, ожидая ответа в следующем формате: 28 01 00 00 00 XX XX HH (XX XX 16 бит, каждый бит представляет одно состояние реле ", 1"указывает на, "0"указывает на ВЫКЛ; ЧЧ - сумма всех предыдущих данных вместе, что означает, что она работает как контрольная сумма)
Я уже проверил и доказал, что это НЕ проблема с доски. Я написал код на Visual Basic, и Windows смог получить ответ от платы, но что-то должно быть не так в моей конфигурации Ubuntu. Я уже отключил свой брандмауэр, UFW. Это НЕ проблема с кабелем Ethernet. Я уже пробовал другие представления команд, такие как: echo -n '5801100000000069' | xxd -r -p | nc -v -n -w3 192.168.1.4 3000 | xxd Я уже использовал netcat для сканирования всех доступных портов на плате, и только порт 3000 отображается как доступный, как указано производителем. Кажется, это проблема конфигурации сети, но в Windows я указал тот же IP-адрес и маску сети, что и в Ubuntu.
Что я здесь теряю?
1 ответ
Netcat ожидает символа EOF, который никогда не отправляется платой iMatic. Это объясняет, почему netcat не может получить ответ.
С другой стороны, я написал скрипт на Python (Python 2.7.6), который успешно получает данные с доски iMatic после отправки ему определенной инструкции. Вот:
import socket
import binascii
IPADDR = '192.168.1.4'
PORTNUM = 3000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IPADDR, PORTNUM))
data = '5801100000000069'.decode('hex')
s.send(data)
response= s.recv(8) #Buffer needs to be 8 for the fastest response without losing information
print binascii.hexlify(response)
s.close()
Теперь вы можете использовать эту плату без маршрутизатора и напрямую подключаться к любому компьютеру через кабель Ethernet.
С уважением, Бернекст.