1414#include < wolfssl/wolfcrypt/hash.h> // wc_sha512
1515
1616#include " constants.h"
17- #include " base64 .h"
17+ #include " base64_util .h"
1818#include " pairing.h"
1919#include " storage.h"
2020#include " query_params.h"
@@ -524,27 +524,21 @@ void write(client_context_t *context, byte *data, int data_size) {
524524 CLIENT_ERROR (context, " The socket is null! (or is closed)" );
525525 return ;
526526 }
527+ if (context->disconnect ) {
528+ context->error_write = true ;
529+ return ;
530+ }
527531 if (context->error_write ) {
528532 CLIENT_ERROR (context, " Abort write data since error_write." );
529533 return ;
530534 }
531535 int write_size = context->socket ->write (data, data_size);
532536 CLIENT_DEBUG (context, " Sending data of size %d" , data_size);
533537 if (write_size != data_size) {
534- CLIENT_ERROR (context, " socket.write, data_size=%d, write_size=%d" , data_size, write_size);
535538 context->error_write = true ;
536- // Error write when :
537- // 1. remote client is disconnected
538- // 2. data_size is larger than the tcp internal send buffer
539- // But We has limited the data_size to 538, and TCP_SND_BUF = 1072. (See the comments on HOMEKIT_JSONBUFFER_SIZE)
540- // So we believe here is disconnected.
541- context->disconnect = true ;
542- homekit_server_close_client (context->server , context);
543- // We consider the socket is 'closed' when error in writing (eg. the remote client is disconnected, NO tcp ack receive).
544- // Closing the socket causes memory-leak if some data has not been sent (the write_buffer did not free)
545- // To fix this memory-leak, add tcp_abandon(_pcb, 0); in ClientContext.h of ESP8266WiFi-library.
539+ context->socket ->keepAlive (1 , 1 , 1 ); // fast disconnected internally in 1 second.
540+ CLIENT_ERROR (context, " socket.write, data_size=%d, write_size=%d" , data_size, write_size);
546541 }
547-
548542}
549543
550544int client_send_encrypted_ (client_context_t *context,
@@ -2699,9 +2693,6 @@ void homekit_server_on_reset(client_context_t *context) {
26992693
27002694 homekit_server_reset ();
27012695 send_204_response (context);
2702-
2703- // vTaskDelay(3000 / portTICK_PERIOD_MS);
2704-
27052696 homekit_system_restart ();
27062697}
27072698
@@ -3141,28 +3132,30 @@ void homekit_mdns_init(homekit_server_t *server) {
31413132
31423133 homekit_accessory_t *accessory = server->config ->accessories [0 ];
31433134 homekit_service_t *accessory_info = homekit_service_by_type (accessory,
3144- HOMEKIT_SERVICE_ACCESSORY_INFORMATION);
3135+ HOMEKIT_SERVICE_ACCESSORY_INFORMATION);
31453136 if (!accessory_info) {
31463137 ERROR (" Invalid accessory declaration: no Accessory Information service" );
31473138 return ;
31483139 }
31493140
31503141 homekit_characteristic_t *name = homekit_service_characteristic_by_type (accessory_info,
3151- HOMEKIT_CHARACTERISTIC_NAME);
3142+ HOMEKIT_CHARACTERISTIC_NAME);
3143+
31523144 if (!name) {
31533145 ERROR (" Invalid accessory declaration: " " no Name characteristic in AccessoryInfo service" );
31543146 return ;
31553147 }
3156-
3148+
31573149 homekit_characteristic_t *model = homekit_service_characteristic_by_type (accessory_info,
3158- HOMEKIT_CHARACTERISTIC_MODEL);
3150+ HOMEKIT_CHARACTERISTIC_MODEL);
3151+
31593152 if (!model) {
31603153 ERROR (" Invalid accessory declaration: " " no Model characteristic in AccessoryInfo service" );
31613154 return ;
31623155 }
31633156
31643157 if (homekit_mdns_started) {
3165- MDNS.close ();
3158+ // MDNS.close();
31663159 MDNS.begin (name->value .string_value , staIP);
31673160 INFO (" MDNS restart: %s, IP: %s" , name->value .string_value , staIP.toString ().c_str ());
31683161 MDNS.announce ();
@@ -3176,7 +3169,7 @@ void homekit_mdns_init(homekit_server_t *server) {
31763169 INFO (" MDNS begin: %s, IP: %s" , name->value .string_value , staIP.toString ().c_str ());
31773170
31783171 MDNSResponder::hMDNSService mdns_service = MDNS.addService (name->value .string_value ,
3179- HOMEKIT_MDNS_SERVICE, HOMEKIT_MDNS_PROTO, HOMEKIT_SERVER_PORT);
3172+ HOMEKIT_MDNS_SERVICE, HOMEKIT_MDNS_PROTO, HOMEKIT_SERVER_PORT);
31803173 // Set a service specific callback for dynamic service TXT items.
31813174 // The callback is called, whenever service TXT items are needed for the given service.
31823175 MDNS.setDynamicServiceTxtCallback (mdns_service,
@@ -3207,31 +3200,6 @@ void homekit_mdns_init(homekit_server_t *server) {
32073200 // MDNS.addServiceTxt(HAP_SERVICE, HOMEKIT_MDNS_PROTO, "sf", (server->paired) ? "0" : "1");
32083201 MDNS.addServiceTxt (mdns_service, " ci" , String (server->config ->category ).c_str ());
32093202
3210- /*
3211- // accessory model name (required)
3212- homekit_mdns_add_txt("md", "%s", model->value.string_value);
3213- // protocol version (required)
3214- homekit_mdns_add_txt("pv", "1.0");
3215- // device ID (required)
3216- // should be in format XX:XX:XX:XX:XX:XX, otherwise devices will ignore it
3217- homekit_mdns_add_txt("id", "%s", server->accessory_id);
3218- // current configuration number (required)
3219- homekit_mdns_add_txt("c#", "%d", server->config->config_number);
3220- // current state number (required)
3221- homekit_mdns_add_txt("s#", "1");
3222- // feature flags (required if non-zero)
3223- // bit 0 - supports HAP pairing. required for all HomeKit accessories
3224- // bits 1-7 - reserved
3225- homekit_mdns_add_txt("ff", "0");
3226- // status flags
3227- // bit 0 - not paired
3228- // bit 1 - not configured to join WiFi
3229- // bit 2 - problem detected on accessory
3230- // bits 3-7 - reserved
3231- homekit_mdns_add_txt("sf", "%d", (server->paired) ? 0 : 1);
3232- // accessory category identifier
3233- homekit_mdns_add_txt("ci", "%d", server->config->category);*/
3234-
32353203 if (server->config ->setupId ) {
32363204 DEBUG (" Accessory Setup ID = %s" , server->config ->setupId );
32373205
@@ -3255,8 +3223,6 @@ void homekit_mdns_init(homekit_server_t *server) {
32553223 MDNS.announce ();
32563224 MDNS.update ();
32573225 homekit_mdns_started = true ;
3258- // INFO("MDNS ok! Open your \"Home\" app, click \"Add or Scan Accessory\""
3259- // " and \"I Don't Have a Code\". \nThis Accessory will show on your iOS device.");
32603226}
32613227
32623228// Used to update the config_number ("c#" value of Bonjour)
@@ -3351,19 +3317,9 @@ void homekit_server_init(homekit_server_config_t *config) {
33513317 // homekit_server_task(server);
33523318 INFO (" Starting server" );
33533319
3354- int r = homekit_storage_init ();
3355- if (r == 0 ) {
3356- r = homekit_storage_load_accessory_id (server->accessory_id );
3357-
3358- if (!r)
3359- r = homekit_storage_load_accessory_key (&server->accessory_key );
3360- }
3361-
3362- if (r) {
3363- if (r < 0 ) {
3364- INFO (" Resetting HomeKit storage" );
3365- homekit_storage_reset ();
3366- }
3320+ if (homekit_storage_init () != 0 ||
3321+ homekit_storage_load_accessory_id (server->accessory_id ) != 0 ||
3322+ homekit_storage_load_accessory_key (&server->accessory_key ) != 0 ) {
33673323
33683324 homekit_accessory_id_generate (server->accessory_id );
33693325 homekit_storage_save_accessory_id (server->accessory_id );
0 commit comments