• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Проблема передачи json-строки по MQTT

maxsatel

New member
Использую esp8266+micropython (v.1.9.4)+брокер mosquitto на удаленном сервере. Отсылая (по mqtt) в mosquitto json-строку вида :
{"descr": "Светодиод",
"style1": "padding-top:10px;",
"topic": "IoTmanager/espb/led1",
"widget": "toggle",
"id": 0,
"descrStyle": "font-size:20px;"},
на брокер приходит не полная строка, а следующее:
{"descr": "Светодиод",
"style1": "padding-top:10px;",
"topic": "IoTmanager/espb/led1",
"widget": "toggle",
"id": 0,
"descrStyle": "font-siz (на этом месте строка обрывается и обрывается соединение с брокером).
Что делаю не так?
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
maxsatel, как минимум, не соблюдаете Правила форума:
4.5. Создание дублей сообщений и тем запрещено. Если вы по ошибке создали тему или сообщение не в том разделе, где планировали (или осознали ошибочность выбора), не создавайте аналогичные темы или сообщения в другом разделе. Обратитесь к модератору - он перенесет вашу тему или сообщение, в правильный раздел.
4.13. Запрещается подъем темы. А именно, публикация сообщений, имеющих целью лишь подъем темы в списке и при этом не несущих смысловой нагрузки, например: "неужели никто не знает?" или "ап!".
4.14. Запрещены неинформативные названия тем, например: "Памагите!", "У меня проблема!", "Крик души!" и т. п. Также запрещено в теме сообщения писать личные пожелания, например: "Настройка ESP8266. Срочно!!!". Если участники форума знают ответ на Ваш вопрос, то они ответят независимо от того "срочно" вам это надо или нет.
 

Сергей_Ф

Moderator
Команда форума
@CodeNameHawk ну по спецификации там 65536 символов может быть. Так что даже в utf должно хватать.
Вопрос скорее, как ТС формирует и отсылает эту строку. Но я в micropython не силен.
 

Сергей_Ф

Moderator
Команда форума
maxsatel, убедитесь что вы отправляете именно такую строку, как ожидаете. Вполне возможно что это она обрезается ещё в esp.
Ну и общие рекомендации по mqtt подразумевают максимальную краткость в написании данных. Это все же не amqp.
 

maxsatel

New member
Спасибо за ответы.
Формирую и отсылаю json-сроку следующим образом:

Код:
import  ujson, ubinascii
from umqtt.simple import MQTTClient


dict = {}
dict["id"] = 0
dict["widget"] = "toggle"
dict["topic"] = "IoTmanager/espb/led1"
dict["descr"] = b"Светодиод"
dict["style1"] = "padding-top:10px;"
dict["descrStyle"] = "font-size:20px;"

jsob = ujson.dumps(dict)

client = MQTTClient(client_id=str(id),
server='www.domen.ru',
port=1883,
user='user1',
password='pass1')
client.connect()

client.publish(b'/IoTmanager/' + ubinascii.hexlify(machine.unique_id()) + '/config',  jsob, qos=1)
По поводу максимальной длины строки не могу сказать, но в скетчах написанных на других языках, все работает (IoTmanager — мобильный MQTT-клиент с необычной концепцией) . Еще такой нюанс, если передаю словарь, а не json, все данные доходят полностью.
 

Сергей_Ф

Moderator
Команда форума
maxsatel, в любом случае, попробуйте сделать отладочный вывод в uart получившейся строки jsob.
И посмотрите нет ли ограничений в библиотеке ujson
 

maxsatel

New member
Проблема решена.
Оказывается причина была в написании кириллицей значения - "Светодиод". После исправления на "Svetodiod", да и вообще на любое значение (в том числе любой длины) латинскими буквами, вся строка пересылается полностью. Думаю причина кроется в модуле mqtt.simple, не дружит он с кириллицей.
Большое спасибо всем за участие.
 
Сверху Снизу