Mega 2561 и MQTT

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
empenoso
Сообщения: 1039
Зарегистрирован: 11 ноя 2015, 08:03
Откуда: Пермь

Re: Mega 2561 и MQTT

Сообщение empenoso » 07 фев 2018, 19:58

То есть можно надеяться, что будет поддержка живости LWT https://www.hivemq.com/blog/mqtt-essent ... -testament

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Mega 2561 и MQTT

Сообщение Andrey_B » 08 фев 2018, 11:48


Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 08 фев 2018, 17:27

Andrey_B писал(а):
08 фев 2018, 11:48
Igor78, попробуйте.
https://ab-log.ru/files/File/megad-2561 ... a6-hex.zip
Похоже,  что все заработало. Объединенные в один пакет команды выполняются. Но подробный тест смогу провести не раньше понедельника, пока тестирую удаленно.

Андрей, а команда get должна работать? Раньше на get=0 я получал состояние порта в mega/XX/0, сейчас тишина.
С уважением, Игорь

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Mega 2561 и MQTT

Сообщение Andrey_B » 09 фев 2018, 10:53

Сейчас команда "get" должна быть в отдельном пакете.
Можно сделать, чтобы эта команда обрабатывалась со всеми остальными, но только при условии, что она будет одна такого типа.

nkh
Сообщения: 39
Зарегистрирован: 12 авг 2016, 11:13

Re: Mega 2561 и MQTT

Сообщение nkh » 10 фев 2018, 18:40

Оставлю это тут, как пример для топиков, счетчик импульсов на дин-рейку на mqtt
https://blog.instalator.ru/archives/711

Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 12 фев 2018, 15:07

Andrey_B писал(а):
09 фев 2018, 10:53
Сейчас команда "get" должна быть в отдельном пакете.
Можно сделать, чтобы эта команда обрабатывалась со всеми остальными, но только при условии, что она будет одна такого типа.
Посылаю отдельным пакетом:

Код: Выделить всё

mosquitto_pub -h localhost -t megad/31/cmd -m get=0
В cmd команду вижу:

Код: Выделить всё

mosquitto_sub -h localhost -t megad/31/cmd
get=0
В ответ тишина... Тишина, в том числе, и в tcpdump-е

На сработку порта Мега отрабатывает нормально:

Код: Выделить всё

mosquitto_sub -h localhost -t megad/31/0
{"port":0,"m":0,"value":"ON","cnt":25969}
{"port":0,"m":2,"value":"ON","cnt":25969}
{"port":0,"m":1,"value":"OFF","cnt":25970}
Еще заметил, что дисконнекты под нагрузкой остались:

Код: Выделить всё

