Files
mixly3-server/arduino-libs/arduino-cli/libraries/Blinker/src/Adapters/BlinkerPROESP.h

3693 lines
111 KiB
C++

#ifndef BLINKER_PRO_ESP_H
#define BLINKER_PRO_ESP_H
#if (defined(ESP8266) || defined(ESP32))
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
#include <base64.h>
#elif defined(ESP32)
#include <WiFi.h>
#if defined(ESP32)
extern "C" {
#include <esp_err.h>
#include <esp_wifi.h>
#include <esp_event.h>
}
#endif
#include <ESPmDNS.h>
#include <HTTPClient.h>
#include <base64.h>
#endif
#include <EEPROM.h>
#include "../modules/WebSockets/WebSocketsServer.h"
#include "../modules/mqtt/Adafruit_MQTT.h"
#include "../modules/mqtt/Adafruit_MQTT_Client.h"
#ifndef ARDUINOJSON_VERSION_MAJOR
#include "../modules/ArduinoJson/ArduinoJson.h"
#endif
// #include "../Adapters/BlinkerPROESP.h"
#include "../Blinker/BlinkerConfig.h"
#include "../Blinker/BlinkerDebug.h"
#include "../Blinker/BlinkerStream.h"
#include "../Blinker/BlinkerUtility.h"
char* MQTT_HOST_PRO;
char* MQTT_ID_PRO;
char* MQTT_NAME_PRO;
char* MQTT_KEY_PRO;
char* MQTT_PRODUCTINFO_PRO;
char* UUID_PRO;
char* AUTHKEY_PRO;
char* MQTT_DEVICEID_PRO;
// char* DEVICE_NAME;
char* BLINKER_PUB_TOPIC_PRO;
char* BLINKER_SUB_TOPIC_PRO;
char* BLINKER_RRPC_SUB_TOPIC_MQTT;
uint16_t MQTT_PORT_PRO;
enum b_config_t {
BLINKER_SMART_CONFIG,
BLINKER_AP_CONFIG
};
enum b_broker_t {
aliyun_b,
blinker_b
};
b_config_t _configType = BLINKER_AP_CONFIG;
class BlinkerPROESP : public BlinkerStream
{
public :
BlinkerPROESP();
void setSmartConfig() { _configType = BLINKER_SMART_CONFIG; BLINKER_LOG_ALL(BLINKER_F("SmartConfig")); }
void setApConfig() { _configType = BLINKER_AP_CONFIG; BLINKER_LOG_ALL(BLINKER_F("ApConfig")); }
bool checkSmartConfig() { return _configType == BLINKER_SMART_CONFIG; }
int connect();
int connected();
int mConnected();// { if (!isMQTTinit) return false; else return mqtt->connected(); }
void disconnect();
void ping();
int available();
int aligenieAvail();
int duerAvail();
int miAvail();
// bool extraAvailable();
void subscribe();
char * lastRead();
void flush();
int print(char * data, bool needCheck = true);
int toServer(char * data);
int bPrint(char * name, const String & data);
int aliPrint(const String & data);
int duerPrint(const String & data, bool report = false);
int miPrint(const String & data);
// void aliType(const String & type);
void begin(const char* _key, const char* _type);
int autoPrint(unsigned long id);
// bool autoPrint(char *name, char *type, char *data);
// bool autoPrint(char *name1, char *type1, char *data1, \
// char *name2, char *type2, char *data2);
char * deviceName();
char * authKey() { return AUTHKEY_PRO; }
char * token() { if (!isMQTTinit) return ""; else return MQTT_KEY_PRO; }
int init()
{
// webSocket_PRO.loop();
// #if defined(ESP8266)
// MDNS.update();
// #endif
return isMQTTinit;
}
int reRegister() { return connectServer(); }
int deviceRegister() { return connectServer(); }
int authCheck();
void freshAlive() { kaTime = millis(); isAlive = true; }
void sharers(const String & data);
int needFreshShare() {
if (_needCheckShare)
{
BLINKER_LOG_ALL(BLINKER_F("needFreshShare"));
_needCheckShare = false;
return true;
}
else
{
return false;
}
}
private :
bool isMQTTinit = false;
bool isWSinit = false;
int connectServer();
void mDNSInit(String name = macDeviceName());
void checkKA();
int checkAliKA();
int checkDuerKA();
int checkMIOTKA();
int checkCanPrint();
int checkCanBprint();
int checkPrintSpan();
int checkAliPrintSpan();
int checkDuerPrintSpan();
int checkMIOTPrintSpan();
int pubHello();
void parseData(const char* data);
protected :
b_broker_t _use_broker = aliyun_b;
char _messageId[20];
BlinkerSharer * _sharers[BLINKER_MQTT_MAX_SHARERS_NUM];
uint8_t _sharerCount = 0;
uint8_t _sharerFrom = BLINKER_MQTT_FROM_AUTHER;
const char* _vipKey;
const char* _deviceType;
// char* _authKey;
// char* _aliType;
bool* isHandle;// = &isConnect;
// bool* isHandle = &isConnect_PRO;
bool isAlive = false;
bool isBavail = false;
bool _needCheckShare = false;
uint32_t latestTime;
uint32_t printTime = 0;
uint32_t bPrintTime = 0;
uint32_t kaTime = 0;
uint32_t linkTime = 0;
uint8_t respTimes = 0;
uint32_t respTime = 0;
uint8_t respAliTimes = 0;
uint32_t respAliTime = 0;
uint8_t respDuerTimes = 0;
uint32_t respDuerTime = 0;
uint8_t respMIOTTimes = 0;
uint32_t respMIOTTime = 0;
uint32_t aliKaTime = 0;
bool isAliAlive = false;
bool isAliAvail = false;
uint32_t duerKaTime = 0;
bool isDuerAlive = false;
bool isDuerAvail = false;
uint32_t miKaTime = 0;
bool isMIOTAlive = false;
bool isMIOTAvail = false;
bool isNew = false;
bool isAuth = false;
bool isFirst = false;
int isJson(const String & data);
uint8_t reconnect_time = 0;
uint32_t _reRegister_time = 0;
uint8_t _reRegister_times = 0;
bool _isAuthKey = false;
char message_id[24];
bool is_rrpc = false;
};
// #if defined(ESP8266)
// extern BearSSL::WiFiClientSecure client_mqtt;
// // WiFiClientSecure client_mqtt;
// #elif defined(ESP32)
// extern WiFiClientSecure client_s;
// #endif
// extern WiFiClient client;
#if defined(ESP8266)
#ifndef BLINKER_WITHOUT_SSL
BearSSL::WiFiClientSecure client_mqtt;
#else
WiFiClient client_mqtt;
#endif
// WiFiClientSecure client_mqtt;
#elif defined(ESP32)
WiFiClientSecure client_s;
#endif
#define BLINKER_PROTOCOL_MQTT mqtt_PRO
WiFiClient client;
Adafruit_MQTT_Client* mqtt_PRO = NULL;
// Adafruit_MQTT_Publish *iotPub;
Adafruit_MQTT_Subscribe* iotSub_PRO;
#define WS_SERVERPORT 81
WebSocketsServer webSocket_PRO = WebSocketsServer(WS_SERVERPORT);
char* msgBuf_PRO;
bool isFresh_PRO = false;
bool isConnect_PRO = false;
bool isAvail_PRO = false;
bool isApCfg = false;
uint8_t ws_num_PRO = 0;
uint8_t dataFrom_PRO = BLINKER_MSG_FROM_MQTT;
void webSocketEvent_PRO(uint8_t num, WStype_t type, \
uint8_t * payload, size_t length)
{
switch(type)
{
case WStype_DISCONNECTED:
BLINKER_LOG_ALL(BLINKER_F("Disconnected! "), num);
isConnect_PRO = false;
break;
case WStype_CONNECTED:
{
IPAddress ip = webSocket_PRO.remoteIP(num);
BLINKER_LOG_ALL(BLINKER_F("num: "), num, \
BLINKER_F(", Connected from: "), ip,
BLINKER_F(", url: "), (char *)payload);
// send message to client
webSocket_PRO.sendTXT(num, "{\"state\":\"connected\"}\n");
ws_num_PRO = num;
if (!isApCfg) isConnect_PRO = true;
}
break;
case WStype_TEXT:
BLINKER_LOG_ALL(BLINKER_F("num: "), num, \
BLINKER_F(", get Text: "), (char *)payload, \
BLINKER_F(", length: "), length);
if (length < BLINKER_MAX_READ_SIZE) {
if (isFresh_PRO) free(msgBuf_PRO);
msgBuf_PRO = (char*)malloc((length+1)*sizeof(char));
strcpy(msgBuf_PRO, (char*)payload);
isAvail_PRO = true;
isFresh_PRO = true;
}
if (!isApCfg) isConnect_PRO = true;
if (!isApCfg) dataFrom_PRO = BLINKER_MSG_FROM_WS;
ws_num_PRO = num;
// BLINKER_LOG_ALL(BLINKER_F("isConnect_PRO: "), isConnect_PRO);
// send message to client
// webSocket_PRO.sendTXT(num, "message here");
// send data to all connected clients
// webSocket_PRO.broadcastTXT("message here");
break;
case WStype_BIN:
// BLINKER_LOG("num: ", num, " get binary length: ", length);
// hexdump(payload, length);
// send message to client
// webSocket_PRO.sendBIN(num, payload, length);
break;
}
}
BlinkerPROESP::BlinkerPROESP() { isHandle = &isConnect_PRO; }
int BlinkerPROESP::connect()
{
int8_t ret;
#if defined(ESP8266)
MDNS.update();
#endif
webSocket_PRO.loop();
if (!isMQTTinit) {
return *isHandle;
}
if (mqtt_PRO->connected())
{
return true;
}
disconnect();
if ((millis() - latestTime) < BLINKER_MQTT_CONNECT_TIMESLOT && latestTime > 0)
{
yield();
return false;
}
BLINKER_LOG(BLINKER_F("Connecting to MQTT... "));
#if defined(ESP8266)
#ifndef BLINKER_WITHOUT_SSL
client_mqtt.setInsecure();
::delay(10);
#endif
#endif
BLINKER_LOG_FreeHeap_ALL();
if ((ret = mqtt_PRO->connect()) != 0)
{
BLINKER_LOG(mqtt_PRO->connectErrorString(ret));
BLINKER_LOG(BLINKER_F("Retrying MQTT connection in "), \
BLINKER_MQTT_CONNECT_TIMESLOT/1000, \
BLINKER_F(" seconds..."));
if (ret == 4)
{
if (_reRegister_times < BLINKER_SERVER_CONNECT_LIMIT)
{
if (reRegister())
{
_reRegister_times = 0;
}
else
{
_reRegister_times++;
_reRegister_time = millis();
}
}
else
{
if (millis() - _reRegister_time >= 60000 * 5) _reRegister_times = 0;
}
BLINKER_LOG_ALL(BLINKER_F("_reRegister_times: "), _reRegister_times);
}
this->latestTime = millis();
reconnect_time += 1;
if (reconnect_time >= 12)
{
if (_reRegister_times < BLINKER_SERVER_CONNECT_LIMIT)
{
if (reRegister())
{
_reRegister_times = 0;
}
else
{
_reRegister_times++;
_reRegister_time = millis();
}
}
else
{
if (millis() - _reRegister_time >= 60000 * 5) _reRegister_times = 0;
}
reconnect_time = 0;
BLINKER_LOG_ALL(BLINKER_F("_reRegister_times: "), _reRegister_times);
}
return false;
}
reconnect_time = 0;
BLINKER_LOG(BLINKER_F("MQTT Connected!"));
BLINKER_LOG_FreeHeap();
if (isNew)
{
if (pubHello()) {
isNew = false;
}
}
this->latestTime = millis();
return true;
}
int BlinkerPROESP::connected()
{
if (!isMQTTinit)
{
return *isHandle;
}
return mqtt_PRO->connected() || *isHandle;
}
int BlinkerPROESP::mConnected()
{
if (!isMQTTinit) return false;
else return mqtt_PRO->connected();
}
void BlinkerPROESP::disconnect()
{
if (isMQTTinit) mqtt_PRO->disconnect();
if (*isHandle) webSocket_PRO.disconnect();
}
void BlinkerPROESP::ping()
{
BLINKER_LOG_ALL(BLINKER_F("MQTT Ping!"));
BLINKER_LOG_FreeHeap_ALL();
if (!isMQTTinit) return;
if (!mqtt_PRO->ping())
{
disconnect();
// delay(100);
// connect();
}
else
{
this->latestTime = millis();
}
}
int BlinkerPROESP::available()
{
#if defined(ESP8266)
MDNS.update();
#endif
// BLINKER_LOG("CHECK available");
delay(1);
webSocket_PRO.loop();
if (isMQTTinit) {
checkKA();
// if (!mqtt_PRO->connected() || \
// (millis() - this->latestTime) > BLINKER_MQTT_PING_TIMEOUT)
if ((millis() - this->latestTime) > BLINKER_MQTT_PING_TIMEOUT)
{
ping();
}
else
{
subscribe();
}
}
if (isAvail_PRO)
{
isAvail_PRO = false;
return true;
}
else {
return false;
}
}
int BlinkerPROESP::aligenieAvail()
{
if (isAliAvail)
{
isAliAvail = false;
return true;
}
else {
return false;
}
}
int BlinkerPROESP::duerAvail()
{
if (isDuerAvail)
{
isDuerAvail = false;
return true;
}
else {
return false;
}
}
int BlinkerPROESP::miAvail()
{
if (isMIOTAvail)
{
isMIOTAvail = false;
return true;
}
else {
return false;
}
}
// bool BlinkerPROESP::extraAvailable()
// {
// if (isBavail)
// {
// isBavail = false;
// return true;
// }
// else
// {
// return false;
// }
// }
void BlinkerPROESP::subscribe()
{
if (!isMQTTinit) return;
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt_PRO->readSubscription(10)))
{
if (subscription == iotSub_PRO)
{
BLINKER_LOG_ALL(BLINKER_F("Got: "), (char *)iotSub_PRO->lastread);
parseData((char *)iotSub_PRO->lastread);
// // DynamicJsonBuffer jsonBuffer;
// // JsonObject& root = jsonBuffer.parseObject(String((char *)iotSub_PRO->lastread));
// DynamicJsonDocument jsonBuffer(1024);
// DeserializationError error = deserializeJson(jsonBuffer, String((char *)iotSub_PRO->lastread));
// JsonObject root = jsonBuffer.as<JsonObject>();
// String _uuid = root["fromDevice"];
// String dataGet = root["data"];
// BLINKER_LOG_ALL(BLINKER_F("data: "), dataGet);
// BLINKER_LOG_ALL(BLINKER_F("fromDevice: "), _uuid);
// if (strcmp(_uuid.c_str(), UUID_PRO) == 0)
// {
// BLINKER_LOG_ALL(BLINKER_F("Authority uuid"));
// kaTime = millis();
// isAvail_PRO = true;
// isAlive = true;
// _sharerFrom = BLINKER_MQTT_FROM_AUTHER;
// }
// else if (_uuid == BLINKER_CMD_ALIGENIE)
// {
// BLINKER_LOG_ALL(BLINKER_F("form AliGenie"));
// aliKaTime = millis();
// isAliAlive = true;
// isAliAvail = true;
// }
// else if (_uuid == BLINKER_CMD_DUEROS)
// {
// BLINKER_LOG_ALL(BLINKER_F("form DuerOS"));
// duerKaTime = millis();
// isDuerAlive = true;
// isDuerAvail = true;
// }
// else if (_uuid == BLINKER_CMD_MIOT)
// {
// BLINKER_LOG_ALL(BLINKER_F("form DuerOS"));
// miKaTime = millis();
// isMIOTAlive = true;
// isMIOTAvail = true;
// }
// else if (_uuid == BLINKER_CMD_SERVERCLIENT)
// {
// BLINKER_LOG_ALL(BLINKER_F("form Sever"));
// isAvail_PRO = true;
// isAlive = true;
// _sharerFrom = BLINKER_MQTT_FROM_AUTHER;
// }
// else
// {
// if (_sharerCount)
// {
// for (uint8_t num = 0; num < _sharerCount; num++)
// {
// if (strcmp(_uuid.c_str(), _sharers[num]->uuid()) == 0)
// {
// _sharerFrom = num;
// kaTime = millis();
// BLINKER_LOG_ALL(BLINKER_F("From sharer: "), _uuid);
// BLINKER_LOG_ALL(BLINKER_F("sharer num: "), num);
// _needCheckShare = false;
// break;
// }
// else
// {
// BLINKER_ERR_LOG_ALL(BLINKER_F("No authority uuid found,"
// "check is from bridge/share device,"
// "data: "), dataGet);
// _needCheckShare = true;
// }
// }
// }
// // {
// // dataGet = String((char *)iotSub_PRO->lastread);
// // root.printTo(dataGet);
// serializeJson(root, dataGet);
// // BLINKER_ERR_LOG_ALL(BLINKER_F("No authority uuid found, \
// // check is from bridge/share device, \
// // data: "), dataGet);
// // // return;
// // // isBavail = true;
// // _needCheckShare = true;
// // }
// isAvail_PRO = true;
// isAlive = true;
// }
// memset(msgBuf_PRO, 0, BLINKER_MAX_READ_SIZE);
// memcpy(msgBuf_PRO, dataGet.c_str(), dataGet.length());
// if (isFresh_PRO) free(msgBuf_PRO);
// msgBuf_PRO = (char*)malloc((dataGet.length()+1)*sizeof(char));
// strcpy(msgBuf_PRO, dataGet.c_str());
// isFresh_PRO = true;
// this->latestTime = millis();
// dataFrom_PRO = BLINKER_MSG_FROM_MQTT;
}
}
if (mqtt_PRO->check_extra())
{
BLINKER_LOG_ALL(BLINKER_F("Got extra topic: "), (char *)mqtt_PRO->get_extra_topic());
BLINKER_LOG_ALL(BLINKER_F("Got extra data: "), (char *)mqtt_PRO->get_extra_data());
if (strncmp(BLINKER_RRPC_SUB_TOPIC_MQTT,
(char *)mqtt_PRO->get_extra_topic(),
strlen(BLINKER_RRPC_SUB_TOPIC_MQTT))
== 0)
{
// char message_id[24];
memset(message_id, '\0', 24);
memmove(message_id,
mqtt_PRO->get_extra_topic()+strlen(BLINKER_RRPC_SUB_TOPIC_MQTT),
strlen(mqtt_PRO->get_extra_topic()) - strlen(BLINKER_RRPC_SUB_TOPIC_MQTT));
BLINKER_LOG_ALL(BLINKER_F("from server RRPC, message_id: "), message_id);
parseData((char *)mqtt_PRO->get_extra_data());
// char BLINKER_RRPC_PUB_TOPIC_MQTT[128];
// strcpy(BLINKER_RRPC_PUB_TOPIC_MQTT, "/sys/");
// strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, MQTT_PRODUCTINFO_PRO);
// strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, "/");
// strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, MQTT_DEVICEID_PRO);
// strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, "/rrpc/response/");
// strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, message_id);
is_rrpc = true;
// BLINKER_LOG_ALL(BLINKER_F("BLINKER_RRPC_PUB_TOPIC_MQTT: "), BLINKER_RRPC_PUB_TOPIC_MQTT);
// mqtt_PRO->publish(BLINKER_RRPC_PUB_TOPIC_MQTT, base64::encode("hello blinker").c_str());
}
}
}
void BlinkerPROESP::parseData(const char* data)
{
DynamicJsonDocument jsonBuffer(1024);
deserializeJson(jsonBuffer, String(data));
JsonObject root = jsonBuffer.as<JsonObject>();
String _uuid = root["fromDevice"].as<String>();
String dataGet = root["data"].as<String>();
if (_use_broker == blinker_b)
{
if (_uuid == "ServerSender")
{
_uuid = root["data"]["from"].as<String>();
String _mId = root["data"]["messageId"].as<String>();
strcpy(_messageId, _mId.c_str());
BLINKER_LOG_ALL(BLINKER_F("_messageId: "), _mId);
}
}
BLINKER_LOG_ALL(BLINKER_F("data: "), dataGet);
BLINKER_LOG_ALL(BLINKER_F("fromDevice: "), _uuid);
if (strcmp(_uuid.c_str(), UUID_PRO) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("Authority uuid"));
kaTime = millis();
isAvail_PRO = true;
isAlive = true;
_sharerFrom = BLINKER_MQTT_FROM_AUTHER;
}
else if (_uuid == BLINKER_CMD_ALIGENIE)
{
BLINKER_LOG_ALL(BLINKER_F("form AliGenie"));
aliKaTime = millis();
isAliAlive = true;
isAliAvail = true;
}
else if (_uuid == BLINKER_CMD_DUEROS)
{
BLINKER_LOG_ALL(BLINKER_F("form DuerOS"));
duerKaTime = millis();
isDuerAlive = true;
isDuerAvail = true;
}
else if (_uuid == BLINKER_CMD_MIOT)
{
BLINKER_LOG_ALL(BLINKER_F("form MIOT"));
miKaTime = millis();
isMIOTAlive = true;
isMIOTAvail = true;
}
else if (_uuid == BLINKER_CMD_SERVERCLIENT)
{
BLINKER_LOG_ALL(BLINKER_F("form Sever"));
isAvail_PRO = true;
isAlive = true;
_sharerFrom = BLINKER_MQTT_FROM_AUTHER;
}
else
{
if (_sharerCount)
{
for (uint8_t num = 0; num < _sharerCount; num++)
{
if (strcmp(_uuid.c_str(), _sharers[num]->uuid()) == 0)
{
_sharerFrom = num;
kaTime = millis();
BLINKER_LOG_ALL(BLINKER_F("From sharer: "), _uuid);
BLINKER_LOG_ALL(BLINKER_F("sharer num: "), num);
_needCheckShare = false;
break;
}
else
{
BLINKER_ERR_LOG_ALL(BLINKER_F("No authority uuid found, check is from bridge/share device, data: "), dataGet);
_needCheckShare = true;
dataGet = data;
}
}
}
else
{
dataGet = data;
}
// dataGet = String((char *)iotSub_PRO->lastread);
// root.printTo(dataGet);
// serializeJson(root, dataGet);
// BLINKER_ERR_LOG_ALL(BLINKER_F("No authority uuid found,
// check is from bridge/share device, \
// data: "), dataGet);
// // return;
// // isBavail = true;
// _needCheckShare = true;
// }
isAvail_PRO = true;
isAlive = true;
}
// memset(msgBuf_PRO, 0, BLINKER_MAX_READ_SIZE);
// memcpy(msgBuf_PRO, dataGet.c_str(), dataGet.length());
if (isFresh_PRO) free(msgBuf_PRO);
msgBuf_PRO = (char*)malloc((dataGet.length()+1)*sizeof(char));
strcpy(msgBuf_PRO, dataGet.c_str());
isFresh_PRO = true;
this->latestTime = millis();
dataFrom_PRO = BLINKER_MSG_FROM_MQTT;
}
char * BlinkerPROESP::lastRead()
{
if (isFresh_PRO) return msgBuf_PRO;
return "";
}
void BlinkerPROESP::flush()
{
if (isFresh_PRO)
{
free(msgBuf_PRO); isFresh_PRO = false; isAvail_PRO = false;
isAliAvail = false; isDuerAvail = false; isMIOTAvail = false;//isBavail = false;
}
}
int BlinkerPROESP::print(char * data, bool needCheck)
// int BlinkerPROESP::print(const String & data, bool needCheck)
{
// BLINKER_LOG_FreeHeap();
if (*isHandle && dataFrom_PRO == BLINKER_MSG_FROM_WS)
{
if (needCheck)
{
if (!checkPrintSpan())
{
respTime = millis();
return false;
}
}
respTime = millis();
BLINKER_LOG_ALL(BLINKER_F("WS response: "));
BLINKER_LOG_ALL(data);
BLINKER_LOG_ALL(BLINKER_F("Success..."));
strcat(data, BLINKER_CMD_NEWLINE);
webSocket_PRO.sendTXT(ws_num_PRO, data);
return true;
}
else
{
// // String payload;
// if (STRING_contains_string(data, BLINKER_CMD_NEWLINE))
// {
// uint8_t num = strlen(data) - 1;
// for(uint8_t c_num = num; c_num > 0; c_num--)
// {
// data[c_num+7] = data[c_num-1];
// }
// // payload = BLINKER_F("{\"data\":");
// // payload += data.substring(0, data.length() - 1);
// // payload += BLINKER_F(",\"fromDevice\":\"");
// // payload += MQTT_DEVICEID_PRO;
// // payload += BLINKER_F("\",\"toDevice\":\"");
// // payload += UUID_PRO;
// // payload += BLINKER_F("\",\"deviceType\":\"OwnApp\"}");
// }
// else
// {
// uint8_t num = strlen(data);
// for(uint8_t c_num = num; c_num > 0; c_num--)
// {
// data[c_num+7] = data[c_num-1];
// }
// // payload = BLINKER_F("{\"data\":");
// // payload += data;
// // payload += BLINKER_F(",\"fromDevice\":\"");
// // payload += MQTT_DEVICEID_PRO;
// // payload += BLINKER_F("\",\"toDevice\":\"");
// // payload += UUID_PRO;
// // payload += BLINKER_F("\",\"deviceType\":\"OwnApp\"}");
// }
if (isMQTTinit == false) {
BLINKER_ERR_LOG("print fail, mqtt not init...");
return false;
}
uint16_t num = strlen(data);
for(uint16_t c_num = num; c_num > 0; c_num--)
{
data[c_num+7] = data[c_num-1];
}
data[num+8] = '\0';
String data_add = BLINKER_F("{\"data\":");
for(uint16_t c_num = 0; c_num < 8; c_num++)
{
data[c_num] = data_add[c_num];
}
data_add = BLINKER_F(",\"fromDevice\":\"");
strcat(data, data_add.c_str());
strcat(data, MQTT_DEVICEID_PRO);
data_add = BLINKER_F("\",\"toDevice\":\"");
strcat(data, data_add.c_str());
if (_sharerFrom < BLINKER_MQTT_MAX_SHARERS_NUM)
{
strcat(data, _sharers[_sharerFrom]->uuid());
}
else
{
strcat(data, UUID_PRO);
}
data_add = BLINKER_F("\",\"deviceType\":\"OwnApp\"}");
strcat(data, data_add.c_str());
_sharerFrom = BLINKER_MQTT_FROM_AUTHER;
if (!isJson(STRING_format(data))) return false;
// String data_add = BLINKER_F("{\"data\":");
// data_add += data;
// data_add += BLINKER_F(",\"fromDevice\":\"");
// data_add += MQTT_DEVICEID_PRO;
// data_add += BLINKER_F("\",\"toDevice\":\"");
// if (_sharerFrom < BLINKER_MQTT_MAX_SHARERS_NUM)
// {
// data_add += _sharers[_sharerFrom]->uuid();
// }
// else
// {
// data_add += UUID_PRO;
// }
// data_add += BLINKER_F("\",\"deviceType\":\"OwnApp\"}");
// _sharerFrom = BLINKER_MQTT_FROM_AUTHER;
// if (!isJson(data_add)) return false;
BLINKER_LOG_ALL(BLINKER_F("MQTT Publish..."));
BLINKER_LOG_FreeHeap_ALL();
bool _alive = isAlive;
if (needCheck)
{
if (!checkPrintSpan())
{
return false;
}
respTime = millis();
}
if (mqtt_PRO->connected())
{
if (needCheck)
{
if (!checkCanPrint())
{
if (!_alive)
{
isAlive = false;
}
return false;
}
}
if (! mqtt_PRO->publish(BLINKER_PUB_TOPIC_PRO, data))
{
BLINKER_LOG_ALL(data);
BLINKER_LOG_ALL(BLINKER_F("...Failed"));
BLINKER_LOG_FreeHeap_ALL();
if (!_alive)
{
isAlive = false;
}
return false;
}
else
{
BLINKER_LOG_ALL(data);
BLINKER_LOG_ALL(BLINKER_F("...OK!"));
BLINKER_LOG_FreeHeap_ALL();
if (needCheck) printTime = millis();
if (!_alive)
{
isAlive = false;
}
this->latestTime = millis();
return true;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
isAlive = false;
return false;
}
}
}
int BlinkerPROESP::toServer(char * data)
{
// if (!checkInit()) return false;
if (!isJson(STRING_format(data))) return false;
BLINKER_LOG_ALL(BLINKER_F("MQTT Publish to server..."));
BLINKER_LOG_FreeHeap_ALL();
bool _alive = isAlive;
if (mqtt_PRO->connected())
{
if (! mqtt_PRO->publish(BLINKER_PUB_TOPIC_PRO, data))
{
BLINKER_LOG_ALL(data);
BLINKER_LOG_ALL(BLINKER_F("...Failed"));
BLINKER_LOG_FreeHeap_ALL();
return false;
}
else
{
BLINKER_LOG_ALL(data);
BLINKER_LOG_ALL(BLINKER_F("...OK!"));
BLINKER_LOG_FreeHeap_ALL();
return true;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
isAlive = false;
return false;
}
}
int BlinkerPROESP::bPrint(char * name, const String & data)
{
// String payload;
// if (STRING_contains_string(data, BLINKER_CMD_NEWLINE))
// {
// payload = BLINKER_F("{\"data\":");
// payload += data.substring(0, data.length() - 1);
// payload += BLINKER_F(",\"fromDevice\":\"");
// payload += MQTT_DEVICEID_PRO;
// payload += BLINKER_F("\",\"toDevice\":\"");
// payload += name;
// payload += BLINKER_F("\",\"deviceType\":\"DiyBridge\"}");
// }
// else
// {
// payload = BLINKER_F("{\"data\":");
// payload += data;
// payload += BLINKER_F(",\"fromDevice\":\"");
// payload += MQTT_DEVICEID_PRO;
// payload += BLINKER_F("\",\"toDevice\":\"");
// payload += name;
// payload += BLINKER_F("\",\"deviceType\":\"DiyBridge\"}");
// }
// uint8_t num = strlen(data);
// for(uint8_t c_num = num; c_num > 0; c_num--)
// {
// data[c_num+7] = data[c_num-1];
// }
String data_add = BLINKER_F("{\"data\":");
// for(uint8_t c_num = 0; c_num < 8; c_num++)
// {
// data[c_num] = data_add[c_num];
// }
data_add += data;
data_add += BLINKER_F(",\"fromDevice\":\"");
data_add += MQTT_DEVICEID_PRO;
data_add += BLINKER_F("\",\"toDevice\":\"");
data_add += name;
data_add += BLINKER_F("\",\"deviceType\":\"DiyBridge\"}");
// data_add = BLINKER_F(",\"fromDevice\":\"");
// strcat(data, data_add.c_str());
// strcat(data, MQTT_DEVICEID_PRO);
// data_add = BLINKER_F("\",\"toDevice\":\"");
// strcat(data, data_add.c_str());
// strcat(data, name);
// data_add = BLINKER_F("\",\"deviceType\":\"DiyBridge\"}");
// strcat(data, data_add.c_str());
if (!isJson(data_add)) return false;
BLINKER_LOG_ALL(BLINKER_F("MQTT Bridge Publish..."));
// bool _alive = isAlive;
// bool state = STRING_contains_string(data, BLINKER_CMD_NOTICE);
// if (!state) {
// state = (STRING_contains_string(data, BLINKER_CMD_STATE)
// && STRING_contains_string(data, BLINKER_CMD_ONLINE));
// }
if (mqtt_PRO->connected()) {
// if (!state) {
if (!checkCanBprint()) {
// if (!_alive) {
// isAlive = false;
// }
return false;
}
// }
// Adafruit_MQTT_Publish iotPub = Adafruit_MQTT_Publish(mqtt_PRO, BLINKER_PUB_TOPIC_PRO);
// if (! iotPub.publish(payload.c_str())) {
// String bPubTopic = BLINKER_F("");
// if (mqtt_broker == BLINKER_MQTT_BORKER_ONENET)
// {
// bPubTopic = MQTT_PRODUCTINFO_PRO;
// bPubTopic += BLINKER_F("/");
// bPubTopic += name;
// bPubTopic += BLINKER_F("/r");
// }
// else
// {
// bPubTopic = BLINKER_PUB_TOPIC_PRO;
// }
if (! mqtt_PRO->publish(BLINKER_PUB_TOPIC_PRO, data_add.c_str()))
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...Failed"));
// if (!_alive) {
// isAlive = false;
// }
return false;
}
else
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...OK!"));
bPrintTime = millis();
// if (!_alive) {
// isAlive = false;
// }
this->latestTime = millis();
return true;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
// isAlive = false;
return false;
}
// }
}
int BlinkerPROESP::aliPrint(const String & data)
{
String data_add = BLINKER_F("{\"data\":");
if (_use_broker == aliyun_b)
{
data_add += data;
}
else if (_use_broker == blinker_b)
{
data_add += data.substring(0, data.length() - 1);
data_add += BLINKER_F(",\"messageId\":\"");
data_add += STRING_format(_messageId);
data_add += BLINKER_F("\"}");
}
data_add += BLINKER_F(",\"fromDevice\":\"");
data_add += MQTT_DEVICEID_PRO;
if (_use_broker == aliyun_b)
{
data_add += BLINKER_F("\",\"toDevice\":\"AliGenie_r\"");
}
else if (_use_broker == blinker_b)
{
data_add += BLINKER_F("\",\"toDevice\":\"ServerReceiver\"");
}
data_add += BLINKER_F(",\"deviceType\":\"vAssistant\"}");
if (!isJson(data_add)) return false;
BLINKER_LOG_ALL(BLINKER_F("MQTT AliGenie Publish..."));
BLINKER_LOG_FreeHeap_ALL();
if (mqtt_PRO->connected())
{
if (!checkAliKA())
{
return false;
}
if (!checkAliPrintSpan())
{
respAliTime = millis();
return false;
}
respAliTime = millis();
// Adafruit_MQTT_Publish iotPub = Adafruit_MQTT_Publish(mqtt_PRO, BLINKER_PUB_TOPIC_PRO);
// if (! iotPub.publish(payload.c_str())) {
char BLINKER_RRPC_PUB_TOPIC_MQTT[128];
if (is_rrpc)
{
strcpy(BLINKER_RRPC_PUB_TOPIC_MQTT, "/sys/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, MQTT_PRODUCTINFO_PRO);
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, "/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, MQTT_DEVICEID_PRO);
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, "/rrpc/response/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, message_id);
BLINKER_LOG_ALL(BLINKER_F("BLINKER_RRPC_PUB_TOPIC_MQTT: "), BLINKER_RRPC_PUB_TOPIC_MQTT);
}
else
{
strcpy(BLINKER_RRPC_PUB_TOPIC_MQTT, BLINKER_PUB_TOPIC_PRO);
}
is_rrpc = false;
char send_data[1024];
if (_use_broker == aliyun_b)
{
strcpy(send_data, base64::encode(data_add).c_str());
}
else if (_use_broker == blinker_b)
{
strcpy(send_data, data_add.c_str());
}
if (! mqtt_PRO->publish(BLINKER_RRPC_PUB_TOPIC_MQTT, send_data))
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...Failed"));
BLINKER_LOG_FreeHeap_ALL();
isAliAlive = false;
return false;
}
else
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...OK!"));
BLINKER_LOG_FreeHeap_ALL();
isAliAlive = false;
this->latestTime = millis();
return true;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
return false;
}
}
int BlinkerPROESP::duerPrint(const String & data, bool report)
{
String data_add = BLINKER_F("{\"data\":");
if (report)
{
data_add += BLINKER_F("{\"report\":");
if (_use_broker == aliyun_b)
{
data_add += data;
}
else if (_use_broker == blinker_b)
{
data_add += data.substring(0, data.length() - 1);
data_add += BLINKER_F(",\"messageId\":\"");
data_add += STRING_format(_messageId);
data_add += BLINKER_F("\"}");
}
data_add += BLINKER_F("}");
}
else
{
if (_use_broker == aliyun_b)
{
data_add += data;
}
else if (_use_broker == blinker_b)
{
data_add += data.substring(0, data.length() - 1);
data_add += BLINKER_F(",\"messageId\":\"");
data_add += STRING_format(_messageId);
data_add += BLINKER_F("\"}");
}
}
data_add += BLINKER_F(",\"fromDevice\":\"");
data_add += MQTT_DEVICEID_PRO;
if (_use_broker == aliyun_b)
{
data_add += BLINKER_F("\",\"toDevice\":\"DuerOS_r\"");
}
else if (_use_broker == blinker_b)
{
data_add += BLINKER_F("\",\"toDevice\":\"ServerReceiver\"");
}
data_add += BLINKER_F(",\"deviceType\":\"vAssistant\"}");
if (!isJson(data_add)) return false;
BLINKER_LOG_ALL(BLINKER_F("MQTT DuerOS Publish..."));
BLINKER_LOG_FreeHeap_ALL();
if (mqtt_PRO->connected())
{
if (!checkDuerKA())
{
return false;
}
if (!checkDuerPrintSpan())
{
respDuerTime = millis();
return false;
}
respDuerTime = millis();
char BLINKER_RRPC_PUB_TOPIC_MQTT[128];
if (is_rrpc)
{
strcpy(BLINKER_RRPC_PUB_TOPIC_MQTT, "/sys/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, MQTT_PRODUCTINFO_PRO);
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, "/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, MQTT_DEVICEID_PRO);
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, "/rrpc/response/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, message_id);
BLINKER_LOG_ALL(BLINKER_F("BLINKER_RRPC_PUB_TOPIC_MQTT: "), BLINKER_RRPC_PUB_TOPIC_MQTT);
}
else
{
strcpy(BLINKER_RRPC_PUB_TOPIC_MQTT, BLINKER_PUB_TOPIC_PRO);
}
char send_data[1024];
if (_use_broker == aliyun_b)
{
strcpy(send_data, base64::encode(data_add).c_str());
}
else if (_use_broker == blinker_b)
{
strcpy(send_data, data_add.c_str());
}
if (! mqtt_PRO->publish(BLINKER_RRPC_PUB_TOPIC_MQTT, send_data))
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...Failed"));
BLINKER_LOG_FreeHeap_ALL();
is_rrpc = false;
isDuerAlive = false;
return false;
}
else
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...OK!"));
BLINKER_LOG_FreeHeap_ALL();
isDuerAlive = false;
this->latestTime = millis();
is_rrpc = false;
return true;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
return false;
}
}
int BlinkerPROESP::miPrint(const String & data)
{
String data_add = BLINKER_F("{\"data\":");
if (_use_broker == aliyun_b)
{
data_add += data;
}
else if (_use_broker == blinker_b)
{
data_add += data.substring(0, data.length() - 1);
data_add += BLINKER_F(",\"messageId\":\"");
data_add += STRING_format(_messageId);
data_add += BLINKER_F("\"}");
}
data_add += BLINKER_F(",\"fromDevice\":\"");
data_add += MQTT_DEVICEID_PRO;
if (_use_broker == aliyun_b)
{
data_add += BLINKER_F("\",\"toDevice\":\"MIOT_r\"");
}
else if (_use_broker == blinker_b)
{
data_add += BLINKER_F("\",\"toDevice\":\"ServerReceiver\"");
}
data_add += BLINKER_F(",\"deviceType\":\"vAssistant\"}");
if (!isJson(data_add)) return false;
BLINKER_LOG_ALL(BLINKER_F("MQTT MIOT Publish..."));
BLINKER_LOG_FreeHeap_ALL();
if (mqtt_PRO->connected())
{
if (!checkMIOTKA())
{
return false;
}
if (!checkMIOTPrintSpan())
{
respMIOTTime = millis();
return false;
}
respMIOTTime = millis();
char BLINKER_RRPC_PUB_TOPIC_MQTT[128];
if (is_rrpc)
{
strcpy(BLINKER_RRPC_PUB_TOPIC_MQTT, "/sys/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, MQTT_PRODUCTINFO_PRO);
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, "/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, MQTT_DEVICEID_PRO);
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, "/rrpc/response/");
strcat(BLINKER_RRPC_PUB_TOPIC_MQTT, message_id);
BLINKER_LOG_ALL(BLINKER_F("BLINKER_RRPC_PUB_TOPIC_MQTT: "), BLINKER_RRPC_PUB_TOPIC_MQTT);
}
else
{
strcpy(BLINKER_RRPC_PUB_TOPIC_MQTT, BLINKER_PUB_TOPIC_PRO);
}
is_rrpc = false;
char send_data[1024];
if (_use_broker == aliyun_b)
{
strcpy(send_data, base64::encode(data_add).c_str());
}
else if (_use_broker == blinker_b)
{
strcpy(send_data, data_add.c_str());
}
if (! mqtt_PRO->publish(BLINKER_RRPC_PUB_TOPIC_MQTT, send_data))
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...Failed"));
BLINKER_LOG_FreeHeap_ALL();
isMIOTAlive = false;
return false;
}
else
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...OK!"));
BLINKER_LOG_FreeHeap_ALL();
isMIOTAlive = false;
this->latestTime = millis();
return true;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
return false;
}
}
// void BlinkerPROESP::aliType(const String & type)
// {
// _aliType = (char*)malloc((type.length()+1)*sizeof(char));
// strcpy(_aliType, type.c_str());
// BLINKER_LOG_ALL(BLINKER_F("_aliType: "), _aliType);
// }
void BlinkerPROESP::begin(const char* _key, const char* _type)
{
_vipKey = _key;
_deviceType = _type;
BLINKER_LOG_ALL(BLINKER_F("PRO deviceType: "), _type);
mDNSInit();
}
int BlinkerPROESP::autoPrint(unsigned long id)
{
String payload = BLINKER_F("{\"data\":{\"set\":{");
payload += BLINKER_F("\"auto\":{\"trig\":true,");
payload += BLINKER_F("\"id\":");
payload += String(id);
payload += BLINKER_F("}}}");
payload += BLINKER_F(",\"fromDevice\":\"");
payload += STRING_format(MQTT_DEVICEID_PRO);
payload += BLINKER_F("\",\"deviceType\":\"Auto\"");
payload += BLINKER_F(",\"toDevice\":\"serverClient\"}");
// "\",\"deviceType\":\"" + "type" + "\"}";
BLINKER_LOG_ALL(BLINKER_F("autoPrint..."));
if (mqtt_PRO->connected())
{
if ((millis() - linkTime) > BLINKER_LINK_MSG_LIMIT || \
linkTime == 0)
{
// linkTime = millis();
// Adafruit_MQTT_Publish iotPub = Adafruit_MQTT_Publish(mqtt_PRO, BLINKER_PUB_TOPIC_PRO);
// if (! iotPub.publish(payload.c_str())) {
if (! mqtt_PRO->publish(BLINKER_PUB_TOPIC_PRO, payload.c_str()))
{
BLINKER_LOG_ALL(payload);
BLINKER_LOG_ALL(BLINKER_F("...Failed"));
return false;
}
else
{
BLINKER_LOG_ALL(payload);
BLINKER_LOG_ALL(BLINKER_F("...OK!"));
linkTime = millis();
this->latestTime = millis();
return true;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT NOT ALIVE OR MSG LIMIT "), linkTime);
return false;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
return false;
}
}
// bool BlinkerPROESP::autoPrint(char *name, char *type, char *data)
// {
// String payload = BLINKER_F("{\"data\":{");
// payload += STRING_format(data);
// payload += BLINKER_F("},\"fromDevice\":\"");
// payload += STRING_format(MQTT_ID_PRO);
// payload += BLINKER_F("\",\"toDevice\":\"");
// payload += name;
// payload += BLINKER_F("\",\"deviceType\":\"");
// payload += type;
// payload += BLINKER_F("\"}");
// BLINKER_LOG_ALL(BLINKER_F("autoPrint..."));
// if (mqtt_PRO->connected()) {
// if ((millis() - linkTime) > BLINKER_LINK_MSG_LIMIT || \
// linkTime == 0)
// {
// linkTime = millis();
// BLINKER_LOG_ALL(payload, BLINKER_F("...OK!"));
// return true;
// }
// else {
// BLINKER_ERR_LOG_ALL(BLINKER_F("MQTT NOT ALIVE OR MSG LIMIT "), linkTime);
// return false;
// }
// }
// else
// {
// BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
// return false;
// }
// }
// bool BlinkerPROESP::autoPrint(char *name1, char *type1, char *data1
// , char *name2, char *type2, char *data2)
// {
// String payload = BLINKER_F("{\"data\":{");
// payload += STRING_format(data1);
// payload += BLINKER_F("},\"fromDevice\":\"");
// payload += STRING_format(MQTT_ID_PRO);
// payload += BLINKER_F("\",\"toDevice\":\"");
// payload += name1;
// payload += BLINKER_F("\",\"deviceType\":\"");
// payload += type1;
// payload += BLINKER_F("\"}");
// BLINKER_LOG_ALL(BLINKER_F("autoPrint..."));
// if (mqtt_PRO->connected())
// {
// if ((millis() - linkTime) > BLINKER_LINK_MSG_LIMIT || \
// linkTime == 0)
// {
// linkTime = millis();
// BLINKER_LOG_ALL(payload, BLINKER_F("...OK!"));
// payload = BLINKER_F("{\"data\":{");
// payload += STRING_format(data2);
// payload += BLINKER_F("},\"fromDevice\":\"");
// payload += STRING_format(MQTT_ID_PRO);
// payload += BLINKER_F("\",\"toDevice\":\"");
// payload += name2;
// payload += BLINKER_F("\",\"deviceType\":\"");
// payload += type2;
// payload += BLINKER_F("\"}");
// BLINKER_LOG_ALL(payload, BLINKER_F("...OK!"));
// return true;
// }
// else
// {
// BLINKER_ERR_LOG_ALL(BLINKER_F("MQTT NOT ALIVE OR MSG LIMIT "), linkTime);
// return false;
// }
// }
// else
// {
// BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
// return false;
// }
// }
char * BlinkerPROESP::deviceName() { return MQTT_DEVICEID_PRO;/*MQTT_ID_PRO;*/ }
void BlinkerPROESP::sharers(const String & data)
{
BLINKER_LOG_ALL(BLINKER_F("sharers data: "), data);
// DynamicJsonBuffer jsonBuffer;
// JsonObject& root = jsonBuffer.parseObject(data);
DynamicJsonDocument jsonBuffer(1024);
DeserializationError error = deserializeJson(jsonBuffer, data);
JsonObject root = jsonBuffer.as<JsonObject>();
// if (!root.success()) return;
if (error) return;
String user_name = "";
if (_sharerCount)
{
for (_sharerCount; _sharerCount > 0; _sharerCount--)
{
delete _sharers[_sharerCount - 1];
}
}
_sharerCount = 0;
for (uint8_t num = 0; num < BLINKER_MQTT_MAX_SHARERS_NUM; num++)
{
user_name = root["users"][num].as<String>();
if (user_name.length() >= BLINKER_MQTT_USER_UUID_SIZE)
{
BLINKER_LOG_ALL(BLINKER_F("sharer uuid: "), user_name, BLINKER_F(", length: "), user_name.length());
_sharerCount++;
_sharers[num] = new BlinkerSharer(user_name);
}
else
{
break;
}
}
}
int BlinkerPROESP::authCheck()
{
uint8_t _authCheck;
BLINKER_LOG_ALL(BLINKER_F("authCheck start"));
EEPROM.begin(BLINKER_EEP_SIZE);
EEPROM.get(BLINKER_EEP_ADDR_AUTH_CHECK, _authCheck);
if (_authCheck == BLINKER_AUTH_CHECK_DATA)
{
EEPROM.commit();
EEPROM.end();
isAuth = true;
BLINKER_LOG_ALL(BLINKER_F("authCheck end"));
return true;
}
EEPROM.commit();
EEPROM.end();
BLINKER_LOG_ALL(BLINKER_F("authCheck end"));
return false;
}
int BlinkerPROESP::connectServer() {
const int httpsPort = 443;
#if defined(ESP8266)
String host = BLINKER_F(BLINKER_SERVER_HOST);
client_mqtt.stop();
#elif defined(ESP32)
String host = BLINKER_F(BLINKER_SERVER_HTTPS);
#endif
if (!_isAuthKey)
{
#if defined(ESP8266)
// String host = BLINKER_F(BLINKER_SERVER_HOST);
String fingerprint = BLINKER_F("84 5f a4 8a 70 5e 79 7e f5 b3 b4 20 45 c8 35 55 72 f6 85 5a");
// WiFiClientSecure client_s;
// BearSSL::WiFiClientSecure *client_s;
// client_s = new BearSSL::WiFiClientSecure();
// client_mqtt.stop();
// BLINKER_LOG_ALL(BLINKER_F("connecting to "), host);
// // BLINKER_LOG_FreeHeap();
// uint8_t connet_times = 0;
// // client_s.stop();
// ::delay(100);
// bool mfln = client_s->probeMaxFragmentLength(host, httpsPort, 1024);
// if (mfln) {
// client_s->setBufferSizes(1024, 1024);
// }
// // client_s.setFingerprint(fingerprint.c_str());
// client_s->setInsecure();
// // while (1) {
// bool cl_connected = false;
// if (!client_s->connect(host, httpsPort)) {
// BLINKER_ERR_LOG(BLINKER_F("server connection failed"));
// // connet_times++;
// ::delay(1000);
// }
// else {
// BLINKER_LOG_ALL(BLINKER_F("connection succeed"));
// cl_connected = true;
// // break;
// }
// // if (connet_times >= 4 && !cl_connected) return BLINKER_CMD_FALSE;
// // }
// String client_msg;
// String url_iot = BLINKER_F("/api/v1/user/device/register?deviceType=");
// url_iot += _deviceType;
// url_iot += BLINKER_F("&deviceName=");
// url_iot += macDeviceName();
// if (_deviceType == BLINKER_SMART_LAMP) {
// url_iot += BLINKER_F("&aliType=light");
// url_iot += BLINKER_F("&duerType=LIGHT");
// }
// else if (_deviceType == BLINKER_SMART_PLUGIN) {
// url_iot += BLINKER_F("&aliType=outlet");
// url_iot += BLINKER_F("&duerType=SOCKET");
// }
// else if (_deviceType == BLINKER_AIR_DETECTOR) {
// url_iot += BLINKER_F("&aliType=sensor");
// url_iot += BLINKER_F("&duerType=AIR_MONITOR");
// }
// // #if defined(BLINKER_ALIGENIE_LIGHT)
// // url_iot += BLINKER_F("&aliType=light");
// // #elif defined(BLINKER_ALIGENIE_OUTLET)
// // url_iot += BLINKER_F("&aliType=outlet");
// // #elif defined(BLINKER_ALIGENIE_SWITCH)
// // #elif defined(BLINKER_ALIGENIE_SENSOR)
// // url_iot += BLINKER_F("&aliType=sensor");
// // #endif
// BLINKER_LOG_ALL(BLINKER_F("HTTPS begin: "), host, url_iot);
// client_msg = BLINKER_F("GET ");
// client_msg += url_iot;
// client_msg += BLINKER_F(" HTTP/1.1\r\nHost: ");
// client_msg += host;
// client_msg += BLINKER_F(":");
// client_msg += STRING_format(httpsPort);
// client_msg += BLINKER_F("\r\nConnection: close\r\n\r\n");
// client_s->print(client_msg);
// BLINKER_LOG_ALL(BLINKER_F("client_msg: "), client_msg);
// unsigned long timeout = millis();
// while (client_s->available() == 0) {
// if (millis() - timeout > 5000) {
// BLINKER_LOG_ALL(BLINKER_F(">>> Client Timeout !"));
// client_s->stop();
// return false;
// }
// }
// String _dataGet;
// String lastGet;
// String lengthOfJson;
// while (client_s->available()) {
// // String line = client_s.readStringUntil('\r');
// _dataGet = client_s->readStringUntil('\n');
// if (_dataGet.startsWith("Content-Length: ")){
// int addr_start = _dataGet.indexOf(' ');
// int addr_end = _dataGet.indexOf('\0', addr_start + 1);
// lengthOfJson = _dataGet.substring(addr_start + 1, addr_end);
// }
// if (_dataGet == "\r") {
// BLINKER_LOG_ALL(BLINKER_F("headers received"));
// break;
// }
// }
// for(int i=0;i<lengthOfJson.toInt();i++){
// lastGet += (char)client_s->read();
// }
// // BLINKER_LOG_FreeHeap();
// client_s->stop();
// client_s->flush();
// free(client_s);
// // BLINKER_LOG_FreeHeap();
// _dataGet = lastGet;
// BLINKER_LOG_ALL(BLINKER_F("_dataGet: "), _dataGet);
// String payload = _dataGet;
// client_mqtt.stop();
#ifndef BLINKER_WITHOUT_SSL
client_mqtt.stop();
std::unique_ptr<BearSSL::WiFiClientSecure>client_s(new BearSSL::WiFiClientSecure);
// client_s->setFingerprint(fingerprint);
client_s->setInsecure();
#else
WiFiClient client_s;
#endif
String url_iot = BLINKER_F("/api/v1/user/device/auth/get?deviceType=");
url_iot += _deviceType;
url_iot += BLINKER_F("&typeKey=");
url_iot += _vipKey;
url_iot += BLINKER_F("&deviceName=");
url_iot += macDeviceName();
#if defined(BLINKER_ALIGENIE_LIGHT)
url_iot += BLINKER_F("&aliType=light");
#elif defined(BLINKER_ALIGENIE_OUTLET)
url_iot += BLINKER_F("&aliType=outlet");
#elif defined(BLINKER_ALIGENIE_MULTI_OUTLET)
url_iot += BLINKER_F("&aliType=multi_outlet");
#elif defined(BLINKER_ALIGENIE_SENSOR)
url_iot += BLINKER_F("&aliType=sensor");
#elif defined(BLINKER_ALIGENIE_TYPE)
url_iot += BLINKER_ALIGENIE_TYPE;
#endif
#if defined(BLINKER_DUEROS_LIGHT)
url_iot += BLINKER_F("&duerType=LIGHT");
#elif defined(BLINKER_DUEROS_OUTLET)
url_iot += BLINKER_F("&duerType=SOCKET");
#elif defined(BLINKER_DUEROS_MULTI_OUTLET)
url_iot += BLINKER_F("&duerType=MULTI_SOCKET");
#elif defined(BLINKER_DUEROS_SENSOR)
url_iot += BLINKER_F("&duerType=AIR_MONITOR");
#elif defined(BLINKER_DUEROS_TYPE)
url_iot += BLINKER_DUEROS_TYPE;
#endif
#if defined(BLINKER_MIOT_LIGHT)
url_iot += BLINKER_F("&miType=light");
#elif defined(BLINKER_MIOT_OUTLET)
url_iot += BLINKER_F("&miType=outlet");
#elif defined(BLINKER_MIOT_MULTI_OUTLET)
url_iot += BLINKER_F("&miType=multi_outlet");
#elif defined(BLINKER_MIOT_SENSOR)
url_iot += BLINKER_F("&miType=sensor");
#elif defined(BLINKER_MIOT_TYPE)
url_iot += BLINKER_MIOT_TYPE;
#endif
url_iot += BLINKER_F("&version=");
url_iot += BLINKER_OTA_VERSION_CODE;
#ifndef BLINKER_WITHOUT_SSL
url_iot += BLINKER_F("&protocol=mqtts");
#else
url_iot += BLINKER_F("&protocol=mqtt");
#endif
#ifndef BLINKER_WITHOUT_SSL
url_iot = "https://" + host + url_iot;
#else
url_iot = "http://" + host + url_iot;
#endif
BLINKER_LOG_ALL(BLINKER_F("HTTPS begin: "), url_iot);
HTTPClient http;
String payload;
#ifndef BLINKER_WITHOUT_SSL
if (http.begin(*client_s, url_iot)) { // HTTPS
#else
if (http.begin(client_s, url_iot)) {
#endif
// Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
BLINKER_LOG_ALL(BLINKER_F("[HTTP] GET... code: "), httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
payload = http.getString();
// Serial.println(payload);
}
} else {
BLINKER_LOG(BLINKER_F("[HTTP] GET... failed, error: "), http.errorToString(httpCode).c_str());
payload = http.getString();
BLINKER_LOG(payload);
}
http.end();
} else {
// Serial.printf("[HTTPS] Unable to connect\n");
}
#elif defined(ESP32)
// String host = BLINKER_F(BLINKER_SERVER_HTTPS);
// const char* ca = \
// "-----BEGIN CERTIFICATE-----\n" \
// "MIIEgDCCA2igAwIBAgIQDKTfhr9lmWbWUT0hjX36oDANBgkqhkiG9w0BAQsFADBy\n" \
// "MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg\n" \
// "SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy\n" \
// "dXN0QXNpYSBUTFMgUlNBIENBMB4XDTE4MDEwNDAwMDAwMFoXDTE5MDEwNDEyMDAw\n" \
// "MFowGDEWMBQGA1UEAxMNaW90ZGV2LmNsei5tZTCCASIwDQYJKoZIhvcNAQEBBQAD\n" \
// "ggEPADCCAQoCggEBALbOFn7cJ2I/FKMJqIaEr38n4kCuJCCeNf1bWdWvOizmU2A8\n" \
// "QeTAr5e6Q3GKeJRdPnc8xXhqkTm4LOhgdZB8KzuVZARtu23D4vj4sVzxgC/zwJlZ\n" \
// "MRMxN+cqI37kXE8gGKW46l2H9vcukylJX+cx/tjWDfS2YuyXdFuS/RjhCxLgXzbS\n" \
// "cve1W0oBZnBPRSMV0kgxTWj7hEGZNWKIzK95BSCiMN59b+XEu3NWGRb/VzSAiJEy\n" \
// "Hy9DcDPBC9TEg+p5itHtdMhy2gq1OwsPgl9HUT0xmDATSNEV2RB3vwviNfu9/Eif\n" \
// "ObhsV078zf30TqdiESqISEB68gJ0Otru67ePoTkCAwEAAaOCAWowggFmMB8GA1Ud\n" \
// "IwQYMBaAFH/TmfOgRw4xAFZWIo63zJ7dygGKMB0GA1UdDgQWBBR/KLqnke61779P\n" \
// "xc9htonQwLOxPDAYBgNVHREEETAPgg1pb3RkZXYuY2x6Lm1lMA4GA1UdDwEB/wQE\n" \
// "AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwTAYDVR0gBEUwQzA3\n" \
// "BglghkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQu\n" \
// "Y29tL0NQUzAIBgZngQwBAgEwgYEGCCsGAQUFBwEBBHUwczAlBggrBgEFBQcwAYYZ\n" \
// "aHR0cDovL29jc3AyLmRpZ2ljZXJ0LmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2Nh\n" \
// "Y2VydHMuZGlnaXRhbGNlcnR2YWxpZGF0aW9uLmNvbS9UcnVzdEFzaWFUTFNSU0FD\n" \
// "QS5jcnQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAhtM4eyrWB14ajJpQ\n" \
// "ibZ5FbzVuvv2Le0FOSoss7UFCDJUYiz2LiV8yOhL4KTY+oVVkqHaYtcFS1CYZNzj\n" \
// "6xWcqYZJ+pgsto3WBEgNEEe0uLSiTW6M10hm0LFW9Det3k8fqwSlljqMha3gkpZ6\n" \
// "8WB0f2clXOuC+f1SxAOymnGUsSqbU0eFSgevcOIBKR7Hr3YXBXH3jjED76Q52OMS\n" \
// "ucfOM9/HB3jN8o/ioQbkI7xyd/DUQtzK6hSArEoYRl3p5H2P4fr9XqmpoZV3i3gQ\n" \
// "oOdVycVtpLunyUoVAB2DcOElfDxxXCvDH3XsgoIU216VY03MCaUZf7kZ2GiNL+UX\n" \
// "9UBd0Q==\n" \
// "-----END CERTIFICATE-----\n";
// #endif
HTTPClient http;
String url_iot = host;
url_iot += BLINKER_F("/api/v1/user/device/auth/get?deviceType=");
url_iot += _deviceType;
url_iot += BLINKER_F("&typeKey=");
url_iot += _vipKey;
url_iot += BLINKER_F("&deviceName=");
url_iot += macDeviceName();
#if defined(BLINKER_ALIGENIE_LIGHT)
url_iot += BLINKER_F("&aliType=light");
#elif defined(BLINKER_ALIGENIE_OUTLET)
url_iot += BLINKER_F("&aliType=outlet");
#elif defined(BLINKER_ALIGENIE_MULTI_OUTLET)
url_iot += BLINKER_F("&aliType=multi_outlet");
#elif defined(BLINKER_ALIGENIE_SENSOR)
url_iot += BLINKER_F("&aliType=sensor");
#elif defined(BLINKER_ALIGENIE_TYPE)
url_iot += BLINKER_ALIGENIE_TYPE;
#endif
#if defined(BLINKER_DUEROS_LIGHT)
url_iot += BLINKER_F("&duerType=LIGHT");
#elif defined(BLINKER_DUEROS_OUTLET)
url_iot += BLINKER_F("&duerType=SOCKET");
#elif defined(BLINKER_DUEROS_MULTI_OUTLET)
url_iot += BLINKER_F("&duerType=MULTI_SOCKET");
#elif defined(BLINKER_DUEROS_SENSOR)
url_iot += BLINKER_F("&duerType=AIR_MONITOR");
#elif defined(BLINKER_DUEROS_TYPE)
url_iot += BLINKER_DUEROS_TYPE;
#endif
#if defined(BLINKER_MIOT_LIGHT)
url_iot += BLINKER_F("&miType=light");
#elif defined(BLINKER_MIOT_OUTLET)
url_iot += BLINKER_F("&miType=outlet");
#elif defined(BLINKER_MIOT_MULTI_OUTLET)
url_iot += BLINKER_F("&miType=multi_outlet");
#elif defined(BLINKER_MIOT_SENSOR)
url_iot += BLINKER_F("&miType=sensor");
#elif defined(BLINKER_MIOT_TYPE)
url_iot += BLINKER_MIOT_TYPE;
#endif
// #if defined(BLINKER_ALIGENIE_LIGHT)
// url_iot += BLINKER_F("&aliType=light");
// #elif defined(BLINKER_ALIGENIE_OUTLET)
// url_iot += BLINKER_F("&aliType=outlet");
// #elif defined(BLINKER_ALIGENIE_SWITCH)
// #elif defined(BLINKER_ALIGENIE_SENSOR)
// url_iot += BLINKER_F("&aliType=sensor");
// #endif
BLINKER_LOG_ALL(BLINKER_F("HTTPS begin: "), url_iot);
// #if defined(ESP8266)
// http.begin(url_iot, fingerprint); //HTTP
// #elif defined(ESP32)
// http.begin(url_iot, ca); TODO
http.begin(url_iot);
// #endif
int httpCode = http.GET();
String payload;
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
BLINKER_LOG_ALL(BLINKER_F("[HTTP] GET... code: "), httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK) {
payload = http.getString();
// BLINKER_LOG(payload);
}
}
else {
BLINKER_LOG(BLINKER_F("[HTTP] GET... failed, error: "), http.errorToString(httpCode).c_str());
payload = http.getString();
BLINKER_LOG(payload);
}
http.end();
#endif
BLINKER_LOG_ALL(BLINKER_F("reply was:"));
BLINKER_LOG_ALL(BLINKER_F("=============================="));
BLINKER_LOG_ALL(payload);
BLINKER_LOG_ALL(BLINKER_F("=============================="));
// DynamicJsonBuffer jsonBuffer;
// JsonObject& root = jsonBuffer.parseObject(payload);
DynamicJsonDocument jsonBuffer(1024);
DeserializationError error = deserializeJson(jsonBuffer, payload);
JsonObject root = jsonBuffer.as<JsonObject>();
if (STRING_contains_string(payload, BLINKER_CMD_NOTFOUND) || error ||
!STRING_contains_string(payload, BLINKER_CMD_AUTHKEY)) {
// while(1) {
BLINKER_ERR_LOG(BLINKER_F("Maybe you have put in the wrong AuthKey!"));
BLINKER_ERR_LOG(BLINKER_F("Or maybe your request is too frequently!"));
BLINKER_ERR_LOG(BLINKER_F("Or maybe your network is disconnected!"));
// ::delay(60000);
return false;
// }
}
String _getAuthKey = root[BLINKER_CMD_DETAIL][BLINKER_CMD_AUTHKEY];
AUTHKEY_PRO = (char*)malloc((_getAuthKey.length()+1)*sizeof(char));
strcpy(AUTHKEY_PRO, _getAuthKey.c_str());
BLINKER_LOG_ALL(BLINKER_F("===================="));
BLINKER_LOG_ALL(BLINKER_F("AUTHKEY_PRO: "), AUTHKEY_PRO);
BLINKER_LOG_ALL(BLINKER_F("===================="));
_isAuthKey = true;
}
#if defined(ESP8266)
// client_mqtt.stop();
#ifndef BLINKER_WITHOUT_SSL
client_mqtt.stop();
std::unique_ptr<BearSSL::WiFiClientSecure>client_s(new BearSSL::WiFiClientSecure);
// client_s->setFingerprint(fingerprint);
client_s->setInsecure();
#else
WiFiClient client_s;
#endif
String url_iot = BLINKER_F("/api/v1/user/device/auth?authKey=");
url_iot += AUTHKEY_PRO;
// url_iot += _aliType;
// url_iot += _duerType;
#if defined(BLINKER_ALIGENIE_LIGHT)
url_iot += BLINKER_F("&aliType=light");
#elif defined(BLINKER_ALIGENIE_OUTLET)
url_iot += BLINKER_F("&aliType=outlet");
#elif defined(BLINKER_ALIGENIE_MULTI_OUTLET)
url_iot += BLINKER_F("&aliType=multi_outlet");
#elif defined(BLINKER_ALIGENIE_SENSOR)
url_iot += BLINKER_F("&aliType=sensor");
#elif defined(BLINKER_ALIGENIE_TYPE)
url_iot += BLINKER_ALIGENIE_TYPE;
#endif
#if defined(BLINKER_DUEROS_LIGHT)
url_iot += BLINKER_F("&duerType=LIGHT");
#elif defined(BLINKER_DUEROS_OUTLET)
url_iot += BLINKER_F("&duerType=SOCKET");
#elif defined(BLINKER_DUEROS_MULTI_OUTLET)
url_iot += BLINKER_F("&duerType=MULTI_SOCKET");
#elif defined(BLINKER_DUEROS_SENSOR)
url_iot += BLINKER_F("&duerType=AIR_MONITOR");
#elif defined(BLINKER_DUEROS_TYPE)
url_iot += BLINKER_DUEROS_TYPE;
#endif
#if defined(BLINKER_MIOT_LIGHT)
url_iot += BLINKER_F("&miType=light");
#elif defined(BLINKER_MIOT_OUTLET)
url_iot += BLINKER_F("&miType=outlet");
#elif defined(BLINKER_MIOT_MULTI_OUTLET)
url_iot += BLINKER_F("&miType=multi_outlet");
#elif defined(BLINKER_MIOT_SENSOR)
url_iot += BLINKER_F("&miType=sensor");
#elif defined(BLINKER_MIOT_TYPE)
url_iot += BLINKER_MIOT_TYPE;
#endif
url_iot += BLINKER_F("&version=");
url_iot += BLINKER_OTA_VERSION_CODE;
#ifndef BLINKER_WITHOUT_SSL
url_iot += BLINKER_F("&protocol=mqtts");
#else
url_iot += BLINKER_F("&protocol=mqtt");
#endif
#ifndef BLINKER_WITHOUT_SSL
url_iot = "https://" + host + url_iot;
#else
url_iot = "http://" + host + url_iot;
#endif
HTTPClient http;
String payload = "";
BLINKER_LOG_ALL(BLINKER_F("[HTTP] begin: "), url_iot);
#ifndef BLINKER_WITHOUT_SSL
if (http.begin(*client_s, url_iot)) { // HTTPS
#else
if (http.begin(client_s, url_iot)) {
#endif
// Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
BLINKER_LOG_ALL(BLINKER_F("[HTTP] GET... code: "), httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
payload = http.getString();
// Serial.println(payload);
}
} else {
BLINKER_LOG(BLINKER_F("[HTTP] GET... failed, error: "), http.errorToString(httpCode).c_str());
payload = http.getString();
BLINKER_LOG(payload);
}
http.end();
} else {
// Serial.printf("[HTTPS] Unable to connect\n");
}
#elif defined(ESP32)
HTTPClient http;
String url_iot = host;
url_iot += BLINKER_F("/api/v1/user/device/auth?authKey=");
url_iot += AUTHKEY_PRO;
// url_iot += _aliType;
// url_iot += _duerType;
#if defined(BLINKER_ALIGENIE_LIGHT)
url_iot += BLINKER_F("&aliType=light");
#elif defined(BLINKER_ALIGENIE_OUTLET)
url_iot += BLINKER_F("&aliType=outlet");
#elif defined(BLINKER_ALIGENIE_MULTI_OUTLET)
url_iot += BLINKER_F("&aliType=multi_outlet");
#elif defined(BLINKER_ALIGENIE_SENSOR)
url_iot += BLINKER_F("&aliType=sensor");
#elif defined(BLINKER_ALIGENIE_FAN)
url_iot += BLINKER_F("&aliType=fan");
#elif defined(BLINKER_ALIGENIE_AIRCONDITION)
url_iot += BLINKER_F("&aliType=aircondition");
#elif defined(BLINKER_ALIGENIE_TYPE)
url_iot += BLINKER_ALIGENIE_TYPE;
#endif
#if defined(BLINKER_DUEROS_LIGHT)
url_iot += BLINKER_F("&duerType=LIGHT");
#elif defined(BLINKER_DUEROS_OUTLET)
url_iot += BLINKER_F("&duerType=SOCKET");
#elif defined(BLINKER_DUEROS_MULTI_OUTLET)
url_iot += BLINKER_F("&duerType=MULTI_SOCKET");
#elif defined(BLINKER_DUEROS_SENSOR)
url_iot += BLINKER_F("&duerType=AIR_MONITOR");
#elif defined(BLINKER_DUEROS_FAN)
url_iot += BLINKER_F("&duerType=FAN");
#elif defined(BLINKER_DUEROS_AIRCONDITION)
url_iot += BLINKER_F("&duerType=AIR_CONDITION");
#elif defined(BLINKER_DUEROS_TYPE)
url_iot += BLINKER_DUEROS_TYPE;
#endif
#if defined(BLINKER_MIOT_LIGHT)
url_iot += BLINKER_F("&miType=light");
#elif defined(BLINKER_MIOT_OUTLET)
url_iot += BLINKER_F("&miType=outlet");
#elif defined(BLINKER_MIOT_MULTI_OUTLET)
url_iot += BLINKER_F("&miType=multi_outlet");
#elif defined(BLINKER_MIOT_SENSOR)
url_iot += BLINKER_F("&miType=sensor");
#elif defined(BLINKER_MIOT_FAN)
url_iot += BLINKER_F("&miType=fan");
#elif defined(BLINKER_MIOT_AIRCONDITION)
url_iot += BLINKER_F("&miType=aircondition");
#elif defined(BLINKER_MIOT_TYPE)
url_iot += BLINKER_MIOT_TYPE;
#endif
url_iot += BLINKER_F("&version=");
url_iot += BLINKER_OTA_VERSION_CODE;
#ifndef BLINKER_WITHOUT_SSL
url_iot += BLINKER_F("&protocol=mqtts");
#else
url_iot += BLINKER_F("&protocol=mqtt");
#endif
BLINKER_LOG_ALL(BLINKER_F("HTTPS begin: "), url_iot);
// #if defined(ESP8266)
// http.begin(url_iot, fingerprint); //HTTP
// #elif defined(ESP32)
// http.begin(url_iot, ca); TODO
http.begin(url_iot);
// #endif
int httpCode = http.GET();
String payload = "";
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
BLINKER_LOG_ALL(BLINKER_F("[HTTP] GET... code: "), httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK) {
payload = http.getString();
// BLINKER_LOG(payload);
}
}
else {
BLINKER_LOG(BLINKER_F("[HTTP] GET... failed, error: "), http.errorToString(httpCode).c_str());
payload = http.getString();
BLINKER_LOG(payload);
}
http.end();
#endif
BLINKER_LOG_ALL(BLINKER_F("reply was:"));
BLINKER_LOG_ALL(BLINKER_F("=============================="));
BLINKER_LOG_ALL(payload);
BLINKER_LOG_ALL(BLINKER_F("=============================="));
// DynamicJsonBuffer jsonBuffer;
// JsonObject& root = jsonBuffer.parseObject(payload);
DynamicJsonDocument jsonBuffer(1024);
DeserializationError error = deserializeJson(jsonBuffer, payload);
JsonObject root = jsonBuffer.as<JsonObject>();
if (STRING_contains_string(payload, BLINKER_CMD_NOTFOUND) || error ||
!STRING_contains_string(payload, BLINKER_CMD_IOTID)) {
// while(1) {
BLINKER_ERR_LOG(BLINKER_F("Please make sure you have register this device!"));
// ::delay(60000);
return false;
// }
}
// String _userID = STRING_find_string(payload, "deviceName", "\"", 4);
// String _userName = STRING_find_string(payload, "iotId", "\"", 4);
// String _key = STRING_find_string(payload, "iotToken", "\"", 4);
// String _productInfo = STRING_find_string(payload, "productKey", "\"", 4);
// String _broker = STRING_find_string(payload, "broker", "\"", 4);
// String _uuid = STRING_find_string(payload, "uuid", "\"", 4);
String _userID = root[BLINKER_CMD_DETAIL][BLINKER_CMD_DEVICENAME];
String _userName = root[BLINKER_CMD_DETAIL][BLINKER_CMD_IOTID];
String _key = root[BLINKER_CMD_DETAIL][BLINKER_CMD_IOTTOKEN];
if (_key == _userName) {
_key = STRING_find_string(payload, "iotToken", "\"", 4);
}
String _productInfo = root[BLINKER_CMD_DETAIL][BLINKER_CMD_PRODUCTKEY];
String _broker = root[BLINKER_CMD_DETAIL][BLINKER_CMD_BROKER];
String _uuid = root[BLINKER_CMD_DETAIL][BLINKER_CMD_UUID];
String _authKey = root[BLINKER_CMD_DETAIL][BLINKER_CMD_KEY];
String _host = root[BLINKER_CMD_DETAIL]["host"];
uint32_t _port = root[BLINKER_CMD_DETAIL]["port"];
uint8_t _num = _host.indexOf("://");
BLINKER_LOG_ALL("_num: ", _num);
if (_num > 0) _num += 3;
_host = _host.substring(_num, _host.length());
if (isMQTTinit)
{
free(MQTT_HOST_PRO);
free(MQTT_ID_PRO);
free(MQTT_NAME_PRO);
free(MQTT_KEY_PRO);
free(MQTT_PRODUCTINFO_PRO);
free(UUID_PRO);
// free(AUTHKEY_PRO);
free(MQTT_DEVICEID_PRO);
free(BLINKER_PUB_TOPIC_PRO);
free(BLINKER_SUB_TOPIC_PRO);
free(BLINKER_RRPC_SUB_TOPIC_MQTT);
free(mqtt_PRO);
free(iotSub_PRO);
isMQTTinit = false;
}
BLINKER_LOG_ALL(BLINKER_F("===================="));
if (_broker == BLINKER_MQTT_BORKER_ALIYUN) {
// memcpy(DEVICE_NAME, _userID.c_str(), 12);
// String _deviceName = _userID.substring(12, 36);
// MQTT_DEVICEID_PRO = (char*)malloc((_deviceName.length()+1)*sizeof(char));
// String _deviceName = _userID.substring(12, 36);
// MQTT_DEVICEID_PRO = (char*)malloc((_userID.length()+1)*sizeof(char));
// strcpy(MQTT_DEVICEID_PRO, _userID.c_str());
#if defined(BLINKER_WITHOUT_SSL)
MQTT_DEVICEID_PRO = (char*)malloc((24+1)*sizeof(char));
strcpy(MQTT_DEVICEID_PRO, _userName.substring(0, 24).c_str());
#else
MQTT_DEVICEID_PRO = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(MQTT_DEVICEID_PRO, _userID.c_str());
#endif
MQTT_ID_PRO = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(MQTT_ID_PRO, _userID.c_str());
MQTT_NAME_PRO = (char*)malloc((_userName.length()+1)*sizeof(char));
strcpy(MQTT_NAME_PRO, _userName.c_str());
MQTT_KEY_PRO = (char*)malloc((_key.length()+1)*sizeof(char));
strcpy(MQTT_KEY_PRO, _key.c_str());
MQTT_PRODUCTINFO_PRO = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_PRODUCTINFO_PRO, _productInfo.c_str());
MQTT_HOST_PRO = (char*)malloc((strlen(BLINKER_MQTT_ALIYUN_HOST)+1)*sizeof(char));
strcpy(MQTT_HOST_PRO, BLINKER_MQTT_ALIYUN_HOST);
// AUTHKEY_PRO = (char*)malloc((_authKey.length()+1)*sizeof(char));
// strcpy(AUTHKEY_PRO, _authKey.c_str());
MQTT_PORT_PRO = _port;
_use_broker = aliyun_b;
BLINKER_LOG_ALL(BLINKER_F("===================="));
}
else if (_broker == BLINKER_MQTT_BORKER_QCLOUD) {
// String id2name = _userID.subString(10, _userID.length());
// memcpy(DEVICE_NAME, _userID.c_str(), 12);
MQTT_DEVICEID_PRO = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(MQTT_DEVICEID_PRO, _userID.c_str());
String IDtest = _productInfo + _userID;
MQTT_ID_PRO = (char*)malloc((IDtest.length()+1)*sizeof(char));
strcpy(MQTT_ID_PRO, IDtest.c_str());
String NAMEtest = IDtest + ";" + _userName;
MQTT_NAME_PRO = (char*)malloc((NAMEtest.length()+1)*sizeof(char));
strcpy(MQTT_NAME_PRO, NAMEtest.c_str());
MQTT_KEY_PRO = (char*)malloc((_key.length()+1)*sizeof(char));
strcpy(MQTT_KEY_PRO, _key.c_str());
MQTT_PRODUCTINFO_PRO = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_PRODUCTINFO_PRO, _productInfo.c_str());
MQTT_HOST_PRO = (char*)malloc((strlen(BLINKER_MQTT_QCLOUD_HOST)+1)*sizeof(char));
strcpy(MQTT_HOST_PRO, BLINKER_MQTT_QCLOUD_HOST);
MQTT_PORT_PRO = BLINKER_MQTT_QCLOUD_PORT;
}
else if (_broker == BLINKER_MQTT_BORKER_ONENET) {
// memcpy(DEVICE_NAME, _userID.c_str(), 12);
MQTT_DEVICEID_PRO = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(MQTT_DEVICEID_PRO, _userID.c_str());
MQTT_ID_PRO = (char*)malloc((_userName.length()+1)*sizeof(char));
strcpy(MQTT_ID_PRO, _userName.c_str());
MQTT_NAME_PRO = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_NAME_PRO, _productInfo.c_str());
MQTT_KEY_PRO = (char*)malloc((_key.length()+1)*sizeof(char));
strcpy(MQTT_KEY_PRO, _key.c_str());
MQTT_PRODUCTINFO_PRO = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_PRODUCTINFO_PRO, _productInfo.c_str());
MQTT_HOST_PRO = (char*)malloc((strlen(BLINKER_MQTT_ONENET_HOST)+1)*sizeof(char));
strcpy(MQTT_HOST_PRO, BLINKER_MQTT_ONENET_HOST);
MQTT_PORT_PRO = BLINKER_MQTT_ONENET_PORT;
// _use_broker = blinker_b;
}
else if (_broker == BLINKER_MQTT_BORKER_BLINKER) {
// memcpy(DEVICE_NAME_MQTT, _userID.c_str(), 12);
MQTT_DEVICEID_PRO = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(MQTT_DEVICEID_PRO, _userID.c_str());
MQTT_ID_PRO = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(MQTT_ID_PRO, _userID.c_str());
MQTT_NAME_PRO = (char*)malloc((_userName.length()+1)*sizeof(char));
strcpy(MQTT_NAME_PRO, _userName.c_str());
MQTT_KEY_PRO = (char*)malloc((_key.length()+1)*sizeof(char));
strcpy(MQTT_KEY_PRO, _key.c_str());
MQTT_PRODUCTINFO_PRO = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_PRODUCTINFO_PRO, _productInfo.c_str());
MQTT_HOST_PRO = (char*)malloc((_host.length()+1)*sizeof(char));
strcpy(MQTT_HOST_PRO, _host.c_str());
MQTT_PORT_PRO = _port;
_use_broker = blinker_b;
}
UUID_PRO = (char*)malloc((_uuid.length()+1)*sizeof(char));
strcpy(UUID_PRO, _uuid.c_str());
char uuid_eeprom[BLINKER_AUUID_SIZE];
BLINKER_LOG_ALL(BLINKER_F("==========AUTH CHECK=========="));
if (!isFirst)
{
char _authCheck;
EEPROM.begin(BLINKER_EEP_SIZE);
EEPROM.get(BLINKER_EEP_ADDR_AUUID, uuid_eeprom);
if (strcmp(uuid_eeprom, _uuid.c_str()) != 0) {
// strcpy(UUID_PRO, _uuid.c_str());
strcpy(uuid_eeprom, _uuid.c_str());
EEPROM.put(BLINKER_EEP_ADDR_AUUID, uuid_eeprom);
EEPROM.get(BLINKER_EEP_ADDR_AUUID, uuid_eeprom);
BLINKER_LOG_ALL(BLINKER_F("===================="));
BLINKER_LOG_ALL(BLINKER_F("uuid_eeprom: "), uuid_eeprom);
BLINKER_LOG_ALL(BLINKER_F("_uuid: "), _uuid);
isNew = true;
}
EEPROM.get(BLINKER_EEP_ADDR_AUTH_CHECK, _authCheck);
if (_authCheck != BLINKER_AUTH_CHECK_DATA) {
EEPROM.put(BLINKER_EEP_ADDR_AUTH_CHECK, BLINKER_AUTH_CHECK_DATA);
isAuth = true;
}
EEPROM.commit();
EEPROM.end();
isFirst = true;
}
BLINKER_LOG_ALL(BLINKER_F("===================="));
BLINKER_LOG_ALL(BLINKER_F("DEVICE_NAME: "), macDeviceName());
BLINKER_LOG_ALL(BLINKER_F("MQTT_PRODUCTINFO_PRO: "), MQTT_PRODUCTINFO_PRO);
BLINKER_LOG_ALL(BLINKER_F("MQTT_DEVICEID_PRO: "), MQTT_DEVICEID_PRO);
BLINKER_LOG_ALL(BLINKER_F("MQTT_ID_PRO: "), MQTT_ID_PRO);
BLINKER_LOG_ALL(BLINKER_F("MQTT_NAME_PRO: "), MQTT_NAME_PRO);
BLINKER_LOG_ALL(BLINKER_F("MQTT_KEY_PRO: "), MQTT_KEY_PRO);
BLINKER_LOG_ALL(BLINKER_F("MQTT_BROKER: "), _broker);
BLINKER_LOG_ALL(BLINKER_F("HOST: "), MQTT_HOST_PRO);
BLINKER_LOG_ALL(BLINKER_F("PORT: "), MQTT_PORT_PRO);
BLINKER_LOG_ALL(BLINKER_F("UUID_PRO: "), UUID_PRO);
BLINKER_LOG_ALL(BLINKER_F("AUTHKEY_PRO: "), AUTHKEY_PRO);
BLINKER_LOG_ALL(BLINKER_F("===================="));
if (_broker == BLINKER_MQTT_BORKER_ALIYUN) {
String PUB_TOPIC_STR = BLINKER_F("/");
PUB_TOPIC_STR += MQTT_PRODUCTINFO_PRO;
PUB_TOPIC_STR += BLINKER_F("/");
PUB_TOPIC_STR += MQTT_DEVICEID_PRO;
PUB_TOPIC_STR += BLINKER_F("/s");
BLINKER_PUB_TOPIC_PRO = (char*)malloc((PUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_PUB_TOPIC_PRO, PUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_PUB_TOPIC_PRO, PUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_PUB_TOPIC_PRO: "), BLINKER_PUB_TOPIC_PRO);
String SUB_TOPIC_STR = BLINKER_F("/");
SUB_TOPIC_STR += MQTT_PRODUCTINFO_PRO;
SUB_TOPIC_STR += BLINKER_F("/");
SUB_TOPIC_STR += MQTT_DEVICEID_PRO;
SUB_TOPIC_STR += BLINKER_F("/r");
BLINKER_SUB_TOPIC_PRO = (char*)malloc((SUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_SUB_TOPIC_PRO, SUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_SUB_TOPIC_PRO, SUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_SUB_TOPIC_PRO: "), BLINKER_SUB_TOPIC_PRO);
SUB_TOPIC_STR = BLINKER_F("/sys/");
SUB_TOPIC_STR += MQTT_PRODUCTINFO_PRO;
SUB_TOPIC_STR += BLINKER_F("/");
SUB_TOPIC_STR += MQTT_DEVICEID_PRO;
SUB_TOPIC_STR += BLINKER_F("/rrpc/request/");
BLINKER_RRPC_SUB_TOPIC_MQTT = (char*)malloc((SUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_PUB_TOPIC_PRO, PUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_RRPC_SUB_TOPIC_MQTT, SUB_TOPIC_STR.c_str());
}
else if (_broker == BLINKER_MQTT_BORKER_QCLOUD) {
String PUB_TOPIC_STR = MQTT_PRODUCTINFO_PRO;
PUB_TOPIC_STR += BLINKER_F("/");
PUB_TOPIC_STR += _userID;
PUB_TOPIC_STR += BLINKER_F("/s");
BLINKER_PUB_TOPIC_PRO = (char*)malloc((PUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_PUB_TOPIC_PRO, PUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_PUB_TOPIC_PRO, PUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_PUB_TOPIC_PRO: "), BLINKER_PUB_TOPIC_PRO);
String SUB_TOPIC_STR = MQTT_PRODUCTINFO_PRO;
SUB_TOPIC_STR += BLINKER_F("/");
SUB_TOPIC_STR += _userID;
SUB_TOPIC_STR += BLINKER_F("/r");
BLINKER_SUB_TOPIC_PRO = (char*)malloc((SUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_SUB_TOPIC_PRO, SUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_SUB_TOPIC_PRO, SUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_SUB_TOPIC_PRO: "), BLINKER_SUB_TOPIC_PRO);
}
else if (_broker == BLINKER_MQTT_BORKER_ONENET) {
uint8_t str_len;
String PUB_TOPIC_STR = MQTT_PRODUCTINFO_PRO;
PUB_TOPIC_STR += BLINKER_F("/onenet_rule/r");
// str_len = PUB_TOPIC_STR.length() + 1;
BLINKER_PUB_TOPIC_PRO = (char*)malloc((PUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_PUB_TOPIC_PRO, PUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_PUB_TOPIC_PRO, PUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_PUB_TOPIC_PRO: "), BLINKER_PUB_TOPIC_PRO);
String SUB_TOPIC_STR = MQTT_PRODUCTINFO_PRO;
SUB_TOPIC_STR += BLINKER_F("/");
SUB_TOPIC_STR += _userID;
SUB_TOPIC_STR += BLINKER_F("/r");
BLINKER_SUB_TOPIC_PRO = (char*)malloc((SUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_SUB_TOPIC_PRO, SUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_SUB_TOPIC_PRO, SUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_SUB_TOPIC_PRO: "), BLINKER_SUB_TOPIC_PRO);
}
else if (_broker == BLINKER_MQTT_BORKER_BLINKER) {
String PUB_TOPIC_STR = BLINKER_F("/device");
// PUB_TOPIC_STR += MQTT_PRODUCTINFO_MQTT;
PUB_TOPIC_STR += BLINKER_F("/");
PUB_TOPIC_STR += MQTT_ID_PRO;
PUB_TOPIC_STR += BLINKER_F("/s");
BLINKER_PUB_TOPIC_PRO = (char*)malloc((PUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_PUB_TOPIC_MQTT, PUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_PUB_TOPIC_PRO, PUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_PUB_TOPIC_PRO: "), BLINKER_PUB_TOPIC_PRO);
String SUB_TOPIC_STR = BLINKER_F("/device");
// SUB_TOPIC_STR += MQTT_PRODUCTINFO_MQTT;
SUB_TOPIC_STR += BLINKER_F("/");
SUB_TOPIC_STR += MQTT_ID_PRO;
SUB_TOPIC_STR += BLINKER_F("/r");
BLINKER_SUB_TOPIC_PRO = (char*)malloc((SUB_TOPIC_STR.length() + 1)*sizeof(char));
// memcpy(BLINKER_SUB_TOPIC_MQTT, SUB_TOPIC_STR.c_str(), str_len);
strcpy(BLINKER_SUB_TOPIC_PRO, SUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_SUB_TOPIC_PRO: "), BLINKER_SUB_TOPIC_PRO);
// SUB_TOPIC_STR = BLINKER_F("/sys/");
// SUB_TOPIC_STR += MQTT_PRODUCTINFO_MQTT;
// SUB_TOPIC_STR += BLINKER_F("/");
// SUB_TOPIC_STR += MQTT_ID_MQTT;
// SUB_TOPIC_STR += BLINKER_F("/rrpc/request/");
// BLINKER_RRPC_SUB_TOPIC_MQTT = (char*)malloc((SUB_TOPIC_STR.length() + 1)*sizeof(char));
// // memcpy(BLINKER_PUB_TOPIC_MQTT, PUB_TOPIC_STR.c_str(), str_len);
// strcpy(BLINKER_RRPC_SUB_TOPIC_MQTT, SUB_TOPIC_STR.c_str());
}
// BLINKER_LOG_FreeHeap();
if (_broker == BLINKER_MQTT_BORKER_ALIYUN) {
#if defined(ESP8266)
// bool mfln = client_mqtt.probeMaxFragmentLength(MQTT_HOST_PRO, MQTT_PORT_PRO, 4096);
// if (mfln) {
// client_mqtt.setBufferSizes(1024, 1024);
// }
// client_mqtt.setInsecure();
mqtt_PRO = new Adafruit_MQTT_Client(&client_mqtt, MQTT_HOST_PRO, MQTT_PORT_PRO, MQTT_ID_PRO, MQTT_NAME_PRO, MQTT_KEY_PRO);
#elif defined(ESP32)
mqtt_PRO = new Adafruit_MQTT_Client(&client_s, MQTT_HOST_PRO, MQTT_PORT_PRO, MQTT_ID_PRO, MQTT_NAME_PRO, MQTT_KEY_PRO);
#endif
}
else if (_broker == BLINKER_MQTT_BORKER_QCLOUD) {
#if defined(ESP8266)
// bool mfln = client_mqtt.probeMaxFragmentLength(MQTT_HOST_PRO, MQTT_PORT_PRO, 4096);
// if (mfln) {
// client_mqtt.setBufferSizes(1024, 1024);
// }
// client_mqtt.setInsecure();
mqtt_PRO = new Adafruit_MQTT_Client(&client_mqtt, MQTT_HOST_PRO, MQTT_PORT_PRO, MQTT_ID_PRO, MQTT_NAME_PRO, MQTT_KEY_PRO);
#elif defined(ESP32)
mqtt_PRO = new Adafruit_MQTT_Client(&client_s, MQTT_HOST_PRO, MQTT_PORT_PRO, MQTT_ID_PRO, MQTT_NAME_PRO, MQTT_KEY_PRO);
#endif
}
else if (_broker == BLINKER_MQTT_BORKER_ONENET) {
mqtt_PRO = new Adafruit_MQTT_Client(&client, MQTT_HOST_PRO, MQTT_PORT_PRO, MQTT_ID_PRO, MQTT_NAME_PRO, MQTT_KEY_PRO);
}
else if (_broker == BLINKER_MQTT_BORKER_BLINKER) {
#if defined(ESP8266)
// bool mfln = client_mqtt.probeMaxFragmentLength(MQTT_HOST_MQTT, MQTT_PORT_MQTT, 4096);
// if (mfln) {
// client_mqtt.setBufferSizes(1024, 1024);
// }
// client_mqtt.setInsecure();
mqtt_PRO = new Adafruit_MQTT_Client(&client_mqtt, MQTT_HOST_PRO, MQTT_PORT_PRO, MQTT_ID_PRO, MQTT_NAME_PRO, MQTT_KEY_PRO);
#elif defined(ESP32)
mqtt_PRO = new Adafruit_MQTT_Client(&client_s, MQTT_HOST_PRO, MQTT_PORT_PRO, MQTT_ID_PRO, MQTT_NAME_PRO, MQTT_KEY_PRO);
#endif
}
// iotPub = new Adafruit_MQTT_Publish(mqtt_PRO, BLINKER_PUB_TOPIC_PRO);
// if (!isMQTTinit)
iotSub_PRO = new Adafruit_MQTT_Subscribe(mqtt_PRO, BLINKER_SUB_TOPIC_PRO);
// mqtt_broker = (char*)malloc((_broker.length()+1)*sizeof(char));
// strcpy(mqtt_broker, _broker.c_str());
// mqtt_broker = _broker;
MDNS.end();
webSocket_PRO.close();
mDNSInit(MQTT_DEVICEID_PRO);
this->latestTime = millis();
// if (!isMQTTinit)
mqtt_PRO->subscribe(iotSub_PRO);
isMQTTinit = true;
#if defined(ESP8266)
// client_s->stop();
// if (!isMQTTinit)
#ifndef BLINKER_WITHOUT_SSL
client_mqtt.setInsecure();
#endif
#elif defined(ESP32)
client_s.setInsecure();
#endif
// connect();
return true;
}
void BlinkerPROESP::mDNSInit(String name)
{
delay(1000);
BLINKER_LOG(BLINKER_F("WiFi.localIP: "), WiFi.localIP());
// MDNS.end();
#if defined(ESP8266)
if (!MDNS.begin(name.c_str(), WiFi.localIP())) {
#elif defined(ESP32)
if (!MDNS.begin(name.c_str())) {
#endif
while(1) {
::delay(100);
}
}
BLINKER_LOG(BLINKER_F("mDNS responder started"));
String _service = STRING_format(BLINKER_MDNS_SERVICE_BLINKER) + STRING_format(_deviceType);
MDNS.addService(BLINKER_MDNS_SERVICE_BLINKER, "tcp", WS_SERVERPORT);
MDNS.addServiceTxt(BLINKER_MDNS_SERVICE_BLINKER, "tcp", "deviceName", name);
MDNS.addServiceTxt(BLINKER_MDNS_SERVICE_BLINKER, "tcp", "mac", macDeviceName());
// if (!isWSinit)
// {
webSocket_PRO.begin();
webSocket_PRO.onEvent(webSocketEvent_PRO);
// }
BLINKER_LOG(BLINKER_F("webSocket_PRO server started"));
BLINKER_LOG(BLINKER_F("ws://"), name, BLINKER_F(".local:"), WS_SERVERPORT);
// isWSinit = true;
isApCfg = false;
}
void BlinkerPROESP::checkKA() {
if (millis() - kaTime >= BLINKER_MQTT_KEEPALIVE)
isAlive = false;
}
int BlinkerPROESP::checkAliKA() {
if (millis() - aliKaTime >= 10000)
return false;
else
return true;
}
int BlinkerPROESP::checkDuerKA() {
if (millis() - duerKaTime >= 10000)
return false;
else
return true;
}
int BlinkerPROESP::checkMIOTKA() {
if (millis() - miKaTime >= 10000)
return false;
else
return true;
}
int BlinkerPROESP::checkCanPrint() {
if ((millis() - printTime >= BLINKER_PRO_MSG_LIMIT && isAlive) || printTime == 0) {
return true;
}
else {
BLINKER_ERR_LOG(BLINKER_F("MQTT NOT ALIVE OR MSG LIMIT"));
checkKA();
return false;
}
}
int BlinkerPROESP::checkCanBprint() {
if ((millis() - bPrintTime >= BLINKER_BRIDGE_MSG_LIMIT) || bPrintTime == 0) {
return true;
}
else {
BLINKER_ERR_LOG(BLINKER_F("MQTT NOT ALIVE OR MSG LIMIT"));
return false;
}
}
int BlinkerPROESP::checkMIOTPrintSpan()
{
if (millis() - respMIOTTime < BLINKER_PRINT_MSG_LIMIT/2)
{
if (respMIOTTimes > BLINKER_PRINT_MSG_LIMIT/2)
{
BLINKER_ERR_LOG(BLINKER_F("DUEROS NOT ALIVE OR MSG LIMIT"));
return false;
}
else
{
respMIOTTimes++;
return true;
}
}
else
{
respMIOTTimes = 0;
return true;
}
}
int BlinkerPROESP::checkPrintSpan() {
if (millis() - respTime < BLINKER_PRINT_MSG_LIMIT) {
if (respTimes > BLINKER_PRINT_MSG_LIMIT) {
BLINKER_ERR_LOG(BLINKER_F("WEBSOCKETS CLIENT NOT ALIVE OR MSG LIMIT"));
return false;
}
else {
respTimes++;
return true;
}
}
else {
respTimes = 0;
return true;
}
}
int BlinkerPROESP::checkAliPrintSpan()
{
if (millis() - respAliTime < BLINKER_PRINT_MSG_LIMIT/2)
{
if (respAliTimes > BLINKER_PRINT_MSG_LIMIT/2)
{
BLINKER_ERR_LOG(BLINKER_F("ALIGENIE NOT ALIVE OR MSG LIMIT"));
return false;
}
else
{
respAliTimes++;
return true;
}
}
else
{
respAliTimes = 0;
return true;
}
}
int BlinkerPROESP::checkDuerPrintSpan()
{
if (millis() - respDuerTime < BLINKER_PRINT_MSG_LIMIT/2)
{
if (respDuerTimes > BLINKER_PRINT_MSG_LIMIT/2)
{
BLINKER_ERR_LOG(BLINKER_F("DUEROS NOT ALIVE OR MSG LIMIT"));
return false;
}
else
{
respDuerTimes++;
return true;
}
}
else
{
respDuerTimes = 0;
return true;
}
}
int BlinkerPROESP::pubHello()
{
char stateJsonStr[256] = ("{\"message\":\"Registration successful\"}");
BLINKER_LOG_ALL(BLINKER_F("PUB hello: "), stateJsonStr);
return print(stateJsonStr, false);
}
int BlinkerPROESP::isJson(const String & data)
{
BLINKER_LOG_ALL(BLINKER_F("isJson: "), data);
// DynamicJsonBuffer jsonBuffer;
// JsonObject& root = jsonBuffer.parseObject(STRING_format(data));
DynamicJsonDocument jsonBuffer(1024);
DeserializationError error = deserializeJson(jsonBuffer, data);
JsonObject root = jsonBuffer.as<JsonObject>();
// if (!root.success())
if (error)
{
BLINKER_ERR_LOG(BLINKER_F("Print data is not Json! "), data);
return false;
}
return true;
}
// static IPAddress apIP(192, 168, 4, 1);
// #if defined(ESP8266)
// static IPAddress netMsk(255, 255, 255, 0);
// #endif
enum bwl_status_t
{
BWL_CONFIG_CKECK,
BWL_CONFIG_FAIL,
BWL_CONFIG_SUCCESS,
BWL_CONNECTING,
BWL_CONNECTED,
BWL_DISCONNECTED,
BWL_SMARTCONFIG_BEGIN,
BWL_SMARTCONFIG_DONE,
BWL_SMARTCONFIG_TIMEOUT,
BWL_STACONFIG_BEGIN,
BWL_APCONFIG_BEGIN,
BWL_APCONFIG_DONE,
BWL_APCONFIG_TIMEOUT,
BWL_CONNECTED_CHECK,
BWL_RESET
};
class BlinkerWlan
{
public :
BlinkerWlan()
: _status(BWL_CONFIG_CKECK)
{}
bool checkConfig();
void loadConfig(char *_ssid, char *_pswd);
void saveConfig(char *_ssid, char *_pswd);
void deleteConfig();
void smartconfigBegin(uint16_t _time = 15000);
bool smartconfigDone();
void connect();
bool connected();
void disconnect();
void reset();
bool run();
bwl_status_t status() { return _status; }
void setType(const char* _type) {
_deviceType = _type;
#ifdef BLINKER_DEBUG_ALL
BLINKER_LOG(BLINKER_F("API deviceType: "), _type);
#endif
}
void softAPinit();
void serverClient();
void parseUrl(String data);
void connectWiFi(String _ssid, String _pswd);
void connectWiFi(const char* _ssid, const char* _pswd);
// uint8_t status() { return _status; }
private :
protected :
char *SSID;
char *PSWD;
const char* _deviceType;
uint32_t connectTime;
uint16_t timeout;
bwl_status_t _status;
uint32_t debugStatusTime;
};
bool BlinkerWlan::checkConfig() {
BLINKER_LOG_ALL(BLINKER_F("check wlan config"));
char ok[2 + 1];
EEPROM.begin(BLINKER_EEP_SIZE);
EEPROM.get(BLINKER_EEP_ADDR_WLAN_CHECK, ok);
EEPROM.commit();
EEPROM.end();
if (String(ok) != String("OK")) {
BLINKER_LOG(BLINKER_F("wlan config check,fail"));
_status = BWL_CONFIG_FAIL;
return false;
}
else {
BLINKER_LOG(BLINKER_F("wlan config check,success"));
_status = BWL_CONFIG_SUCCESS;
return true;
}
}
void BlinkerWlan::loadConfig(char *_ssid, char *_pswd) {
char loadssid[BLINKER_SSID_SIZE];
char loadpswd[BLINKER_PSWD_SIZE];
EEPROM.begin(BLINKER_EEP_SIZE);
EEPROM.get(BLINKER_EEP_ADDR_SSID, loadssid);
EEPROM.get(BLINKER_EEP_ADDR_PSWD, loadpswd);
// char ok[2 + 1];
// EEPROM.get(EEP_ADDR_WIFI_CFG + BLINKER_SSID_SIZE + BLINKER_PSWD_SIZE, ok);
EEPROM.commit();
EEPROM.end();
strcpy(_ssid, loadssid);
strcpy(_pswd, loadpswd);
BLINKER_LOG(BLINKER_F("SSID: "), _ssid, BLINKER_F(" PASWD: "), _pswd);
}
void BlinkerWlan::saveConfig(char *_ssid, char *_pswd) {
char loadssid[BLINKER_SSID_SIZE];
char loadpswd[BLINKER_PSWD_SIZE];
memcpy(loadssid, _ssid, BLINKER_SSID_SIZE);
memcpy(loadpswd, _pswd, BLINKER_PSWD_SIZE);
EEPROM.begin(BLINKER_EEP_SIZE);
EEPROM.put(BLINKER_EEP_ADDR_SSID, loadssid);
EEPROM.put(BLINKER_EEP_ADDR_PSWD, loadpswd);
char ok[2 + 1] = "OK";
EEPROM.put(BLINKER_EEP_ADDR_WLAN_CHECK, ok);
EEPROM.commit();
EEPROM.end();
BLINKER_LOG(BLINKER_F("Save wlan config"));
}
void BlinkerWlan::deleteConfig() {
char ok[3] = {0};
EEPROM.begin(BLINKER_EEP_SIZE);
// for (int i = BLINKER_EEP_ADDR_WLAN_CHECK; i < BLINKER_WLAN_CHECK_SIZE; i++)
// EEPROM.write(i, 0);
EEPROM.put(BLINKER_EEP_ADDR_WLAN_CHECK, ok);
EEPROM.commit();
EEPROM.end();
BLINKER_LOG(BLINKER_F("Erase wlan config"));
}
void BlinkerWlan::smartconfigBegin(uint16_t _time) {
WiFi.softAPdisconnect();
WiFi.mode(WIFI_STA);
delay(100);
String softAP_ssid = STRING_format(_deviceType) + "_" + macDeviceName();
#if defined(ESP8266)
WiFi.hostname(softAP_ssid);
#elif defined(ESP32)
WiFi.setHostname(softAP_ssid.c_str());
#endif
WiFi.beginSmartConfig();
connectTime = millis();
timeout = _time;
_status = BWL_SMARTCONFIG_BEGIN;
BLINKER_LOG(BLINKER_F("Wait for Smartconfig"));
}
bool BlinkerWlan::smartconfigDone() {
if (WiFi.smartConfigDone())
{
// WiFi.setAutoConnect(true);
// WiFi.setAutoReconnect(true);
connectTime = millis();
_status = BWL_SMARTCONFIG_DONE;
BLINKER_LOG(BLINKER_F("SmartConfig Success"));
#if defined(ESP8266)
BLINKER_LOG(BLINKER_F("SSID: "), WiFi.SSID(), BLINKER_F(" PSWD: "), WiFi.psk());
// WiFi.begin(WiFi.SSID().c_str(), WiFi.psk().c_str());
connectWiFi(WiFi.SSID().c_str(), WiFi.psk().c_str());
// connectWiFi("有没有wifi", "i8888888");
#endif
return true;
}
else {
return false;
}
}
void BlinkerWlan::connect() {
switch (_status) {
case BWL_CONFIG_SUCCESS :
// WiFi.setAutoConnect(false);
// WiFi.setAutoReconnect(true);
SSID = (char*)malloc(BLINKER_SSID_SIZE*sizeof(char));
PSWD = (char*)malloc(BLINKER_PSWD_SIZE*sizeof(char));
loadConfig(SSID, PSWD);
// WiFi.begin(SSID, PSWD);
connectWiFi(SSID, PSWD);
free(SSID);
free(PSWD);
_status = BWL_CONNECTING;
break;
case BWL_DISCONNECTED :
if (millis() - connectTime > 30000 && WiFi.status() != WL_CONNECTED) {
BLINKER_LOG(BLINKER_F("status: "), WiFi.status());
disconnect();
// SSID = (char*)malloc(BLINKER_SSID_SIZE*sizeof(char));
// PSWD = (char*)malloc(BLINKER_PSWD_SIZE*sizeof(char));
// WiFi.reconnect();
char _ssid_[BLINKER_SSID_SIZE];
char _pswd_[BLINKER_PSWD_SIZE];
loadConfig(_ssid_, _pswd_);
connectWiFi(_ssid_, _pswd_);
// WiFi.setAutoConnect(false);
// WiFi.setAutoReconnect(true);
// free(SSID);
// free(PSWD);
connectTime = millis();
BLINKER_LOG(BLINKER_F("connecting BWL_DISCONNECTED"));
BLINKER_LOG(BLINKER_F("_ssid_: "), _ssid_, BLINKER_F(" _pswd_: "), _pswd_);
}
else if(WiFi.status() == WL_CONNECTED) {
_status = BWL_CONNECTED;
}
break;
}
}
bool BlinkerWlan::connected() {
switch (_status) {
case BWL_SMARTCONFIG_DONE :
if (WiFi.status() != WL_CONNECTED) {
if (millis() - connectTime > 15000)
{
BLINKER_LOG(BLINKER_F("smartConfig time out"));
WiFi.stopSmartConfig();
_status = BWL_SMARTCONFIG_TIMEOUT;
}
return false;
}
else if (WiFi.status() == WL_CONNECTED) {
// WiFi.stopSmartConfig();
IPAddress deviceIP = WiFi.localIP();
BLINKER_LOG(BLINKER_F("WiFi connected"));
BLINKER_LOG(BLINKER_F("IP address: "));
BLINKER_LOG(deviceIP);
BLINKER_LOG(BLINKER_F("SSID: "), WiFi.SSID(), BLINKER_F(" PSWD: "), WiFi.psk());
SSID = (char*)malloc(BLINKER_SSID_SIZE*sizeof(char));
PSWD = (char*)malloc(BLINKER_PSWD_SIZE*sizeof(char));
memcpy(SSID,"\0",BLINKER_SSID_SIZE);
memcpy(SSID,WiFi.SSID().c_str(),BLINKER_SSID_SIZE);
memcpy(PSWD,"\0",BLINKER_PSWD_SIZE);
memcpy(PSWD,WiFi.psk().c_str(),BLINKER_PSWD_SIZE);
saveConfig(SSID, PSWD);
free(SSID);
free(PSWD);
// WiFi.setAutoConnect(true);
// WiFi.setAutoReconnect(true);
_status = BWL_CONNECTED_CHECK;
BLINKER_LOG_FreeHeap_ALL();
return true;
}
// break;
case BWL_APCONFIG_DONE :
if (WiFi.status() != WL_CONNECTED) {
if (millis() - connectTime > 15000)
{
BLINKER_LOG(BLINKER_F("APConfig time out"));
// WiFi.stopSmartConfig();
WiFi.disconnect();
_status = BWL_APCONFIG_TIMEOUT;
}
return false;
}
else if (WiFi.status() == WL_CONNECTED) {
IPAddress deviceIP = WiFi.localIP();
BLINKER_LOG(BLINKER_F("WiFi connected"));
BLINKER_LOG(BLINKER_F("IP address: "));
BLINKER_LOG(deviceIP);
BLINKER_LOG(BLINKER_F("SSID: "), WiFi.SSID(), BLINKER_F(" PSWD: "), WiFi.psk());
// SSID = (char*)malloc(BLINKER_SSID_SIZE*sizeof(char));
// PSWD = (char*)malloc(BLINKER_PSWD_SIZE*sizeof(char));
// memcpy(SSID,"\0",BLINKER_SSID_SIZE);
// memcpy(SSID,WiFi.SSID().c_str(),BLINKER_SSID_SIZE);
// memcpy(PSWD,"\0",BLINKER_PSWD_SIZE);
// memcpy(PSWD,WiFi.psk().c_str(),BLINKER_PSWD_SIZE);
saveConfig(SSID, PSWD);
free(SSID);
free(PSWD);
// WiFi.setAutoConnect(true);
// WiFi.setAutoReconnect(true);
_status = BWL_CONNECTED_CHECK;
return true;
}
break;
case BWL_CONNECTING :
if (WiFi.status() == WL_CONNECTED) {
IPAddress deviceIP = WiFi.localIP();
BLINKER_LOG(BLINKER_F("WiFi connected"));
BLINKER_LOG(BLINKER_F("IP address: "));
BLINKER_LOG(deviceIP);
BLINKER_LOG(BLINKER_F("SSID: "), WiFi.SSID(), BLINKER_F(" PSWD: "), WiFi.psk());
_status = BWL_CONNECTED_CHECK;
return true;
}
else if (WiFi.status() != WL_CONNECTED) {
return false;
}
case BWL_CONNECTED_CHECK :
// if (WiFi.status() != WL_CONNECTED)
// _status = BWL_DISCONNECTED;
if (WiFi.status() == WL_CONNECTED)
{
return true;
}
else
{
_status = BWL_DISCONNECTED;
return false;
}
case BWL_RESET :
return false;
default :
if (WiFi.status() == WL_CONNECTED) {
IPAddress deviceIP = WiFi.localIP();
BLINKER_LOG(BLINKER_F("WiFi connected"));
BLINKER_LOG(BLINKER_F("IP address: "));
BLINKER_LOG(deviceIP);
BLINKER_LOG(BLINKER_F("SSID: "), WiFi.SSID(), BLINKER_F(" PSWD: "), WiFi.psk());
_status = BWL_CONNECTED_CHECK;
return true;
}
return false;
}
return false;
}
void BlinkerWlan::disconnect() {
WiFi.disconnect();
delay(100);
_status = BWL_DISCONNECTED;
BLINKER_LOG(BLINKER_F("WiFi disconnected"));
}
void BlinkerWlan::reset() {
disconnect();
_status = BWL_RESET;
}
void BlinkerWlan::softAPinit() {
// _server = new WiFiServer(80);
IPAddress apIP(192, 168, 4, 1);
#if defined(ESP8266)
IPAddress netMsk(255, 255, 255, 0);
#endif
WiFi.mode(WIFI_AP);
delay(1000);
String softAP_ssid = STRING_format(_deviceType) + "_" + macDeviceName();
#if defined(ESP8266)
WiFi.hostname(softAP_ssid.c_str());
WiFi.softAPConfig(apIP, apIP, netMsk);
#elif defined(ESP32)
WiFi.setHostname(softAP_ssid.c_str());
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
#endif
WiFi.softAP(softAP_ssid.c_str(), NULL);
delay(100);
// _server->begin();
// BLINKER_LOG(BLINKER_F("AP IP address: "), WiFi.softAPIP());
// BLINKER_LOG(BLINKER_F("HTTP _server started"));
// BLINKER_LOG(String("URL: http://" + WiFi.softAPIP()));
// #if defined(ESP8266)
// if (!MDNS.begin(softAP_ssid.c_str(), WiFi.localIP())) {
// #elif defined(ESP32)
// if (!MDNS.begin(softAP_ssid.c_str())) {
// #endif
// while(1) {
// ::delay(100);
// }
// }
// BLINKER_LOG(BLINKER_F("mDNS responder started"));
// MDNS.addService(BLINKER_MDNS_SERVICE_BLINKER, "tcp", WS_SERVERPORT);
// MDNS.addServiceTxt(BLINKER_MDNS_SERVICE_BLINKER, "tcp", "deviceName", macDeviceName());
webSocket_PRO.begin();
webSocket_PRO.onEvent(webSocketEvent_PRO);
_status = BWL_APCONFIG_BEGIN;
isApCfg = true;
BLINKER_LOG(BLINKER_F("Wait for APConfig"));
}
void BlinkerWlan::serverClient()
{
webSocket_PRO.loop();
#if defined(ESP8266)
MDNS.update();
#endif
if (isAvail_PRO)
{
BLINKER_LOG(BLINKER_F("checkAPCFG: "), msgBuf_PRO);
if (STRING_contains_string(msgBuf_PRO, "ssid") && \
STRING_contains_string(msgBuf_PRO, "pswd"))
{
parseUrl(msgBuf_PRO);
}
isAvail_PRO = false;
}
// if (!_client)
// {
// _client = _server->available();
// }
// else
// {
// // if (_client.status() == CLOSED)
// if (!_client.connected())
// {
// _client.stop();
// BLINKER_LOG(BLINKER_F("Connection closed on _client"));
// }
// else
// {
// if (_client.available())
// {
// String data = _client.readStringUntil('\r');
// // data = data.substring(4, data.length() - 9);
// _client.flush();
// // BLINKER_LOG("clientData: ", data);
// if (STRING_contains_string(data, "ssid") && STRING_contains_string(data, "pswd")) {
// String msg = BLINKER_F("{\"hello\":\"world\"}");
// String s= BLINKER_F("HTTP/1.1 200 OK\r\nContent-Type: application/json;charset=utf-8\r\n");
// s += BLINKER_F("Content-Length: ");
// s += String(msg.length());
// s += BLINKER_F("\r\nConnection: Keep Alive\r\n\r\n");
// s += msg;
// s += BLINKER_F("\r\n");
// _client.print(s);
// _client.stop();
// parseUrl(data);
// }
// }
// }
// }
}
void BlinkerWlan::parseUrl(String data)
{
BLINKER_LOG(BLINKER_F("APCONFIG data: "), data);
// DynamicJsonBuffer jsonBuffer;
// JsonObject& wifi_data = jsonBuffer.parseObject(data);
DynamicJsonDocument jsonBuffer(1024);
DeserializationError error = deserializeJson(jsonBuffer, data);
JsonObject wifi_data = jsonBuffer.as<JsonObject>();
// if (!wifi_data.success())
if (error)
{
return;
}
String _ssid = wifi_data["ssid"];
String _pswd = wifi_data["pswd"];
BLINKER_LOG(BLINKER_F("ssid: "), _ssid);
BLINKER_LOG(BLINKER_F("pswd: "), _pswd);
// free(_server);
// MDNS.end();
webSocket_PRO.close();
SSID = (char*)malloc(BLINKER_SSID_SIZE*sizeof(char));
PSWD = (char*)malloc(BLINKER_PSWD_SIZE*sizeof(char));
strcpy(SSID, _ssid.c_str());
strcpy(PSWD, _pswd.c_str());
connectWiFi(_ssid, _pswd);
connectTime = millis();
_status = BWL_APCONFIG_DONE;
BLINKER_LOG(BLINKER_F("APConfig Success"));
}
void BlinkerWlan::connectWiFi(String _ssid, String _pswd)
{
connectWiFi(_ssid.c_str(), _pswd.c_str());
}
void BlinkerWlan::connectWiFi(const char* _ssid, const char* _pswd)
{
uint32_t connectTime = millis();
BLINKER_LOG(BLINKER_F("Connecting to "), _ssid);
WiFi.mode(WIFI_STA);
String _hostname = STRING_format(_deviceType) + "_" + macDeviceName();
#if defined(ESP8266)
WiFi.hostname(_hostname);
#elif defined(ESP32)
WiFi.setHostname(_hostname.c_str());
#endif
if (_pswd && strlen(_pswd)) {
WiFi.begin(_ssid, _pswd);
}
else {
WiFi.begin(_ssid);
}
// while (WiFi.status() != WL_CONNECTED) {
// ::delay(50);
// if (millis() - connectTime > BLINKER_CONNECT_TIMEOUT_MS && WiFi.status() != WL_CONNECTED) {
// connectTime = millis();
// BLINKER_LOG(("WiFi connect timeout, please check ssid and pswd!"));
// BLINKER_LOG(("Retring WiFi connect again!"));
// }
// }
// BLINKER_LOG(("Connected"));
// IPAddress myip = WiFi.localIP();
// BLINKER_LOG(("Your IP is: "), myip);
// mDNSInit();
}
bool BlinkerWlan::run()
{
// if (millis() - debugStatusTime > 10000) {
// debugStatusTime = millis();
// BLINKER_LOG_ALL("WLAN status: ", _status);
// }
switch (_status) {
case BWL_CONFIG_CKECK :
checkConfig();
break;
case BWL_CONFIG_FAIL :
// #if defined(BLINKER_ESP_SMARTCONFIG)
// smartconfigBegin();
// #elif defined(BLINKER_APCONFIG)
// softAPinit();
// #endif
if (_configType == BLINKER_SMART_CONFIG)
{
smartconfigBegin();
}
else
{
softAPinit();
}
break;
case BWL_CONFIG_SUCCESS :
connect();
break;
case BWL_CONNECTING :
return connected();
break;
case BWL_CONNECTED :
return connected();
break;
case BWL_DISCONNECTED :
connect();
break;
case BWL_SMARTCONFIG_BEGIN :
if (_configType == BLINKER_SMART_CONFIG)
{
smartconfigDone();
}
else
{
WiFi.stopSmartConfig();
_status = BWL_CONFIG_FAIL;
}
break;
case BWL_SMARTCONFIG_DONE :
return connected();
break;
case BWL_SMARTCONFIG_TIMEOUT :
_status = BWL_CONFIG_FAIL;
break;
case BWL_STACONFIG_BEGIN :
connect();
break;
case BWL_APCONFIG_BEGIN :
serverClient();
break;
case BWL_APCONFIG_DONE :
return connected();
break;
case BWL_APCONFIG_TIMEOUT :
_status = BWL_CONFIG_FAIL;
break;
case BWL_CONNECTED_CHECK :
return connected();
break;
case BWL_RESET:
break;
default :
break;
}
return false;
}
#endif
#endif