首页 > 解决方案 > 使用 c 通过 mqtt 将 sqlite 数据库读取到 mqtt 代理

问题描述

我想读取一个 sqlite3 db 文件,用于通过 mqtt 的数据连接将数据从嵌入式设备发送到 c 语言的 mqtt 代理。

我收到错误“连接失败,返回代码 5”

谁能帮我纠正这个代码

提前致谢

 #include <stdlib.h>
 #include <string.h>
 #include <MQTTClient.h>
 #include <sqlite3.h>
 #define ADDRESS     "tcp:localhost:1883"
 #define CLIENTID    "......"
 #define USERNAME    "....."
 #define PASSWORD    "....."
 #define TOPIC       "..."
 #define QOS         1
 #define TIMEOUT     10000L

 static int callback(void *NotUsed, int argc, char* argv[],char   **azColName)
{
int i;
 for(i = 0; i<argc; i++) {
  printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
 }

  }
int main() {

int rc;
 MQTTClient client;
 MQTTClient_connectOptions conn_opts =   MQTTClient_connectOptions_initializer;
 MQTTClient_message pubmsg = MQTTClient_message_initializer;
 MQTTClient_deliveryToken token;

 MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
 conn_opts.username = USERNAME;
  conn_opts.password = PASSWORD;
  conn_opts.keepAliveInterval = 20;
  conn_opts.cleansession = 1;

   if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
   {
      printf("Failed to connect, return code %d\n", rc);
       exit(EXIT_FAILURE);
    }

   pubmsg.qos = QOS;
   pubmsg.retained = 0;

  sqlite3 *db;
  char *zErrMsg = 0;
  char *sql;
  const char* data = "Callback function called";

   rc = sqlite3_open("db/dht.db", &db);
   sql = "SELECT * from table";
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

   MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
    printf("Waiting for up to %d seconds for publication of %s\n"
    "on topic %s for client with ClientID: \n",
    (int)(TIMEOUT/1000), TOPIC, CLIENTID);
     rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
     printf("Message with delivery token %d delivered\n", token); 
  sqlite3_close(db);
  return 0 ;
  }

标签: csqlitemqtt

解决方案


来自 Paho C文档

MQTTClient_connect()

int MQTTClient_connect(MQTTClient handle, MQTTClient_connectOptions* options)

此函数尝试使用指定的选项将先前创建的客户端(请参阅 MQTTClient_create())连接到 MQTT 服务器。如果要启用异步消息和状态通知,则必须在 MQTTClient_connect() 之前调用 MQTTClient_setCallbacks()。

参数

  • handle 成功调用 MQTTClient_create() 后的有效客户端句柄。
  • options 指向有效 MQTTClient_connectOptions 结构的指针。

退货

如果客户端成功连接到服务器,则为 MQTTCLIENT_SUCCESS。如果客户端无法连接到服务器,则会返回错误代码。MQTT 协议返回大于 0 的错误码:

  • 1:连接被拒绝:不可接受的协议版本
  • 2:连接被拒绝:标识符被拒绝
  • 3:连接被拒绝:服务器不可用
  • 4:连接被拒绝:用户名或密码错误
  • 5:连接被拒绝:未授权
  • 6-255:保留供将来使用

返回码 5 表示“未授权”,这意味着您的用户名/密码错误。


推荐阅读