#include "Arduino.h" #include #include "esp_log.h" #include "esp_system.h" #include "esp_event.h" #include "mqtt_client.h" #include "esp_crt_bundle.h" #define SECURE_MQTT // Comment this line if you are not using MQTT over SSL #ifdef SECURE_MQTT #include "esp_tls.h" // Let's Encrypt CA certificate. Change with the one you need static const unsigned char DSTroot_CA[] PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- )EOF"; // static const unsigned char DSTroot_CA[] PROGMEM = R"EOF( // -----BEGIN CERTIFICATE----- // MIIDmzCCAoOgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UEBhMCR0Ix // FzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTESMBAGA1UE // CgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVpdHRvLm9y // ZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzAeFw0yMjEyMDcxMDIw // MjBaFw0yMzAzMDcxMDIwMjBaMHUxCzAJBgNVBAYTAklOMRQwEgYDVQQIDAtXZXN0 // IEJlbmdhbDEVMBMGA1UECgwMVGFtb2ppdCBTYWhhMRMwEQYDVQQDDApvcGVucmVt // b3RlMSQwIgYJKoZIhvcNAQkBFhVtYWlsQHRhbW9qaXRzYWhhLmluZm8wggEiMA0G // CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0YbVximGgXvrG9Hx3oTMe+1TuOdJy // 6CdawS0+kGxzT62cySs4HcebfBN6DkIdQFj6aJu5LfBdyWeIsKbzUattFIfZpclB // 9TNiBUeaaSodCUDdTvRqIT9aO+ekGlomYj7G188/qoePvuhbzdtPjtDZ5itRijTf // agmFfE6ZpmbeM0SUYzB73yVVsh2x4AH3O30UP395Cp3wOdYkoXGmR1Kn5dYxWNnq // 2WIECUhRTzhFjUSP1M00Ax9Ebh+stSoXenFeyDz/rnNMC1GRtItoF16IIMoYvIsW // aKb+vTEcSJa++tY4dy83cGMibAGPfbOWRa3wlDYhYuCY7pNeRFnEMSqnAgMBAAGj // GjAYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMA0GCSqGSIb3DQEBCwUAA4IBAQBb // XSCOvRV7nVxZ/qtTfGXRJoenAfAgqHMIQHXlQWPecOkbKNchf1VMZj4rtZfB4vmA // zLKt6mMn+Ii1NMWxafeQTfORZNURtDbLAntqnda5qPwGJPUJkX3ltx6XdCxZdiHH // o2gPj91kvTwLHWKcbPGpXDEhtC1xKGHZW4Qrh7SRNMWytvsrWaBND+mXN8J5Rh34 // IH6ZTh3aOmlH04cAkI9RP3CLeWAvzZyLm8IX+UOlgWQ8OL8JGXOMYEvPqi2/cwAA // T8qHVVLyCzT1EKag3oFQhIRa/a2artxFARxHyDLspbohkzzg7EBrjHwoh74gBUA6 // NTm1DjDxCEnoMy85JGia // -----END CERTIFICATE----- // )EOF"; #endif // SECURE_MQTT static const char* TAG = "MQTTSSL"; esp_mqtt_client_config_t mqtt_cfg; esp_mqtt_client_handle_t client; const char* WIFI_SSID = ""; const char* WIFI_PASSWD = ""; const char* MQTT_HOST = ""; #ifdef SECURE_MQTT const uint32_t MQTT_PORT = 8883; #else const uint32_t MQTT_PORT = 1883; #endif // SECURE_MQTT const char* MQTT_USER = "cust1:mqtt"; const char* MQTT_PASSWD = ""; const char* ASSET_ID = ""; char MQTT_CLIENT_ID[20]; char curr_cycle_topic[100]; static esp_err_t mqtt_event_handler (esp_mqtt_event_handle_t event) { if (event->event_id == MQTT_EVENT_CONNECTED) { ESP_LOGI (TAG, "MQTT msgid= %d event: %d. MQTT_EVENT_CONNECTED", event->msg_id, event->event_id); // esp_mqtt_client_subscribe (client, TAGhello", 0); // esp_mqtt_client_publish (client, TAGstatus", "1", 1, 0, false); } else if (event->event_id == MQTT_EVENT_DISCONNECTED) { ESP_LOGI (TAG, "MQTT event: %d. MQTT_EVENT_DISCONNECTED", event->event_id); //esp_mqtt_client_reconnect (event->client); //not needed if autoconnect is enabled } else if (event->event_id == MQTT_EVENT_SUBSCRIBED) { ESP_LOGI (TAG, "MQTT msgid= %d event: %d. MQTT_EVENT_SUBSCRIBED", event->msg_id, event->event_id); } else if (event->event_id == MQTT_EVENT_UNSUBSCRIBED) { ESP_LOGI (TAG, "MQTT msgid= %d event: %d. MQTT_EVENT_UNSUBSCRIBED", event->msg_id, event->event_id); } else if (event->event_id == MQTT_EVENT_PUBLISHED) { ESP_LOGI (TAG, "MQTT event: %d. MQTT_EVENT_PUBLISHED", event->event_id); } else if (event->event_id == MQTT_EVENT_DATA) { ESP_LOGI (TAG, "MQTT msgid= %d event: %d. MQTT_EVENT_DATA", event->msg_id, event->event_id); ESP_LOGI (TAG, "Topic length %d. Data length %d", event->topic_len, event->data_len); ESP_LOGI (TAG,"Incoming data: %.*s %.*s\n", event->topic_len, event->topic, event->data_len, event->data); } else if (event->event_id == MQTT_EVENT_BEFORE_CONNECT) { ESP_LOGI (TAG, "MQTT event: %d. MQTT_EVENT_BEFORE_CONNECT", event->event_id); } return ESP_OK; } char id[20]={0}; void setup () { uint8_t mac_addr[6] = {0}; esp_read_mac(mac_addr, ESP_MAC_WIFI_STA); ESP_LOGI(TAG, "MAC ADDR: 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); sprintf(MQTT_CLIENT_ID, "ci_%x%x%x%x%x%x",mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); ESP_LOGI(TAG, "MQTT CLient id: %s", MQTT_CLIENT_ID); sprintf(curr_cycle_topic, "cust1/%s/writeattributevalue/TestAttr/%s",MQTT_CLIENT_ID, ASSET_ID); mqtt_cfg.host = MQTT_HOST; mqtt_cfg.port = MQTT_PORT; mqtt_cfg.username = MQTT_USER; mqtt_cfg.password = MQTT_PASSWD; mqtt_cfg.keepalive = 30; mqtt_cfg.client_id = (const char*)MQTT_CLIENT_ID; mqtt_cfg.crt_bundle_attach = esp_crt_bundle_attach; // mqtt_cfg.client_key_pem ESP_LOGI(TAG, "Client id: %s", mqtt_cfg.client_id); delay(1000); #ifdef SECURE_MQTT mqtt_cfg.transport = MQTT_TRANSPORT_OVER_SSL; #else mqtt_cfg.transport = MQTT_TRANSPORT_OVER_TCP; #endif // SECURE_MQTT mqtt_cfg.event_handle = mqtt_event_handler; Serial.begin (115200); WiFi.mode (WIFI_MODE_STA); WiFi.begin (WIFI_SSID, WIFI_PASSWD); while (!WiFi.isConnected ()) { Serial.print ('.'); delay (100); } Serial.println (); #ifdef SECURE_MQTT esp_err_t err = esp_tls_set_global_ca_store (DSTroot_CA, sizeof (DSTroot_CA)); ESP_LOGI (TAG,"CA store set. Error = %d %s", err, esp_err_to_name(err)); #endif // SECURE_MQTT client = esp_mqtt_client_init (&mqtt_cfg); //esp_mqtt_client_register_event (client, ESP_EVENT_ANY_ID, mqtt_event_handler, client); // not implemented in current Arduino core err = esp_mqtt_client_start (client); ESP_LOGI (TAG, "Client connect. Error = %d %s", err, esp_err_to_name (err)); ESP_LOGI(TAG, "Current Cycle topic: %s", curr_cycle_topic); } void loop () { uint8_t _rand = random(1,255); char data[10]={0}; sprintf(data, "\"%d\"",_rand); // esp_mqtt_client_publish (client, (const char *)curr_cycle_topic, (const char *)rand, 4, 0, false); esp_err_t err = esp_mqtt_client_publish (client, curr_cycle_topic, data, strlen(data), 0, false); ESP_LOGI (TAG, "Client Publish %s = %d %s",err==-1?"Error":"Success", err, esp_err_to_name (err)); delay (3000); }