ESP32 MQTT_EVENT_DATA 不
ESP32 MQTT_EVENT_DATA NOT
我正在尝试为我的项目使用文件 mqtt_client.h 中定义的 arduino-esp32 方法。
我用过这个:https://docs.microsoft.com/en-us/samples/azure/azure-sdk-for-c/how-to-setup-and-run-azure-sdk-for-embedded-c-iot-hub-client-on-espressif-esp32/ 例子。
我的设备正在连接到 IoT Hub Azure 并成功向其发送数据。
我的问题是当我尝试从 IoTHub 将消息从 Azure 控制台发送到设备时。 MQTT_EVENT_DATA 未触发。
#include <cstdlib>
#include <string.h>
#include <time.h>
#include <WiFi.h>
#include <mqtt_client.h>
#include <az_iot_hub_client.h>
#include <az_result.h>
#include <az_span.h>
#include "AzIoTSasToken.h"
#include "SerialLogger.h"
#include "ca.h"
#include "iot_configs.h"
#define sizeofarray(a) (sizeof(a) / sizeof(a[0]))
#define NTP_SERVERS "pool.ntp.org", "time.nist.gov"
#define MQTT_QOS1 1
#define DO_NOT_RETAIN_MSG 0
#define SAS_TOKEN_DURATION_IN_MINUTES 60
#define UNIX_TIME_NOV_13_2017 1510592825
#define PST_TIME_ZONE -8
#define PST_TIME_ZONE_DST_DIFF 1
#define GMT_OFFSET_SECS (PST_TIME_ZONE * 3600)
#define GMT_OFFSET_SECS_DST ((PST_TIME_ZONE + PST_TIME_ZONE_DST_DIFF) * 3600)
static const char* ssid = IOT_CONFIG_WIFI_SSID;
static const char* password = IOT_CONFIG_WIFI_PASSWORD;
static const char* host = IOT_CONFIG_IOTHUB_FQDN;
static const char* mqtt_broker_uri = "mqtts://" IOT_CONFIG_IOTHUB_FQDN;
static const char* device_id = IOT_CONFIG_DEVICE_ID;
static const int mqtt_port = 8883;
static esp_mqtt_client_handle_t mqtt_client;
static az_iot_hub_client client;
static char mqtt_client_id[128];
static char mqtt_username[128];
static char mqtt_password[200];
static uint8_t sas_signature_buffer[256];
static unsigned long next_telemetry_send_time_ms = 0;
static char telemetry_topic[128];
static uint8_t telemetry_payload[100];
static uint32_t telemetry_send_count = 0;
static AzIoTSasToken sasToken(
&client,
AZ_SPAN_FROM_STR(IOT_CONFIG_DEVICE_KEY),
AZ_SPAN_FROM_BUFFER(sas_signature_buffer),
AZ_SPAN_FROM_BUFFER(mqtt_password));
static void connectToWiFi()
{
Logger.Info("Connecting to WIFI SSID " + String(ssid));
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Logger.Info("WiFi connected, IP address: " + WiFi.localIP().toString());
}
static void initializeTime()
{
Logger.Info("Setting time using SNTP");
configTime(GMT_OFFSET_SECS, GMT_OFFSET_SECS_DST, NTP_SERVERS);
time_t now = time(NULL);
while (now < UNIX_TIME_NOV_13_2017)
{
delay(500);
Serial.print(".");
now = time(nullptr);
}
Serial.println("");
Logger.Info("Time initialized!");
}
void receivedCallback(char* topic, byte* payload, unsigned int length)
{
Logger.Info("Received [");
Logger.Info(topic);
Logger.Info("]: ");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
}
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
{
Logger.Info("mqtt_event_handler fired!");
switch (event->event_id)
{
case MQTT_EVENT_ERROR:
Logger.Info("MQTT event MQTT_EVENT_ERROR");
break;
case MQTT_EVENT_CONNECTED:
Logger.Info("MQTT event MQTT_EVENT_CONNECTED");
break;
case MQTT_EVENT_DISCONNECTED:
Logger.Info("MQTT event MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
Logger.Info("MQTT event MQTT_EVENT_SUBSCRIBED");
break;
case MQTT_EVENT_UNSUBSCRIBED:
Logger.Info("MQTT event MQTT_EVENT_UNSUBSCRIBED");
break;
case MQTT_EVENT_PUBLISHED:
Logger.Info("MQTT event MQTT_EVENT_PUBLISHED");
break;
case MQTT_EVENT_DATA:
//THIS EVENT IS NOT FIRERING
Logger.Info("MQTT event MQTT_EVENT_DATA");
break;
case MQTT_EVENT_BEFORE_CONNECT:
Logger.Info("MQTT event MQTT_EVENT_BEFORE_CONNECT");
break;
default:
Logger.Error("MQTT event UNKNOWN");
break;
}
}
static void initializeIoTHubClient()
{
if (az_result_failed(az_iot_hub_client_init(
&client,
az_span_create((uint8_t*)host, strlen(host)),
az_span_create((uint8_t*)device_id, strlen(device_id)),
NULL)))
{
Logger.Error("Failed initializing Azure IoT Hub client");
return;
}
size_t client_id_length;
if (az_result_failed(az_iot_hub_client_get_client_id(
&client, mqtt_client_id, sizeof(mqtt_client_id) - 1, &client_id_length)))
{
Logger.Error("Failed getting client id");
return;
}
// Get the MQTT user name used to connect to IoT Hub
if (az_result_failed(az_iot_hub_client_get_user_name(
&client, mqtt_username, sizeofarray(mqtt_username), NULL)))
{
Logger.Error("Failed to get MQTT clientId, return code");
return;
}
Logger.Info("Client ID: " + String(mqtt_client_id));
Logger.Info("Username: " + String(mqtt_username));
}
static int initializeMqttClient()
{
if (sasToken.Generate(SAS_TOKEN_DURATION_IN_MINUTES) != 0)
{
Logger.Error("Failed generating SAS token");
return 1;
}
esp_mqtt_client_config_t mqtt_config;
memset(&mqtt_config, 0, sizeof(mqtt_config));
mqtt_config.uri = mqtt_broker_uri;
mqtt_config.port = mqtt_port;
mqtt_config.client_id = mqtt_client_id;
mqtt_config.username = mqtt_username;
mqtt_config.password = (const char*)az_span_ptr(sasToken.Get());
mqtt_config.keepalive = 30;
mqtt_config.disable_clean_session = 0;
mqtt_config.disable_auto_reconnect = false;
mqtt_config.event_handle = mqtt_event_handler;
mqtt_config.user_context = NULL;
mqtt_config.cert_pem = (const char*)ca_pem;
mqtt_client = esp_mqtt_client_init(&mqtt_config);
if (mqtt_client == NULL)
{
Logger.Error("Failed creating mqtt client");
return 1;
}
esp_err_t start_result = esp_mqtt_client_start(mqtt_client);
if (start_result != ESP_OK)
{
Logger.Error("Could not start mqtt client; error code:" + start_result);
return 1;
}
else
{
Logger.Info("MQTT client started");
return 0;
}
}
static uint32_t getEpochTimeInSecs()
{
return (uint32_t)time(NULL);
}
static int establishConnection()
{
connectToWiFi();
initializeTime();
initializeIoTHubClient();
(void)initializeMqttClient();
}
void setup() { establishConnection(); }
static void getTelemetryPayload(az_span payload, az_span* out_payload)
{
az_span original_payload = payload;
payload = az_span_copy(
payload, AZ_SPAN_FROM_STR("{ \"deviceId\": \"" IOT_CONFIG_DEVICE_ID "\", \"msgCount\": "));
(void)az_span_u32toa(payload, telemetry_send_count++, &payload);
payload = az_span_copy(payload, AZ_SPAN_FROM_STR(" }"));
payload = az_span_copy_u8(payload, '[=11=]');
*out_payload = az_span_slice(original_payload, 0, az_span_size(original_payload) - az_span_size(payload));
}
static void sendTelemetry()
{
az_span telemetry = AZ_SPAN_FROM_BUFFER(telemetry_payload);
Logger.Info("Sending telemetry ...");
// The topic could be obtained just once during setup,
// however if properties are used the topic need to be generated again to reflect the
// current values of the properties.
if (az_result_failed(az_iot_hub_client_telemetry_get_publish_topic(
&client, NULL, telemetry_topic, sizeof(telemetry_topic), NULL)))
{
Logger.Error("Failed az_iot_hub_client_telemetry_get_publish_topic");
return;
}
getTelemetryPayload(telemetry, &telemetry);
if (esp_mqtt_client_publish(
mqtt_client,
telemetry_topic,
(const char*)az_span_ptr(telemetry),
az_span_size(telemetry),
MQTT_QOS1,
DO_NOT_RETAIN_MSG)
== 0)
{
Logger.Error("Failed publishing");
}
else
{
Logger.Info("Message published successfully");
}
}
void loop()
{
if (WiFi.status() != WL_CONNECTED)
{
connectToWiFi();
}
else if (sasToken.IsExpired())
{
Logger.Info("SAS token expired; reconnecting with a new one.");
(void)esp_mqtt_client_destroy(mqtt_client);
initializeMqttClient();
}
else if (millis() > next_telemetry_send_time_ms)
{
sendTelemetry();
next_telemetry_send_time_ms = millis() + TELEMETRY_FREQUENCY_MILLISECS;
}
}
COM 日志:
11:07:37.286 -> 1970/1/1 00:00:00 [INFO] Connecting to WIFI SSID ELMA
11:07:37.904 -> .....
11:07:39.898 -> 1970/1/1 00:00:02 [INFO] WiFi connected, IP address: 192.168.3.90
11:07:39.898 -> 1970/1/1 00:00:02 [INFO] Setting time using SNTP
11:07:40.399 -> .
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] Time initialized!
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] Client ID: DEVICETEST
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] Username: xxxx
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] 2021/9/14 08:07:39 [INFO] mqtt_event_handler fired!
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] MQTT event MQTT_EVENT_BEFORE_CONNECT
11:07:40.446 -> MQTT client started
11:07:40.446 -> 2021/9/14 08:07:39 [INFO] Sending telemetry ...
11:07:41.954 -> 2021/9/14 08:07:41 [INFO] mqtt_event_handler fired!
11:07:41.954 -> 2021/9/14 08:07:41 [INFO] MQTT event MQTT_EVENT_CONNECTED
11:07:41.954 -> 2021/9/14 08:07:41 [INFO] Message published successfully
11:07:42.268 -> 2021/9/14 08:07:41 [INFO] mqtt_event_handler fired!
11:07:42.268 -> 2021/9/14 08:07:41 [INFO] MQTT event MQTT_EVENT_PUBLISHED
11:07:51.948 -> 2021/9/14 08:07:51 [INFO] Sending telemetry ...
11:07:51.948 -> 2021/9/14 08:07:51 [INFO] Message published successfully
11:07:52.095 -> 2021/9/14 08:07:51 [INFO] mqtt_event_handler fired!
11:07:52.095 -> 2021/9/14 08:07:51 [INFO] MQTT event MQTT_EVENT_PUBLISHED
Azure console to send message to device
所以,正如 romkey 提到的,我订阅了 C2D 主题,然后 EVENT_DATA 被触发。
#define AZ_IOT_HUB_CLIENT_C2D_SUBSCRIBE_TOPIC "devices/+/messages/devicebound/#"
#define MQTT_QOS1 1
static void subscribeC2D(){
if(esp_mqtt_client_subscribe(mqtt_client, AZ_IOT_HUB_CLIENT_C2D_SUBSCRIBE_TOPIC, MQTT_QOS1) == 0)
{
Logger.Info("subscribeC2D: Failed to subscribe!");
}
而subscribeC2D()函数的调用是在MQTT_EVENT_CONNECTED事件中。
并且从 Azure IoT Hub 收到的消息打印在 MQTT_EVENT_DATA 事件中。
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
{
switch (event->event_id)
{
case MQTT_EVENT_ERROR:
Logger.Info("MQTT event MQTT_EVENT_ERROR");
break;
case MQTT_EVENT_CONNECTED:
Logger.Info("MQTT event MQTT_EVENT_CONNECTED");
subscribeC2D();
break;
case MQTT_EVENT_DISCONNECTED:
Logger.Info("MQTT event MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
Logger.Info("MQTT event MQTT_EVENT_SUBSCRIBED");
break;
case MQTT_EVENT_UNSUBSCRIBED:
Logger.Info("MQTT event MQTT_EVENT_UNSUBSCRIBED");
break;
case MQTT_EVENT_PUBLISHED:
Logger.Info("MQTT event MQTT_EVENT_PUBLISHED");
break;
case MQTT_EVENT_DATA:
Logger.Info("MQTT event MQTT_EVENT_DATA");
printf("DATA=%.*s\r\n", event->data_len, event->data);
break;
case MQTT_EVENT_BEFORE_CONNECT:
Logger.Info("MQTT event MQTT_EVENT_BEFORE_CONNECT");
break;
default:
Logger.Error("MQTT event UNKNOWN");
break;
}
}
我正在尝试为我的项目使用文件 mqtt_client.h 中定义的 arduino-esp32 方法。 我用过这个:https://docs.microsoft.com/en-us/samples/azure/azure-sdk-for-c/how-to-setup-and-run-azure-sdk-for-embedded-c-iot-hub-client-on-espressif-esp32/ 例子。
我的设备正在连接到 IoT Hub Azure 并成功向其发送数据。 我的问题是当我尝试从 IoTHub 将消息从 Azure 控制台发送到设备时。 MQTT_EVENT_DATA 未触发。
#include <cstdlib>
#include <string.h>
#include <time.h>
#include <WiFi.h>
#include <mqtt_client.h>
#include <az_iot_hub_client.h>
#include <az_result.h>
#include <az_span.h>
#include "AzIoTSasToken.h"
#include "SerialLogger.h"
#include "ca.h"
#include "iot_configs.h"
#define sizeofarray(a) (sizeof(a) / sizeof(a[0]))
#define NTP_SERVERS "pool.ntp.org", "time.nist.gov"
#define MQTT_QOS1 1
#define DO_NOT_RETAIN_MSG 0
#define SAS_TOKEN_DURATION_IN_MINUTES 60
#define UNIX_TIME_NOV_13_2017 1510592825
#define PST_TIME_ZONE -8
#define PST_TIME_ZONE_DST_DIFF 1
#define GMT_OFFSET_SECS (PST_TIME_ZONE * 3600)
#define GMT_OFFSET_SECS_DST ((PST_TIME_ZONE + PST_TIME_ZONE_DST_DIFF) * 3600)
static const char* ssid = IOT_CONFIG_WIFI_SSID;
static const char* password = IOT_CONFIG_WIFI_PASSWORD;
static const char* host = IOT_CONFIG_IOTHUB_FQDN;
static const char* mqtt_broker_uri = "mqtts://" IOT_CONFIG_IOTHUB_FQDN;
static const char* device_id = IOT_CONFIG_DEVICE_ID;
static const int mqtt_port = 8883;
static esp_mqtt_client_handle_t mqtt_client;
static az_iot_hub_client client;
static char mqtt_client_id[128];
static char mqtt_username[128];
static char mqtt_password[200];
static uint8_t sas_signature_buffer[256];
static unsigned long next_telemetry_send_time_ms = 0;
static char telemetry_topic[128];
static uint8_t telemetry_payload[100];
static uint32_t telemetry_send_count = 0;
static AzIoTSasToken sasToken(
&client,
AZ_SPAN_FROM_STR(IOT_CONFIG_DEVICE_KEY),
AZ_SPAN_FROM_BUFFER(sas_signature_buffer),
AZ_SPAN_FROM_BUFFER(mqtt_password));
static void connectToWiFi()
{
Logger.Info("Connecting to WIFI SSID " + String(ssid));
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Logger.Info("WiFi connected, IP address: " + WiFi.localIP().toString());
}
static void initializeTime()
{
Logger.Info("Setting time using SNTP");
configTime(GMT_OFFSET_SECS, GMT_OFFSET_SECS_DST, NTP_SERVERS);
time_t now = time(NULL);
while (now < UNIX_TIME_NOV_13_2017)
{
delay(500);
Serial.print(".");
now = time(nullptr);
}
Serial.println("");
Logger.Info("Time initialized!");
}
void receivedCallback(char* topic, byte* payload, unsigned int length)
{
Logger.Info("Received [");
Logger.Info(topic);
Logger.Info("]: ");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
}
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
{
Logger.Info("mqtt_event_handler fired!");
switch (event->event_id)
{
case MQTT_EVENT_ERROR:
Logger.Info("MQTT event MQTT_EVENT_ERROR");
break;
case MQTT_EVENT_CONNECTED:
Logger.Info("MQTT event MQTT_EVENT_CONNECTED");
break;
case MQTT_EVENT_DISCONNECTED:
Logger.Info("MQTT event MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
Logger.Info("MQTT event MQTT_EVENT_SUBSCRIBED");
break;
case MQTT_EVENT_UNSUBSCRIBED:
Logger.Info("MQTT event MQTT_EVENT_UNSUBSCRIBED");
break;
case MQTT_EVENT_PUBLISHED:
Logger.Info("MQTT event MQTT_EVENT_PUBLISHED");
break;
case MQTT_EVENT_DATA:
//THIS EVENT IS NOT FIRERING
Logger.Info("MQTT event MQTT_EVENT_DATA");
break;
case MQTT_EVENT_BEFORE_CONNECT:
Logger.Info("MQTT event MQTT_EVENT_BEFORE_CONNECT");
break;
default:
Logger.Error("MQTT event UNKNOWN");
break;
}
}
static void initializeIoTHubClient()
{
if (az_result_failed(az_iot_hub_client_init(
&client,
az_span_create((uint8_t*)host, strlen(host)),
az_span_create((uint8_t*)device_id, strlen(device_id)),
NULL)))
{
Logger.Error("Failed initializing Azure IoT Hub client");
return;
}
size_t client_id_length;
if (az_result_failed(az_iot_hub_client_get_client_id(
&client, mqtt_client_id, sizeof(mqtt_client_id) - 1, &client_id_length)))
{
Logger.Error("Failed getting client id");
return;
}
// Get the MQTT user name used to connect to IoT Hub
if (az_result_failed(az_iot_hub_client_get_user_name(
&client, mqtt_username, sizeofarray(mqtt_username), NULL)))
{
Logger.Error("Failed to get MQTT clientId, return code");
return;
}
Logger.Info("Client ID: " + String(mqtt_client_id));
Logger.Info("Username: " + String(mqtt_username));
}
static int initializeMqttClient()
{
if (sasToken.Generate(SAS_TOKEN_DURATION_IN_MINUTES) != 0)
{
Logger.Error("Failed generating SAS token");
return 1;
}
esp_mqtt_client_config_t mqtt_config;
memset(&mqtt_config, 0, sizeof(mqtt_config));
mqtt_config.uri = mqtt_broker_uri;
mqtt_config.port = mqtt_port;
mqtt_config.client_id = mqtt_client_id;
mqtt_config.username = mqtt_username;
mqtt_config.password = (const char*)az_span_ptr(sasToken.Get());
mqtt_config.keepalive = 30;
mqtt_config.disable_clean_session = 0;
mqtt_config.disable_auto_reconnect = false;
mqtt_config.event_handle = mqtt_event_handler;
mqtt_config.user_context = NULL;
mqtt_config.cert_pem = (const char*)ca_pem;
mqtt_client = esp_mqtt_client_init(&mqtt_config);
if (mqtt_client == NULL)
{
Logger.Error("Failed creating mqtt client");
return 1;
}
esp_err_t start_result = esp_mqtt_client_start(mqtt_client);
if (start_result != ESP_OK)
{
Logger.Error("Could not start mqtt client; error code:" + start_result);
return 1;
}
else
{
Logger.Info("MQTT client started");
return 0;
}
}
static uint32_t getEpochTimeInSecs()
{
return (uint32_t)time(NULL);
}
static int establishConnection()
{
connectToWiFi();
initializeTime();
initializeIoTHubClient();
(void)initializeMqttClient();
}
void setup() { establishConnection(); }
static void getTelemetryPayload(az_span payload, az_span* out_payload)
{
az_span original_payload = payload;
payload = az_span_copy(
payload, AZ_SPAN_FROM_STR("{ \"deviceId\": \"" IOT_CONFIG_DEVICE_ID "\", \"msgCount\": "));
(void)az_span_u32toa(payload, telemetry_send_count++, &payload);
payload = az_span_copy(payload, AZ_SPAN_FROM_STR(" }"));
payload = az_span_copy_u8(payload, '[=11=]');
*out_payload = az_span_slice(original_payload, 0, az_span_size(original_payload) - az_span_size(payload));
}
static void sendTelemetry()
{
az_span telemetry = AZ_SPAN_FROM_BUFFER(telemetry_payload);
Logger.Info("Sending telemetry ...");
// The topic could be obtained just once during setup,
// however if properties are used the topic need to be generated again to reflect the
// current values of the properties.
if (az_result_failed(az_iot_hub_client_telemetry_get_publish_topic(
&client, NULL, telemetry_topic, sizeof(telemetry_topic), NULL)))
{
Logger.Error("Failed az_iot_hub_client_telemetry_get_publish_topic");
return;
}
getTelemetryPayload(telemetry, &telemetry);
if (esp_mqtt_client_publish(
mqtt_client,
telemetry_topic,
(const char*)az_span_ptr(telemetry),
az_span_size(telemetry),
MQTT_QOS1,
DO_NOT_RETAIN_MSG)
== 0)
{
Logger.Error("Failed publishing");
}
else
{
Logger.Info("Message published successfully");
}
}
void loop()
{
if (WiFi.status() != WL_CONNECTED)
{
connectToWiFi();
}
else if (sasToken.IsExpired())
{
Logger.Info("SAS token expired; reconnecting with a new one.");
(void)esp_mqtt_client_destroy(mqtt_client);
initializeMqttClient();
}
else if (millis() > next_telemetry_send_time_ms)
{
sendTelemetry();
next_telemetry_send_time_ms = millis() + TELEMETRY_FREQUENCY_MILLISECS;
}
}
COM 日志:
11:07:37.286 -> 1970/1/1 00:00:00 [INFO] Connecting to WIFI SSID ELMA
11:07:37.904 -> .....
11:07:39.898 -> 1970/1/1 00:00:02 [INFO] WiFi connected, IP address: 192.168.3.90
11:07:39.898 -> 1970/1/1 00:00:02 [INFO] Setting time using SNTP
11:07:40.399 -> .
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] Time initialized!
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] Client ID: DEVICETEST
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] Username: xxxx
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] 2021/9/14 08:07:39 [INFO] mqtt_event_handler fired!
11:07:40.399 -> 2021/9/14 08:07:39 [INFO] MQTT event MQTT_EVENT_BEFORE_CONNECT
11:07:40.446 -> MQTT client started
11:07:40.446 -> 2021/9/14 08:07:39 [INFO] Sending telemetry ...
11:07:41.954 -> 2021/9/14 08:07:41 [INFO] mqtt_event_handler fired!
11:07:41.954 -> 2021/9/14 08:07:41 [INFO] MQTT event MQTT_EVENT_CONNECTED
11:07:41.954 -> 2021/9/14 08:07:41 [INFO] Message published successfully
11:07:42.268 -> 2021/9/14 08:07:41 [INFO] mqtt_event_handler fired!
11:07:42.268 -> 2021/9/14 08:07:41 [INFO] MQTT event MQTT_EVENT_PUBLISHED
11:07:51.948 -> 2021/9/14 08:07:51 [INFO] Sending telemetry ...
11:07:51.948 -> 2021/9/14 08:07:51 [INFO] Message published successfully
11:07:52.095 -> 2021/9/14 08:07:51 [INFO] mqtt_event_handler fired!
11:07:52.095 -> 2021/9/14 08:07:51 [INFO] MQTT event MQTT_EVENT_PUBLISHED
Azure console to send message to device
所以,正如 romkey 提到的,我订阅了 C2D 主题,然后 EVENT_DATA 被触发。
#define AZ_IOT_HUB_CLIENT_C2D_SUBSCRIBE_TOPIC "devices/+/messages/devicebound/#"
#define MQTT_QOS1 1
static void subscribeC2D(){
if(esp_mqtt_client_subscribe(mqtt_client, AZ_IOT_HUB_CLIENT_C2D_SUBSCRIBE_TOPIC, MQTT_QOS1) == 0)
{
Logger.Info("subscribeC2D: Failed to subscribe!");
}
而subscribeC2D()函数的调用是在MQTT_EVENT_CONNECTED事件中。 并且从 Azure IoT Hub 收到的消息打印在 MQTT_EVENT_DATA 事件中。
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
{
switch (event->event_id)
{
case MQTT_EVENT_ERROR:
Logger.Info("MQTT event MQTT_EVENT_ERROR");
break;
case MQTT_EVENT_CONNECTED:
Logger.Info("MQTT event MQTT_EVENT_CONNECTED");
subscribeC2D();
break;
case MQTT_EVENT_DISCONNECTED:
Logger.Info("MQTT event MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
Logger.Info("MQTT event MQTT_EVENT_SUBSCRIBED");
break;
case MQTT_EVENT_UNSUBSCRIBED:
Logger.Info("MQTT event MQTT_EVENT_UNSUBSCRIBED");
break;
case MQTT_EVENT_PUBLISHED:
Logger.Info("MQTT event MQTT_EVENT_PUBLISHED");
break;
case MQTT_EVENT_DATA:
Logger.Info("MQTT event MQTT_EVENT_DATA");
printf("DATA=%.*s\r\n", event->data_len, event->data);
break;
case MQTT_EVENT_BEFORE_CONNECT:
Logger.Info("MQTT event MQTT_EVENT_BEFORE_CONNECT");
break;
default:
Logger.Error("MQTT event UNKNOWN");
break;
}
}