Не могу получить шестнадцатеричный ответ от платы 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 Как я узнаю, что это работает? Ну в принципе реле с вторичной платы включаются успешно ("SainSmart 16-Channel 12V Relay Module").

Есть список шестнадцатеричных команд для включения и выключения каждого реле. В предыдущей инструкции я указывал плате включить реле номер 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» означает «выключено»; HH — это сумма всех предыдущих данных вместе, что означает, что он работает как контрольная сумма)

Я уже проверил и доказал, что это НЕ проблема платы. Я написал код в 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.

Что мне здесь не хватает?


person Berham Horadrim    schedule 05.06.2016    source источник
comment
Здравствуйте, я пытаюсь управлять платой на C++, но не могу найти список шестнадцатеричных команд для включения/выключения реле. У меня есть плата с 16 реле. Я пытался читать руководство, но не нашел справочной таблицы с командами. Не могли бы вы мне помочь?   -  person Marcus Barnet    schedule 25.08.2019
comment
Добрый день, перечислить их все здесь невозможно, но я дам ссылку. Вы увидите весь список, начиная с: 580112000000016C,   -  person Berham Horadrim    schedule 27.08.2019
comment
Вот это ссылка. amazon.de/SainSmart-Channels-Network-Controller- Ардуино/   -  person Berham Horadrim    schedule 27.08.2019
comment
Вот еще одна ссылка: amazon.de/review/R1UPGUYFD5W15   -  person Berham Horadrim    schedule 27.08.2019
comment
Большое спасибо! Поскольку мне нужно управлять платой с помощью C++, мне просто нужно открыть TCP-соединение и отправить пакет данных с 580112000000016C (или любой другой командой в списке), чтобы включить/выключить реле?   -  person Marcus Barnet    schedule 27.08.2019


Ответы (1)


Netcat ожидает символ EOF, который никогда не отправляется платой iMatic. Это объясняет, почему netcat никогда не может получить ответ.

С другой стороны, я написал скрипт на питоне (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.

С уважением, Бернекс.

person Berham Horadrim    schedule 09.06.2016