Openssl 客户端上的套接字错误<;未知>;,断开

Openssl 客户端上的套接字错误<;未知>;,断开,openssl,mqtt,tls1.2,esp32,Openssl,Mqtt,Tls1.2,Esp32,我正在尝试使用pubsubclient&Wificlientsecure从ESP32到Raspberry Pi上的MQTT代理建立安全连接(tls&open ssl证书),但我收到一个套接字错误,如下所示: MQTT控制台: 1582138400: New connection from 192.168.4.9 on port 8883. 1582138405: Socket error on client <unknown>, disconnecting. 1582138413:

我正在尝试使用pubsubclient&Wificlientsecure从ESP32到Raspberry Pi上的MQTT代理建立安全连接(tls&open ssl证书),但我收到一个套接字错误,如下所示:

MQTT控制台:

1582138400: New connection from 192.168.4.9 on port 8883.
1582138405: Socket error on client <unknown>, disconnecting.
1582138413: New connection from 192.168.4.9 on port 8883.
1582138405: Socket error on client <unknown>, disconnecting.
Arduino代码:

#include <PubSubClient.h>
#include <SPIFFS.h>
#include <WiFiClientSecure.h>
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_BMP085.h>
#define DHTPIN 4 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 11
#define wifi_ssid "MGK-RP-1" //wifi ssid
#define wifi_password "naht" //wifi password
const char* ca_cert =
"-----BEGIN CERTIFICATE-----\n"
"MIIEAjCCAuqgAwIBAgIJAM0HTvv4E6FaMA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD\n"
"VQQGEwJpbjESMBAGA1UECAwJdGFtaWxuYWR1MRMwEQYDVQQHDApjb2ltYmF0b3Jl\n"
"MQwwCgYDVQQKDANtZ2sxETAPBgNVBAsMCGJ1aWxkaW90MRQwEgYDVQQDDAsxOTIu\n"
"MTY4LjQuMTEmMCQGCSqGSIb3DQEJARYXcmFta3VtYXIubWdrMUBnbWFpbC5jb20w\n"
"HhcNMjAwMjI4MDY1NTIxWhcNMjUwMjI3MDY1NTIxWjCBlTELMAkGA1UEBhMCaW4x\n"
"EjAQBgNVBAgMCXRhbWlsbmFkdTETMBEGA1UEBwwKY29pbWJhdG9yZTEMMAoGA1UE\n"
"JjAkBgkqhkiG9w0BCQEWF3JhbWt1bWFyLm1nazFAZ21haWwuY29tMIIBIjANBgkq\n"
"hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtmbO3kNK6lmYAGhAt8n8yziPNYZ1wLhs\n"
"3W/VkIm5A2veyHz8PivnknVdATx9/fRJ1cy1LKD/Wo5cwaH8dyKiVq/iRYZ4zAxq\n"
"s8va5xUkWlXoiGcB87wCviAGsdNXLa54/qPPa04T5vlaBr+Ht5gsQvB1OeRyTo8U\n"
"mD7VSw9eCBMlBpTZprlHReXLcnBOvNQ/9n0vN/KmdJXXu2ZNGj8P/itbFlRpKBAP\n"
"2AxUJAiNHAB7No7WZ4mMLPxp6iJbDb6KUVH0vwMgVHq4tkWNEcMcnUPRemkiA321\n"
"1oJRxBQY26xd7AXbTass9UqIRF1R1kb29pZqkwarfVAgqalegd8W6wIDAQABo1Mw\n"
"UTAdBgNVHQ4EFgQUHZBuhBeUW9UhnQQ5AWdmQffukPowHwYDVR0jBBgwFoAUHZBu\n"
"hBeUW9UhnQQ5AWdmQffukPowDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsF\n"
"AAOCAQEAC6buT/r7oJiLhgWnU5QrSPFbuX6vViN6//wk1Jz3SZLP/qgfv1UgHXmX\n"
"hGHtse45S9V3ke7isI6IQ2QQpLaCg2NpQoEqXy2E3zUForElRuB2NWy6OT2+fglL\n"
"wWJ2f7STaGJcTUAxwB4R5pfNycTR+jg3l3pNuosnq85E0zSUnvMPPNilM7JooWQ5\n"
"bFixSJUx7rknyRjvD+5X7umyB+rWhv/VdogcKvln3dL70yS3ujWatTVYkUKirdL/\n"
"8MiM2wxi5pSV9PRmiJxbCVRryKMJ05ZELndmjRLtU/0kwKthENkV0pL1n81UqeIu\n"
"PtkIMHm89cGiKmM+pZpCDVcqAN8bWg==\n"
"-----END CERTIFICATE-----\n";
#define mqtt_server "192.168.4.1" // server name or IP
#define temperature_topic "temphum" //Topic temperature
#define atmos_pre_topic "atmos_pre"
#define light_lux_topic "light_lux"
//#define humidity_topic "humid1" //Topic humidity
#define debug_topic "debug"
bool debug = true;

DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
int sensorPin = 36; //
float rawRange = 4096;
float logRange = 5.0;
/* create an instance of WiFiClientSecure */
WiFiClientSecure espClient;
PubSubClient client(espClient);

void setup() {
    Serial.begin(9600);
    Serial.println(ca_cert);
    setup_wifi(); //Connect to Wifi network
    espClient.setCACert(ca_cert);
    client.setServer(mqtt_server, 8883); // Configure MQTT connection, change port if needed.
    if (!client.connected()) {
        reconnect();
    }
    if (!bmp.begin()) {
       Serial.println("Could not find a valid BMP085/BMP180 sensor, check wiring!");
       while (1) {}
    }
    dht.begin();
}
void loop() {
    delay(2000);
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    float f = dht.readTemperature(true);
    String tempe = String(t).c_str();
    String hum = String(h).c_str();
    if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println(F("Failed to read from DHT sensor!"));
        return;
    }
    float hif = dht.computeHeatIndex(f, h);
    float hic = dht.computeHeatIndex(t, h, false);
    String heat = String(hic).c_str();
    String temphum = tempe+","+hum+","+heat;
    float P = bmp.readPressure();
    float temp = bmp.readTemperature();
    String pre = String(P).c_str();
    String atmos_pre = pre+","+String(temp).c_str();
    int rawValue = analogRead(sensorPin);
    String light_lux = String(RawToLux(rawValue)).c_str();
    Serial.println();
    delay(500);
    if ( debug ) {
        Serial.print("Temperature : ");
        Serial.print(t);
        Serial.print(" | Humidity : ");
        Serial.println(h);
    }
    // Publish values to MQTT topics
    client.publish(temperature_topic, String(temphum).c_str(), false);
    client.publish(atmos_pre_topic, String(atmos_pre).c_str(), false);
    client.publish(light_lux_topic, String(light_lux).c_str(), false);
    if ( debug ) {
       Serial.println("data sent to MQTT.");
    }
}

float RawToLux(int raw)
{
    float logLux = raw * logRange / rawRange;
    Serial.print("loglux");
    Serial.print(logLux);
    return pow(10, logLux);
}

