05.06.2014, 11:37 | #151 |
Senior Member
|
Re: Описание протокола "Умный дом"
Тот же скрипт, но без использования timeout, т.е. практически даровый:
Код:
#!/bin/sh tty=/dev/ttyATH0 # Сброс параметров. stty -F $tty 4:0:18b2:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 # Настройка. stty -F $tty raw 9600 cs8 # Тестовая посылка. printf "\x10\x10\x00\x00\x00\x01\x02\x03\xE8\x66\xBE" > $tty #timeout 0.2 dd if=$tty of=ans.dat count=256 2> /dev/null ( dd if=$tty of=ans.dat count=256 2> /dev/null ) & sleep 1 ; kill $! hexdump -C ans.dat Жалко только, что sleep засыпает на секунды, т.к. timeout понимает и доли секунды.
__________________
Россия навсегда! |
05.06.2014, 13:59 | #152 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Описание протокола "Умный дом"
Я использовал read в модуле AquaLog
Для коректного чтения в ардуино, после получения запроса нужно выдержать паузу 100мс и после пауза отправлять данные |
05.06.2014, 15:41 | #153 |
Senior Member
|
Re: Описание протокола "Умный дом"
read не работает с нулевыми байтами насколько я понял и ещё похоже, что переменные в скрипте не могут содержать нулевые байты.
__________________
Россия навсегда! |
07.06.2014, 08:22 | #154 |
Senior Member
|
Re: Описание протокола "Умный дом"
Создал простой модуль для тестирования работы по протоколу modbus при помощи скрипта в shell.
Посылки из javascript я научился делать, crc считается, всё нормально. Эмулятор принимает и распознаёт посылки, но почему-то не передаёт данные в ответ. Это странно, не могу пока объяснить такое поведение. Пробовал функции чтения 03 и 04. На картинки видно, что запрос принят, но ответной посылки нет. Зато запись (функция 06) работает. В общем осталось разобраться почему эмулятор не выдаёт запрошенные данные. П.С. Возможно дело в каком-то таймауте или задержке. Надо бы попробовать на каком-нибудь реальном железе.
__________________
Россия навсегда! Последний раз редактировалось uni; 07.06.2014 в 08:55. |
07.06.2014, 09:27 | #155 |
Senior Member
|
Re: Описание протокола "Умный дом"
С другим симулятором работает. Ура. На картинке чтение (03) с адреса 0x0000, где находится значение 0x0A (10).
Осталось унифицировать интерфейс и проверить работу с реальным железом. В общем и целом это означает, что можно при помощи нескольких строк в shell со стандартными командами и дополнительных функций на javascript реализовывать протоколы, основанные на обмене массивами байт, в том числе с расчетом crc.
__________________
Россия навсегда! Последний раз редактировалось uni; 07.06.2014 в 09:33. |
07.06.2014, 10:48 | #156 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Описание протокола "Умный дом"
Проверить нет возможности, вернусть 13 июня, протестирую
|
07.06.2014, 11:00 | #157 |
Senior Member
|
Re: Описание протокола "Умный дом"
К тому времени попробую оформить интерфейс более универсально, добавлю настройки для последовательного порта и выложу архив с модулем для CyberWrt. У меня в принципе есть плата с avr и прошивка для modbus slave, просто симулятором тестировать сейчас быстрее.
Желательно попробовать на реальном модуле ввода-вывода каком-нибудь, промышленном или около того. П.С. Нашёл crc16 алгоритм для bash: crc16 algorithm from C++ to bash. Не уверен, что он будет работать для произвольных данных. Не знаю как его использовать для произвольных бинарных данных. И ещё один вариант: CRC-16 checksum of a string.
__________________
Россия навсегда! Последний раз редактировалось uni; 07.06.2014 в 13:11. |
19.06.2014, 12:05 | #158 | |
Senior Member
Регистрация: 14.04.2010
Сообщений: 239
Вес репутации: 0 |
Re: Описание протокола "Умный дом"
Цитата:
|
|
19.06.2014, 17:33 | #159 |
Senior Member
|
Re: Описание протокола "Умный дом"
Оказывается, что будут. С доработкой конечно. Я поначалу не мог понять смысла, почему они имеют в виду строки. Оказывается это нужно, чтобы интерпретатор мог работать с байтами как с числами.
Скрипт может выглядеть так: Код:
string="001005000006000001" cnt=${#string} let 'cnt -= 3' crc=0xFFFF for i in `seq 0 3 $cnt`; do crc=$(( crc ^ ${string:$i:3} )) for j in `seq 0 7`; do c=$(( crc >> 1 )) if [ $(( crc & 1 )) = 1 ]; then let 'c ^= 0xA001' fi crc=$c done done printf "0x%04X" "$crc" echo Код:
2014.06.18 13:47:30 [INFO:30500] ( => ) 0x01_0x05_0x00_0x06_0x00_0x01_0xEC_0x0B 2014.06.18 13:47:30 [INFO:30500] ( <= ) 0x01_0x85_0x03_0x02_0x91 Для второй строки (string="001133003") получим ответ: 0x9102 На хабре меня не поправили. Оказывается можно считать crc, если представить числа в "интерпретируемом виде".
__________________
Россия навсегда! Последний раз редактировалось uni; 19.06.2014 в 20:23. |
19.06.2014, 21:21 | #160 |
Senior Member
Регистрация: 14.04.2010
Сообщений: 239
Вес репутации: 0 |
Re: Описание протокола "Умный дом"
чего-то у меня не выходит
попробовал перевести 599517 - вывело 0x427C а должно быть 0925DD |
Здесь присутствуют: 6 (пользователей: 0 , гостей: 6) | |
|
|