1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/coloz-blinker-library

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
BlinkerGateway.h 72 КБ
Копировать Редактировать Исходные данные Просмотреть построчно История
i3water Отправлено 6 лет назад 0c28cfb
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459
#ifndef BLINKER_GATEWAY_H
#define BLINKER_GATEWAY_H
#if defined(ESP8266) || defined(ESP32)
#define BLINKER_GATEWAY
#if defined(ESP8266)
#include <ESP8266mDNS.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#elif defined(ESP32)
#include <ESPmDNS.h>
#include <WiFi.h>
#include <HTTPClient.h>
#endif
// #include <EEPROM.h>
#include "modules/WebSockets/WebSocketsServer.h"
#include "modules/mqtt/Adafruit_MQTT.h"
#include "modules/mqtt/Adafruit_MQTT_Client.h"
#include "modules/ArduinoJson/ArduinoJson.h"
// #include "Adapters/BlinkerGateway.h"
#include "Blinker/BlinkerConfig.h"
#include "Blinker/BlinkerDebug.h"
#include "Blinker/BlinkerStream.h"
#include "Blinker/BlinkerUtility.h"
enum b_config_t {
COMM,
SMART,
APCFG
};
enum b_configStatus_t {
SMART_BEGIN,
SMART_DONE,
SMART_TIMEOUT,
APCFG_BEGIN,
APCFG_DONE,
APCFG_TIMEOUT
};
// static WiFiServer *_apServer;
// static WiFiClient _apClient;
// class BlinkerSharer
// {
// public :
// BlinkerSharer(const String & _uuid)
// {
// name = (char*)malloc((_uuid.length()+1)*sizeof(char));
// strcpy(name, _uuid.c_str());
// }
// char * uuid() { return name; }
// private :
// char * name;
// };
class BlinkerGateway : public BlinkerStream
{
public :
BlinkerGateway();
int connect();
int connected();
int mConnected();
void disconnect();
void ping();
int available();
int aligenieAvail();
int duerAvail();
// bool extraAvailable();
void subscribe();
char * lastRead();
void flush();
int print(char * data, bool needCheck = true);
int bPrint(char * name, const String & data);
int aliPrint(const String & data);
int duerPrint(const String & data);
void aliType(const String & type);
void duerType(const String & type);
void begin(const char* auth);
bool begin();
int autoPrint(uint32_t 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; }
int init() { if (!isMQTTinit) checkInit(); return isMQTTinit; }
int reRegister() { return connectServer(); }
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;
}
}
bool checkInit();
void commonBegin(const char* _ssid, const char* _pswd);
void smartconfigBegin();
void apconfigBegin();
bool autoInit();
void smartconfig();
#if defined(BLINKER_APCONFIG)
void softAPinit();
void checkAPCFG();
bool parseUrl(String data);
#endif
void connectWiFi(String _ssid, String _pswd);
void connectWiFi(const char* _ssid, const char* _pswd);
private :
bool isMQTTinit = false;
int connectServer();
void mDNSInit();
void checkKA();
int checkAliKA();
int checkDuerKA();
int checkCanPrint();
int checkCanBprint();
int checkPrintSpan();
int checkAliPrintSpan();
int checkDuerPrintSpan();
protected :
BlinkerSharer * _sharers[BLINKER_MQTT_MAX_SHARERS_NUM];
uint8_t _sharerCount = 0;
uint8_t _sharerFrom = BLINKER_MQTT_FROM_AUTHER;
bool _isWiFiInit = false;
bool _isBegin = false;
b_config_t _configType = COMM;
b_configStatus_t _configStatus = SMART_BEGIN;
uint32_t _connectTime = 0;
// const char* _authKey;
char* _authKey;
char* _aliType;
char* _duerType;
// char _authKey[BLINKER_AUTHKEY_SIZE];
bool* isHandle;// = &isConnect;
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;
uint32_t aliKaTime = 0;
bool isAliAlive = false;
bool isAliAvail = false;
uint32_t duerKaTime = 0;
bool isDuerAlive = false;
bool isDuerAvail = false;
char* mqtt_broker;
int isJson(const String & data);
#if defined(BLINKER_APCONFIG)
WiFiServer *_apServer;
WiFiClient _apClient;
#endif
};
char* MQTT_HOST_MQTT;
char* MQTT_ID_MQTT;
char* MQTT_NAME_MQTT;
char* MQTT_KEY_MQTT;
char* MQTT_PRODUCTINFO_MQTT;
char* UUID_MQTT;
char* DEVICE_NAME_MQTT;
char* BLINKER_PUB_TOPIC_MQTT;
char* BLINKER_SUB_TOPIC_MQTT;
uint16_t MQTT_PORT_MQTT;
#if defined(ESP8266)
BearSSL::WiFiClientSecure client_mqtt;
// WiFiClientSecure client_mqtt;
#elif defined(ESP32)
WiFiClientSecure client_s;
#endif
WiFiClient client;
Adafruit_MQTT_Client* mqtt_MQTT;
// Adafruit_MQTT_Publish *iotPub;
Adafruit_MQTT_Subscribe* iotSub_MQTT;
#define WS_SERVERPORT 81
WebSocketsServer webSocket_MQTT = WebSocketsServer(WS_SERVERPORT);
char* msgBuf_MQTT;
bool isFresh_MQTT = false;
bool isConnect_MQTT = false;
bool isAvail_MQTT = false;
uint8_t ws_num_MQTT = 0;
uint8_t dataFrom_MQTT = BLINKER_MSG_FROM_MQTT;
void webSocketEvent_MQTT(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_MQTT = false;
break;
case WStype_CONNECTED:
{
IPAddress ip = webSocket_MQTT.remoteIP(num);
BLINKER_LOG_ALL(BLINKER_F("num: "), num, \
BLINKER_F(", Connected from: "), ip,
BLINKER_F(", url: "), (char *)payload);
// send message to client
webSocket_MQTT.sendTXT(num, "{\"state\":\"connected\"}\n");
ws_num_MQTT = num;
isConnect_MQTT = 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_MQTT) free(msgBuf_MQTT);
msgBuf_MQTT = (char*)malloc((length+1)*sizeof(char));
strcpy(msgBuf_MQTT, (char*)payload);
isAvail_MQTT = true;
isFresh_MQTT = true;
}
dataFrom_MQTT = BLINKER_MSG_FROM_WS;
ws_num_MQTT = num;
// send message to client
// webSocket_MQTT.sendTXT(num, "message here");
// send data to all connected clients
// webSocket_MQTT.broadcastTXT("message here");
break;
case WStype_BIN:
// BLINKER_LOG("num: ", num, " get binary length: ", length);
// hexdump(payload, length);
// send message to client
// webSocket_MQTT.sendBIN(num, payload, length);
break;
default :
break;
}
}
BlinkerGateway::BlinkerGateway() { isHandle = &isConnect_MQTT; }
int BlinkerGateway::connect()
{
if (!checkInit()) return false;
int8_t ret;
webSocket_MQTT.loop();
if (mqtt_MQTT->connected())
{
return true;
}
disconnect();
if ((millis() - latestTime) < BLINKER_MQTT_CONNECT_TIMESLOT && latestTime > 0)
{
yield();
return false;
}
BLINKER_LOG(BLINKER_F("Connecting to MQTT... "));
// BLINKER_LOG_ALL(BLINKER_F("MQTT_ID_MQTT: "), MQTT_ID_MQTT);
// BLINKER_LOG_ALL(BLINKER_F("MQTT_NAME_MQTT: "), MQTT_NAME_MQTT);
// BLINKER_LOG_ALL(BLINKER_F("MQTT_KEY_MQTT: "), MQTT_KEY_MQTT);
#if defined(ESP8266)
client_mqtt.setInsecure();
::delay(10);
#endif
if ((ret = mqtt_MQTT->connect()) != 0)
{
BLINKER_LOG(mqtt_MQTT->connectErrorString(ret));
BLINKER_LOG(BLINKER_F("Retrying MQTT connection in "), \
BLINKER_MQTT_CONNECT_TIMESLOT/1000, \
BLINKER_F(" seconds..."));
if (ret == 4) reRegister();
this->latestTime = millis();
return false;
}
BLINKER_LOG(BLINKER_F("MQTT Connected!"));
BLINKER_LOG_FreeHeap();
if (!isMQTTinit)
{
isMQTTinit = true;
mqtt_MQTT->subscribeTopic(BLINKER_SUB_TOPIC_MQTT);
BLINKER_LOG_ALL(BLINKER_F("MQTT subscribe: "), BLINKER_SUB_TOPIC_MQTT);
}
this->latestTime = millis();
return true;
}
int BlinkerGateway::connected()
{
if (!checkInit()) return false;
if (!isMQTTinit)
{
return *isHandle;
}
return mqtt_MQTT->connected() || *isHandle;
}
int BlinkerGateway::mConnected()
{
if (!checkInit()) return false;
if (!isMQTTinit) return false;
else return mqtt_MQTT->connected();
}
void BlinkerGateway::disconnect()
{
if (!checkInit()) return;
mqtt_MQTT->disconnect();
if (*isHandle) webSocket_MQTT.disconnect();
}
void BlinkerGateway::ping()
{
if (!checkInit()) return;
BLINKER_LOG(BLINKER_F("MQTT Ping!"));
BLINKER_LOG_FreeHeap_ALL();
if (!mqtt_MQTT->ping())
{
disconnect();
// delay(100);
// connect();
}
else
{
this->latestTime = millis();
}
}
int BlinkerGateway::available()
{
if (!checkInit()) return false;
webSocket_MQTT.loop();
checkKA();
// if (!mqtt_MQTT->connected() ||
// (millis() - this->latestTime) > BLINKER_MQTT_PING_TIMEOUT)
if ((millis() - this->latestTime) > BLINKER_MQTT_PING_TIMEOUT)
{
ping();
}
else
{
subscribe();
}
if (isAvail_MQTT)
{
isAvail_MQTT = false;
return true;
}
else {
return false;
}
}
int BlinkerGateway::aligenieAvail()
{
if (!checkInit()) return false;
if (isAliAvail)
{
isAliAvail = false;
return true;
}
else {
return false;
}
}
int BlinkerGateway::duerAvail()
{
if (!checkInit()) return false;
if (isDuerAvail)
{
isDuerAvail = false;
return true;
}
else {
return false;
}
}
// bool BlinkerGateway::extraAvailable()
// {
// if (isBavail)
// {
// isBavail = false;
// return true;
// }
// else
// {
// return false;
// }
// }
void BlinkerGateway::subscribe()
{
if (!checkInit()) return;
if (!isMQTTinit) return;
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt_MQTT->readSubscription(10)))
{
if (subscription == iotSub_MQTT)
{
BLINKER_LOG_ALL(BLINKER_F("Got: "), (char *)iotSub_MQTT->lastread);
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(String((char *)iotSub_MQTT->lastread));
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_MQTT) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("Authority uuid"));
kaTime = millis();
isAvail_MQTT = 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_SERVERCLIENT)
{
BLINKER_LOG_ALL(BLINKER_F("form Sever"));
isAvail_MQTT = 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, \
check is from bridge/share device, \
data: "), dataGet);
_needCheckShare = true;
}
}
}
// else
// {
// dataGet = String((char *)iotSub_MQTT->lastread);
root.printTo(dataGet);
// BLINKER_ERR_LOG_ALL(BLINKER_F("No authority uuid, \
// check is from bridge/share device, \
// data: "), dataGet);
// // return;
// // isBavail = true;
// _needCheckShare = true;
// }
isAvail_MQTT = true;
isAlive = true;
}
// memset(msgBuf_MQTT, 0, BLINKER_MAX_READ_SIZE);
// memcpy(msgBuf_MQTT, dataGet.c_str(), dataGet.length());
if (isFresh_MQTT) free(msgBuf_MQTT);
msgBuf_MQTT = (char*)malloc((dataGet.length()+1)*sizeof(char));
strcpy(msgBuf_MQTT, dataGet.c_str());
isFresh_MQTT = true;
this->latestTime = millis();
dataFrom_MQTT = BLINKER_MSG_FROM_MQTT;
}
}
}
char * BlinkerGateway::lastRead()
{
if (isFresh_MQTT) return msgBuf_MQTT;
else return "";
}
void BlinkerGateway::flush()
{
if (isFresh_MQTT)
{
free(msgBuf_MQTT); isFresh_MQTT = false; isAvail_MQTT = false;
isAliAvail = false; //isBavail = false;
}
}
int BlinkerGateway::print(char * data, bool needCheck)
{
if (!checkInit()) return false;
// BLINKER_LOG_FreeHeap();
if (*isHandle && dataFrom_MQTT == 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("Succese..."));
strcat(data, BLINKER_CMD_NEWLINE);
webSocket_MQTT.sendTXT(ws_num_MQTT, 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_ID_MQTT;
// // payload += BLINKER_F("\",\"toDevice\":\"");
// // payload += UUID_MQTT;
// // 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_ID_MQTT;
// // payload += BLINKER_F("\",\"toDevice\":\"");
// // payload += UUID_MQTT;
// // payload += BLINKER_F("\",\"deviceType\":\"OwnApp\"}");
// }
uint16_t num = strlen(data);
data[num+8] = '\0';
for(uint16_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 = BLINKER_F(",\"fromDevice\":\"");
strcat(data, data_add.c_str());
strcat(data, MQTT_ID_MQTT);
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_MQTT);
}
data_add = BLINKER_F("\",\"deviceType\":\"OwnApp\"}");
strcat(data, data_add.c_str());
_sharerFrom = BLINKER_MQTT_FROM_AUTHER;
if (!isJson(STRING_format(data))) 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_MQTT->connected())
{
if (needCheck)
{
if (!checkCanPrint())
{
if (!_alive)
{
isAlive = false;
}
return false;
}
}
if (! mqtt_MQTT->publish(BLINKER_PUB_TOPIC_MQTT, 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 BlinkerGateway::bPrint(char * name, const String & data)
{
if (!checkInit()) return false;
// 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_ID_MQTT;
// payload += BLINKER_F("\",\"toDevice\":\"");
// payload += name;
// payload += BLINKER_F("\",\"deviceType\":\"DiyBridge\"}");
// }
// else
// {
// payload = BLINKER_F("{\"data\":");
// payload += data;
// payload += BLINKER_F(",\"fromDevice\":\"");
// payload += MQTT_ID_MQTT;
// 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_ID_MQTT;
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_ID_MQTT);
// 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_MQTT->connected()) {
// if (!state) {
if (!checkCanBprint()) {
// if (!_alive) {
// isAlive = false;
// }
return false;
}
// }
// Adafruit_MQTT_Publish iotPub = Adafruit_MQTT_Publish(mqtt_MQTT, BLINKER_PUB_TOPIC_MQTT);
// if (! iotPub.publish(payload.c_str())) {
String bPubTopic = BLINKER_F("");
if (strcmp(mqtt_broker, BLINKER_MQTT_BORKER_ONENET) == 0)
{
bPubTopic = MQTT_PRODUCTINFO_MQTT;
bPubTopic += BLINKER_F("/");
bPubTopic += name;
bPubTopic += BLINKER_F("/r");
}
else
{
bPubTopic = BLINKER_PUB_TOPIC_MQTT;
}
if (! mqtt_MQTT->publish(bPubTopic.c_str(), 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 BlinkerGateway::aliPrint(const String & data)
{
if (!checkInit()) return false;
String data_add = BLINKER_F("{\"data\":");
data_add += data;
data_add += BLINKER_F(",\"fromDevice\":\"");
data_add += MQTT_ID_MQTT;
data_add += BLINKER_F("\",\"toDevice\":\"AliGenie_r\"");
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_MQTT->connected())
{
if (!checkAliKA())
{
return false;
}
if (!checkAliPrintSpan())
{
respAliTime = millis();
return false;
}
respAliTime = millis();
if (! mqtt_MQTT->publish(BLINKER_PUB_TOPIC_MQTT, data_add.c_str()))
{
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 BlinkerGateway::duerPrint(const String & data)
{
if (!checkInit()) return false;
String data_add = BLINKER_F("{\"data\":");
data_add += data;
data_add += BLINKER_F(",\"fromDevice\":\"");
data_add += MQTT_ID_MQTT;
data_add += BLINKER_F("\",\"toDevice\":\"DuerOS_r\"");
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_MQTT->connected())
{
if (!checkDuerKA())
{
return false;
}
if (!checkDuerPrintSpan())
{
respDuerTime = millis();
return false;
}
respDuerTime = millis();
if (! mqtt_MQTT->publish(BLINKER_PUB_TOPIC_MQTT, data_add.c_str()))
{
BLINKER_LOG_ALL(data_add);
BLINKER_LOG_ALL(BLINKER_F("...Failed"));
BLINKER_LOG_FreeHeap_ALL();
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();
return true;
}
}
else
{
BLINKER_ERR_LOG(BLINKER_F("MQTT Disconnected"));
return false;
}
}
void BlinkerGateway::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 BlinkerGateway::duerType(const String & type)
{
_duerType = (char*)malloc((type.length()+1)*sizeof(char));
strcpy(_duerType, type.c_str());
BLINKER_LOG_ALL(BLINKER_F("_duerType: "), _duerType);
}
void BlinkerGateway::begin(const char* auth) {
// if (!checkInit()) return;
// _authKey = auth;
_authKey = (char*)malloc((strlen(auth)+1)*sizeof(char));
strcpy(_authKey, auth);
BLINKER_LOG_ALL(BLINKER_F("_authKey: "), auth);
}
bool BlinkerGateway::begin() {
// if (connectServer()) {
// mDNSInit();
// isMQTTinit = true;
// }
// else {
// uint32_t re_time = millis();
if (isMQTTinit) return true;
// bool isConnect_MQTT = true;
// while(1)
// {
// re_time = millis();
// ::delay(10000);
// BLINKER_ERR_LOG("Maybe you have put in the wrong AuthKey!");
// BLINKER_ERR_LOG("Or maybe your request is too frequently!");
// BLINKER_ERR_LOG("Or maybe your network is disconnected!");
if (_connectTime == 0 || (millis() - _connectTime) >= 10000)
{
_connectTime = millis();
if (connectServer()) {
mDNSInit();
isMQTTinit = true;
return true;
}
else {
isMQTTinit = false;
// ::delay(10000);
// BLINKER_ERR_LOG("init error, ", _connectTime);
// BLINKER_ERR_LOG("Maybe you have put in the wrong AuthKey!");
// BLINKER_ERR_LOG("Or maybe your request is too frequently!");
// BLINKER_ERR_LOG("Or maybe your network is disconnected!");
return false;
}
}
// BLINKER_ERR_LOG("init error1, ", _connectTime);
// ::delay(1000);
return false;
// delay(10000);
// while ((millis() - re_time) < 10000)
// {
// if (WiFi.status() != WL_CONNECTED && isConnect_MQTT)
// {
// isConnect_MQTT = false;
// WiFi.begin();
// WiFi.reconnect();
// }
// else if (WiFi.status() == WL_CONNECTED && !isConnect_MQTT)
// {
// isConnect_MQTT = true;
// }
// // ::delay(10);
// yield();
// // WiFi.status();
// }
// }
// }
}
int BlinkerGateway::autoPrint(uint32_t id)
{
String payload = BLINKER_F("{\"data\":{\"set\":{");
payload += BLINKER_F("\"trigged\":true,\"autoData\":{");
payload += BLINKER_F("\"autoId\":");
payload += STRING_format(id);
payload += BLINKER_F("}}}");
payload += BLINKER_F(",\"fromDevice\":\"");
payload += STRING_format(MQTT_ID_MQTT);
payload += BLINKER_F("\",\"toDevice\":\"autoManager\"}");
// "\",\"deviceType\":\"" + "type" + "\"}";
BLINKER_LOG_ALL(BLINKER_F("autoPrint..."));
if (mqtt_MQTT->connected())
{
if ((millis() - linkTime) > BLINKER_LINK_MSG_LIMIT || \
linkTime == 0)
{
// linkTime = millis();
// Adafruit_MQTT_Publish iotPub = Adafruit_MQTT_Publish(mqtt_MQTT, BLINKER_PUB_TOPIC_MQTT);
// if (! iotPub.publish(payload.c_str())) {
if (! mqtt_MQTT->publish(BLINKER_PUB_TOPIC_MQTT, 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 BlinkerGateway::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_MQTT);
// payload += BLINKER_F("\",\"toDevice\":\"");
// payload += name;
// payload += BLINKER_F("\",\"deviceType\":\"");
// payload += type;
// payload += BLINKER_F("\"}");
// BLINKER_LOG_ALL(BLINKER_F("autoPrint..."));
// if (mqtt_MQTT->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 BlinkerGateway::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_MQTT);
// payload += BLINKER_F("\",\"toDevice\":\"");
// payload += name1;
// payload += BLINKER_F("\",\"deviceType\":\"");
// payload += type1;
// payload += BLINKER_F("\"}");
// BLINKER_LOG_ALL(BLINKER_F("autoPrint..."));
// if (mqtt_MQTT->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_MQTT);
// 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 * BlinkerGateway::deviceName() { return DEVICE_NAME_MQTT;/*MQTT_ID_MQTT;*/ }
void BlinkerGateway::sharers(const String & data)
{
BLINKER_LOG_ALL(BLINKER_F("sharers data: "), data);
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(data);
if (!root.success()) return;
String user_name = "";
if (_sharerCount)
{
for (uint8_t num = _sharerCount; num > 0; num--)
{
delete _sharers[num - 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 BlinkerGateway::connectServer() {
const int httpsPort = 443;
#if defined(ESP8266)
String host = BLINKER_F("iotdev.clz.me");
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();
// 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/diy/auth?authKey=");
// url_iot += _authKey;
// 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_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();
std::unique_ptr<BearSSL::WiFiClientSecure>client_s(new BearSSL::WiFiClientSecure);
// client_s->setFingerprint(fingerprint);
client_s->setInsecure();
String url_iot = BLINKER_F("/api/v1/user/device/diy/auth?authKey=");
url_iot += _authKey;
url_iot += _aliType;
url_iot += _duerType;
url_iot = "https://" + host + url_iot;
HTTPClient http;
String payload;
if (http.begin(*client_s, url_iot)) { // HTTPS
// 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("https://iotdev.clz.me");
// 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/diy/auth?authKey=");
url_iot += _authKey;
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_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
// payload = "";
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);
if (STRING_contains_string(payload, BLINKER_CMD_NOTFOUND) || !root.success() ||
!STRING_contains_string(payload, BLINKER_CMD_IOTID)) {
// 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 _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];
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];
if (isMQTTinit)
{
free(MQTT_HOST_MQTT);
free(MQTT_ID_MQTT);
free(MQTT_NAME_MQTT);
free(MQTT_KEY_MQTT);
free(MQTT_PRODUCTINFO_MQTT);
free(UUID_MQTT);
free(DEVICE_NAME_MQTT);
free(BLINKER_PUB_TOPIC_MQTT);
free(BLINKER_SUB_TOPIC_MQTT);
free(mqtt_MQTT);
free(iotSub_MQTT);
isMQTTinit = false;
}
if (_broker == BLINKER_MQTT_BORKER_ALIYUN) {
// memcpy(DEVICE_NAME_MQTT, _userID.c_str(), 12);
DEVICE_NAME_MQTT = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(DEVICE_NAME_MQTT, _userID.c_str());
MQTT_ID_MQTT = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(MQTT_ID_MQTT, _userID.c_str());
MQTT_NAME_MQTT = (char*)malloc((_userName.length()+1)*sizeof(char));
strcpy(MQTT_NAME_MQTT, _userName.c_str());
MQTT_KEY_MQTT = (char*)malloc((_key.length()+1)*sizeof(char));
strcpy(MQTT_KEY_MQTT, _key.c_str());
MQTT_PRODUCTINFO_MQTT = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_PRODUCTINFO_MQTT, _productInfo.c_str());
MQTT_HOST_MQTT = (char*)malloc((strlen(BLINKER_MQTT_ALIYUN_HOST)+1)*sizeof(char));
strcpy(MQTT_HOST_MQTT, BLINKER_MQTT_ALIYUN_HOST);
MQTT_PORT_MQTT = BLINKER_MQTT_ALIYUN_PORT;
}
else if (_broker == BLINKER_MQTT_BORKER_QCLOUD) {
// String id2name = _userID.subString(10, _userID.length());
// memcpy(DEVICE_NAME_MQTT, _userID.c_str(), 12);
DEVICE_NAME_MQTT = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(DEVICE_NAME_MQTT, _userID.c_str());
String IDtest = _productInfo + _userID;
MQTT_ID_MQTT = (char*)malloc((IDtest.length()+1)*sizeof(char));
strcpy(MQTT_ID_MQTT, IDtest.c_str());
String NAMEtest = IDtest + ";" + _userName;
MQTT_NAME_MQTT = (char*)malloc((NAMEtest.length()+1)*sizeof(char));
strcpy(MQTT_NAME_MQTT, NAMEtest.c_str());
MQTT_KEY_MQTT = (char*)malloc((_key.length()+1)*sizeof(char));
strcpy(MQTT_KEY_MQTT, _key.c_str());
MQTT_PRODUCTINFO_MQTT = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_PRODUCTINFO_MQTT, _productInfo.c_str());
MQTT_HOST_MQTT = (char*)malloc((strlen(BLINKER_MQTT_QCLOUD_HOST)+1)*sizeof(char));
strcpy(MQTT_HOST_MQTT, BLINKER_MQTT_QCLOUD_HOST);
MQTT_PORT_MQTT = BLINKER_MQTT_QCLOUD_PORT;
}
else if (_broker == BLINKER_MQTT_BORKER_ONENET) {
// memcpy(DEVICE_NAME_MQTT, _userID.c_str(), 12);
DEVICE_NAME_MQTT = (char*)malloc((_userID.length()+1)*sizeof(char));
strcpy(DEVICE_NAME_MQTT, _userID.c_str());
MQTT_ID_MQTT = (char*)malloc((_userName.length()+1)*sizeof(char));
strcpy(MQTT_ID_MQTT, _userName.c_str());
MQTT_NAME_MQTT = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_NAME_MQTT, _productInfo.c_str());
MQTT_KEY_MQTT = (char*)malloc((_key.length()+1)*sizeof(char));
strcpy(MQTT_KEY_MQTT, _key.c_str());
MQTT_PRODUCTINFO_MQTT = (char*)malloc((_productInfo.length()+1)*sizeof(char));
strcpy(MQTT_PRODUCTINFO_MQTT, _productInfo.c_str());
MQTT_HOST_MQTT = (char*)malloc((strlen(BLINKER_MQTT_ONENET_HOST)+1)*sizeof(char));
strcpy(MQTT_HOST_MQTT, BLINKER_MQTT_ONENET_HOST);
MQTT_PORT_MQTT = BLINKER_MQTT_ONENET_PORT;
}
UUID_MQTT = (char*)malloc((_uuid.length()+1)*sizeof(char));
strcpy(UUID_MQTT, _uuid.c_str());
// char uuid_eeprom[BLINKER_AUUID_SIZE];
// // BLINKER_LOG_ALL(("===================="));
// 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_MQTT, _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();
BLINKER_LOG_ALL(BLINKER_F("===================="));
BLINKER_LOG_ALL(BLINKER_F("DEVICE_NAME_MQTT: "), DEVICE_NAME_MQTT);
BLINKER_LOG_ALL(BLINKER_F("MQTT_PRODUCTINFO_MQTT: "), MQTT_PRODUCTINFO_MQTT);
BLINKER_LOG_ALL(BLINKER_F("MQTT_ID_MQTT: "), MQTT_ID_MQTT);
BLINKER_LOG_ALL(BLINKER_F("MQTT_NAME_MQTT: "), MQTT_NAME_MQTT);
BLINKER_LOG_ALL(BLINKER_F("MQTT_KEY_MQTT: "), MQTT_KEY_MQTT);
BLINKER_LOG_ALL(BLINKER_F("MQTT_BROKER: "), _broker);
BLINKER_LOG_ALL(BLINKER_F("HOST: "), MQTT_HOST_MQTT);
BLINKER_LOG_ALL(BLINKER_F("PORT: "), MQTT_PORT_MQTT);
BLINKER_LOG_ALL(BLINKER_F("UUID_MQTT: "), UUID_MQTT);
BLINKER_LOG_ALL(BLINKER_F("===================="));
if (_broker == BLINKER_MQTT_BORKER_ALIYUN) {
String PUB_TOPIC_STR = BLINKER_F("/");
PUB_TOPIC_STR += MQTT_PRODUCTINFO_MQTT;
PUB_TOPIC_STR += BLINKER_F("/");
PUB_TOPIC_STR += MQTT_ID_MQTT;
PUB_TOPIC_STR += BLINKER_F("/s");
BLINKER_PUB_TOPIC_MQTT = (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_MQTT, PUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_PUB_TOPIC_MQTT: "), BLINKER_PUB_TOPIC_MQTT);
String SUB_TOPIC_STR = BLINKER_F("/");
SUB_TOPIC_STR += MQTT_PRODUCTINFO_MQTT;
SUB_TOPIC_STR += BLINKER_F("/");
SUB_TOPIC_STR += MQTT_ID_MQTT;
SUB_TOPIC_STR += BLINKER_F("/r");
BLINKER_SUB_TOPIC_MQTT = (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_MQTT, SUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_SUB_TOPIC_MQTT: "), BLINKER_SUB_TOPIC_MQTT);
}
else if (_broker == BLINKER_MQTT_BORKER_QCLOUD) {
String PUB_TOPIC_STR = MQTT_PRODUCTINFO_MQTT;
PUB_TOPIC_STR += BLINKER_F("/");
PUB_TOPIC_STR += _userID;
PUB_TOPIC_STR += BLINKER_F("/s");
BLINKER_PUB_TOPIC_MQTT = (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_MQTT, PUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_PUB_TOPIC_MQTT: "), BLINKER_PUB_TOPIC_MQTT);
String SUB_TOPIC_STR = MQTT_PRODUCTINFO_MQTT;
SUB_TOPIC_STR += BLINKER_F("/");
SUB_TOPIC_STR += _userID;
SUB_TOPIC_STR += BLINKER_F("/r");
BLINKER_SUB_TOPIC_MQTT = (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_MQTT, SUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_SUB_TOPIC_MQTT: "), BLINKER_SUB_TOPIC_MQTT);
}
else if (_broker == BLINKER_MQTT_BORKER_ONENET) {
// uint8_t str_len;
String PUB_TOPIC_STR = MQTT_PRODUCTINFO_MQTT;
PUB_TOPIC_STR += BLINKER_F("/onenet_rule/r");
// str_len = PUB_TOPIC_STR.length() + 1;
BLINKER_PUB_TOPIC_MQTT = (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_MQTT, PUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_PUB_TOPIC_MQTT: "), BLINKER_PUB_TOPIC_MQTT);
String SUB_TOPIC_STR = MQTT_PRODUCTINFO_MQTT;
SUB_TOPIC_STR += BLINKER_F("/");
SUB_TOPIC_STR += _userID;
SUB_TOPIC_STR += BLINKER_F("/r");
BLINKER_SUB_TOPIC_MQTT = (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_MQTT, SUB_TOPIC_STR.c_str());
BLINKER_LOG_ALL(BLINKER_F("BLINKER_SUB_TOPIC_MQTT: "), BLINKER_SUB_TOPIC_MQTT);
}
// BLINKER_LOG_FreeHeap();
if (_broker == BLINKER_MQTT_BORKER_ALIYUN) {
#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_MQTT = new Adafruit_MQTT_Client(&client_mqtt, MQTT_HOST_MQTT, MQTT_PORT_MQTT, MQTT_ID_MQTT, MQTT_NAME_MQTT, MQTT_KEY_MQTT);
#elif defined(ESP32)
mqtt_MQTT = new Adafruit_MQTT_Client(&client_s, MQTT_HOST_MQTT, MQTT_PORT_MQTT, MQTT_ID_MQTT, MQTT_NAME_MQTT, MQTT_KEY_MQTT);
#endif
}
else if (_broker == BLINKER_MQTT_BORKER_QCLOUD) {
#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_MQTT = new Adafruit_MQTT_Client(&client_mqtt, MQTT_HOST_MQTT, MQTT_PORT_MQTT, MQTT_ID_MQTT, MQTT_NAME_MQTT, MQTT_KEY_MQTT);
#elif defined(ESP32)
mqtt_MQTT = new Adafruit_MQTT_Client(&client_s, MQTT_HOST_MQTT, MQTT_PORT_MQTT, MQTT_ID_MQTT, MQTT_NAME_MQTT, MQTT_KEY_MQTT);
#endif
}
else if (_broker == BLINKER_MQTT_BORKER_ONENET) {
mqtt_MQTT = new Adafruit_MQTT_Client(&client, MQTT_HOST_MQTT, MQTT_PORT_MQTT, MQTT_ID_MQTT, MQTT_NAME_MQTT, MQTT_KEY_MQTT);
}
// iotPub = new Adafruit_MQTT_Publish(mqtt_MQTT, BLINKER_PUB_TOPIC_MQTT);
// if (!isMQTTinit)
iotSub_MQTT = new Adafruit_MQTT_Subscribe(mqtt_MQTT, BLINKER_SUB_TOPIC_MQTT);
mqtt_broker = (char*)malloc((_broker.length()+1)*sizeof(char));
strcpy(mqtt_broker, _broker.c_str());
// mqtt_broker = _broker;
// mDNSInit(MQTT_ID_MQTT);
this->latestTime = millis() - BLINKER_MQTT_CONNECT_TIMESLOT;
// if (!isMQTTinit)
mqtt_MQTT->subscribe(iotSub_MQTT);
#if defined(ESP8266)
// client_s->stop();
// if (!isMQTTinit)
client_mqtt.setInsecure();
#endif
// connect();
BLINKER_LOG_FreeHeap();
return true;
}
void BlinkerGateway::mDNSInit()
{
#if defined(ESP8266)
if (!MDNS.begin(DEVICE_NAME_MQTT, WiFi.localIP())) {
#elif defined(ESP32)
if (!MDNS.begin(DEVICE_NAME_MQTT)) {
#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", String(DEVICE_NAME_MQTT));
webSocket_MQTT.begin();
webSocket_MQTT.onEvent(webSocketEvent_MQTT);
BLINKER_LOG(BLINKER_F("webSocket_MQTT server started"));
BLINKER_LOG(BLINKER_F("ws://"), DEVICE_NAME_MQTT, BLINKER_F(".local:"), WS_SERVERPORT);
}
void BlinkerGateway::checkKA() {
if (millis() - kaTime >= BLINKER_MQTT_KEEPALIVE)
isAlive = false;
}
int BlinkerGateway::checkAliKA() {
if (millis() - aliKaTime >= 10000)
return false;
else
return true;
}
int BlinkerGateway::checkDuerKA() {
if (millis() - duerKaTime >= 10000)
return false;
else
return true;
}
int BlinkerGateway::checkCanPrint() {
if ((millis() - printTime >= BLINKER_MQTT_MSG_LIMIT && isAlive) || printTime == 0) {
return true;
}
else {
BLINKER_ERR_LOG(BLINKER_F("MQTT NOT ALIVE OR MSG LIMIT"));
checkKA();
return false;
}
}
int BlinkerGateway::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 BlinkerGateway::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 BlinkerGateway::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 BlinkerGateway::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 BlinkerGateway::isJson(const String & data)
{
BLINKER_LOG_ALL(BLINKER_F("isJson: "), data);
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(STRING_format(data));
if (!root.success())
{
BLINKER_ERR_LOG("Print data is not Json! ", data);
return false;
}
return true;
}
bool BlinkerGateway::checkInit()
{
if (!_isWiFiInit)
{
switch (_configType)
{
case COMM :
_connectTime = millis();
// BLINKER_LOG(BLINKER_F("checkInit..."));
if (WiFi.status() != WL_CONNECTED) {
::delay(500);
if (millis() - _connectTime > BLINKER_CONNECT_TIMEOUT_MS && WiFi.status() != WL_CONNECTED) {
// _connectTime = millis();
BLINKER_LOG(BLINKER_F("WiFi connect timeout, please check ssid and pswd!"));
BLINKER_LOG(BLINKER_F("Retring WiFi connect again!"));
return false;
}
// BLINKER_LOG(BLINKER_F("checkInit..."));
return false;
}
BLINKER_LOG(BLINKER_F("WiFi Connected."));
BLINKER_LOG(BLINKER_F("IP Address: "));
BLINKER_LOG(WiFi.localIP());
_isWiFiInit = true;
_connectTime = 0;
// begin();
return false;
case SMART :
switch (_configStatus)
{
case SMART_BEGIN :
if (WiFi.smartConfigDone())
{
BLINKER_LOG(BLINKER_F("SmartConfig received."));
_connectTime = millis();
#if defined(ESP8266)
BLINKER_LOG(BLINKER_F("SSID: "), WiFi.SSID(), BLINKER_F(" PSWD: "), WiFi.psk());
#endif
_configStatus = SMART_DONE;
}
else return false;
case SMART_DONE :
if (WiFi.status() != WL_CONNECTED)
{
if (millis() - _connectTime > 15000)
{
BLINKER_LOG(BLINKER_F("SmartConfig timeout."));
WiFi.stopSmartConfig();
_configStatus = SMART_TIMEOUT;
}
return false;
}
else if (WiFi.status() == WL_CONNECTED)
{
// WiFi.stopSmartConfig();
BLINKER_LOG(BLINKER_F("WiFi Connected."));
BLINKER_LOG(BLINKER_F("IP Address: "));
BLINKER_LOG(WiFi.localIP());
_isWiFiInit = true;
_connectTime = 0;
// begin();
return false;
}
// return false;
case SMART_TIMEOUT :
WiFi.beginSmartConfig();
_configStatus = SMART_BEGIN;
BLINKER_LOG(BLINKER_F("Waiting for SmartConfig."));
return false;
default :
return false;
}
case APCFG :
#if defined(BLINKER_APCONFIG)
switch (_configStatus)
{
case APCFG_BEGIN :
checkAPCFG();
return false;
case APCFG_DONE :
if (WiFi.status() != WL_CONNECTED)
{
if (millis() - _connectTime > 15000)
{
BLINKER_LOG(BLINKER_F("APConfig timeout."));
_configStatus = APCFG_TIMEOUT;
}
return false;
}
else if (WiFi.status() == WL_CONNECTED)
{
BLINKER_LOG(BLINKER_F("WiFi Connected."));
BLINKER_LOG(BLINKER_F("IP Address: "));
BLINKER_LOG(WiFi.localIP());
_isWiFiInit = true;
_connectTime = 0;
// begin();
return false;
}
// return false;
case APCFG_TIMEOUT :
softAPinit();
return false;
default :
return false;
}
#endif
default :
return false;
}
}
if (!_isBegin)
{
_isBegin = begin();
return _isBegin;
}
return true;
}
void BlinkerGateway::commonBegin(const char* _ssid, const char* _pswd)
{
_configType = COMM;
connectWiFi(_ssid, _pswd);
#if defined(ESP8266)
BLINKER_LOG(BLINKER_F("ESP8266_MQTT initialized..."));
#elif defined(ESP32)
BLINKER_LOG(BLINKER_F("ESP32_MQTT initialized..."));
#endif
}
void BlinkerGateway::smartconfigBegin()
{
_configType = SMART;
if (!autoInit()) smartconfig();
else _configStatus = SMART_DONE;
#if defined(ESP8266)
BLINKER_LOG(BLINKER_F("ESP8266_MQTT initialized..."));
#elif defined(ESP32)
BLINKER_LOG(BLINKER_F("ESP32_MQTT initialized..."));
#endif
}
void BlinkerGateway::apconfigBegin()
{
#if defined(BLINKER_APCONFIG)
_configType = APCFG;
if (!autoInit()) softAPinit();
else _configStatus = APCFG_DONE;
#if defined(ESP8266)
BLINKER_LOG(BLINKER_F("ESP8266_MQTT initialized..."));
#elif defined(ESP32)
BLINKER_LOG(BLINKER_F("ESP32_MQTT initialized..."));
#endif
#endif
}
bool BlinkerGateway::autoInit()
{
WiFi.mode(WIFI_STA);
String _hostname = BLINKER_F("DiyArduino_");
_hostname += macDeviceName();
#if defined(ESP8266)
WiFi.hostname(_hostname.c_str());
#elif defined(ESP32)
WiFi.setHostname(_hostname.c_str());
#endif
WiFi.begin();
::delay(500);
BLINKER_LOG(BLINKER_F("Waiting for WiFi "),
BLINKER_WIFI_AUTO_INIT_TIMEOUT / 1000,
BLINKER_F("s, will enter SMARTCONFIG or "),
BLINKER_F("APCONFIG while WiFi not connect!"));
uint8_t _times = 0;
while (WiFi.status() != WL_CONNECTED) {
::delay(500);
if (_times > BLINKER_WIFI_AUTO_INIT_TIMEOUT / 500) break;
_times++;
}
if (WiFi.status() != WL_CONNECTED) return false;
else {
// BLINKER_LOG(BLINKER_F("WiFi Connected."));
// BLINKER_LOG(BLINKER_F("IP Address: "));
// BLINKER_LOG(WiFi.localIP());
// _isWiFiInit = true;
// begin();
return true;
}
}
void BlinkerGateway::smartconfig()
{
WiFi.mode(WIFI_STA);
String _hostname = BLINKER_F("DiyArduino_");
_hostname += macDeviceName();
#if defined(ESP8266)
WiFi.hostname(_hostname.c_str());
#elif defined(ESP32)
WiFi.setHostname(_hostname.c_str());
#endif
WiFi.beginSmartConfig();
_configStatus = SMART_BEGIN;
BLINKER_LOG(BLINKER_F("Waiting for SmartConfig."));
// while (!WiFi.smartConfigDone()) {
// ::delay(500);
// }
// BLINKER_LOG(BLINKER_F("SmartConfig received."));
// BLINKER_LOG(BLINKER_F("Waiting for WiFi"));
// while (WiFi.status() != WL_CONNECTED) {
// ::delay(500);
// }
// BLINKER_LOG(BLINKER_F("WiFi Connected."));
// BLINKER_LOG(BLINKER_F("IP Address: "));
// BLINKER_LOG(WiFi.localIP());
}
#if defined(BLINKER_APCONFIG)
void BlinkerGateway::softAPinit()
{
// WiFiServer _apServer(80);
// WiFiClient _apClient;
IPAddress apIP(192, 168, 4, 1);
#if defined(ESP8266)
IPAddress netMsk(255, 255, 255, 0);
#endif
_apServer = new WiFiServer(80);
WiFi.mode(WIFI_AP);
String softAP_ssid = BLINKER_F("DiyArduino_");
softAP_ssid += 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(), ("12345678"));
delay(100);
_apServer->begin();
BLINKER_LOG(BLINKER_F("AP IP address: "), WiFi.softAPIP());
BLINKER_LOG(BLINKER_F("HTTP _apServer started"));
BLINKER_LOG(BLINKER_F("URL: http://"), WiFi.softAPIP());
_configStatus = APCFG_BEGIN;
BLINKER_LOG(BLINKER_F("Wait for APConfig"));
// while(WiFi.status() != WL_CONNECTED)
// {
// // serverClient();
// _apClient = _apServer->available();
// // if (_apClient.status() == CLOSED)
// if (!_apClient.connected())
// {
// _apClient.stop();
// BLINKER_LOG(BLINKER_F("Connection closed on _apClient"));
// }
// else
// {
// if (_apClient.available())
// {
// String data = _apClient.readStringUntil('\r');
// // data = data.substring(4, data.length() - 9);
// _apClient.flush();
// BLINKER_LOG(BLINKER_F("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\n");
// s += BLINKER_F("Content-Type: application/json;");
// s += BLINKER_F("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");
// _apClient.print(s);
// _apClient.stop();
// parseUrl(data);
// }
// }
// }
// ::delay(10);
// }
}
void BlinkerGateway::checkAPCFG()
{
if(WiFi.status() != WL_CONNECTED)
{
// serverClient();
_apClient = _apServer->available();
// if (_apClient.status() == CLOSED)
if (!_apClient.connected())
{
_apClient.stop();
BLINKER_LOG(BLINKER_F("Connection closed on _apClient"));
}
else
{
if (_apClient.available())
{
String data = _apClient.readStringUntil('\r');
// data = data.substring(4, data.length() - 9);
_apClient.flush();
BLINKER_LOG(BLINKER_F("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\n");
s += BLINKER_F("Content-Type: application/json;");
s += BLINKER_F("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");
_apClient.print(s);
_apClient.stop();
parseUrl(data);
}
}
}
::delay(10);
}
}
// void BlinkerGateway::serverClient()
// {
// if (!_apClient)
// {
// _apClient = _apServer->available();
// }
// else
// {
// // if (_apClient.status() == CLOSED)
// if (!_apClient.connected())
// {
// _apClient.stop();
// BLINKER_LOG(BLINKER_F("Connection closed on _apClient"));
// }
// else
// {
// if (_apClient.available())
// {
// String data = _apClient.readStringUntil('\r');
// // data = data.substring(4, data.length() - 9);
// _apClient.flush();
// BLINKER_LOG(BLINKER_F("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\n");
// s += BLINKER_F("Content-Type: application/json;");
// s += BLINKER_F("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");
// _apClient.print(s);
// _apClient.stop();
// parseUrl(data);
// }
// }
// }
// }
// }
bool BlinkerGateway::parseUrl(String data)
{
BLINKER_LOG(BLINKER_F("APCONFIG data: "), data);
DynamicJsonBuffer jsonBuffer;
JsonObject& wifi_data = jsonBuffer.parseObject(data);
if (!wifi_data.success()) {
return false;
}
String _ssid = wifi_data["ssid"];
String _pswd = wifi_data["pswd"];
BLINKER_LOG(BLINKER_F("ssid: "), _ssid);
BLINKER_LOG(BLINKER_F("pswd: "), _pswd);
free(_apServer);
connectWiFi(_ssid, _pswd);
_configStatus = APCFG_DONE;
_connectTime = millis();
return true;
}
#endif
void BlinkerGateway::connectWiFi(String _ssid, String _pswd)
{
connectWiFi(_ssid.c_str(), _pswd.c_str());
}
void BlinkerGateway::connectWiFi(const char* _ssid, const char* _pswd)
{
uint32_t _connectTime = millis();
BLINKER_LOG(BLINKER_F("Connecting to "), _ssid);
WiFi.mode(WIFI_STA);
String _hostname = BLINKER_F("DiyArduinoMQTT_");
_hostname += macDeviceName();
#if defined(ESP8266)
WiFi.hostname(_hostname.c_str());
#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(BLINKER_F("WiFi connect timeout, please check ssid and pswd!"));
// BLINKER_LOG(BLINKER_F("Retring WiFi connect again!"));
// }
// }
// BLINKER_LOG(BLINKER_F("Connected"));
// IPAddress myip = WiFi.localIP();
// BLINKER_LOG(BLINKER_F("Your IP is: "), myip);
// _isWiFiInit = true;
}
#endif
#endif

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/coloz-blinker-library.git
git@gitlife.ru:oschina-mirror/coloz-blinker-library.git
oschina-mirror
coloz-blinker-library
coloz-blinker-library
0.3.0