Created
March 24, 2019 18:11
-
-
Save nxzz/42f21da1bd537e15ba4fe7a90eb2e144 to your computer and use it in GitHub Desktop.
ESP8266 MQTT with TLS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <ESP8266WiFi.h> | |
| #include <WiFiClientSecure.h> | |
| #include <time.h> | |
| #include <PubSubClient.h> | |
| // WiFi | |
| #define STASSID "wlanAP" | |
| #define STAPSK "wlanPSK" | |
| // MQTT | |
| #define MQTT_SERVER "mqtt.hoge.fuga" | |
| #define MQTT_PORT 8883 | |
| #define MQTT_USER "username" | |
| #define MQTT_PASS "password" | |
| #define MQTT_PUB_TOPIC "topicname" | |
| #define MQTT_SUB_TOPIC "topicname" | |
| #define MQTT_ID_PREFIX "iotdevice-" | |
| // NTP | |
| #define NTP_SERVER_PRIMARY "ntp.nict.jp" | |
| #define NTP_SERVER_SECONDARY "pool.ntp.org" | |
| #define NTP_UTC_OFFSET 60 * 60 * 9 | |
| // CA | |
| // DST_Root_CA_X3.pem | |
| // notBefore=Sep 30 21:12:19 2000 GMT | |
| // notAfter=Sep 30 14:01:15 2021 GMT | |
| static const char ca_cert[] 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"; | |
| BearSSL::WiFiClientSecure wifiClient; | |
| BearSSL::X509List cert(ca_cert); | |
| PubSubClient mqtt(wifiClient); | |
| void setup() | |
| { | |
| Serial.begin(115200); | |
| Serial.println("Booting"); | |
| // Wi-Fi接続 | |
| WiFi.mode(WIFI_STA); | |
| WiFi.begin(STASSID, STAPSK); | |
| while (WiFi.waitForConnectResult() != WL_CONNECTED) | |
| { | |
| Serial.println("Connection Failed! Rebooting..."); | |
| delay(5000); | |
| ESP.restart(); | |
| } | |
| Serial.println("Ready"); | |
| Serial.print("IP address: "); | |
| Serial.println(WiFi.localIP()); | |
| // NTPで時刻合わせ | |
| setTimeNTP(); | |
| // LetsEncryptの中間証明を読み込む | |
| wifiClient.setTrustAnchors(&cert); | |
| // MQTTの設定 | |
| mqtt.setServer(MQTT_SERVER, MQTT_PORT); | |
| mqtt.setCallback(MQTTHandle); | |
| } | |
| void loop() | |
| { | |
| if (!mqtt.connected() && MQTTConnect()) | |
| { | |
| // 接続成功 | |
| mqtt.subscribe(MQTT_SUB_TOPIC); | |
| MQTTPubStr(MQTT_ID_PREFIX + getMacAddr() + " WakeUP!"); | |
| } | |
| mqtt.loop(); | |
| } | |
| // MQTTブローカに接続を行う | |
| bool MQTTConnect() | |
| { | |
| Serial.print("Waiting MQTT connection..."); | |
| char buf[50]; | |
| (MQTT_ID_PREFIX + getMacAddr()).toCharArray(buf, 50); | |
| if (mqtt.connect(buf, MQTT_USER, MQTT_PASS)) | |
| { | |
| Serial.println("connected"); | |
| return true; | |
| } | |
| else | |
| { | |
| Serial.print("failed, rc="); | |
| Serial.println(mqtt.state()); | |
| return false; | |
| } | |
| } | |
| // イベントが来た際に呼ばれる | |
| void MQTTHandle(char *topic, byte *payload, unsigned int length) | |
| { | |
| } | |
| // 文字列を投げる | |
| void MQTTPubStr(String msg) | |
| { | |
| char buf[1024]; | |
| msg.toCharArray(buf, 1024); | |
| mqtt.publish(MQTT_PUB_TOPIC, buf); | |
| } | |
| // NTPで時刻合わせ | |
| void setTimeNTP() | |
| { | |
| Serial.print("Waiting NTP..."); | |
| configTime(NTP_UTC_OFFSET, 0, NTP_SERVER_PRIMARY, NTP_SERVER_SECONDARY); | |
| // NTPの取得が終わるまで終わるまで待つ | |
| // 0と比較すると起動してからのカウントアップがあるので、ループから抜けてしまう | |
| while (time(NULL) < 365 * 24 * 60 * 60) | |
| { | |
| Serial.print("."); | |
| delay(1000); | |
| } | |
| Serial.println(getTime()); | |
| } | |
| // 現在時刻を文字列で得る | |
| String getTime() | |
| { | |
| time_t t = time(NULL); | |
| struct tm timeinfo; | |
| gmtime_r(&t, &timeinfo); | |
| return asctime(&timeinfo); | |
| } | |
| // Macアドレスを文字列で得る | |
| String getMacAddr() | |
| { | |
| byte mac[6]; | |
| char buf[50]; | |
| WiFi.macAddress(mac); | |
| sprintf(buf, "%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); | |
| return String(buf); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment