Added homeSpan.getWebLog()
This commit is contained in:
parent
39b7b54d48
commit
392eac38b9
26
src/HAP.cpp
26
src/HAP.cpp
|
|
@ -256,7 +256,7 @@ void HAPClient::processRequest(){
|
||||||
}
|
}
|
||||||
|
|
||||||
if(homeSpan.webLog.isEnabled && !strncmp(body,homeSpan.webLog.statusURL.c_str(),homeSpan.webLog.statusURL.length())){ // GET STATUS - AN OPTIONAL, NON-HAP-R2 FEATURE
|
if(homeSpan.webLog.isEnabled && !strncmp(body,homeSpan.webLog.statusURL.c_str(),homeSpan.webLog.statusURL.length())){ // GET STATUS - AN OPTIONAL, NON-HAP-R2 FEATURE
|
||||||
getStatusURL();
|
getStatusURL(this,NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1095,7 +1095,7 @@ int HAPClient::putPrepareURL(char *json){
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
|
||||||
int HAPClient::getStatusURL(){
|
void HAPClient::getStatusURL(HAPClient *hapClient, void (*callBack)(const char *)){
|
||||||
|
|
||||||
char clocktime[33];
|
char clocktime[33];
|
||||||
|
|
||||||
|
|
@ -1116,9 +1116,10 @@ int HAPClient::getStatusURL(){
|
||||||
|
|
||||||
sprintf(uptime,"%d:%02d:%02d:%02d",days,hours,mins,secs);
|
sprintf(uptime,"%d:%02d:%02d:%02d",days,hours,mins,secs);
|
||||||
|
|
||||||
LOG2("\n>>>>>>>>>> %s >>>>>>>>>>\n",client.remoteIP().toString().c_str());
|
if(hapClient)
|
||||||
|
LOG2("\n>>>>>>>>>> %s >>>>>>>>>>\n",hapClient->client.remoteIP().toString().c_str());
|
||||||
|
|
||||||
hapOut.setHapClient(this).setLogLevel(2);
|
hapOut.setHapClient(hapClient).setLogLevel(2).setCallback(callBack);
|
||||||
|
|
||||||
hapOut << "HTTP/1.1 200 OK\r\nContent-type: text/html; charset=utf-8\r\n\r\n";
|
hapOut << "HTTP/1.1 200 OK\r\nContent-type: text/html; charset=utf-8\r\n\r\n";
|
||||||
hapOut << "<html><head><title>" << homeSpan.displayName << "</title>\n";
|
hapOut << "<html><head><title>" << homeSpan.displayName << "</title>\n";
|
||||||
|
|
@ -1225,10 +1226,10 @@ int HAPClient::getStatusURL(){
|
||||||
hapOut << "</body></html>\n";
|
hapOut << "</body></html>\n";
|
||||||
hapOut.flush();
|
hapOut.flush();
|
||||||
|
|
||||||
|
if(hapClient){
|
||||||
|
hapClient->client.stop();
|
||||||
LOG2("------------ SENT! --------------\n");
|
LOG2("------------ SENT! --------------\n");
|
||||||
|
}
|
||||||
client.stop();
|
|
||||||
return(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
|
@ -1635,8 +1636,12 @@ void HapOut::HapStreamBuffer::flushBuffer(){
|
||||||
|
|
||||||
byteCount+=num;
|
byteCount+=num;
|
||||||
|
|
||||||
if(logLevel<=homeSpan.getLogLevel()){
|
|
||||||
buffer[num]='\0'; // add null terminator but DO NOT increment num (we don't want terminator considered as part of buffer)
|
buffer[num]='\0'; // add null terminator but DO NOT increment num (we don't want terminator considered as part of buffer)
|
||||||
|
|
||||||
|
if(callBack)
|
||||||
|
callBack(buffer);
|
||||||
|
|
||||||
|
if(logLevel<=homeSpan.getLogLevel()){
|
||||||
if(enablePrettyPrint) // if pretty print needed, use formatted method
|
if(enablePrettyPrint) // if pretty print needed, use formatted method
|
||||||
printFormatted(buffer,num,2);
|
printFormatted(buffer,num,2);
|
||||||
else // if not, just print
|
else // if not, just print
|
||||||
|
|
@ -1689,6 +1694,11 @@ int HapOut::HapStreamBuffer::sync(){
|
||||||
byteCount=0;
|
byteCount=0;
|
||||||
indent=0;
|
indent=0;
|
||||||
|
|
||||||
|
if(callBack){
|
||||||
|
callBack(NULL);
|
||||||
|
callBack=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
mbedtls_sha512_finish_ret(ctx,hash); // finish SHA-384 and store hash
|
mbedtls_sha512_finish_ret(ctx,hash); // finish SHA-384 and store hash
|
||||||
mbedtls_sha512_starts_ret(ctx,1); // re-start hash for next time
|
mbedtls_sha512_starts_ret(ctx,1); // re-start hash for next time
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,6 @@ struct HAPClient {
|
||||||
int getCharacteristicsURL(char *urlBuf); // GET /characteristics (HAP Section 6.7.4)
|
int getCharacteristicsURL(char *urlBuf); // GET /characteristics (HAP Section 6.7.4)
|
||||||
int putCharacteristicsURL(char *json); // PUT /characteristics (HAP Section 6.7.2)
|
int putCharacteristicsURL(char *json); // PUT /characteristics (HAP Section 6.7.2)
|
||||||
int putPrepareURL(char *json); // PUT /prepare (HAP Section 6.7.2.4)
|
int putPrepareURL(char *json); // PUT /prepare (HAP Section 6.7.2.4)
|
||||||
int getStatusURL(); // GET / status (an optional, non-HAP feature)
|
|
||||||
|
|
||||||
void tlvRespond(TLV8 &tlv8); // respond to client with HTTP OK header and all defined TLV data records
|
void tlvRespond(TLV8 &tlv8); // respond to client with HTTP OK header and all defined TLV data records
|
||||||
void sendEncrypted(char *body, uint8_t *dataBuf, int dataLen); // send client complete ChaCha20-Poly1305 encrypted HTTP mesage comprising a null-terminated 'body' and 'dataBuf' with 'dataLen' bytes
|
void sendEncrypted(char *body, uint8_t *dataBuf, int dataLen); // send client complete ChaCha20-Poly1305 encrypted HTTP mesage comprising a null-terminated 'body' and 'dataBuf' with 'dataLen' bytes
|
||||||
|
|
@ -172,6 +171,8 @@ struct HAPClient {
|
||||||
static void checkTimedWrites(); // checks for expired Timed Write PIDs, and clears any found (HAP Section 6.7.2.4)
|
static void checkTimedWrites(); // checks for expired Timed Write PIDs, and clears any found (HAP Section 6.7.2.4)
|
||||||
static void eventNotify(SpanBuf *pObj, int nObj, int ignoreClient=-1); // transmits EVENT Notifications for nObj SpanBuf objects, pObj, with optional flag to ignore a specific client
|
static void eventNotify(SpanBuf *pObj, int nObj, int ignoreClient=-1); // transmits EVENT Notifications for nObj SpanBuf objects, pObj, with optional flag to ignore a specific client
|
||||||
|
|
||||||
|
static void getStatusURL(HAPClient *, void (*)(const char *)); // GET / status (an optional, non-HAP feature)
|
||||||
|
|
||||||
class HAPTLV : public TLV8 { // dedicated class for HAP TLV8 records
|
class HAPTLV : public TLV8 { // dedicated class for HAP TLV8 records
|
||||||
public:
|
public:
|
||||||
HAPTLV() : TLV8(HAP_Names,11){}
|
HAPTLV() : TLV8(HAP_Names,11){}
|
||||||
|
|
@ -198,6 +199,7 @@ class HapOut : public std::ostream {
|
||||||
size_t indent=0;
|
size_t indent=0;
|
||||||
uint8_t *hash;
|
uint8_t *hash;
|
||||||
mbedtls_sha512_context *ctx;
|
mbedtls_sha512_context *ctx;
|
||||||
|
void (*callBack)(const char *)=NULL;
|
||||||
|
|
||||||
void flushBuffer();
|
void flushBuffer();
|
||||||
int_type overflow(int_type c) override;
|
int_type overflow(int_type c) override;
|
||||||
|
|
@ -219,6 +221,7 @@ class HapOut : public std::ostream {
|
||||||
HapOut& setHapClient(HAPClient *hapClient){hapBuffer.hapClient=hapClient;return(*this);}
|
HapOut& setHapClient(HAPClient *hapClient){hapBuffer.hapClient=hapClient;return(*this);}
|
||||||
HapOut& setLogLevel(int logLevel){hapBuffer.logLevel=logLevel;return(*this);}
|
HapOut& setLogLevel(int logLevel){hapBuffer.logLevel=logLevel;return(*this);}
|
||||||
HapOut& prettyPrint(){hapBuffer.enablePrettyPrint=true;hapBuffer.logLevel=0;return(*this);}
|
HapOut& prettyPrint(){hapBuffer.enablePrettyPrint=true;hapBuffer.logLevel=0;return(*this);}
|
||||||
|
HapOut& setCallback(void(*f)(const char *)){hapBuffer.callBack=f;return(*this);}
|
||||||
|
|
||||||
uint8_t *getHash(){return(hapBuffer.hash);}
|
uint8_t *getHash(){return(hapBuffer.hash);}
|
||||||
size_t getSize(){return(hapBuffer.getSize());}
|
size_t getSize(){return(hapBuffer.getSize());}
|
||||||
|
|
|
||||||
|
|
@ -452,8 +452,6 @@ void Span::checkConnect(){
|
||||||
|
|
||||||
// create broadcast name from server base name plus accessory ID (without ':')
|
// create broadcast name from server base name plus accessory ID (without ':')
|
||||||
|
|
||||||
char *hostName;
|
|
||||||
|
|
||||||
if(!hostNameSuffix)
|
if(!hostNameSuffix)
|
||||||
asprintf(&hostName,"%s-%.2s%.2s%.2s%.2s%.2s%.2s",hostNameBase,id,id+3,id+6,id+9,id+12,id+15);
|
asprintf(&hostName,"%s-%.2s%.2s%.2s%.2s%.2s%.2s",hostNameBase,id,id+3,id+6,id+9,id+12,id+15);
|
||||||
else
|
else
|
||||||
|
|
@ -554,9 +552,6 @@ void Span::checkConnect(){
|
||||||
if(wifiCallbackAll)
|
if(wifiCallbackAll)
|
||||||
wifiCallbackAll((connected+1)/2);
|
wifiCallbackAll((connected+1)/2);
|
||||||
|
|
||||||
|
|
||||||
free(hostName);
|
|
||||||
|
|
||||||
} // initWiFi
|
} // initWiFi
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
@ -583,8 +578,10 @@ void Span::processSerialCommand(const char *c){
|
||||||
|
|
||||||
LOG0("\n*** HomeSpan Status ***\n\n");
|
LOG0("\n*** HomeSpan Status ***\n\n");
|
||||||
|
|
||||||
LOG0("IP Address: %s\n\n",WiFi.localIP().toString().c_str());
|
LOG0("IP Address: %s\n",WiFi.localIP().toString().c_str());
|
||||||
LOG0("Accessory ID: ");
|
if(webLog.isEnabled && hostName!=NULL)
|
||||||
|
LOG0("Web Logging: http://%s.local:%d%s\n",hostName,tcpPortNum,webLog.statusURL.c_str()+4);
|
||||||
|
LOG0("\nAccessory ID: ");
|
||||||
HAPClient::charPrintRow(HAPClient::accessory.ID,17);
|
HAPClient::charPrintRow(HAPClient::accessory.ID,17);
|
||||||
LOG0(" LTPK: ");
|
LOG0(" LTPK: ");
|
||||||
HAPClient::hexPrintRow(HAPClient::accessory.LTPK,32);
|
HAPClient::hexPrintRow(HAPClient::accessory.LTPK,32);
|
||||||
|
|
@ -1146,6 +1143,12 @@ void Span::processSerialCommand(const char *c){
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
|
void Span::getWebLog(void (*f)(const char *)){
|
||||||
|
HAPClient::getStatusURL(NULL,f);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
|
||||||
void Span::resetStatus(){
|
void Span::resetStatus(){
|
||||||
if(strlen(network.wifiData.ssid)==0)
|
if(strlen(network.wifiData.ssid)==0)
|
||||||
STATUS_UPDATE(start(LED_WIFI_NEEDED),HS_WIFI_NEEDED)
|
STATUS_UPDATE(start(LED_WIFI_NEEDED),HS_WIFI_NEEDED)
|
||||||
|
|
|
||||||
|
|
@ -222,6 +222,7 @@ class Span{
|
||||||
const char *displayName; // display name for this device - broadcast as part of Bonjour MDNS
|
const char *displayName; // display name for this device - broadcast as part of Bonjour MDNS
|
||||||
const char *hostNameBase; // base of hostName of this device - full host name broadcast by Bonjour MDNS will have 6-byte accessoryID as well as '.local' automatically appended
|
const char *hostNameBase; // base of hostName of this device - full host name broadcast by Bonjour MDNS will have 6-byte accessoryID as well as '.local' automatically appended
|
||||||
const char *hostNameSuffix=NULL; // optional "suffix" of hostName of this device. If specified, will be used as the hostName suffix instead of the 6-byte accessoryID
|
const char *hostNameSuffix=NULL; // optional "suffix" of hostName of this device. If specified, will be used as the hostName suffix instead of the 6-byte accessoryID
|
||||||
|
char *hostName=NULL; // derived full hostname
|
||||||
const char *modelName; // model name of this device - broadcast as Bonjour field "md"
|
const char *modelName; // model name of this device - broadcast as Bonjour field "md"
|
||||||
char category[3]=""; // category ID of primary accessory - broadcast as Bonjour field "ci" (HAP Section 13)
|
char category[3]=""; // category ID of primary accessory - broadcast as Bonjour field "ci" (HAP Section 13)
|
||||||
unsigned long snapTime; // current time (in millis) snapped before entering Service loops() or updates()
|
unsigned long snapTime; // current time (in millis) snapped before entering Service loops() or updates()
|
||||||
|
|
@ -372,6 +373,7 @@ class Span{
|
||||||
|
|
||||||
Span& setWebLogCSS(const char *css){webLog.css="\n" + String(css) + "\n";return(*this);}
|
Span& setWebLogCSS(const char *css){webLog.css="\n" + String(css) + "\n";return(*this);}
|
||||||
Span& setWebLogCallback(void (*f)(String &)){weblogCallback=f;return(*this);}
|
Span& setWebLogCallback(void (*f)(String &)){weblogCallback=f;return(*this);}
|
||||||
|
void getWebLog(void (*f)(const char *));
|
||||||
|
|
||||||
Span& setVerboseWifiReconnect(bool verbose=true){verboseWifiReconnect=verbose;return(*this);}
|
Span& setVerboseWifiReconnect(bool verbose=true){verboseWifiReconnect=verbose;return(*this);}
|
||||||
|
|
||||||
|
|
|
||||||
22
src/src.ino
22
src/src.ino
|
|
@ -27,14 +27,14 @@
|
||||||
|
|
||||||
#include "HomeSpan.h"
|
#include "HomeSpan.h"
|
||||||
|
|
||||||
#define MAX_LIGHTS 4
|
#define MAX_LIGHTS 2
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
|
|
||||||
homeSpan.setLogLevel(2);
|
homeSpan.setLogLevel(2);
|
||||||
homeSpan.enableWebLog(500);
|
homeSpan.enableWebLog(50);
|
||||||
|
|
||||||
homeSpan.begin(Category::Lighting,"HomeSpan Max");
|
homeSpan.begin(Category::Lighting,"HomeSpan Max");
|
||||||
|
|
||||||
|
|
@ -51,11 +51,13 @@ void setup() {
|
||||||
new Characteristic::Name(c);
|
new Characteristic::Name(c);
|
||||||
new Service::LightBulb();
|
new Service::LightBulb();
|
||||||
new Characteristic::On(0,false);
|
new Characteristic::On(0,false);
|
||||||
new Characteristic::Brightness(50,false);
|
// new Characteristic::Brightness(50,false);
|
||||||
new Characteristic::Hue(120,false);
|
// new Characteristic::Hue(120,false);
|
||||||
new Characteristic::Saturation(100,false);
|
// new Characteristic::Saturation(100,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new SpanUserCommand('w', " - get web log test",webLogTest);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
|
@ -67,3 +69,13 @@ void loop(){
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
void webLogTest(const char *dummy){
|
||||||
|
Serial.printf("\n*** In Web Log Test. Starting Custom Web Log Handler\n");
|
||||||
|
homeSpan.getWebLog(webLogHandler);
|
||||||
|
Serial.printf("\n**** Done!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void webLogHandler(const char *buf){
|
||||||
|
Serial.print("Here I am\n");
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue