带 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);
我尝试在 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);