Перейти к содержанию
    

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

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

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Upd:

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

Цитата

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

Upd2:

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

Цитата

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

 

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...