{"id":312,"date":"2023-08-17T20:42:51","date_gmt":"2023-08-17T12:42:51","guid":{"rendered":"http:\/\/www.forillusion.com\/?p=312"},"modified":"2025-02-14T11:39:27","modified_gmt":"2025-02-14T03:39:27","slug":"esp8266-connect-mqtt","status":"publish","type":"post","link":"https:\/\/www.forillusion.com\/index.php\/esp8266-connect-mqtt\/","title":{"rendered":"ESP8266\u8fde\u63a5MQTT"},"content":{"rendered":"\n<p><div class=\"has-toc have-toc\"><\/div><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u7b80\u4ecb<\/h4>\n\n\n\n<p>\u672c\u6587\u4e3b\u8981\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528 ESP8266 \u8fde\u63a5MQTT\u670d\u52a1\u5668\uff0c\u5229\u7528&nbsp;<code>PubSubClient<\/code>&nbsp;\u5e93\uff0c\u5b9e\u73b0\u5ba2\u6237\u7aef\u4e0e MQTT \u670d\u52a1\u5668\u7684\u8fde\u63a5\u3001\u8ba2\u9605\u3001\u6536\u53d1\u6d88\u606f\u7b49\u529f\u80fd\u3002\u670d\u52a1\u5668\u4f7f\u7528EMQX\u4e3a\u4f8b\u3002\u90e8\u5206\u4ee3\u7801\u4f7f\u7528 <code>PubSubClient<\/code>&nbsp;\u5e93\u81ea\u5e26\u7684\u793a\u4f8b\u3002<\/p>\n\n\n\n<p>\u8fde\u63a5\u5230MQTT\u670d\u52a1\u5668\u5206\u4e3aTCP\u65b9\u5f0f\u8fde\u63a5\u548cTLS\/SSL\u65b9\u5f0f\u8fde\u63a5\uff0c\u4f7f\u7528EMQX\u7684\u516c\u5171\u670d\u52a1\u5668\u7684\u8bdd\u662fTCP\u65b9\u5f0f\u8fde\u63a5\uff0c\u4f7f\u7528EMQX\u7684\u79c1\u6709\u670d\u52a1\u5668\u4e3aTLS\/SSL\u65b9\u5f0f\u8fde\u63a5\u3002TCP\u548cTLS\/SSL\u8fde\u63a5\u7684\u533a\u522b\u5728\u4e8e\u5b9a\u4e49espClient\u7684\u65b9\u5f0f\u4e0d\u540c\uff0c\u8fde\u63a5\u670d\u52a1\u5668\u7684\u7aef\u53e3\u4e0d\u540c\uff0c\u4ee5\u53caTLS\/SSL\u9700\u8981\u586b\u5199\u670d\u52a1\u5668\u6307\u7eb9\uff0c\u5e76\u4f7f\u7528<code>espClient.setFingerprint(fingerprint);<\/code>\u8bbe\u7f6e\u6307\u7eb9<\/p>\n\n\n\n<p>EMQX\u516c\u5171\u670d\u52a1\u5668<a href=\"http:\/\/www.emqx.io\/online-mqtt-client\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >\u94fe\u63a5<\/a>\uff0c<a rel=\"noreferrer noopener\" href=\"https:\/\/mqttx.app\/zh\/docs\/web\" target=\"_blank\" rel=\"nofollow\" >\u4f7f\u7528\u8bf4\u660e<\/a>\u3002<\/p>\n\n\n\n<p>EMQX\u79c1\u6709\u670d\u52a1\u5668<a rel=\"noreferrer noopener\" href=\"https:\/\/www.emqx.com\/zh\/cloud\" target=\"_blank\" rel=\"nofollow\" >\u94fe\u63a5<\/a>\uff0c<a rel=\"noreferrer noopener\" href=\"https:\/\/docs.emqx.com\/zh\/cloud\/latest\/\" data-type=\"URL\" data-id=\"https:\/\/docs.emqx.com\/zh\/cloud\/latest\/\" target=\"_blank\" rel=\"nofollow\" >\u4f7f\u7528\u8bf4\u660e<\/a>\uff0c\u79c1\u6709\u670d\u52a1\u5668\u6709\u4e00\u5b9a\u7684\u514d\u8d39\u989d\u5ea6\uff0c\u6bcf\u67081\u767e\u4e07\u8fde\u63a5\u5206\u949f\u6570\uff08\u5927\u7ea623\u4e2a\u8bbe\u5907\u6301\u7eed\u5728\u7ebf\u8fde\u63a51\u4e2a\u6708\uff09\u548c1G\u6d41\u91cf\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u5148\u5728Arduino IDE\u7684 \u7ba1\u7406\u5e93 \u4e2d\u6dfb\u52a0 <code>PubSubClient<\/code> \u5e93<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u5e38\u7528\u51fd\u6570<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>WiFiClient espClient;  \/\/TCP\u8fde\u63a5\nWiFiClientSecure espClient;  \/\/TLS\/SSL\u8fde\u63a5\nPubSubClient client(espClient);  \/\/\u5b9a\u4e49client\nespClient.setFingerprint(fingerprint);  \/\/TLS\/SSL\u8fde\u63a5\uff0c\u8bbe\u7f6e\u6307\u7eb9\nclient.setServer(mqtt_server, mqtt_port);   \/\/\u8bbe\u7f6e\u670d\u52a1\u5668\u5730\u5740\u548c\u7aef\u53e3\nclient.setCallback(callback);    \/\/\u8bbe\u7f6e\u63a5\u6536\u6d88\u606f\u7684\u51fd\u6570\nclient.connect(clientId.c_str());  \/\/\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u4e0d\u4f7f\u7528\u7528\u6237\u540d\u548c\u5bc6\u7801\nclient.connect(clientId.c_str() , mqtt_name , mqtt_password);  \/\/\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u4f7f\u7528\u7528\u6237\u540d\u548c\u5bc6\u7801\nclient.connected();  \/\/\u8fd4\u56de\u662f\u5426\u8fde\u63a5\u6210\u529f\uff0c0\u4e3a\u5931\u8d25\uff0c1\u4e3a\u6210\u529f\nclient.state();  \/\/\u8fd4\u56de\u8fde\u63a5\u72b6\u6001\u7801\nclient.publish(topic, \"connected\");  \/\/\u5411\u4e3b\u9898\u53d1\u5e03\u6d88\u606f\uff0c\u53ef\u4ee5\u4e0d\u7528\u8ba2\u9605\u4e3b\u9898\nclient.subscribe(topic);  \/\/\u8ba2\u9605\u4e3b\u9898\uff0c\u7528\u4e8e\u63a5\u6536\u6d88\u606f\uff0cqos\u9ed8\u8ba4\u4e3a0\nclient.subscribe(topic,qos);  \/\/\u8ba2\u9605\u4e3b\u9898\uff0c\u7528\u4e8e\u63a5\u6536\u6d88\u606f\uff0c\u5e76\u586b\u5199qos\nclient.unsubscribe(topic);  \/\/\u53d6\u6d88\u8ba2\u9605\nclient.loop();  \n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u5934\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;ESP8266WiFi.h&gt;\n#include &lt;PubSubClient.h&gt;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b9a\u4e49\u57fa\u672c\u4fe1\u606f<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>const char* ssid = \"\";  \/\/WiFi\u540d\nconst char* password = \"\";  \/\/WiFi\u5bc6\u7801\nconst char* mqtt_server = \"\";  \/\/MQTT\u670d\u52a1\u5668\u5730\u5740\nconst int mqtt_port = 1883;   \/\/\u670d\u52a1\u5668\u8fde\u63a5\u7aef\u53e3\nconst char* mqtt_name = \"\";  \/\/MQTT\u8fde\u63a5\u7528\u6237\u540d\uff08\u53ef\u9009\uff09\nconst char* mqtt_password = \"\";  \/\/MQTT\u8fde\u63a5\u5bc6\u7801\uff08\u53ef\u9009\uff09\nconst char* topic=\"\";   \/\/\u8ba2\u9605\u3001\u53d1\u5e03\u7684\u4e3b\u9898<\/code><\/pre>\n\n\n\n<p>MQTT\u8fde\u63a5\u7528\u6237\u540d\u548c\u5bc6\u7801\u90fd\u662f\u53ef\u9009\u7684\uff0c\u5177\u4f53\u8981\u6839\u636eMQTT\u670d\u52a1\u5668\u3002\u4e00\u822c\u6765\u8bf4\uff0c\u4f7f\u7528TCP\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u7aef\u53e3\u4e3a1883\uff1b\u4f7f\u7528TLS\/SSL\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u7aef\u53e3\u4e3a8883\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u4f7f\u7528 EMQX\u7684\u516c\u5171\u670d\u52a1\u5668\uff0c\u4f7f\u7528TCP\u8fde\u63a5\uff0c\u670d\u52a1\u5668\u5730\u5740\u4e3a<code>broker.emqx.io<\/code>\uff0c\u7aef\u53e3\u4e3a1883\uff0c\u8fde\u63a5\u7528\u6237\u540d\u4e3a<code>emqx<\/code>\uff0c\u5bc6\u7801\u4e3a<code>public<\/code>\uff0c\u4e5f\u53ef\u4ee5\u4e0d\u586b\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u4f7f\u7528\u79c1\u6709\u670d\u52a1\u5668\uff0c\u4f7f\u7528TLS\/SSL\u8fde\u63a5\uff0c\u670d\u52a1\u5668\u5730\u5740\u6839\u636e\u63a7\u5236\u53f0\u5177\u4f53\u4fe1\u606f\uff0c\u7aef\u53e3\u4e3a8883\uff0c\u7528\u6237\u540d\u548c\u5bc6\u7801\u81ea\u5df1\u5728\u63a7\u5236\u53f0\u91cc\u5b9a\u4e49\u3002<\/p>\n\n\n\n<p>\u5b9a\u4e49<code> espClient <\/code>\u548c<code> client <\/code>\u3002\u5982\u679c\u4f7f\u7528TCP\u8fde\u63a5\uff0c\u5219\u6309\u4ee5\u4e0b\u5b9a\u4e49\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WiFiClient espClient;\nPubSubClient client(espClient);<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">TLS\/SSL\u8fde\u63a5<\/h4>\n\n\n\n<p>\u5982\u679c\u4f7f\u7528TLS\/SSL\u8fde\u63a5\uff0c\u5219\u6309\u4ee5\u4e0b\u8fde\u63a5\uff1a <\/p>\n\n\n\n<p>\u8bbe\u7f6e\u670d\u52a1\u5668\u548c\u8bc1\u4e66\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ WiFi\u548cMQTT\u5ba2\u6237\u7aef\u521d\u59cb\u5316\nBearSSL::WiFiClientSecure espClient;\nPubSubClient mqtt_client(espClient);\n\n\/\/ NTP\u670d\u52a1\u5668\u8bbe\u7f6e\nconst char *ntp_server = \"pool.ntp.org\";     \/\/ \u9ed8\u8ba4NTP\u670d\u52a1\u5668\n\/\/ const char* ntp_server = \"cn.pool.ntp.org\"; \/\/ \u4e3a\u56fd\u5185\u63a8\u8350\u7684NTP\u670d\u52a1\u5668\nconst long gmt_offset_sec = 0;            \/\/ \u4ee5\u79d2\u4e3a\u5355\u4f4d\u7684GMT\u65f6\u5dee\uff08\u6839\u636e\u65f6\u533a\u8fdb\u884c\u8c03\u6574\uff09\nconst int daylight_offset_sec = 0;        \/\/ \u590f\u4ee4\u65f6\u504f\u79fb\u91cf\uff08\u79d2\uff09\n\n\/\/ MQTT\u4ee3\u7406\u7684SSL\u8bc1\u4e66\n\/\/ \u5982\u679c\u4f7f\u7528\u516c\u5171\u670d\u52a1\u5668: broker.emqx.io\n\u7684DigiCert Global Root G2\nstatic const char ca_cert&#91;]\nPROGMEM = R\"EOF(\n-----BEGIN CERTIFICATE-----\nMIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\nMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX\/RrohCgiN9RlUyfuI\n2\/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\n1x7e\/dfgy5SDN67sH0NO3Xss0r0upS\/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\nq2EGnI\/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134\/tJS7SsVQepj5Wz\ntCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\nvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\nBgNVHRMBAf8EBTADAQH\/MA4GA1UdDwEB\/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\n5uNu5g\/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\n1Yl9PMWLSn\/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv\/iPsGEMNKSuIEyExtv4\nNeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth\/Jsw1HKj2ZL7tcu7XUIOGZX1NG\nFdtom\/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\n8rGOmaFvE7FBcf6IKshPECBV1\/MUReXgRPTqh5Uykw7+U0b6LJ3\/iyK5S9kJRaTe\npLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\nMrY=\n-----END CERTIFICATE-----\n)EOF\";\n\n\/\/ \u5982\u679c\u4f7f\u7528EMQX\u7684Serverless\u670d\u52a1\n\/*\nstatic const char ca_cert&#91;] PROGMEM = R\"EOF(\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U\/dDxGkAV53ijSLdhwZAAIEJzs4bg7\/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV\/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C\/dxC\/\/AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr\/y7vrTC0LUq7dBMtoM1O\/4\ngdW7jVg\/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH\/BAUwAwEB\/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY\/Esr\nhMAtudXH\/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp\/2PV5Adg\n06O\/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n)EOF\";\n*\/<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><code>setup<\/code>\u51fd\u6570<\/h4>\n\n\n\n<p>\u5982\u679cTLS\/SSL\u8fde\u63a5\uff0c\u5219\u9700\u8981\u4f7f\u7528 <code>Client.setFingerprint(fingerprint);<\/code>\u8bbe\u7f6e\u6307\u7eb9 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void setup() {\n  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);\n  pinMode(BUILTIN_LED, OUTPUT);   \n  Serial.begin(115200);\n  setup_wifi();  \/\/\u8fde\u63a5WiFi\n\/\/syncTime();  \/\/ \u5982\u679c\u4f7f\u7528TLS\/SSL\u8fde\u63a5\uff0c\u9700\u8981\u6dfb\u52a0\u6b64\u884c\uff0cX.509\u9a8c\u8bc1\u9700\u8981\u540c\u6b65\u65f6\u95f4\n  \n\/\/espClient.setFingerprint(fingerprint);  \n  client.setServer(mqtt_server, mqtt_port);   \/\/\u8bbe\u7f6e\u670d\u52a1\u5668\u5730\u5740\u548c\u7aef\u53e3\n  client.setCallback(callback);    \/\/\u8bbe\u7f6e\u63a5\u6536\u6d88\u606f\u7684\u51fd\u6570\n}\n\n\/*\nvoid syncTime() {\n    configTime(gmt_offset_sec, daylight_offset_sec, ntp_server);\n    Serial.print(\"Waiting for NTP time sync: \");\n    while (time(nullptr) &lt; 8 * 3600 * 2) {\n        delay(1000);\n        Serial.print(\".\");\n    }\n    Serial.println(\"Time synchronized\");\n}\n*\/<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u5efa\u7acbWiFi\u8fde\u63a5<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>void setup_wifi() {\n  digitalWrite(BUILTIN_LED, LOW);\n  delay(10);\n  \/\/ We start by connecting to a WiFi network\n  Serial.println();\n  Serial.print(\"Connecting to \");\n  Serial.println(ssid);\n\n  WiFi.mode(WIFI_STA);\n  WiFi.begin(ssid, password);\n\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(\".\");\n  }\n  randomSeed(micros());\n\n  Serial.println(\"\");\n  Serial.println(\"WiFi connected\");\n  Serial.println(\"IP address: \");\n  Serial.println(WiFi.localIP());\n  digitalWrite(BUILTIN_LED, HIGH);\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"> \u5efa\u7acbMQTT\u8fde\u63a5 <\/h4>\n\n\n\n<p>\u5efa\u7acbMQTT\u8fde\u63a5\u4ee5\u53ca\u65ad\u5f00\u540e\u7684\u91cd\u8fde\uff0c\u8fd9\u91cc\u9700\u8981\u5b9a\u4e49\u8bbe\u5907\u540d\uff0c \u8bbe\u5907\u540d\u53ef\u4ee5\u81ea\u5df1\u5b9a\u4e49\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528XX-\u968f\u673a\u6570\uff0cXX-IP\u5730\u5740\u7b49\uff0c\u4f8b\u5982ESP8266-1898\uff0cESP8266-123.456.7.891<\/p>\n\n\n\n<p>\u5982\u679c\u5b58\u5728\u76f8\u540c\u7684\u8bbe\u5907ID\uff0c\u90a3\u4e48\u6240\u6709\u62e5\u6709\u76f8\u540c\u8bbe\u5907ID\u7684\u8bbe\u5907\u5c06\u4f1a\u4e0d\u65ad\u7684\u65ad\u5f00\u91cd\u8fde\u3002\u6240\u4ee5\u5efa\u8bae\u5728\u8bbe\u5907ID\u540e\u6dfb\u52a0\u4e0aIP\u5730\u5740\u3002<\/p>\n\n\n\n<p>\u524d\u9762\u63d0\u8fc7\uff0c\u8fde\u63a5\u7528\u6237\u540d\u548c\u5bc6\u7801\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u5982\u679c\u4f7f\u7528\u7528\u6237\u540d\u548c\u5bc6\u7801\uff0c\u5219\u4f7f\u7528<code> client.connect(clientId.c_str() , mqtt_name , mqtt_password) <\/code>\u6765\u8fde\u63a5MQTT\u670d\u52a1\u5668\uff0c\u5982\u679c\u4e0d\u4f7f\u7528\u7528\u6237\u540d\u548c\u5bc6\u7801\uff0c\u5219\u4f7f\u7528 <code> client.connect(clientId.c_str()) <\/code> \u6765\u8fde\u63a5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void reconnect() {\n\/\/\u5faa\u73af\u76f4\u5230\u56de\u8fde\u6210\u529f\n\/\/BearSSL::X509List serverTrustedCA(ca_cert);\n   \/\/\u5982\u679c\u4f7f\u7528TLS\/SSL\u8fde\u63a5\uff0c\u9700\u8981\u6dfb\u52a0\u8fd9\u4e24\u53e5\n\/\/espClient.setTrustAnchors(&amp;serverTrustedCA);\n  while (!client.connected()) \n  {\n    Serial.print(\"Attempting MQTT connection...\");\n    String clientId = \"ESP8266-\";  \/\/\u8bbe\u5907\u540d\n\/\/  clientId += String(random(0xffff), HEX);     \u4f7f\u7528XX-\u968f\u673a\u6570\n    clientId += WiFi.localIP().toString().c_str();  \/\/XX-IP\u5730\u5740\n\/\/  \u5c1d\u8bd5\u8fde\u63a5\n    if (client.connect(clientId.c_str() , mqtt_name , mqtt_password))     \/\/<span style=\"background-color: inherit; font-size: inherit;\">client.connect(clientId.c_str())<\/span>    \n    {  \n      Serial.println(\"connected\");  \/\/\u8fde\u63a5\u6210\u529f\n      client.publish(topic, \"connected\");  \/\/\u8fde\u63a5\u6210\u529f\u540e\uff0c\u5411\u4e3b\u9898\u53d1\u5e03\u6d88\u606f\uff0c\u4e5f\u53ef\u4ee5\u4e0d\u53d1\u5e03\n      client.subscribe(topic);  \/\/\u8ba2\u9605\u4e3b\u9898\n    } \n    else \n    {\n      char err_buf&#91;128];\n      espClient.getLastSSLError(err_buf, sizeof(err_buf));\n      Serial.print(\"failed, rc=\");  \/\/\u8fde\u63a5\u5931\u8d25\uff0c\u5e76\u6253\u5370\u72b6\u6001\u7801\n      Serial.print(client.state());\n      Serial.print(\"  SSL error: \");\n      Serial.println(err_buf);\n      Serial.println(\" try again in 5 seconds\");  \n      delay(5000);  \/\/5\u79d2\u540e\u518d\u6b21\u5c1d\u8bd5\u8fde\u63a5\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p> &nbsp;<code>PubSubClient<\/code>&nbsp;\u5e93\u4e2d &nbsp;<code>PubSubClient.h<\/code> \u5bf9\u4e8e\u72b6\u6001\u7801\u7684\u5b9a\u4e49 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Possible values for client.state()\n#define MQTT_CONNECTION_TIMEOUT     -4\n#define MQTT_CONNECTION_LOST        -3\n#define MQTT_CONNECT_FAILED         -2\n#define MQTT_DISCONNECTED           -1\n#define MQTT_CONNECTED               0\n#define MQTT_CONNECT_BAD_PROTOCOL    1\n#define MQTT_CONNECT_BAD_CLIENT_ID   2\n#define MQTT_CONNECT_UNAVAILABLE     3\n#define MQTT_CONNECT_BAD_CREDENTIALS 4\n#define MQTT_CONNECT_UNAUTHORIZED    5<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u63a5\u6536\u8ba2\u9605\u7684\u6d88\u606f<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>void callback(char* topic, byte* payload, unsigned int length)  \/\/\u4e3b\u9898\uff0c\u6d88\u606f\uff0c\u6d88\u606f\u957f\u5ea6\n{\n  Serial.print(\"Message arrived &#91;\");\n  Serial.print(topic);  \/\/\u6253\u5370\u4e3b\u9898\n  Serial.print(\"] \");\n  \n  char msg&#91;length];\n  for (int i = 0; i &lt; length; i++) \n    msg&#91;i]=(char)payload&#91;i];  \/\/\u5c06\u6d88\u606f\u8f6c\u5b58\u5230msg\u4e2d\n  snprintf (msg, length+1, msg);\n  Serial.println(msg);  \/\/\u6253\u5370\u6d88\u606f\n \n  if (!strcmp(msg, \"on\")) digitalWrite(BUILTIN_LED, LOW);   \/\/\u5982\u679c\u63a5\u6536\u5230on\uff0c\u5219\u5c06esp8266\u677f\u8f7d\u7684led\u70b9\u4eae\uff0c\u6ce8\u610f\uff0c\u5c06BUILTIN_LED\u7f6e\u4e3a\u4f4e\u65f6\uff0cLED\u4f1a\u88ab\u70b9\u4eae\n  if (!strcmp(msg, \"off\")) digitalWrite(BUILTIN_LED, HIGH);  \/\/\u5982\u679c\u63a5\u6536\u5230on\uff0c\u5219\u5c06led\u7184\u706d\uff0c\u6ce8\u610f\uff0c\u5c06BUILTIN_LED\u7f6e\u4e3a\u9ad8\u65f6\uff0cLED\u4f1a\u88ab\u7184\u706d\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">loop\u51fd\u6570<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>void loop() \n{\n  if (!client.connected()) \n \/\/\u5982\u679c\u65ad\u8fde\uff0c\u5219\u8fdb\u884c\u91cd\u8fde\n  {\n    reconnect();\n  }\n  client.loop();\n \n\n  unsigned long now = millis();\n  if (now - lastMsg &gt; 2000) {\n    lastMsg = now;\n    ++value;\n    snprintf (msg, MSG_BUFFER_SIZE, \"hello world #%ld\", value);\n    Serial.print(\"Publish message: \");\n    Serial.println(msg);\n    client.publish(topic, msg);\n       \/\/\u6bcf2\u79d2\u53d1\u9001\u4e00\u6b21\u6d88\u606f\n  }\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;ESP8266WiFi.h>\n#include &lt;PubSubClient.h>\n\nconst char* ssid = \"\";  \/\/WiFi\u540d\nconst char* password = \"\";  \/\/WiFi\u5bc6\u7801\nconst char* mqtt_server = \"broker.emqx.io\";  \/\/MQTT\u670d\u52a1\u5668\u5730\u5740\nconst int mqtt_port = 1883;   \/\/\u670d\u52a1\u5668\u8fde\u63a5\u7aef\u53e3\nconst char* mqtt_name = \"emqx\";  \/\/MQTT\u8fde\u63a5\u7528\u6237\u540d\uff08\u53ef\u9009\uff09\nconst char* mqtt_password = \"public\";  \/\/MQTT\u8fde\u63a5\u5bc6\u7801\uff08\u53ef\u9009\uff09\nconst char* topic=\"testtopic\";   \/\/\u8ba2\u9605\u3001\u53d1\u5e03\u7684\u4e3b\u9898\n\n\/*\n\/\/ NTP\u670d\u52a1\u5668\u8bbe\u7f6e\nconst char *ntp_server = \"pool.ntp.org\";     \/\/ \u9ed8\u8ba4NTP\u670d\u52a1\u5668\n\/\/ const char* ntp_server = \"cn.pool.ntp.org\"; \/\/ \u4e3a\u56fd\u5185\u63a8\u8350\u7684NTP\u670d\u52a1\u5668\nconst long gmt_offset_sec = 0;            \/\/ \u4ee5\u79d2\u4e3a\u5355\u4f4d\u7684GMT\u65f6\u5dee\uff08\u6839\u636e\u65f6\u533a\u8fdb\u884c\u8c03\u6574\uff09\nconst int daylight_offset_sec = 0;        \/\/ \u590f\u4ee4\u65f6\u504f\u79fb\u91cf\uff08\u79d2\uff09\n\n\/\/ WiFi\u548cMQTT\u5ba2\u6237\u7aef\u521d\u59cb\u5316\nWiFiClientSecure espClient;\nPubSubClient client(espClient);\n\n\n\/\/ MQTT\u4ee3\u7406\u7684SSL\u8bc1\u4e66\n\/\/ \u5982\u679c\u4f7f\u7528\u516c\u5171\u670d\u52a1\u5668: broker.emqx.io\u7684DigiCert Global Root G2\nstatic const char ca_cert&#91;]\nPROGMEM = R\"EOF(\n-----BEGIN CERTIFICATE-----\nMIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\nMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX\/RrohCgiN9RlUyfuI\n2\/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\n1x7e\/dfgy5SDN67sH0NO3Xss0r0upS\/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\nq2EGnI\/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134\/tJS7SsVQepj5Wz\ntCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\nvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\nBgNVHRMBAf8EBTADAQH\/MA4GA1UdDwEB\/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\n5uNu5g\/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\n1Yl9PMWLSn\/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv\/iPsGEMNKSuIEyExtv4\nNeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth\/Jsw1HKj2ZL7tcu7XUIOGZX1NG\nFdtom\/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\n8rGOmaFvE7FBcf6IKshPECBV1\/MUReXgRPTqh5Uykw7+U0b6LJ3\/iyK5S9kJRaTe\npLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\nMrY=\n-----END CERTIFICATE-----\n)EOF\";*\/\n\n\/\/ \u5982\u679c\u4f7f\u7528EMQX\u7684Serverless\u670d\u52a1\n\/*\nstatic const char ca_cert&#91;] PROGMEM = R\"EOF(\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U\/dDxGkAV53ijSLdhwZAAIEJzs4bg7\/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV\/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C\/dxC\/\/AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr\/y7vrTC0LUq7dBMtoM1O\/4\ngdW7jVg\/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH\/BAUwAwEB\/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY\/Esr\nhMAtudXH\/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp\/2PV5Adg\n06O\/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n)EOF\";\n*\/\n\nWiFiClient espClient;   \/\/\u5982\u679c\u4f7f\u7528TLS\/SSL\u8fde\u63a5\uff0c\u9700\u8981\u6ce8\u91ca\u6389\u8fd9\u4e24\u884c\nPubSubClient client(espClient);\n\nunsigned long lastMsg = 0;\n#define MSG_BUFFER_SIZE  (50)\nchar msg&#91;MSG_BUFFER_SIZE];\nint value = 0;\n\nvoid setup() {\n  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);\n  pinMode(BUILTIN_LED, OUTPUT);   \n  Serial.begin(115200);\n  setup_wifi();  \/\/\u8fde\u63a5WiFi\n\/\/syncTime();  \/\/ \u5982\u679c\u4f7f\u7528TLS\/SSL\u8fde\u63a5\uff0c\u9700\u8981\u6dfb\u52a0\u6b64\u884c\uff0cX.509\u9a8c\u8bc1\u9700\u8981\u540c\u6b65\u65f6\u95f4\n  \n  client.setServer(mqtt_server, mqtt_port);   \/\/\u8bbe\u7f6e\u670d\u52a1\u5668\u5730\u5740\u548c\u7aef\u53e3\n  client.setCallback(callback);    \/\/\u8bbe\u7f6e\u63a5\u6536\u6d88\u606f\u7684\u51fd\u6570\n}\n\n\/*\nvoid syncTime() {\n    configTime(gmt_offset_sec, daylight_offset_sec, ntp_server);\n    Serial.print(\"Waiting for NTP time sync: \");\n    while (time(nullptr) &lt; 8 * 3600 * 2) {\n        delay(1000);\n        Serial.print(\".\");\n    }\n    Serial.println(\"Time synchronized\");\n}\n*\/\n\nvoid setup_wifi() {\n  digitalWrite(BUILTIN_LED, LOW);\n  delay(10);\n  \/\/ We start by connecting to a WiFi network\n  Serial.println();\n  Serial.print(\"Connecting to \");\n  Serial.println(ssid);\n\n  WiFi.mode(WIFI_STA);\n  WiFi.begin(ssid, password);\n\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(\".\");\n  }\n  randomSeed(micros());\n\n  Serial.println(\"\");\n  Serial.println(\"WiFi connected\");\n  Serial.println(\"IP address: \");\n  Serial.println(WiFi.localIP());\n  digitalWrite(BUILTIN_LED, HIGH);\n}\n\nvoid reconnect() {\n\/\/\u5faa\u73af\u76f4\u5230\u56de\u8fde\u6210\u529f\n\/\/BearSSL::X509List serverTrustedCA(ca_cert);   \/\/\u5982\u679c\u4f7f\u7528TLS\/SSL\u8fde\u63a5\uff0c\u9700\u8981\u6dfb\u52a0\u8fd9\u4e24\u53e5\n\/\/espClient.setTrustAnchors(&amp;serverTrustedCA);\n  while (!client.connected()) \n  {\n    Serial.print(\"Attempting MQTT connection...\");\n    String clientId = \"ESP8266-\";  \/\/\u8bbe\u5907\u540d\n\/\/  clientId += String(random(0xffff), HEX);     \u4f7f\u7528XX-\u968f\u673a\u6570\n    clientId += WiFi.localIP().toString().c_str();  \/\/XX-IP\u5730\u5740\n\/\/  \u5c1d\u8bd5\u8fde\u63a5\n    if (client.connect(clientId.c_str() , mqtt_name , mqtt_password))     \/\/client.connect(clientId.c_str())    \n    {  \n      Serial.println(\"connected\");  \/\/\u8fde\u63a5\u6210\u529f\n      client.publish(topic, \"connected\");  \/\/\u8fde\u63a5\u6210\u529f\u540e\uff0c\u5411\u4e3b\u9898\u53d1\u5e03\u6d88\u606f\uff0c\u4e5f\u53ef\u4ee5\u4e0d\u53d1\u5e03\n      client.subscribe(topic);  \/\/\u8ba2\u9605\u4e3b\u9898\n    } \n    else \n    {\n      char err_buf&#91;128];\n      espClient.getLastSSLError(err_buf, sizeof(err_buf));\n      Serial.print(\"failed, rc=\");  \/\/\u8fde\u63a5\u5931\u8d25\uff0c\u5e76\u6253\u5370\u72b6\u6001\u7801\n      Serial.print(client.state());\n      Serial.print(\"  SSL error: \");\n      Serial.println(err_buf);\n      Serial.println(\" try again in 5 seconds\");  \n      delay(5000);  \/\/5\u79d2\u540e\u518d\u6b21\u5c1d\u8bd5\u8fde\u63a5\n    }\n  }\n}\n\nvoid callback(char* topic, byte* payload, unsigned int length)  \/\/\u4e3b\u9898\uff0c\u6d88\u606f\uff0c\u6d88\u606f\u957f\u5ea6\n{\n  Serial.print(\"Message arrived &#91;\");\n  Serial.print(topic);  \/\/\u6253\u5370\u4e3b\u9898\n  Serial.print(\"] \");\n  \n  char msg&#91;length];\n  for (int i = 0; i &lt; length; i++) \n    msg&#91;i]=(char)payload&#91;i];  \/\/\u5c06\u6d88\u606f\u8f6c\u5b58\u5230msg\u4e2d\n  snprintf (msg, length+1, msg);\n  Serial.println(msg);  \/\/\u6253\u5370\u6d88\u606f\n \n  if (!strcmp(msg, \"on\")) digitalWrite(BUILTIN_LED, LOW);   \/\/\u5982\u679c\u63a5\u6536\u5230on\uff0c\u5219\u5c06esp8266\u677f\u8f7d\u7684led\u70b9\u4eae\uff0c\u6ce8\u610f\uff0c\u5c06BUILTIN_LED\u7f6e\u4e3a\u4f4e\u65f6\uff0cLED\u4f1a\u88ab\u70b9\u4eae\n  if (!strcmp(msg, \"off\")) digitalWrite(BUILTIN_LED, HIGH);  \/\/\u5982\u679c\u63a5\u6536\u5230on\uff0c\u5219\u5c06led\u7184\u706d\uff0c\u6ce8\u610f\uff0c\u5c06BUILTIN_LED\u7f6e\u4e3a\u9ad8\u65f6\uff0cLED\u4f1a\u88ab\u7184\u706d\n}\n\nvoid loop() \n{\n  if (!client.connected())  \/\/\u5982\u679c\u65ad\u8fde\uff0c\u5219\u8fdb\u884c\u91cd\u8fde\n  {\n    reconnect();\n  }\n  client.loop();\n \n  unsigned long now = millis();\n  if (now - lastMsg > 2000) {\n    lastMsg = now;\n    ++value;\n    snprintf (msg, MSG_BUFFER_SIZE, \"hello world #%ld\", value);\n    Serial.print(\"Publish message: \");\n    Serial.println(msg);\n    client.publish(topic, msg);  \/\/\u6bcf2\u79d2\u53d1\u9001\u4e00\u6b21\u6d88\u606f\n  }\n}\n\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u4ecb \u672c\u6587\u4e3b\u8981\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528 ESP8266 \u8fde\u63a5MQTT\u670d\u52a1\u5668\uff0c\u5229\u7528&nbsp;PubSubClient&nbsp;\u5e93\uff0c\u5b9e\u73b0\u5ba2\u6237\u7aef &#8230;<\/p>","protected":false},"author":1,"featured_media":374,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38,3],"tags":[27,26,25,12,22],"class_list":["post-312","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-38","category-3","tag-esp8266","tag-26","tag-25","tag-12","tag-22"],"_links":{"self":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/comments?post=312"}],"version-history":[{"count":1,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/312\/revisions"}],"predecessor-version":[{"id":1771,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/312\/revisions\/1771"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/media\/374"}],"wp:attachment":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/media?parent=312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/categories?post=312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/tags?post=312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}