【问题标题】:MQTT Client application with lwip (MQTT_CONNECT_DISCONNECTED)带有 lwip 的 MQTT 客户端应用程序 (MQTT_CONNECT_DISCONNECTED)
【发布时间】:2021-12-23 11:49:10
【问题描述】:

我尝试在 ATSAME53N20A 上实现 MQTT 客户端。我之前使用 lwip bsd socket api 成功实现了 tcp-ip 服务器-客户端应用程序。但是这次尽管我关注了lwip MQTT documentation,但还是出现了一些问题。我在与 pc 相同的网络上使用 mosquitto mqtt 代理。

首先我做了 tcpip、ethernet_link 等初始化。后来,我有一个 "mqtt_new" 任务。

void mqtt_new(void *p){
  vTaskDelay(1000);
  mqtt_client_t* client;
  client = mqtt_client_new();
  if (client != NULL){
    leds_off();
    mqtt_connect(&client);} 

  while(1){
    gpio_toggle_pin_level(LED_OUT);
    vTaskDelay(200);
  }
}

而且,这个任务调用了mqtt_connect的函数。

void mqtt_connect(mqtt_client_t *client){
  ip_addr_t my_mqtt;
  struct mqtt_connect_client_info_t ci;
  err_t err;
  memset(&ci, 0, sizeof(ci)); 
  ci.client_id = "lwip_test";   
  my_mqtt.addr = 3232236597ul;
  err = mqtt_client_connect(client, &my_mqtt, MQTT_PORT, mqtt_connection_cb, 0, &ci);
  while (err != ERR_OK)
  {
    err = mqtt_client_connect(client, &my_mqtt, MQTT_PORT, mqtt_connection_cb, 0, &ci);
    gpio_toggle_pin_level(LED_B);
    vTaskDelay(300);
  }
  while (!mqtt_client_is_connected(&client)){
    gpio_set_pin_level(LED_R,false);
  }
}

当此函数运行时,mqtt_client_connect 函数可以返回ERR_OK。过了一会儿(也许当 mqtt_client_is_connected(&client) 返回 1 时),mqtt_connection_cb 开始了。

static void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status){
err_t err;

if (status == MQTT_CONNECT_ACCEPTED) {
    //printf("mqtt_connection_cb: Successfully connected\n");
    /* Setup callback for incoming publish requests */
    mqtt_set_inpub_callback(client, mqtt_incoming_publish_cb, mqtt_incoming_data_cb, arg);
    
    /* Subscribe to a topic named "subtopic" with QoS level 1, call mqtt_sub_request_cb with result */
    err = mqtt_subscribe(client, "subtopic", 1, mqtt_sub_request_cb, arg);

    if(err != ERR_OK) {
        //printf("mqtt_subscribe return: %d\n", err);
    } // !err_ok
}   // mqtt_accepted
else {
    //printf("mqtt_connection_cb: Disconnected, reason: %d\n", status);
    leds_off();
    gpio_set_pin_level(LED_G,false);
    /* Its more nice to be connected, so try to reconnect */
    mqtt_connect(client);
} // else
} // task

但是,这里的状态每次都等于 MQTT_CONNECT_DISCONNECTED。我找不到如何解决这个问题。如果你能帮助我,我会很高兴的。

【问题讨论】:

    标签: mqtt freertos atmel lwip


    【解决方案1】:

    我解决了这个问题。当我更改 mqtt_connect 任务中包含的以下定义时,问题就解决了。

    my_mqtt.addr = 3232236597ul;
    

    我写了下面的定义而不是这个定义。

    ipaddr_aton("192.168.4.53",&my_mqtt);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2018-01-11
      • 2018-10-18
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多