无法连接到丢失的消息:mqttClient.state -1
我为WEMOS D1控制器编写了一个代码,并且该代码应将数据(温度,湿度)发送到Losant,可以连接到WiFi,但是当Controller连接到Losant时会显示一条消息:
WiFi connected
IP address:
192.168.43.222
Authenticating Device...This device is authorized!
Connecting to Losant...-1
.-1
.-1
.-1
.-1
.-1
我的代码:
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Losant.h>
#define DHTPIN D8 // what digital pin the DHT22 is conected to
#define DHTTYPE DHT22 // There are multiple kinds of DHT sensors
DHT dht(DHTPIN, DHTTYPE);
// WiFi credentials.
const char* WIFI_SSID = "Android";
const char* WIFI_PASS = "";
// Losant credentials.
const char* LOSANT_DEVICE_ID = "MyLosantId";
const char* LOSANT_ACCESS_KEY = "MyAccesKey";
const char* LOSANT_ACCESS_SECRET = "MyAccesSecret";
WiFiClient wifiClient;
LosantDevice device(LOSANT_DEVICE_ID);
void connect() {
// Connect to Wifi.
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
// WiFi fix: https://github.com/esp8266/Arduino/issues/2186
WiFi.persistent(false);
WiFi.mode(WIFI_OFF);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
unsigned long wifiConnectStart = millis();
while (WiFi.status() != WL_CONNECTED) {
// Check to see if
if (WiFi.status() == WL_CONNECT_FAILED) {
Serial.println("Failed to connect to WIFI. Please verify credentials: ");
Serial.println();
Serial.print("SSID: ");
Serial.println(WIFI_SSID);
Serial.print("Password: ");
Serial.println(WIFI_PASS);
Serial.println();
}
delay(500);
Serial.println("...");
// Only try for 5 seconds.
if(millis() - wifiConnectStart > 5000) {
Serial.println("Failed to connect to WiFi");
Serial.println("Please attempt to send updated configuration parameters.");
return;
}
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println();
Serial.print("Authenticating Device...");
HTTPClient http;
http.begin("http://api.losant.com/auth/device");
http.addHeader("Content-Type", "application/json");
http.addHeader("Accept", "application/json");
/* Create JSON payload to sent to Losant
*
* {
* "deviceId": "575ecf887ae143cd83dc4aa2",
* "key": "this_would_be_the_key",
* "secret": "this_would_be_the_secret"
* }
*
*/
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["deviceId"] = LOSANT_DEVICE_ID;
root["key"] = LOSANT_ACCESS_KEY;
root["secret"] = LOSANT_ACCESS_SECRET;
String buffer;
root.printTo(buffer);
int httpCode = http.POST(buffer);
if(httpCode > 0) {
if(httpCode == HTTP_CODE_OK) {
Serial.println("This device is authorized!");
} else {
Serial.println("Failed to authorize device to Losant.");
if(httpCode == 400) {
Serial.println("Validation error: The device ID, access key, or access secret is not in the proper format.");
} else if(httpCode == 401) {
Serial.println("Invalid credentials to Losant: Please double-check the device ID, access key, and access secret.");
} else {
Serial.println("Unknown response from API");
}
}
} else {
Serial.println("Failed to connect to Losant API.");
}
http.end();
// Connect to Losant.
Serial.println();
Serial.print("Connecting to Losant...");
device.connectSecure (wifiClient, LOSANT_ACCESS_KEY, LOSANT_ACCESS_SECRET);
while(!device.connected()) {
delay(500);
Serial.println(device.mqttClient.state()); // HERE
Serial.print(".");
}
Serial.println("Connected!");
Serial.println();
Serial.println("This device is now ready for use!");
}
void setup() {
Serial.begin(9600);
Serial.setTimeout(2000);
// Wait for serial to initialize.
while(!Serial) { }
Serial.println("Device Started");
Serial.println("-------------------------------------");
Serial.println("Running DHT!");
Serial.println("-------------------------------------");
connect();
}
void report(double humidity, double tempC, double tempF, double heatIndexC, double heatIndexF) {
StaticJsonBuffer<500> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["humidity"] = humidity;
root["tempC"] = tempC;
root["tempF"] = tempF;
root["heatIndexC"] = heatIndexC;
root["heatIndexF"] = heatIndexF;
device.sendState(root);
Serial.println("Reported!");
}
int timeSinceLastRead = 0;
void loop() {
bool toReconnect = false;
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Disconnected from WiFi");
toReconnect = true;
}
if (!device.connected()) {
Serial.println("Disconnected from MQTT");
Serial.println(device.mqttClient.state());
toReconnect = true;
}
if (toReconnect) {
connect();
}
device.loop();
// Report every 2 seconds.
if(timeSinceLastRead > 2000) {
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
timeSinceLastRead = 0;
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
report(h, t, f, hic, hif);
timeSinceLastRead = 0;
}
delay(100);
timeSinceLastRead += 100;
}
在Losant网站的日志中,我只有一条消息:
Device RoomSensor1 authenticated with Losant Authentication succeeded ndz 16 gru 2018 21:45:41 GMT+01:00
控制器已成功进行连接/身份验证,但下一步不会消失。我一直粘贴此消息。
我与失败者一起制作了此教程/课程:
答案 0 :(得分:1)
尝试关注此Losant论坛帖子。
losant forums - arduino hangs on authentication
这篇文章显示您应该尝试将PubSubClient.h中的MQTT_MAX_PACKET_SIZE从128更新为256。论坛帖子中还有其他一些注意事项。
希望这会有所帮助。