@@ -90,7 +90,7 @@ ArduinoIoTCloudTCP::ArduinoIoTCloudTCP()
90
90
, _ota_error{static_cast <int >(OTAError::None)}
91
91
, _ota_img_sha256{" Inv." }
92
92
, _ota_url{" " }
93
- , _otq_request {false }
93
+ , _ota_req {false }
94
94
#endif /* OTA_ENABLED */
95
95
{
96
96
@@ -214,7 +214,7 @@ void ArduinoIoTCloudTCP::setOTAStorage(OTAStorage & ota_storage)
214
214
addPropertyReal (_ota_error, " OTA_ERROR" , Permission::Read);
215
215
addPropertyReal (_ota_img_sha256, " OTA_SHA256" , Permission::Read);
216
216
addPropertyReal (_ota_url, " OTA_URL" , Permission::ReadWrite).onSync (DEVICE_WINS);
217
- addPropertyReal (_otq_request , " OTA_REQ" , Permission::ReadWrite).onSync (DEVICE_WINS);
217
+ addPropertyReal (_ota_req , " OTA_REQ" , Permission::ReadWrite).onSync (DEVICE_WINS). onUpdate (ArduinoIoTCloudTCP::on_OTA_REQ_Update );
218
218
_ota_logic.setOTAStorage (ota_storage);
219
219
}
220
220
#endif /* OTA_ENABLED */
@@ -419,6 +419,65 @@ int ArduinoIoTCloudTCP::write(String const topic, byte const data[], int const l
419
419
return 0 ;
420
420
}
421
421
422
+ #if OTA_ENABLED
423
+ void ArduinoIoTCloudTCP::on_OTA_REQ_Update ()
424
+ {
425
+ ArduinoCloud.onOTARequest ();
426
+ }
427
+
428
+ void ArduinoIoTCloudTCP::onOTARequest ()
429
+ {
430
+ DBG_VERBOSE (" ArduinoIoTCloudTCP::%s _ota_req = %s" , __FUNCTION__, _ota_req ? " true" : " false" );
431
+ DBG_VERBOSE (" ArduinoIoTCloudTCP::%s _ota_url = %s" , __FUNCTION__, _ota_url.c_str ());
432
+
433
+ if (_ota_req)
434
+ {
435
+ WiFiSSLClient ota_client;
436
+ if (!ota_client.connect (" www.107-systems.org" , 443 )) {
437
+ DBG_VERBOSE (" ArduinoIoTCloudTCP::%s ota_client.connect failed" , __FUNCTION__);
438
+ return ;
439
+ }
440
+
441
+ /* Request binary via http-get */
442
+ char get_msg[128 ];
443
+ snprintf (get_msg, 128 , " GET /ota/%s HTTP/1.1" , _ota_url.c_str ());
444
+ DBG_VERBOSE (" ArduinoIoTCloudTCP::%s \" %s\" " , __FUNCTION__, get_msg);
445
+
446
+ ota_client.println (get_msg);
447
+ ota_client.println (" Host: www.107-systems.org" );
448
+ ota_client.println (" Connection: close" );
449
+ ota_client.println ();
450
+
451
+ /* Read and parse the received data. */
452
+ bool is_header_complete = false ;
453
+ size_t bytes_recv = 0 ;
454
+ String http_header;
455
+
456
+ while (ota_client.available ())
457
+ {
458
+ char const c = ota_client.read ();
459
+ Serial.print (c);
460
+
461
+ /* Check if header is complete. */
462
+ if (!is_header_complete)
463
+ {
464
+ http_header += c;
465
+ is_header_complete = http_header.endsWith (" \r\n\r\n " );
466
+ break ;
467
+ }
468
+
469
+ /* If we reach this point then the HTTP header has
470
+ * been received and we can feed the incoming binary
471
+ * data into the OTA state machine.
472
+ */
473
+ _ota_logic.onOTADataReceived (reinterpret_cast <uint8_t const *>(&c), 1 );
474
+ _ota_error = static_cast <int >(_ota_logic.update ());
475
+ DBG_VERBOSE (" ArduinoIoTCloudTCP::%s %d bytes received" , __FUNCTION__, ++bytes_recv);
476
+ }
477
+ }
478
+ }
479
+ #endif
480
+
422
481
/* *****************************************************************************
423
482
* EXTERN DEFINITION
424
483
******************************************************************************/
0 commit comments