Jump to content
    

MQTT: прием URC сообщения "+SMSUB:" от модема на фоне других команд? (его целостность, как определить конец сообщения и т д),

Использую SIM7080. Нужно принимать сообщения от брокера.

Что делать- ясно. Подписываюсь на топик и ловлю от модема сообщения, начинающиеся с "+SMSUB:". Но это сообщение полностью асинхронно, и запросто может прийти во время моего общения с модемом с помощью других AT команд. Возникли вопросы:

1) целостность сообщения гарантируется?. То есть не будет ли оно порезано пополам ответом модема на другую команду ("OK", например)?

2) может ли это сообщение влезть между отправкой команды модему и появлением ответа на эту команду? Например, запрос времени с ntp сервера или любое другое действие, требующее от модема внешнего общения,  может занять сколько-то секунд. То есть команда-пауза-ответ_модема. В эту паузу может влезть "+SMSUB"?. Или, например, я посылаю свое сообщение, а в это время приходит URC

3) как определять конец сообщения? Насколько я понял, после сообщения "+SMSUB:" модем даже \r\n не вставит? или вставит? В ответе [+SMSUB: <topic>,<message>]  эти topic и message всегда в кавычках приходят?

 

А может быть как-то можно по запросу эти сообщения от брокера принимать? Типа дал модему команду, и только после нее он эти сообщения в порт передает, по очереди, или по одному на такой запрос?

Share this post


Link to post
Share on other sites

Проверил на реальном модеме, вроде получается.

Вижу, что это URC сообщение всегда имеет \r\n в начале и \r\n в конце. Уже хорошо.

К сожалению, у меня в прошивке (1951B12SIM7080) нет поддержки опции (AT+SMCONF="MESSAGELEN", 1) чтоб выводить и длину сообщения, ну да ладно.

Share this post


Link to post
Share on other sites

Не скажу, конкретно, но если нужна одновременная работа  - нужно использовать разные UART (или виртуальные, CMUX).

Что там есть в SIM7080, не знаю. Уже пару лет как отошел от сотовой связи...

Share this post


Link to post
Share on other sites

1 час назад, POLL сказал:

Не скажу, конкретно, но если нужна одновременная работа  - нужно использовать разные UART (или виртуальные, CMUX).

Что там есть в SIM7080, не знаю. Уже пару лет как отошел от сотовой связи...

Спасибо, про CMUX я и забыл. Проверил- есть. Значит, если вдруг будут проблемы, знаю куда идти.

Share this post


Link to post
Share on other sites

Подсмотрел, как сделано в устройстве c похожим функционалом: там модем подписывается, и тут же ему приходит еще не доставленное сообщение от брокера, он отписывается. Причем соединение было восстановлено с флагом ""clransession=true". QoS=1.

Странно, я думал это не так работает. Что брокер не доставит этому clientID ничего за то время, когда клиент явно не подписан на топик. Но если QoS=1 так работает, как я вижу на реальном устройстве, то замечательно.

Тогда у меня нет проблемы. Подписываюсь-проверяю-отписываюсь, и ничего не получаю пока опять не подпишусь. И ничего не теряю из топика потому что подключаюсь с тем же clientID. Именно то что мне нужно, но неожиданно. Почитаю еще описание mqtt.

Upd:

Вот как написано, и это соответствует моим представлениям о подписках (гуглоперевод текста отсюда )

Цитата

При установке соединения с брокером клиенты могут включить или отключить постоянный сеанс, установив значение флага cleanSession. Вот как это работает: когда для флага cleanSession установлено значение true , клиент явно запрашивает непостоянный сеанс. В этом сценарии, если клиент отключается от брокера, вся информация в очереди и сообщения из предыдущего постоянного сеанса удаляются. Клиент запускается с чистого листа после повторного подключения.

Upd2:

вроде понял. Есть флаг "сохраненное сообщение" (retained = true). Именно мой случай, мне всегда нужно получать именно только последнее (самое актуальное) имеющееся в топике сообщение.

Цитата

Сохраненное сообщение — это обычное сообщение MQTT с флагом сохранения, установленным в значение true. Брокер сохраняет последнее сохраненное сообщение и соответствующее качество обслуживания для этой темы. Каждый клиент, который подписывается на шаблон темы, соответствующий теме сохраненного сообщения, получает сохраненное сообщение сразу после подписки. Брокер хранит только одно сохраненное сообщение для каждой темы.

Да. Накрутили в этом mqtt. Уважаю.

Share this post


Link to post
Share on other sites

Приветствую! 

Чтобы не создавать лишних тем, спрошу здесь. 

У меня SIM800C, хочу разные кейсы проработать на устройстве. Наблюдал пару раз, что МК уходил в перезагрузку и хоть длится это несколько секунд до инициализации всей периферии, в этот момент прилетало сообщение по MQTT - модем то оставался подключенным к брокеру. 

Есть ли возможность получить это сообщение повторно, или достать его из буфера у модема ?

Или всё таки тщательно работать над стабильностью самого МК ?

Share this post


Link to post
Share on other sites

В 04.03.2024 в 21:26, Nazar Diadiun сказал:

Приветствую! 

Чтобы не создавать лишних тем, спрошу здесь. 

У меня SIM800C, хочу разные кейсы проработать на устройстве. Наблюдал пару раз, что МК уходил в перезагрузку и хоть длится это несколько секунд до инициализации всей периферии, в этот момент прилетало сообщение по MQTT - модем то оставался подключенным к брокеру. 

Есть ли возможность получить это сообщение повторно, или достать его из буфера у модема ?

Или всё таки тщательно работать над стабильностью самого МК ?

Наверное можно просто задержать принятое сообщение в модеме, если использовать процедуру железячного хэндшейка через RTS/CTS, а неактивный (перезагружающийся) МК запрещает модему передачу.

 

Если на уровне данных то, по-моему, получить это же сообщение тот же юзер не может. Вижу только один вариант: 

Устройство подписано два раза (то есть имеет два юзернейма или два Client ID?).

1. В процессе нормальной работы принимается оба два сообщения (по очереди), поочередно соединяясь как два разных юзера.

2. Если МК не работает- то модем получит сообщение только из текущей сейчас открытой сессии (соединения для данного юзера), сообщение для второго юзера он не получит.

3. Цель устройства после перезагрузки- зайти по очереди под двумя разными юзернеймами/ID (или в оба два топика) и прочитать последнее сообщение. Далее построить логику в зависимости от того, разные это сообщения или одно и то же.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...