Какой escape-символ в AT-командах?
Я использую модем BG96 для подключения к AWS iot через MQTT.
Я пытаюсь установить MQTT Last Will and Testament с помощью следующей AT-команды:
+QMTCFG:"will",(0-5),(0,1),(0-2),(0,1),"willtopic","willmessage"
Что отлично работает. Но теперь я пытаюсь добавить строку в формате JSON в"willmessage"
, поэтому мне нужно добавить ""
(двойные кавычки) там, что означает, что мне нужно избежать их в моей команде. Но я понятия не имею, смогу ли я их избежать или что такое escape-символ.
Что я пробовал: \"
(обратная косая черта) и ""
(двойные двойные кавычки)
Я просмотрел все спецификации BG96 и нигде не нашел упоминания об этом.
3 ответа
Побег от"
внутри строки рассматривается в главе 5.4.2.2 Строковые константы в стандарте V.250 , которую ДОЛЖЕН ПРОЧИТАТЬ каждый, кто пишет код, обрабатывающий AT-команды (прочитайте хотя бы всю главу 5):
Строковые константы должны состоять из последовательности ... за исключением символов """ ... Строковые константы должны быть ограничены в начале и конце символом двойной кавычки (""" ... ... символ двойной кавычки, используемый в качестве начального и конечного разделителя строк, должен быть представлен внутри строковой константы как "\22".
Итак, механизм побега\22
нет\x22
. Это должно быть универсальным случаем для всех модемов, а не чем-то, что зависит от реализации.
Я не нашел ссылки на документацию MQTT и BG96, и вы не связали ни одну из ваших «всех таблиц данных BG96», поэтому я просто привожу пример синтаксиса для воображаемой команды для отправки полезной нагрузки JSON{"key": "value"}
:
AT+SOMECOMMAND=...,"{\22key\22: \22value\22}"
Некоторые специальные символы имеют разные значения в наборе символов ASCII и наборе символов GSM.
то есть
- В наборе символов ASCII:
\
= 0x5С. - В наборе символов GSM:
Ö
= 0x5С.
Помимо этого, некоторые специальные символы необходимо вводить особым образом, например, в виде 2-байтового представления. Я предлагаю вам проверить стандарт/версию AT-команд, реализованных на вашем оборудовании (например, GSM 07.07, GSM 07.05, определенный производителем набор...).
т.е. я использую модем GPS+GPRS от Ai-Thinker под названием A9G. В этом случае, чтобы использовать команду AT+MQTTPUB с данными, отформатированными в стиле JSON, мне нужно добавить\x5c\x32\x32
. Таким образом, модуль будет интерпретировать это как\22
и сервер как\"
.
иг
"{\x5c\x32\x32Key\x5c\x32\x32:\x5c\x32\x32Value\x5c\x32\x32}"
в облаке будет:
{"Key":"Value"}
У меня была такая же проблема при использовании команд MQTT на SIMCOM SIM800c, и я заметил, что обычная обратная косая черта (\) выходит из кавычек (как в c) при прямой связи с модулем GSM через преобразователь USB в TTL. Чтобы реализовать это в программном обеспечении, я распечатал следующую строку на UART, подключенном к модему GSM:
AT+SMPUB=\"testTopicPost\",0,1,\"{\x5c\x22Key\x5c\x22 : \x5c\x22Value\x5c\x22}\"
В основном это отправляет необработанные символы \ и "на GSM-блок. Надеюсь, это решение сработает и для вас.