diff --git a/SARA/SSL/certificate/e5.der b/SARA/SSL/certificate/e5.der new file mode 100644 index 0000000..4e4adee Binary files /dev/null and b/SARA/SSL/certificate/e5.der differ diff --git a/SARA/SSL/certificate/e5.pem b/SARA/SSL/certificate/e5.pem new file mode 100644 index 0000000..62c652d --- /dev/null +++ b/SARA/SSL/certificate/e5.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICtDCCAjugAwIBAgIQGG511O6woF39Lagghl0eMTAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yNDAzMTMwMDAwMDBaFw0y +NzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNy +eXB0MQswCQYDVQQDEwJFNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABA0LOoprYY62 +79xfWOfGQkVUq2P2ZmFICi5ZdbSBAjdQtz8WedyY7KEol3IgHCzP1XxSIE5UeFuE +FGvAkK6F7MBRQTxah38GTdT+YNH6bC3hfZUQiKIIVA+ZGkzm6gqs2KOB+DCB9TAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIG +A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJ8rX888IU+dBLftKyzExnCL0tcN +MB8GA1UdIwQYMBaAFHxClq7eS0g7+pL4nozPbYupcjeVMDIGCCsGAQUFBwEBBCYw +JDAiBggrBgEFBQcwAoYWaHR0cDovL3gyLmkubGVuY3Iub3JnLzATBgNVHSAEDDAK +MAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDIuYy5sZW5jci5v +cmcvMAoGCCqGSM49BAMDA2cAMGQCMBttLkVBHEU+2V80GHRnE3m6qym1thBOgydK +i0VOx3vP9EAwHWGl5hxtpJAJkm5GSwIwRikYhDR6vPve2BvYGacE9ct+522E2dqO +6s42MLmigEws5mASS6l2quhtlUfacgkM +-----END CERTIFICATE----- diff --git a/SARA/SSL/certificate/e6.der b/SARA/SSL/certificate/e6.der new file mode 100644 index 0000000..b241308 Binary files /dev/null and b/SARA/SSL/certificate/e6.der differ diff --git a/SARA/SSL/certificate/e6.pem b/SARA/SSL/certificate/e6.pem new file mode 100644 index 0000000..0d70bf3 --- /dev/null +++ b/SARA/SSL/certificate/e6.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICtjCCAjygAwIBAgIRAICpc0jvJ2ip4/a7Q8D5xikwCgYIKoZIzj0EAwMwTzEL +MAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNo +IEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDIwHhcNMjQwMzEzMDAwMDAwWhcN +MjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3MgRW5j +cnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5Gh/gh +cWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV6RlA +N2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgwgfUw +DgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAS +BgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsjv1iU +0jAfBgNVHSMEGDAWgBR8Qpau3ktIO/qS+J6Mz22LqXI3lTAyBggrBgEFBQcBAQQm +MCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94Mi5pLmxlbmNyLm9yZy8wEwYDVR0gBAww +CjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gyLmMubGVuY3Iu +b3JnLzAKBggqhkjOPQQDAwNoADBlAjBgGMvAszhCd1BsRuMwGYCC0QCzf5d//MC5 +ASqIyswj3hGcoZREOKDKdvJPHhgdZr8CMQCWq4Kjl/RmuF49LBq9eP7oGWAc55w4 +G72FoKw5a9WywSwBzoJunrayTB8nDSjEhu8= +-----END CERTIFICATE----- diff --git a/SARA/SSL/certificate/isrg-root-x2.der b/SARA/SSL/certificate/isrg-root-x2.der new file mode 100644 index 0000000..0f5f95f Binary files /dev/null and b/SARA/SSL/certificate/isrg-root-x2.der differ diff --git a/SARA/SSL/isrgrootx1.der b/SARA/SSL/certificate/isrgrootx1.der similarity index 100% rename from SARA/SSL/isrgrootx1.der rename to SARA/SSL/certificate/isrgrootx1.der diff --git a/SARA/SSL/certificate/isrgrootx1.pem b/SARA/SSL/certificate/isrgrootx1.pem new file mode 100644 index 0000000..b85c803 --- /dev/null +++ b/SARA/SSL/certificate/isrgrootx1.pem @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- diff --git a/SARA/SSL/certificate/r11.der b/SARA/SSL/certificate/r11.der new file mode 100644 index 0000000..0b0eabc Binary files /dev/null and b/SARA/SSL/certificate/r11.der differ diff --git a/SARA/SSL/certificate/r11.pem b/SARA/SSL/certificate/r11.pem new file mode 100644 index 0000000..d6bdd38 --- /dev/null +++ b/SARA/SSL/certificate/r11.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFBjCCAu6gAwIBAgIRAIp9PhPWLzDvI4a9KQdrNPgwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAzMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDEMMAoGA1UEAxMDUjExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAuoe8XBsAOcvKCs3UZxD5ATylTqVhyybKUvsVAbe5KPUoHu0nsyQYOWcJ +DAjs4DqwO3cOvfPlOVRBDE6uQdaZdN5R2+97/1i9qLcT9t4x1fJyyXJqC4N0lZxG +AGQUmfOx2SLZzaiSqhwmej/+71gFewiVgdtxD4774zEJuwm+UE1fj5F2PVqdnoPy +6cRms+EGZkNIGIBloDcYmpuEMpexsr3E+BUAnSeI++JjF5ZsmydnS8TbKF5pwnnw +SVzgJFDhxLyhBax7QG0AtMJBP6dYuC/FXJuluwme8f7rsIU5/agK70XEeOtlKsLP +Xzze41xNG/cLJyuqC0J3U095ah2H2QIDAQABo4H4MIH1MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwEgYDVR0TAQH/BAgwBgEB +/wIBADAdBgNVHQ4EFgQUxc9GpOr0w8B6bJXELbBeki8m47kwHwYDVR0jBBgwFoAU +ebRZ5nu25eQBc4AIiMgaWPbpm24wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAC +hhZodHRwOi8veDEuaS5sZW5jci5vcmcvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMCcG +A1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly94MS5jLmxlbmNyLm9yZy8wDQYJKoZIhvcN +AQELBQADggIBAE7iiV0KAxyQOND1H/lxXPjDj7I3iHpvsCUf7b632IYGjukJhM1y +v4Hz/MrPU0jtvfZpQtSlET41yBOykh0FX+ou1Nj4ScOt9ZmWnO8m2OG0JAtIIE38 +01S0qcYhyOE2G/93ZCkXufBL713qzXnQv5C/viOykNpKqUgxdKlEC+Hi9i2DcaR1 +e9KUwQUZRhy5j/PEdEglKg3l9dtD4tuTm7kZtB8v32oOjzHTYw+7KdzdZiw/sBtn +UfhBPORNuay4pJxmY/WrhSMdzFO2q3Gu3MUBcdo27goYKjL9CTF8j/Zz55yctUoV +aneCWs/ajUX+HypkBTA+c8LGDLnWO2NKq0YD/pnARkAnYGPfUDoHR9gVSp/qRx+Z +WghiDLZsMwhN1zjtSC0uBWiugF3vTNzYIEFfaPG7Ws3jDrAMMYebQ95JQ+HIBD/R +PBuHRTBpqKlyDnkSHDHYPiNX3adPoPAcgdF3H2/W0rmoswMWgTlLn1Wu0mrks7/q +pdWfS6PJ1jty80r2VKsM/Dj3YIDfbjXKdaFU5C+8bhfJGqU3taKauuz0wHVGT3eo +6FlWkWYtbt4pgdamlwVeZEW+LM7qZEJEsMNPrfC03APKmZsJgpWCDWOKZvkZcvjV +uYkQ4omYCTX5ohy+knMjdOmdH9c7SpqEWBDC86fiNex+O0XOMEZSa8DA +-----END CERTIFICATE----- diff --git a/SARA/SSL/curl_script.sh b/SARA/SSL/curl_script.sh new file mode 100755 index 0000000..1215a89 --- /dev/null +++ b/SARA/SSL/curl_script.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# to run this script ./curl_script.sh + +# URL to send the request +URL_microSpot="http://api-prod.uspot.probesys.net:81/nebuleair?token=2AFF6dQk68daFZ" +URL_microSpot_HTTPS="https://api-prod.uspot.probesys.net:443/nebuleair?token=2AFF6dQk68daFZ" +URL_airCarto_HTTPS="https://aircarto.fr/tests/test.php" +URL_webhook="https://webhook.site/6bee2237-099a-4ff4-8452-9f4126df7151" + +CERT_PATH="/var/www/nebuleair_pro_4g/SARA/SSL/certificate/e6.pem" +CIPHER="TLS_AES_256_GCM_SHA384" +#CIPHER="TLS_AES_256_GCM_SHA384" +#CIPHER="POLY1305_SHA256" + +# JSON payload to send +PAYLOAD='{ + "nebuleairid": "C04F8B8D3A08", + "software_version": "ModuleAir-V1-012023", + "sensordatavalues": [ + {"value_type": "NPM_P0", "value": "2.3"}, + {"value_type": "NPM_P0", "value": "3.30"}, + {"value_type": "NPM_P1", "value": "9.05"}, + {"value_type": "NPM_P2", "value": "20.60"}, + {"value_type": "NPM_N1", "value": "49.00"}, + {"value_type": "NPM_N10", "value": "49.00"}, + {"value_type": "NPM_N25", "value": "49.00"} + ] +}' + +# Perform the curl command +curl --http1.1 -v -X POST "$URL_microSpot_HTTPS" \ + --tlsv1.2 \ + --cacert "$CERT_PATH" \ + -d "$PAYLOAD" diff --git a/SARA/SSL/full_test_HTTPS_POST.py b/SARA/SSL/full_test_HTTPS_POST.py index e66eddb..a959794 100755 --- a/SARA/SSL/full_test_HTTPS_POST.py +++ b/SARA/SSL/full_test_HTTPS_POST.py @@ -22,8 +22,7 @@ parameter = sys.argv[1:] # Exclude the script name #print("Parameters received:") port='/dev/'+parameter[0] # ex: ttyAMA2 url = parameter[1] # ex: data.mobileair.fr - -profile_id = 3 +profile_id = 2 #get baudrate def load_config(config_file): @@ -43,20 +42,45 @@ config = load_config(config_file) baudrate = config.get('SaraR4_baudrate', 115200) send_uSpot = config.get('send_uSpot', False) -def read_complete_response(serial_connection, timeout=2, end_of_response_timeout=2): +def color_text(text, color): + colors = { + "red": "\033[31m", + "green": "\033[32m", + "yellow": "\033[33m", + "blue": "\033[34m", + "magenta": "\033[35m", + "cyan": "\033[36m", + "white": "\033[37m", + } + reset = "\033[0m" + return f"{colors.get(color, '')}{text}{reset}" + +def read_complete_response(serial_connection, timeout=2, end_of_response_timeout=2, wait_for_line=None): response = bytearray() serial_connection.timeout = timeout end_time = time.time() + end_of_response_timeout - + start_time = time.time() + while True: + elapsed_time = time.time() - start_time # Time since function start if serial_connection.in_waiting > 0: data = serial_connection.read(serial_connection.in_waiting) response.extend(data) end_time = time.time() + end_of_response_timeout # Reset timeout on new data + + # Decode and check for the specific line + if wait_for_line: + decoded_response = response.decode('utf-8', errors='replace') + if wait_for_line in decoded_response: + print(f"[DEBUG] 🔎Found target line: {wait_for_line}") + break elif time.time() > end_time: + print(f"[DEBUG] Timeout reached. No more data received.") break time.sleep(0.1) # Short sleep to prevent busy waiting - + # Final response and debug output + total_elapsed_time = time.time() - start_time + print(f"[DEBUG] ⏱️ elapsed time: {total_elapsed_time:.2f}s. ⏱️") return response.decode('utf-8', errors='replace') ser_sara = serial.Serial( @@ -72,51 +96,105 @@ ser_sara = serial.Serial( try: #step 1: import the certificate print("****") - print("Add certificate") - with open("/var/www/nebuleair_pro_4g/SARA/SSL/isrgrootx1.der", "rb") as cert_file: + with open("/var/www/nebuleair_pro_4g/SARA/SSL/certificate/e6.der", "rb") as cert_file: certificate = cert_file.read() size_of_string = len(certificate) - command = f'AT+USECMNG=0,0,"myCertificate2",{size_of_string}\r' + print("\033[0;33m Import certificate\033[0m") + # AT+USECMNG=0,,, + # type-> 0 -> trusted root CA + command = f'AT+USECMNG=0,0,"e6",{size_of_string}\r' ser_sara.write((command + '\r').encode('utf-8')) response_SARA_1 = read_complete_response(ser_sara) - print("Write certificate metadata") print(response_SARA_1) - time.sleep(1) + time.sleep(0.5) + print("\033[0;33mAdd certificate\033[0m") ser_sara.write(certificate) response_SARA_2 = read_complete_response(ser_sara) - print("Write certificate data") print(response_SARA_2) - time.sleep(1) + time.sleep(0.5) + + #check certificate (List all available certificates and private keys) + print("\033[0;33mCheck certificate\033[0m") + command = f'AT+USECMNG=3\r' + ser_sara.write((command + '\r').encode('utf-8')) + response_SARA_5b = read_complete_response(ser_sara, wait_for_line="OK") + print(response_SARA_5b) + time.sleep(0.5) + + # ******************************* + # SECURITY PROFILE + # AT+USECPRF=[,[,]] + + + # op_code: 0 -> certificate validation level + # param_val : 0 -> Level 0 No validation; 1-> Level 1 Root certificate validation + security_profile_id = 0 + print("\033[0;33mSet the security profile (params)\033[0m") + command = f'AT+USECPRF={security_profile_id},0,0\r' + ser_sara.write((command + '\r').encode('utf-8')) + response_SARA_5b = read_complete_response(ser_sara, wait_for_line="OK") + print(response_SARA_5b) + time.sleep(0.5) + + # op_code: 1 -> minimum SSL/TLS version + # param_val : 0 -> any; server can use any version for the connection; 1-> LSv1.0; + print("\033[0;33mSet the security profile (params)\033[0m") + command = f'AT+USECPRF={security_profile_id},1,0\r' + ser_sara.write((command + '\r').encode('utf-8')) + response_SARA_5bb = read_complete_response(ser_sara, wait_for_line="OK") + print(response_SARA_5bb) + time.sleep(0.5) + + #op_code: 2 -> cipher suite + print("\033[0;33mSet cipher \033[0m") + command = f'AT+USECPRF={security_profile_id},2,0\r' + ser_sara.write((command + '\r').encode('utf-8')) + response_SARA_5cc = read_complete_response(ser_sara, wait_for_line="OK") + print(response_SARA_5cc) + time.sleep(0.5) + + # op_code: 3 -> trusted root certificate internal name + print("\033[0;33mSet the security profile (choose cert)\033[0m") + command = f'AT+USECPRF={security_profile_id},3,"e6"\r' + ser_sara.write((command + '\r').encode('utf-8')) + response_SARA_5c = read_complete_response(ser_sara, wait_for_line="OK") + print(response_SARA_5c) + time.sleep(0.5) + + # ************************* + # ************************* + #step 4: set url (op_code = 1) - print("****") - print("SET URL") + print("\033[0;33mSET URL\033[0m") command = f'AT+UHTTP={profile_id},1,"{url}"\r' ser_sara.write((command + '\r').encode('utf-8')) - response_SARA_5 = read_complete_response(ser_sara) + response_SARA_5 = read_complete_response(ser_sara, wait_for_line="OK") print(response_SARA_5) time.sleep(1) #step 4: set PORT (op_code = 5) - print("****") - print("SET PORT") - command = f'AT+UHTTP={profile_id},5,443\r' + print("\033[0;33mSET PORT\033[0m") + port = 443 + command = f'AT+UHTTP={profile_id},5,{port}\r' ser_sara.write((command + '\r').encode('utf-8')) - response_SARA_55 = read_complete_response(ser_sara) + response_SARA_55 = read_complete_response(ser_sara, wait_for_line="OK") print(response_SARA_55) time.sleep(1) #step 4: set url to SSL (op_code = 6) (http_secure = 1 for HTTPS)(USECMNG_PROFILE = 2) - print("****") - print("SET SSL") - command = f'AT+UHTTP={profile_id},6,1\r' + print("\033[0;33mSET SSL\033[0m") + http_secure = 1 + command = f'AT+UHTTP={profile_id},6,{http_secure},{security_profile_id}\r' + #command = f'AT+UHTTP={profile_id},6,{http_secure}\r' + ser_sara.write(command.encode('utf-8')) - response_SARA_5 = read_complete_response(ser_sara) + response_SARA_5 = read_complete_response(ser_sara, wait_for_line="OK") print(response_SARA_5) time.sleep(1) @@ -162,53 +240,91 @@ try: # 1. Open sensordata_csv.json (with correct data size) payload_string = json.dumps(payload_json) # Convert dict to JSON string size_of_string = len(payload_string) + print("\033[0;33mOPEN JSON\033[0m") command = f'AT+UDWNFILE="sensordata_json.json",{size_of_string}\r' - ser_sara.write((command + '\r').encode('utf-8')) - response_SARA_1 = read_complete_response(ser_sara) - print("Open JSON:") + ser_sara.write(command.encode('utf-8')) + response_SARA_1 = read_complete_response(ser_sara, wait_for_line=">") print(response_SARA_1) - time.sleep(1) + time.sleep(0.5) #2. Write to shell + print("\033[0;33mWrite to Memory\033[0m") ser_sara.write(payload_string.encode()) - response_SARA_2 = read_complete_response(ser_sara) - print("Write to memory:") + response_SARA_2 = read_complete_response(ser_sara, wait_for_line="OK") print(response_SARA_2) #step 4: trigger the request (http_command=1 for GET and http_command=1 for POST) print("****") - print("Trigger POST REQUEST") - #command = f'AT+UHTTPC={profile_id},1,"/tests/test.php","https.resp"\r' - command = f'AT+UHTTPC={profile_id},4,"/nebuleair?token=2AFF6dQk68daFZ","https.resp","sensordata_json.json",4\r' + print("\033[0;33mPOST REQUEST\033[0m") + #AIRCARTO + #command = f'AT+UHTTPC={profile_id},4,"/tests/test.php","https.resp","sensordata_json.json",4\r' + #uSPOT + command = f'AT+UHTTPC={profile_id},4,"/nebuleair?token=2AFF6dQk68daFZ","https.resp","sensordata_json.json",4\r' + #AtmoSud + #command = f'AT+UHTTPC={profile_id},1,"/","https.resp"\r' + #Webhook + #command = f'AT+UHTTPC={profile_id},4,"/6bee2237-099a-4ff4-8452-9f4126df7151","https.resp","sensordata_json.json",4\r' + ser_sara.write(command.encode('utf-8')) # Wait for the +UUHTTPCR response print("Waiting for +UUHTTPCR response...") - response_received = False - while not response_received: - response = read_complete_response(ser_sara, timeout=5) - print(response) - if "+UUHTTPCR" in response: - response_received = True + response_SARA_3 = read_complete_response(ser_sara, timeout=5, end_of_response_timeout=30, wait_for_line="+UUHTTPCR") + + print("\033[0;34m") + print(response_SARA_3) + print("\033[0m") + + if "+UUHTTPCR" in response_SARA_3: + print("✅ Received +UUHTTPCR response.") + lines = response_SARA_3.strip().splitlines() + http_response = lines[-1] # "+UUHTTPCR: 0,4,0" + parts = http_response.split(',') + # code 0 (HTTP failed) + if len(parts) == 3 and parts[-1] == '0': # The third value indicates success + print("\033[0;31mATTENTION: HTTP operation failed\033[0m") + else: + print("\033[0;32m HTTP operation successful!!!\033[0m") + #READ REPLY print("****") - print("Read reply from server") + print("\033[0;33mREPLY SERVER\033[0m") ser_sara.write(b'AT+URDFILE="https.resp"\r') - response_SARA_7 = read_complete_response(ser_sara) + response_SARA_7 = read_complete_response(ser_sara, wait_for_line="OK") print("Reply from server:") + + print("\033[0;32m") print(response_SARA_7) + print("\033[0m") #5. empty json - print("Empty SARA memory:") + print("\033[0;33mEmpty Memory\033[0m") ser_sara.write(b'AT+UDELFILE="sensordata_json.json"\r') - response_SARA_8 = read_complete_response(ser_sara) + response_SARA_8 = read_complete_response(ser_sara, wait_for_line="OK") print(response_SARA_8) + # Get error code + print("\033[0;33mEmpty Memory\033[0m") + command = f'AT+UHTTPER={profile_id}\r' + ser_sara.write(command.encode('utf-8')) + response_SARA_9 = read_complete_response(ser_sara, wait_for_line="OK") + print(response_SARA_9) + ''' + +UHTTPER: profile_id,error_class,error_code + error_class + 0 OK, no error + 3 HTTP Protocol error class + 10 Wrong HTTP API USAGE + + error_code + 0 No error + 73 Secure socket connect error + ''' except serial.SerialException as e: print(f"Error: {e}") diff --git a/SARA/SSL/full_test_HTTP_POST.py b/SARA/SSL/full_test_HTTP_POST.py index 69c01cf..efb4d85 100755 --- a/SARA/SSL/full_test_HTTP_POST.py +++ b/SARA/SSL/full_test_HTTP_POST.py @@ -25,7 +25,6 @@ parameter = sys.argv[1:] # Exclude the script name #print("Parameters received:") port='/dev/'+parameter[0] # ex: ttyAMA2 url = parameter[1] # ex: data.mobileair.fr - profile_id = 1 #get baudrate diff --git a/SARA/SSL/old/full_test_HTTPS.py b/SARA/SSL/old/full_test_HTTPS.py index f1e6a70..aac6046 100755 --- a/SARA/SSL/old/full_test_HTTPS.py +++ b/SARA/SSL/old/full_test_HTTPS.py @@ -42,20 +42,32 @@ config = load_config(config_file) baudrate = config.get('SaraR4_baudrate', 115200) send_uSpot = config.get('send_uSpot', False) -def read_complete_response(serial_connection, timeout=2, end_of_response_timeout=2): +def read_complete_response(serial_connection, timeout=2, end_of_response_timeout=2, wait_for_line=None): response = bytearray() serial_connection.timeout = timeout end_time = time.time() + end_of_response_timeout - + start_time = time.time() + while True: + elapsed_time = time.time() - start_time # Time since function start if serial_connection.in_waiting > 0: data = serial_connection.read(serial_connection.in_waiting) response.extend(data) end_time = time.time() + end_of_response_timeout # Reset timeout on new data + + # Decode and check for the specific line + if wait_for_line: + decoded_response = response.decode('utf-8', errors='replace') + if wait_for_line in decoded_response: + print(f"[DEBUG] 🔎Found target line: {wait_for_line}") + break elif time.time() > end_time: + print(f"[DEBUG] Timeout reached. No more data received.") break time.sleep(0.1) # Short sleep to prevent busy waiting - + # Final response and debug output + total_elapsed_time = time.time() - start_time + print(f"[DEBUG] ⏱️ elapsed time: {total_elapsed_time:.2f}s. ⏱️") return response.decode('utf-8', errors='replace') ser_sara = serial.Serial( diff --git a/SARA/SSL/open_ssl_script.sh b/SARA/SSL/open_ssl_script.sh new file mode 100644 index 0000000..e84067b --- /dev/null +++ b/SARA/SSL/open_ssl_script.sh @@ -0,0 +1,5 @@ +#!/bin/bash +openssl s_client -connect aircarto.fr:443 -cipher TLS_AES_256_GCM_SHA384 +openssl s_client -connect aircarto.fr:443 -tls1_3 -ciphersuites TLS_AES_256_GCM_SHA384 +openssl s_client -connect api-prod.uspot.probesys.net:443 -tls1_2 -ciphersuites TLS_AES_256_GCM_SHA384 -CAfile /var/www/nebuleair_pro_4g/SARA/SSL/certificate/isrgrootx1.pem +openssl s_client -connect aircarto.fr:443 -tls1_2 -ciphersuites TLS_AES_256_GCM_SHA384 -CAfile /var/www/nebuleair_pro_4g/SARA/SSL/certificate/isrgrootx1.pem diff --git a/SARA/SSL/request.py b/SARA/SSL/request.py new file mode 100644 index 0000000..aea27da --- /dev/null +++ b/SARA/SSL/request.py @@ -0,0 +1,45 @@ +''' +/usr/bin/python3 /var/www/nebuleair_pro_4g/SARA/SSL/request.py + +''' +import requests +import logging +import http.client as http_client + +# Enable HTTP and HTTPS verbose logging +http_client.HTTPConnection.debuglevel = 1 + +logging.basicConfig(level=logging.DEBUG) +logging.getLogger("http.client").setLevel(logging.DEBUG) +logging.getLogger("urllib3").setLevel(logging.DEBUG) +logging.getLogger("requests").setLevel(logging.DEBUG) + +# Suppress logging from unrelated libraries +logging.getLogger("chardet").setLevel(logging.INFO) +logging.getLogger("urllib3.connectionpool").setLevel(logging.INFO) + +url_microSpot = "https://api-prod.uspot.probesys.net/nebuleair?token=2AFF6dQk68daFZ" +url_aircarto = "https://aircarto.fr/tests/test.php" + +payload = { + "nebuleairid": "C04F8B8D3A08", + "software_version": "ModuleAir-V1-012023", + "sensordatavalues": [ + {"value_type": "NPM_P0", "value": "2.3"}, + {"value_type": "NPM_P0", "value": "3.30"}, + {"value_type": "NPM_P1", "value": "9.05"}, + {"value_type": "NPM_P2", "value": "20.60"}, + {"value_type": "NPM_N1", "value": "49.00"}, + {"value_type": "NPM_N10", "value": "49.00"}, + {"value_type": "NPM_N25", "value": "49.00"} + ] +} +cert_path = "/var/www/nebuleair_pro_4g/SARA/SSL/isrgrootx1.pem" + + +try: + response = requests.post(url_aircarto, json=payload, verify=cert_path) + print("Response Status Code:", response.status_code) + print("Response Text:", response.text) +except requests.exceptions.RequestException as e: + print("An error occurred:", e)