//Setup connection to wifi
void setup_wifi() {
    delay(20);
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(wifi_ssid);
    //WiFi.mode(WIFI_STA);
    WiFi.begin(wifi_ssid, wifi_password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(100);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi is OK ");
    Serial.print("=> ESP32 new IP address is: ");
    Serial.print(WiFi.localIP());
    Serial.println("");
}

//Reconnect to wifi if connection is lost
void reconnect() {
    while (!client.connected()) {
        Serial.print("Connecting to MQTT broker ...");
        if (client.connect("ESP32Client",0,2,0,0)) {
            Serial.println("OK");
        } else {
            Serial.print("[Error] Not connected: ");
            Serial.println(client.state());
            Serial.println("Wait 5 seconds before retry.");
            delay(5000);
        }
    }
}
#包括
#包括
#包括
#包括“DHT.h”
#包括
#包括
#定义连接到DHT传感器的DHTPIN 4//数字引脚
#定义DHT类型DHT11//DHT 11
#定义wifi_ssid“MGK-RP-1”//wifi ssid
#定义wifi_密码“naht”//wifi密码
常量字符*证书=
“----开始证书------\n”
“MIIEAjCCAuqgAwIBAgIJAM0HTvv4E6FaMA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD\n”
“vqgewjpbjesbaga1uecawjdgftawxuywr1meweqydvqqhdapjb2ltymf0b3jl\n”
“MQWWCGYDVQKDANTZ2SXETAPBGNVBASMCGJ1AWXKAW90MRQWEGYDVQDDAXOTIU\n”
“MTY4LJQUMTEMMCQGCSQGSIB3DQEJARYXCMFTA3VTYXIUBWDRMUBNFBC5JB20W\n”
“HHCNMJAWMJI4MDY1NTIXWHCNMJUWMJI3MDY1NTIXWJCBLTELMAKGA1EBHMCAW4X\n”
“EJAQBGNVBAGMCxRHBWLSBFKDETMBEGA1UEBWWKY29PBWJHDG9YZTEMMAOGA1UE\n”
“JjAkBgkqhkiG9w0BCQEWF3JhbWt1bWFyLm1nazFAZ21haWwuY29tMIIBIjANBgkq\n”
“HKIG9W0BAQEFAOCAQ8AMIIBCGCKCAQEATTOBO3NK6LMYAGHAT8N8YZIPNYZ1WLHS\n”
“3W/VkIm5A2veyHz8PivnknVdATx9/fRJ1cy1LKD/Wo5cwaH8dyKiVq/iRYZ4zAxq\n”
“s8va5xUkWlXoiGcB87wCviAGsdNXLa54/qPPa04T5vlaBr+HT5GSQVB1ORYTO8U\n”
“mD7VSw9eCBMlBpTZprlHReXLcnBOvNQ/9n0vN/KmdJXXu2ZNGj8P/itbFlRpKBAP\n”
“2AXUJAINHAB7NO7WZ4MMLP6IJBB6KUVH0VWMGVHQ4TKWNECMNUPREMKIA321\n”
“1JRXBQY26XD7AXBTASS9UQIRF1R1KB29PZQKWARFVAGQALEGD8W6WIDAQABO1MW\n”
“Utadbgnvhq4efgquhzbuhbeuw9uhnqq5awdmqffukpowydvr0jbbgwfauhzbu\n”
“HBEUW9UHNQ5AWDMQFFUKPOWDWYDVR0TACH/BAUwAwEB/zANBgkqhkiG9w0BAQsF\n”
“AAOCAQEAC6buT/r7ojillhgwnu5qrspfbux6vvin6//wk1Jz3SZLP/qgfv1UgHXmX\n”
“HGHTSE45S9V3KE7ISI6IQ2QQPLACG2NPCOEQXY2E3ZUFORELRUB2NWY6OT2+fglL\n”
“wWJ2f7STaGJcTUAxwB4R5pfNycTR+JG3L3PNUOSNQ85E0ZSUNVMPNILLM7JOOWQ5\n”
“BFIXJUX7RKNYRJVD+5X7umyB+rWhv/VDOGCKVLN3DL70YS3UJWATTVYKUIRDL/\n”
“8MIM2WXI5PSV9PRMIJXBCVRYKMJ05ZELNDMJRLTU/0KWKTENKV0PL1N81UQEIU\n”
“PtkIMHm89cGiKmM+pZpCDVcqAN8bWg==\n”
“----结束证书------\n”;
#定义mqtt_服务器“192.168.4.1”//服务器名称或IP
#定义温度主题“temphum”//topic温度
#定义atmos_pre_主题“atmos_pre”
#定义灯光亮度主题“灯光亮度”
//#定义湿度\主题“湿度1”//主题湿度
#定义调试主题“调试”
bool debug=true;
DHT-DHT(DHTPIN,DHTTYPE);
Adafruit_BMP085 bmp;
int-sensorPin=36//
浮动范围=4096;
浮动对数范围=5.0;
/*创建WiFiClientSecure的实例*/
WiFiClientSecure espClient;
PubSubClient客户(espClient);
无效设置(){
Serial.begin(9600);
序列号。打印号(证书);
setup_wifi();//连接到wifi网络
espClient.setCACert(证书);
client.setServer(mqtt_server,8883);//配置mqtt连接,根据需要更改端口。
如果(!client.connected()){
重新连接();
}
如果(!bmp.begin()){
Serial.println(“找不到有效的BMP085/BMP180传感器,请检查接线!”);
而(1){}
}
dht.begin();
}
void循环(){
延迟(2000年);
浮动h=dht.read湿度();
浮点数t=dht.readTemperature();
浮子f=dht读数温度(真);
String tempe=String(t).c_str();
字符串hum=String(h).c_str();
if(isnan(h)| | isnan(t)| | isnan(f)){
Serial.println(F(“从DHT传感器读取失败!”);
返回;
}
float hif=dht.计算热指数(f,h);
浮点hic=dht.计算热指数(t,h,假);
字符串热=字符串(hic).c_str();
字符串temphum=tempe+”,“+hum+”,“+heat;
float P=bmp.readPressure();
float temp=bmp.readTemperature();
String pre=String(P).c_str();
字符串atmos_pre=pre+“,”+字符串(temp).c_str();
int rawValue=模拟读数(传感器引脚);
String light_lux=String(RawToLux(rawValue)).c_str();
Serial.println();
延迟(500);
如果(调试){
连续打印(“温度:”);
连续打印(t);
连续打印(“|湿度:”);
序列号println(h);
}
//将值发布到MQTT主题
publish(温度主题,字符串(temphum.c_str(),false);
publish(atmos_pre_主题,字符串(atmos_pre).c_str(),false);
publish(light_lux_主题,字符串(light_lux).c_str(),false);
如果(调试){
Serial.println(“发送到MQTT的数据”);
}
}
浮点RawToLux(整数原始)
{
浮动对数勒克斯=原始*对数范围/原始范围;
连续打印(“loglux”);
串行打印(logLux);
返回功率(10,logLux);
}
//设置与wifi的连接
无效设置\u wifi(){
延迟(20);
Serial.println();
串行打印(“连接到”);
Serial.println(wifi_ssid);
//WiFi.模式(WiFi_STA);
WiFi.begin(WiFi\u ssid、WiFi\u密码);
while(WiFi.status()!=WL_已连接){
延迟(100);
连续打印(“.”);
}
Serial.println(“”);
Serial.println(“WiFi正常”);
Serial.print(“=>ESP32新IP地址为:”);
Serial.print(WiFi.localIP());
Serial.println(“”);
}
//如果连接丢失,请重新连接到wifi
void重新连接(){
而(!client.connected()){
Serial.print(“连接到MQTT代理…”);
if(客户端连接(“ESP32Client”,0,2,0,0)){
Serial.println(“OK”);
}否则{
串行打印(“[错误]未连接:”);
Serial.println(client.state());
Serial.println(“重试前等待5秒”);
延迟(5000);
}
}
}

pubsubclient连接到网络,但我从client.state()函数中得到一个-2错误代码。您能帮我纠正此错误并建立安全连接吗。

您需要在
loop()
中调用PubSubClient的
loop()
方法;否则,它将无法执行必要的内务管理功能并使连接保持活动状态

因此,循环函数的开头应该如下所示:

void loop() {
  client.loop();

  delay(2000);
PubSubClient每15秒向代理发送一次“keepalive”消息(默认情况下),因此您需要小心使用
delay()
fun
void loop() {
  client.loop();

  delay(2000);