带 lwip 的 MQTT 客户端应用程序 (MQTT_CONNECT_DISCONNECTED)

MQTT Client application with lwip (MQTT_CONNECT_DISCONNECTED)

我尝试在 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的函数可以returnERR_OK。过了一会儿(也许当 mqtt_client_is_connected(&client) return 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_connect 任务中包含的以下定义时,问题就解决了。

my_mqtt.addr = 3232236597ul;

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

ipaddr_aton("192.168.4.53",&my_mqtt);