Я создал простое приложение на языке c ++ для отправки данных из малины в канал IoT AWS. Я никогда не получал сообщения от темы, где малина публикует данные.
Код следующий:
int main(int argc, char* argv[]) {
int res = 0;
NRMKMqttWrapper * mqttHdl;
mqttHdl = new NRMKMqttWrapper("clientid1");
res = mqttHdl->tls_opts_set(1, "tlsv1.2", NULL);
std::cout<<"tls_opts_set response: "<<res<<::std::endl;
std::cout<<"Initialize tls"<<std::endl;
res = mqttHdl->tls_set("tls/ca/Public-Primary-Certification-Authority-G5.pem", NULL, "tls/xxxx-certificate.pem", "tls/xxxx-private.pem", NULL);
std::cout<<"TLS set certificate response: "<<res<<::std::endl;
res = mqttHdl->connect("xxxx.iot.eu-west-1.amazonaws.com", 8883);
std::cout<<"Connect response: "<<res<<std::endl;
std::cout<<"Connection estabilished"<<std::endl;
while(1) {
auto tstr = "Hello world, this is a enode from mqtt";
mqttHdl->publish(NULL, "enode/data", strlen(tstr), tstr);
std::cout<<"Message sent"<<std::endl;
std::cout<<"Response of publish is: "<<res<<std::endl;
res = mqttHdl->loop(); // Keep MQTT connection
std::cout<<"Response of loop is: "<<res<<std::endl;
if (res)
mqttHdl->reconnect();
sleep(5);
}
return 0;
}
NRMKMqttWrapper.cpp
NRMKMqttWrapper::NRMKMqttWrapper(const char *id) : mosquittopp(id)
{
mosqpp::lib_init(); // Initialize libmosquitto
std::cout<<"Lib initialized"<<std::endl;
//int keepalive = 120; // seconds
//connect(host, port, keepalive); // Connect to MQTT Broker
}
void NRMKMqttWrapper::on_connect(int rc)
{
std::cout<<"Connected with code "<<rc<<std::endl;;
if (rc == 0)
{
subscribe(NULL, "command/IGot");
}
}
void NRMKMqttWrapper::on_subcribe(int mid, int qos_count, const int *granted_qos)
{
std::cout<<"Subscription succeeded."<<std::endl;
}
void NRMKMqttWrapper::on_message(const struct mosquitto_message *message)
{
std::cout<<(const char *)message->payload<<std::endl;
}
Когда он входит в цикл, он печатает некоторое время 0, так как я понимаю, что вынужден возвращать 0 в первый раз, затем он возвращает код 7 (соединение потеряно), он восстанавливает соединение и теряет соединение в следующем цикле.
Но если я запускаю команду из консоли, используя mosquitto_pub
он отлично работает, и я получаю сообщение от малины.
mosquitto_pub --cafile tls/ca/Public-Primary-Certification-Authority-G5.pem --cert tls/xxxx-certificate.pem --key tls/xxxx-private.pem -h xxxx.iot.eu-west-1.amazonaws.com -p 8883 -q 1 -d -t "enode/data" -i clientid1 -m "Hello World"
Любое предложение?
Задача ещё не решена.
Других решений пока нет …