Я использую комаров, чтобы опубликовать какое-то сообщение для подписчика.
Для подписчика я использую:
mosquitto_sub -h хост -t «new_topic» -q 0
Вместо этого для публикации я разрабатываю программу, которая использует оболочку mosquittopp, но не имеет отношения к делу.
Я отправляю сообщение, используя этот метод:
int MyClass::publish(const char* message) {
return mosquittopp::publish(NULL, topic_, strlen(message),
(uint8_t*) message, qos_);
}
....
MyClass publisher;
string s = base64_decode("LAAAtQ8AIXRpwoVyeMKodMK2wpPDscKBYcKDw6jCg8KAYWDDhjVCMQ==");
publisher.publish(s.c_str());
Если я печатаю s, я получаю:
,�!tirx¨t¶ñaèa`Æ5B1
И я думаю, что все в порядке.
Но подписчик, кажется, получает только первый символ, фактически печатает только:
,
Есть идеи?
Это был BUG на версии, которую я использовал (1.3.1), исправлено с версии 1.3.4.
Второй символ декодированной строки имеет значение ноль. Используется для обозначения конца строки в стиле C; так strlen
сообщит длину 1 при обнаружении нуля после одного символа.
Если вы хотите использовать «строки», содержащие нулевые символы, вы не можете использовать функции обработки строк с нулевым символом в конце библиотеки C. Я бы поменял MyClass::publish
работать со строкой C ++ (или, возможно, std::vector<uint8_t>
так что это не будет принято за строку для печати), поэтому длина доступна как message.size()
содержит ли он нулевые символы.