1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (4 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (4 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (4 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (4 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from megad-31 (d0, q0, r0, m0, 'megad/31/1', ... (42 bytes))
1518417975: Sending PUBLISH to paho41988319991 (d0, q0, r0, m0, 'megad/31/1', ... (42 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Received PUBLISH from paho41988319991 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417975: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518417985: Socket error on client megad-31, disconnecting.
1518417985: New connection from 10.5.5.31 on port 1883.
1518417985: New client connected from 10.5.5.31 as megad-31 (c1, k30).
1518417985: Sending CONNACK to megad-31 (0, 0)
1518417986: Received SUBSCRIBE from megad-31
1518417986:     megad/31/cmd (QoS 0)
1518417986: megad-31 0 megad/31/cmd
1518417986: Sending SUBACK to megad-31
После переподключения Мега начинает снова нормально работать, но как-то не сразу...
Может Мегу тоже "научить" слать по несколько MQTT сообщений в одном пакете: например если происходят практически одновременные события по нескольким IN-портам (поднесли ладошку к нескольким рядом расположенным TTP223) ...
С уважением, Игорь

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Mega 2561 и MQTT

Сообщение Andrey_B » 12 фев 2018, 16:19

Igor78, что касается "get", попробуйте.
https://ab-log.ru/files/File/megad-2561 ... a8-hex.zip

Мега не будет собирать "практические одновременные" события в один пакет, так как это не вяжется с ее логикой.
С редкими дисконнектами сложнее. Тут нужно точно знать, как со 100% вероятностью воспроизвести ситуацию.

Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 12 фев 2018, 17:37

Andrey_B писал(а): Igor78, что касается "get", попробуйте.
https://ab-log.ru/files/File/megad-2561 ... a8-hex.zip
...
Сейчас команда "get" должна быть в отдельном пакете.
Можно сделать, чтобы эта команда обрабатывалась со всеми остальными, но только при условии, что она будет одна такого типа.
..
Проверил, для портов типа IN,OUT,I2C(MAX44009,BMx280) все хорошо, для порта типа PCA9685 возвращает пустоту: {"port":5,"value":""}, а хотелось бы видеть что-то вроде:

{"port":10,"value":{"ext0":0,"ext1":0,"ext3":2000,"ext4":4095,"ext5":0,"ext6":0,"ext7":2000,"ext8":0,"ext9":0,"ext10":0,"ext11":0,"ext12":0,"ext13":0,"ext14":0,"ext15":0,"ext16":0}}
или ответ на запрос get=5e3 в отдельный топик порта расширителя megad/XX/5e3

Т.е. если нужно будет опросить все порты контроллера (например при старте системы управления УД) и брокер объединит несколько get в один TCP-пакет, Мега проигнорирует эти запросы?
С уважением, Игорь

Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 12 фев 2018, 18:32

Andrey_B писал(а):
12 фев 2018, 16:19
...
С редкими дисконнектами сложнее. Тут нужно точно знать, как со 100% вероятностью воспроизвести ситуацию.
Запустил скрипт на Python:

Код: Выделить всё

import paho.mqtt.publish as publish

msgs = [{'topic':"megad/31/cmd", 'payload':"5e10=1"},
    ("megad/31/cmd", "5e10=2", 0, False),
    ("megad/31/cmd", "5e10=3", 0, False),
    ("megad/31/cmd", "5e10=4", 0, False),
    ("megad/31/cmd", "5e10=5", 0, False),
    ("megad/31/cmd", "5e10=6", 0, False),
    ("megad/31/cmd", "5e10=7", 0, False),
    ("megad/31/cmd", "5e10=8", 0, False),
    ("megad/31/cmd", "5e10=9", 0, False),
    ("megad/31/cmd", "5e10=10", 0, False),
    ("megad/31/cmd", "5e10=11", 0, False),
    ("megad/31/cmd", "5e10=12", 0, False),
    ("megad/31/cmd", "5e10=13", 0, False),
    ("megad/31/cmd", "5e10=14", 0, False)]
publish.multiple(msgs, hostname="localhost")
брокер послал Меге пакет:

Код: Выделить всё

17:14:32.875145 IP 10.5.5.3.1883 > 10.5.5.31.2850: Flags [P.], seq 23:291, ack 1, win 29200, length 268
        0x0000:  4500 0134 0ea7 4000 4006 0cf2 0a05 0503  E..4..@.@.......
        0x0010:  0a05 051f 075b 0b22 2d7a 5500 0000 0a32  .....[."-zU....2
        0x0020:  5018 7210 1f52 0000 3015 000c 6d65 6761  P.r..R..0...mega
        0x0030:  642f 3331 2f63 6d64 3565 3130 3d31 3330  d/31/cmd5e10=130
        0x0040:  1500 0c6d 6567 6164 2f33 312f 636d 6435  ...megad/31/cmd5
        0x0050:  6531 303d 3132 3015 000c 6d65 6761 642f  e10=120...megad/
        0x0060:  3331 2f63 6d64 3565 3130 3d31 3130 1500  31/cmd5e10=110..
        0x0070:  0c6d 6567 6164 2f33 312f 636d 6435 6531  .megad/31/cmd5e1
        0x0080:  303d 3130 3014 000c 6d65 6761 642f 3331  0=100...megad/31
        0x0090:  2f63 6d64 3565 3130 3d39 3014 000c 6d65  /cmd5e10=90...me
        0x00a0:  6761 642f 3331 2f63 6d64 3565 3130 3d38  gad/31/cmd5e10=8
        0x00b0:  3014 000c 6d65 6761 642f 3331 2f63 6d64  0...megad/31/cmd
        0x00c0:  3565 3130 3d37 3014 000c 6d65 6761 642f  5e10=70...megad/
        0x00d0:  3331 2f63 6d64 3565 3130 3d36 3014 000c  31/cmd5e10=60...
        0x00e0:  6d65 6761 642f 3331 2f63 6d64 3565 3130  megad/31/cmd5e10
        0x00f0:  3d35 3014 000c 6d65 6761 642f 3331 2f63  =50...megad/31/c
        0x0100:  6d64 3565 3130 3d34 3014 000c 6d65 6761  md5e10=40...mega
        0x0110:  642f 3331 2f63 6d64 3565 3130 3d33 3014  d/31/cmd5e10=30.
        0x0120:  000c 6d65 6761 642f 3331 2f63 6d64 3565  ..megad/31/cmd5e
        0x0130:  3130 3d32 0000 0000 0000 0000 0000 0000  10=2............
        0x0140:  0000 0000                                ....
Мега "ушла в себя" секунд на 10 после чего переподключилась к брокеру..
Значение порта 5e10=120 ! В других итерациях было и 5 и 6 но ни разу 1 (сообщения посылаются в обратной последовательности).

Сервер Linux Centos7.4, Intel NUC7i7
Python 2.7.5 + paho-mqtt module (pim install paho-mqtt)
MegaD-2561 by ab-log.ru (fw: 4.24b8)
С уважением, Игорь

Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 13 фев 2018, 12:44

Добавлю..

Методом подбора выяснил, что Мега обрабатывает нормально TCP-пакеты длинной (lenght в tcpdump) до 201 байта включительно, 202 байта уже проблема...
С уважением, Игорь

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Mega 2561 и MQTT

Сообщение Andrey_B » 13 фев 2018, 16:55

https://ab-log.ru/files/File/megad-2561 ... a9-hex.zip

Попробуйте. Теоретически должно быть лучше по части отваливаний.
Остальное пока не делал.

Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 13 фев 2018, 18:18

Andrey_B писал(а):
13 фев 2018, 16:55
https://ab-log.ru/files/File/megad-2561 ... a9-hex.zip

Попробуйте. Теоретически должно быть лучше по части отваливаний.
Остальное пока не делал.
Не заметил, пакет в 202 байта все так же подвешивает Мегу и

Код: Выделить всё

1518531273: Socket error on client megad-31, disconnecting.
201 байт обрабатывает без проблем...
С уважением, Игорь

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Mega 2561 и MQTT

Сообщение Andrey_B » 14 фев 2018, 19:28


Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 15 фев 2018, 16:49

Andrey_B писал(а):
14 фев 2018, 19:28
Попробуйте теперь.
https://ab-log.ru/files/File/megad-2561 ... a1-hex.zip
Спасибо! Однозначно стало лучше: На тестах Мега нормально переварила пакет в 512 байт (у меня Москито более длинные пакеты не отправляет, но принимать может). Однако если послать брокеру пакет больше 512 байт, он его делит на несколько пакетов по 512 и тут Мега опять не выдерживает...

В реальных условиях, мой тестовый сенсорный выключатель с обратной связью, также, стал работать значительно стабильнее, но все равно, постучав секунды 4-5 по стеклу можно подвесить Мегу, один раз она без внешнего вмешательства, даже, не хотела переподключаться к брокеру, при этом нормально работал веб-интерфейс и непрерывно мигал Act. По дампу в это время очень больших пакетов не видно ( макс 150-200 байт).

Оптимизация кода в Openhab c целью уменьшения (разноса по времени) подряд посылаемых команд позволила привести работу выключателя почти к идеалу.. Т.е. он стал работать почти также как по HTTP, кстати, в режиме работы по HTTP, под нагрузкой зависает уже не
Мега а сервер входящих сообщений MegaD-Binding..
С уважением, Игорь

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Mega 2561 и MQTT

Сообщение Andrey_B » 15 фев 2018, 19:39

Igor78 писал(а):
15 фев 2018, 16:49
Однозначно стало лучше: На тестах Мега нормально переварила пакет в 512 байт (у меня Москито более длинные пакеты не отправляет, но принимать может). Однако если послать брокеру пакет больше 512 байт, он его делит на несколько пакетов по 512 и тут Мега опять не выдерживает...
Дело в том, что брокер делит посылку на два пакета, предполагая, что принимающая сторона должна собрать все в один пакет.
То есть, в конце первого пакета может идти, скажем "mega", а в начале второго "d/14/cmd..."
Микроконтроллер в текущей реализации считает второй пакет ошибочным и выставляет флаг RST. Вы это можете увидеть в tcpdump'е.
Контроллер экономит память. Это ценный ресурс. И он не собирается собирать пакеты. А если таким макаром прилетит 100кб? или 100мб?
Теоретически какой-то хак можно придумать, чтобы контроллер работал с "продолжением", но тут могут возникнуть сложности. Да и обсуждаем мы синтетическую ситуацию. На практике это маловероятно.
Igor78 писал(а):
15 фев 2018, 16:49
В реальных условиях, мой тестовый сенсорный выключатель с обратной связью, также, стал работать значительно стабильнее, но все равно, постучав секунды 4-5 по стеклу можно подвесить Мегу.
У вас отлично получается. Сделайте скрипт, который эмулирует эту ситуацию, будем смотреть.

martiniman
Сообщения: 528
Зарегистрирован: 09 авг 2016, 15:09
Откуда: Сочи

Re: Mega 2561 и MQTT

Сообщение martiniman » 16 фев 2018, 00:39

Igor78 писал(а):
15 фев 2018, 16:49
Оптимизация кода в Openhab c целью уменьшения (разноса по времени) подряд посылаемых команд
Подскажите, что за оптимизация? А лучше пример вашего кода.
Спасибо.

Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 16 фев 2018, 12:01

martiniman писал(а):
16 фев 2018, 00:39
Подскажите, что за оптимизация? А лучше пример вашего кода.
Спасибо.
Цель оптимизации - минимизировать количество параллельно (из разных правил) посылаемых одной Меге MQTT-комманд. Решил путем добавления флагов (глобальных переменных те, что вверху файла .rules), блокирующих (отправляющих в ожидание) одни правила, пока выполняются другие. Можно еще добавить паузы внутри правил, но пока этого не делал.

Код: Выделить всё

var int Mega31_busy_flag //флаг занятости Меги

rule "INIT" //начальная инициализация глобальных переменных при старте системы или изменении файла rules
when
   System started
then   
   Mega31_busy_flag=0
end

rule "Rule 1"
when
   Item Sensor_1 changed to ON
then
	var int i=0
	
	while((Mega31_busy_flag==1)&&(i<5))
	{
		Thread::sleep(50)
		i++
	}
	if(i==5){return}
	
	Mega31_busy_flag=1
	
	// ВАШ КОД
	
	Mega31_busy_flag=0
	
end

//...
 
rule "Rule XX"
when
   Item Sensor_XX changed to ON
then
	var int i=0
	
	while((Mega31_busy_flag==1)&&(i<5))
	{
		Thread::sleep(50)
		i++
	}
	if(i==5){return}
	
	Mega31_busy_flag=1
	
	// ВАШ КОД
	
	Mega31_busy_flag=0
	
end

С уважением, Игорь

Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Mega 2561 и MQTT

Сообщение Igor78 » 16 фев 2018, 17:02

Andrey_B писал(а):
15 фев 2018, 19:39
...
У вас отлично получается. Сделайте скрипт, который эмулирует эту ситуацию, будем смотреть.
Искусственно получается воссоздать ситуацию с делением одной посылки на несколько TCP-пакетов по 512 байт с резкой по живому :)
Вот пример работы специально созданных правил в Openhab2:
IP MegaD: 10.5.5.31
IP Server: 10.5.5.3

Код: Выделить всё

13:15:40.017673 IP 10.5.5.3.1883 > 10.5.5.31.3056: Flags [.], seq 45:557, ack 1, win 29200, length 512
        0x0000:  4500 0228 580f 4000 4006 c295 0a05 0503  E..(X.@.@.......
        0x0010:  0a05 051f 075b 0bf0 2559 4f37 0000 3c9b  .....[..%YO7..<.
        0x0020:  5010 7210 2046 0000 3014 000c 6d65 6761  P.r..F..0...mega
        0x0030:  642f 3331 2f63 6d64 3565 3132 3d30 3017  d/31/cmd5e12=00.
        0x0040:  000c 6d65 6761 642f 3331 2f63 6d64 3565  ..megad/31/cmd5e
        0x0050:  3133 3d34 3039 3530 1400 0c6d 6567 6164  13=40950...megad
        0x0060:  2f33 312f 636d 6435 6531 313d 3030 1200  /31/cmd5e11=00..
        0x0070:  0c6d 6567 6164 2f33 312f 636d 6431 383d  .megad/31/cmd18=
        0x0080:  3130 1400 0c6d 6567 6164 2f33 312f 636d  10...megad/31/cm
        0x0090:  6435 6531 303d 3030 1400 0c6d 6567 6164  d5e10=00...megad
        0x00a0:  2f33 312f 636d 6435 6531 323d 3030 1700  /31/cmd5e12=00..
        0x00b0:  0c6d 6567 6164 2f33 312f 636d 6435 6531  .megad/31/cmd5e1
        0x00c0:  313d 3230 3030 3017 000c 6d65 6761 642f  1=20000...megad/
        0x00d0:  3331 2f63 6d64 3565 3133 3d34 3039 3530  31/cmd5e13=40950
        0x00e0:  1400 0c6d 6567 6164 2f33 312f 636d 6435  ...megad/31/cmd5
        0x00f0:  6531 313d 3030 1200 0c6d 6567 6164 2f33  e11=00...megad/3
        0x0100:  312f 636d 6431 383d 3030 1700 0c6d 6567  1/cmd18=00...meg
        0x0110:  6164 2f33 312f 636d 6435 6531 303d 3230  ad/31/cmd5e10=20
        0x0120:  3030 3014 000c 6d65 6761 642f 3331 2f63  000...megad/31/c
        0x0130:  6d64 3565 3132 3d30 3014 000c 6d65 6761  md5e12=00...mega
        0x0140:  642f 3331 2f63 6d64 3565 3130 3d30 3017  d/31/cmd5e10=00.
        0x0150:  000c 6d65 6761 642f 3331 2f63 6d64 3565  ..megad/31/cmd5e
        0x0160:  3132 3d32 3030 3030 1400 0c6d 6567 6164  12=20000...megad
        0x0170:  2f33 312f 636d 6435 6531 313d 3030 1700  /31/cmd5e11=00..
        0x0180:  0c6d 6567 6164 2f33 312f 636d 6435 6531  .megad/31/cmd5e1
        0x0190:  333d 3430 3935 3014 000c 6d65 6761 642f  3=40950...megad/
        0x01a0:  3331 2f63 6d64 3565 3131 3d30 3012 000c  31/cmd5e11=00...
        0x01b0:  6d65 6761 642f 3331 2f63 6d64 3138 3d31  megad/31/cmd18=1
        0x01c0:  3017 000c 6d65 6761 642f 3331 2f63 6d64  0...megad/31/cmd
        0x01d0:  3565 3130 3d32 3030 3030 1400 0c6d 6567  5e10=20000...meg
        0x01e0:  6164 2f33 312f 636d 6435 6531 323d 3030  ad/31/cmd5e12=00
        0x01f0:  1400 0c6d 6567 6164 2f33 312f 636d 6435  ...megad/31/cmd5
        0x0200:  6531 303d 3030 1400 0c6d 6567 6164 2f33  e10=00...megad/3
        0x0210:  312f 636d 6435 6531 323d 3030 1700 0c6d  1/cmd5e12=00...m
        0x0220:  6567 6164 2f33 312f 0000 0000 0000 0000  egad/31/........
        0x0230:  0000 0000 0000 0000                      ........
13:15:40.021197 IP 10.5.5.31.3056 > 10.5.5.3.1883: Flags [.], ack 45, win 1024, length 0
        0x0000:  4500 0028 580e 4000 4006 c496 0a05 051f  E..(X.@.@.......
        0x0010:  0a05 0503 0bf0 075b 0000 3c9b 2559 4f37  .......[..<.%YO7
        0x0020:  5010 0400 c932 0000 0000 0000 0000 6fcf  P....2........o.
        0x0030:  2ee5 6fcf d000 0000 0000 0000 0000       ..o...........
13:15:40.021214 IP 10.5.5.3.1883 > 10.5.5.31.3056: Flags [P.], seq 557:594, ack 1, win 29200, length 37
        0x0000:  4500 004d 5810 4000 4006 c46f 0a05 0503  E..MX.@.@..o....
        0x0010:  0a05 051f 075b 0bf0 2559 5137 0000 3c9b  .....[..%YQ7..<.
        0x0020:  5018 7210 1e6b 0000 636d 6435 6531 313d  P.r..k..cmd5e11=
        0x0030:  3230 3030 3017 000c 6d65 6761 642f 3331  20000...megad/31
        0x0040:  2f63 6d64 3565 3133 3d34 3039 3500 0000  /cmd5e13=4095...
        0x0050:  0000 0000 0000 0000 0000 0000 00         .............
13:15:40.025453 IP 10.5.5.31.3056 > 10.5.5.3.1883: Flags [.], ack 557, win 1024, length 0
        0x0000:  4500 0028 580f 4000 4006 c495 0a05 051f  E..(X.@.@.......
        0x0010:  0a05 0503 0bf0 075b 0000 3c9b 2559 5137  .......[..<.%YQ7
        0x0020:  5010 0400 c732 0000 0000 0000 0000 6fcf  P....2........o.
        0x0030:  2ee5 6fcf 0000 0000 0000 0000 0000       ..o...........
13:15:40.026495 IP 10.5.5.31.3056 > 10.5.5.3.1883: Flags [R.], seq 1, ack 594, win 1024, length 0
        0x0000:  4500 0028 5810 4000 4006 c494 0a05 051f  E..(X.@.@.......
        0x0010:  0a05 0503 0bf0 075b 0000 3c9b 2559 515c  .......[..<.%YQ\
        0x0020:  5014 0400 c709 0000 0000 0000 0000 7002  P.............p.
        0x0030:  2ee5 38a1 3012 000c 6d65 6761 642f       ..8.0...megad/
Тут RST действительно выставляет Мега. В этом случае в логах москиты видим просто

Код: Выделить всё

Socket error on client megad-31, disconnecting.
Но если стучать ладошкой по реальному четырех сенсорному выключателю (программно сымитировать не получается), то в дампе видим другое:

Код: Выделить всё

15:28:42.988718 IP 10.5.5.3.1883 > 10.5.5.31.2924: Flags [.], ack 11275, win 29200, length 0
	0x0000:  4500 0028 c034 4000 4006 5c70 0a05 0503  E..(.4@.@.\p....
	0x0010:  0a05 051f 075b 0b6c 8cee f308 0000 4daa  .....[.l......M.
	0x0020:  5010 7210 1e46 0000 0101 080a 2f5f 3f95  P.r..F....../_?.
	0x0030:  2f5f 3f64 3036 000a                      /_?d06..
15:28:42.997640 IP 10.5.5.31.2924 > 10.5.5.3.1883: Flags [P.], seq 11275:11331, ack 12170, win 1024, length 56
	0x0000:  4500 0060 c034 4000 4006 5c38 0a05 051f  E..`.4@.@.\8....
	0x0010:  0a05 0503 0b6c 075b 0000 4daa 8cee f308  .....l.[..M.....
	0x0020:  5018 0400 c9ea 0000 3036 000a 6d65 6761  P.......06..mega
	0x0030:  642f 3331 2f33 7b22 706f 7274 223a 332c  d/31/3{"port":3,
	0x0040:  226d 223a 312c 2276 616c 7565 223a 224f  "m":1,"value":"O
	0x0050:  4646 222c 2263 6e74 223a 3236 3032 327d  FF","cnt":26022}
	0x0060:  3030 1300 0c6d 6567 6164 2f33 312f 636d  00...megad/31/cm
15:28:42.997665 IP 10.5.5.3.1883 > 10.5.5.31.2924: Flags [.], ack 11331, win 29200, length 0
	0x0000:  4500 0028 c035 4000 4006 5c6f 0a05 0503  E..(.5@.@.\o....
	0x0010:  0a05 051f 075b 0b6c 8cee f308 0000 4de2  .....[.l......M.
	0x0020:  5010 7210 1e46 0000 0101 080a 2f5f 3f9d  P.r..F....../_?.
	0x0030:  2f5f 3f95 3013 000c                      /_?.0...
15:28:43.022226 IP 127.0.0.1.1883 > 127.0.0.1.55258: Flags [.], ack 12166, win 451, options [nop,nop,TS val 794771399 ecr 794771359], length 0
	0x0000:  4500 0034 37d4 4000 4006 04ee 7f00 0001  E..47.@.@.......
	0x0010:  7f00 0001 075b d7da 7fd4 69b8 4865 440c  .....[....i.HeD.
	0x0020:  8010 01c3 fe28 0000 0101 080a 2f5f 3fc7  .....(....../_?.
	0x0030:  2f5f 3f9f 2f34 7b22 706f 7274 223a 342c  /_?./4{"port":4,
	0x0040:  226d 223a                                "m":
15:28:43.022238 IP 127.0.0.1.55258 > 127.0.0.1.1883: Flags [P.], seq 12166:12190, ack 11270, win 350, options [nop,nop,TS val 794771399 ecr 794771399], length 24
	0x0000:  4500 004c 199f 4000 4006 230b 7f00 0001  E..L..@.@.#.....
	0x0010:  7f00 0001 d7da 075b 4865 440c 7fd4 69b8  .......[HeD...i.
	0x0020:  8018 015e fe40 0000 0101 080a 2f5f 3fc7  ...^.@....../_?.
	0x0030:  2f5f 3fc7 3016 000c 6d65 6761 642f 3331  /_?.0...megad/31
	0x0040:  2f63 6d64 3565 343d 3430 3935 226d 223a  /cmd5e4=4095"m":
	0x0050:  302c 2276 616c 7565 223a 224f            0,"value":"O
15:28:43.022284 IP 127.0.0.1.1883 > 127.0.0.1.55258: Flags [.], ack 12190, win 451, options [nop,nop,TS val 794771399 ecr 794771399], length 0
	0x0000:  4500 0034 37d5 4000 4006 04ed 7f00 0001  E..47.@.@.......
	0x0010:  7f00 0001 075b d7da 7fd4 69b8 4865 4424  .....[....i.HeD$
	0x0020:  8010 01c3 fe28 0000 0101 080a 2f5f 3fc7  .....(....../_?.
	0x0030:  2f5f 3fc7 3035 000a 6d65 6761 642f 3331  /_?.05..megad/31
	0x0040:  2f34 7b22                                /4{"
15:28:43.022323 IP 10.5.5.3.1883 > 10.5.5.31.2924: Flags [P.], seq 12170:12194, ack 11331, win 29200, length 24
	0x0000:  4500 0040 c036 4000 4006 5c56 0a05 0503  E..@.6@.@.\V....
	0x0010:  0a05 051f 075b 0b6c 8cee f308 0000 4de2  .....[.l......M.
	0x0020:  5018 7210 1e5e 0000 3016 000c 6d65 6761  P.r..^..0...mega
	0x0030:  642f 3331 2f63 6d64 3565 343d 3430 3935  d/31/cmd5e4=4095
	0x0040:  2f34 7b22 706f 7274 223a 342c 226d 223a  /4{"port":4,"m":
15:28:43.023790 IP 10.5.5.31.2924 > 10.5.5.3.1883: Flags [.], ack 12194, win 1024, length 0
	0x0000:  4500 0028 c036 4000 4006 5c6e 0a05 051f  E..(.6@.@.\n....
	0x0010:  0a05 0503 0b6c 075b 0000 4de2 8cee f320  .....l.[..M.....
	0x0020:  5010 0400 acf0 0000 0000 0000 0000 3f9f  P.............?.
	0x0030:  2f5f 3f9f 3013 000c 6d65 6761 642f       /_?.0...megad/
15:28:43.030399 IP 127.0.0.1.55258 > 127.0.0.1.1883: Flags [P.], seq 12190:12211, ack 11270, win 350, options [nop,nop,TS val 794771407 ecr 794771399], length 21
	0x0000:  4500 0049 19a0 4000 4006 230d 7f00 0001  E..I..@.@.#.....
	0x0010:  7f00 0001 d7da 075b 4865 4424 7fd4 69b8  .......[HeD$..i.
	0x0020:  8018 015e fe3d 0000 0101 080a 2f5f 3fcf  ...^.=....../_?.
	0x0030:  2f5f 3fc7 3013 000c 6d65 6761 642f 3331  /_?.0...megad/31
	0x0040:  2f63 6d64 3565 343d 306c 7565 223a 224f  /cmd5e4=0lue":"O
	0x0050:  4646 222c 2263 6e74 22                   FF","cnt"
15:28:43.030560 IP 127.0.0.1.1883 > 127.0.0.1.55258: Flags [.], ack 12211, win 451, options [nop,nop,TS val 794771407 ecr 794771407], length 0
	0x0000:  4500 0034 37d6 4000 4006 04ec 7f00 0001  E..47.@.@.......
	0x0010:  7f00 0001 075b d7da 7fd4 69b8 4865 4439  .....[....i.HeD9
	0x0020:  8010 01c3 fe28 0000 0101 080a 2f5f 3fcf  .....(....../_?.
	0x0030:  2f5f 3fcf 2f31 7b22 706f 7274 223a 312c  /_?./1{"port":1,
	0x0040:  226d 223a                                "m":
15:28:43.030591 IP 10.5.5.3.1883 > 10.5.5.31.2924: Flags [P.], seq 12194:12215, ack 11331, win 29200, length 21
	0x0000:  4500 003d c037 4000 4006 5c58 0a05 0503  E..=.7@.@.\X....
	0x0010:  0a05 051f 075b 0b6c 8cee f320 0000 4de2  .....[.l......M.
	0x0020:  5018 7210 1e5b 0000 3013 000c 6d65 6761  P.r..[..0...mega
	0x0030:  642f 3331 2f63 6d64 3565 343d 302f 3331  d/31/cmd5e4=0/31
	0x0040:  2f32 7b22 706f 7274 223a 322c 22         /2{"port":2,"
15:28:43.033482 IP 10.5.5.31.2924 > 10.5.5.3.1883: Flags [.], ack 12215, win 1024, length 0
	0x0000:  4500 0028 c037 4000 4006 5c6d 0a05 051f  E..(.7@.@.\m....
	0x0010:  0a05 0503 0b6c 075b 0000 4de2 8cee f335  .....l.[..M....5
	0x0020:  5010 0400 acdb 0000 0000 0000 0000 6761  P.............ga
	0x0030:  642f 3331 2f33 7b22 706f 7274 223a       d/31/3{"port":
15:28:43.157750 IP 10.5.5.31.2924 > 10.5.5.3.1883: Flags [P.], seq 11331:11386, ack 12215, win 1024, length 55
	0x0000:  4500 005f c037 4000 4006 5c36 0a05 051f  E.._.7@.@.\6....
	0x0010:  0a05 0503 0b6c 075b 0000 4de2 8cee f335  .....l.[..M....5
	0x0020:  5018 0400 0679 0000 3035 000a 6d65 6761  P....y..05..mega
	0x0030:  642f 3331 2f31 7b22 706f 7274 223a 312c  d/31/1{"port":1,
	0x0040:  226d 223a 302c 2276 616c 7565 223a 224f  "m":0,"value":"O
	0x0050:  4e22 2c22 636e 7422 3a32 3439 3939 7d7d  N","cnt":24999}}
	0x0060:  642f 3331 2f63 6d64 3565 343d 302f 63    d/31/cmd5e4=0/c
15:28:43.158124 IP 10.5.5.3.1883 > 10.5.5.31.2924: Flags [R.], seq 12215, ack 11386, win 29200, length 0
	0x0000:  4500 0028 c038 4000 4006 5c6c 0a05 0503  E..(.8@.@.\l....
	0x0010:  0a05 051f 075b 0b6c 8cee f335 0000 4e19  .....[.l...5..N.
	0x0020:  5014 7210 1e46 0000 0101 080a 2f5f 3fc7  P.r..F....../_?.
	0x0030:  2f5f 3f9f 3013 000c                      /_?.0...
15:28:43.160555 IP 10.5.5.31.2924 > 10.5.5.3.1883: Flags [R.], seq 11386, ack 12215, win 1024, length 0
	0x0000:  4500 0028 c038 4000 4006 5c6c 0a05 051f  E..(.8@.@.\l....
	0x0010:  0a05 0503 0b6c 075b 0000 4e19 8cee f335  .....l.[..N....5
	0x0020:  5014 0400 aca0 0000 0000 0000 0000 3fc7  P.............?.
	0x0030:  2f5f 3f9f 2f34 7b22 706f 7274 223a       /_?./4{"port":
Идет нормальный обмен посылками, размеры TCP-пакетов редко превышают 100 байт, и вдруг уже брокер дает "красную карточку" Меге, она ему отвечает тем же..

В логах москиты в это время:

Код: Выделить всё

1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (4 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Received PUBLISH from megad-31 (d0, q0, r0, m0, 'megad/31/2', ... (41 bytes))
1518784122: Sending PUBLISH to paho525477355426415 (d0, q0, r0, m0, 'megad/31/2', ... (41 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518784122: Received PUBLISH from megad-31 (d0, q0, r0, m0, 'megad/31/3', ... (41 bytes))
1518784122: Sending PUBLISH to paho525477355426415 (d0, q0, r0, m0, 'megad/31/3', ... (41 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Received PUBLISH from megad-31 (d0, q0, r0, m0, 'megad/31/4', ... (40 bytes))
1518784122: Sending PUBLISH to paho525477355426415 (d0, q0, r0, m0, 'megad/31/4', ... (40 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (4 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (4 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Received PUBLISH from megad-31 (d0, q0, r0, m0, 'megad/31/2', ... (42 bytes))
1518784122: Sending PUBLISH to paho525477355426415 (d0, q0, r0, m0, 'megad/31/2', ... (42 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Received PUBLISH from megad-31 (d0, q0, r0, m0, 'megad/31/4', ... (41 bytes))
1518784122: Sending PUBLISH to paho525477355426415 (d0, q0, r0, m0, 'megad/31/4', ... (41 bytes))
1518784122: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784122: Received PUBCOMP from megad-31 (Mid: 13824)
1518784123: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518784123: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (8 bytes))
1518784123: Received PUBLISH from paho525477355426415 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784123: Sending PUBLISH to megad-31 (d0, q0, r0, m0, 'megad/31/cmd', ... (5 bytes))
1518784123: Socket error on client megad-31, disconnecting.
Особенно не понятна вот эта строчка 1518784122: Received PUBCOMP from megad-31 (Mid: 13824)
В других тестах я получал дисконнект сразу после Received PUBCOMP from megad-31 (Mid: 13824)
С уважением, Игорь

martiniman
Сообщения: 528
Зарегистрирован: 09 авг 2016, 15:09
Откуда: Сочи

Re: Mega 2561 и MQTT

Сообщение martiniman » 16 фев 2018, 18:54

Igor78 писал(а):
16 фев 2018, 12:01
Цель оптимизации - минимизировать количество параллельно (из разных правил) посылаемых одной Меге MQTT-комманд. Решил путем добавления флагов (глобальных переменных те, что вверху файла .rules), блокирующих (отправляющих в ожидание) одни правила, пока выполняются другие. Можно еще добавить паузы внутри правил, но пока этого не делал.
Я уже натыкался на могопоточность.
Код ниже может выполнятся не по порядку (сначала 20, потом 10 и тп), т.к. ява параллелит выполнение сама (это зависит от быстроты компа).
На эту тему много на форуме openHAB.

Код: Выделить всё

Dimmer.sendCommand(10)
Thread::sleep(50)
Dimmer.sendCommand(20)
Thread::sleep(50)
Dimmer.sendCommand(30)
Thread::sleep(50)
Dimmer.sendCommand(50)
Предлагают решать как в коде ниже, запрещать конкретному правилу повторно выполняться если оно залочено и еще не завершилось.
И если повставлять lock везде, где отправляется в топики, то всё по идее должно быть по порядку. И уже тут вставить задержку.
И не нужно гонять циклы.

Код: Выделить всё

import java.util.concurrent.locks.ReentrantLock

var java.util.concurrent.locks.ReentrantLock lock  = new java.util.concurrent.locks.ReentrantLock()

rule ConcurrentCode
when
	Item Item received update
then
	lock.lock()
	try {
		// do stuff (e.g. create and start a timer ...)
	} finally{
		lock.unlock()
	}
end

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Mega 2561 и MQTT

Сообщение Andrey_B » 16 фев 2018, 19:19

Igor78,
сделал такой скрипт

Код: Выделить всё

import paho.mqtt.client as mqtt

def on_message(mqttc, obj, msg):
	print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
	mqttc.publish("megad/14/cmd","7=2",2)

mqttc = mqtt.Client()
mqttc.on_message = on_message
mqttc.connect("192.168.0.1", 1883, 60)
mqttc.subscribe("megad/14/0", 0)
mqttc.subscribe("megad/14/1", 0)
mqttc.loop_forever()
disconnect()
Нажимал кнопки, подключенные к P0 и P1 так часто, как только мог. На протяжении нескольких минут.
Никаких сбоев не заметил. Ваш дамп какой-то слегка странный. В данном случае мне нужно лично воспроизвести ситуацию.
Может, у вас получится написать скрипт, который будет имитировать проблему.

Ответить