主要内容

使用安全MQTT发布和订阅ThingSpeak频道

这个例子展示了如何使用ESP8266板通过安全MQTT在ThingSpeak™中记录RSSI数据。您可以按照注释中的指示修改代码,使其适用于其他板或不安全的MQTT。

设置

1)创建一个ThingSpeak频道,如图所示在新通道中收集数据

2)单击,创建MQTT设备设备>MQTT然后在ThingSpeak页面的顶部添加设备.在设置设备并将新通道添加到其授权列表时,单击下载证书>纯文本.有关详细信息,请参见创建ThingSpeak MQTT设备.使用下面Code部分中保存的凭据。

3)增加ESP8266单板包:

下一个。文件>首选项,输入https://arduino.esp8266.com/stable/package_esp8266com_index.json额外的Board Manager url

b。选择工具>董事会>董事会的经理.输入ESP8266在搜索栏中并安装软件包。

4)下载库WiFi.hWiFiClientSecure.h到你的Arduino IDE

代码

1)定义无线网络,ThingSpeak MQTT凭据连接您的板,连接安全,并包括适当的库。为您的特定凭据和设置编辑此代码。

//确保正确的凭证连接到您的WiFi网络。char ssid[] = "ENTER_YOUR_WIFI_SSID";char pass[] = "ENTER_YOUR_WIFI_PASSWORD";//确保这里的凭据允许您发布和订阅ThingSpeak频道。#define channelID ENTER_YOUR_THINGSPEAK_CHANNEL_NUMBER const char mqttUserName[] = "ENTER_YOUR_MQTT_USERNAME";const char clientID[] = "ENTER_YOUR_MQTT_CLIENT_ID";const char mqttPass[] = "ENTER_YOUR_MQTT_PASSWORD";//强烈建议使用安全连接。但是,某些硬件不能与WiFiClientSecure库一起工作。//注释掉下面的#define使用非安全的MQTT连接到ThingSpeak服务器。 #define USESECUREMQTT // Comment the following line if not using an ESP8266. #define ESP8266BOARD #include  #ifdef ESP8266BOARD #include  const char* PROGMEM thingspeak_cert_thumbprint = "271892dda426c30709b97ae6c521b95b48f716e1"; #else #include  const char * PROGMEM thingspeak_ca_cert = \ "-----BEGIN CERTIFICATE-----\n" \ "MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\n" \ "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" \ "d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\n" \ "ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\n" \ "MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\n" \ "LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\n" \ "RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\n" \ "+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\n" \ "PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\n" \ "xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\n" \ "Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\n" \ "hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\n" \ "EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\n" \ "MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\n" \ "FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\n" \ "nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\n" \ "eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\n" \ "hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\n" \ "Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\n" \ "vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\n" \ "+OkuE6N36B9K\n" \ "-----END CERTIFICATE-----\n"; #endif #ifdef USESECUREMQTT #include  #define mqttPort 8883 WiFiClientSecure client; #else #define mqttPort 1883 WiFiClient client; #endif

2)定义连接参数并初始化aPubSubClient实例。

Const char* server = "mqtt3.thingspeak.com";int status = WL_IDLE_STATUS;long lastPublishMillis = 0;int connectionDelay = 1;int updateInterval = 15;mqttClient(客户端);

3)处理传入的订阅消息,订阅以接收更新,并发布消息。

//处理来自MQTT订阅的消息。void mqttSubscriptionCallback(char* topic, byte* payload, unsigned int length){//打印接收到的消息的详细信息给串行监视器。系列。打印(“消息到达[");并同时(主题);系列。打印(“]”);For (int I = 0;我<长度;我+ +){并((char)负载[我]); } Serial.println(); } // Subscribe to ThingSpeak channel for updates. void mqttSubscribe( long subChannelID ){ String myTopic = "channels/"+String( subChannelID )+"/subscribe"; mqttClient.subscribe(myTopic.c_str()); } // Publish messages to a ThingSpeak channel. void mqttPublish(long pubChannelID, String message) { String topicString ="channels/" + String( pubChannelID ) + "/publish"; mqttClient.publish( topicString.c_str(), message.c_str() ); }

4)连接WiFi和MQTT服务器。

//连接WiFi。void connectWifi(){串行。打印(“连接Wi-Fi…”);//循环直到WiFi连接成功#ifdef ESP8266BOARD while (WiFi. waitforconnectresult () != WL_CONNECTED) {#else while (WiFi.status() != WL_CONNECTED) {#endif WiFi.status();Begin (ssid, pass);延迟(connectionDelay * 1000);系列。打印(WiFi.status ());}系列。println(“连接Wi-Fi”)。;} //连接MQTT服务器。 void mqttConnect() { // Loop until connected. while ( !mqttClient.connected() ) { // Connect to the MQTT broker. if ( mqttClient.connect( clientID, mqttUserName, mqttPass ) ) { Serial.print( "MQTT to " ); Serial.print( server ); Serial.print (" at port "); Serial.print( mqttPort ); Serial.println( " successful." ); } else { Serial.print( "MQTT connection failed, rc = " ); // See https://pubsubclient.knolleary.net/api.html#state for the failure code explanation. Serial.print( mqttClient.state() ); Serial.println( " Will try again in a few seconds" ); delay( connectionDelay*1000 ); } } }

初始化串行数据传输,并设置MQTT代理的详细信息设置方法。

void setup() {Serial。开始(115200);//延迟允许串行监视器出现。延迟(3000);//连接Wi-Fi网络connectWifi ();//配置MQTT客户端setServer(server, mqttPort);//设置MQTT消息处理函数。mqttClient。setCallback (mqttSubscriptionCallback);//设置缓冲区来处理返回的JSON。 NOTE: A buffer overflow of the message buffer will result in your callback not being invoked. mqttClient.setBufferSize( 2048 ); // Use secure MQTT connections if defined. #ifdef USESECUREMQTT // Handle functionality differences of WiFiClientSecure library for different boards. #ifdef ESP8266BOARD client.setFingerprint(thingspeak_cert_thumbprint); #else client.setCACert(thingspeak_ca_cert); #endif #endif }

中维护MQTT连接,并定期将数据发布到通道循环方法。

void loop(){//重新连接WiFi如果它被断开。if (WiFi.status() != WL_CONNECTED) {connectWifi();} //如果MQTT客户端未连接,则连接并重新订阅通道更新。if (!mqttClient.connected()) {mqttConnect();mqttSubscribe (channelID);} //调用循环来维持与服务器的连接。mqttClient.loop ();//定期更新ThingSpeak频道。更新结果是发送给订阅者的消息。if (abs(millis() - lastPublishMillis) > updateInterval*1000) {mqttPublish(channelID, (String("field1=")+String(WiFi.RSSI()))); lastPublishMillis = millis(); } }

另请参阅

|

相关的例子

更多关于