Skip to content

Commit

Permalink
Merge pull request #137 from mindsuru/fix-vscode-otaupload-with-V3
Browse files Browse the repository at this point in the history
fixed-platformio-upload-with-otav3
  • Loading branch information
ayushsharma82 committed Oct 26, 2023
2 parents 543f977 + 7027748 commit 9ab44bd
Showing 1 changed file with 63 additions and 13 deletions.
76 changes: 63 additions & 13 deletions platformio_upload.py
@@ -1,4 +1,4 @@
# Allows PlatformIO to upload directly to AsyncElegantOTA
# Allows PlatformIO to upload directly to ElegantOTA
#
# To use:
# - copy this script into the same folder as your platformio.ini
Expand All @@ -9,11 +9,14 @@
# upload_url = <your upload URL>
#
# An example of an upload URL:
# upload_URL = http://192.168.1.123/update
# upload_url = http://192.168.1.123/update
# also possible: upload_url = http://domainname/update

import requests
import hashlib
Import('env')
from urllib.parse import urlparse
import time
Import("env")

try:
from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor
Expand All @@ -26,28 +29,75 @@

def on_upload(source, target, env):
firmware_path = str(source[0])
upload_url = env.GetProjectOption('upload_url')
upload_url_compatibility = env.GetProjectOption('upload_url')
upload_url = upload_url_compatibility.replace("/update", "")

with open(firmware_path, 'rb') as firmware:
md5 = hashlib.md5(firmware.read()).hexdigest()

parsed_url = urlparse(upload_url)
host_ip = parsed_url.netloc

# Führe die GET-Anfrage aus
start_url = f"{upload_url}/ota/start?mode=fr&hash={md5}"

start_headers = {
'Host': host_ip,
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0',
'Accept': '*/*',
'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Referer': f'{upload_url}/update',
'Connection': 'keep-alive'
}

start_response = requests.get(start_url, headers=start_headers)

if start_response.status_code != 200:
print("start-request faild " + str(start_response.status_code))
return

firmware.seek(0)
encoder = MultipartEncoder(fields={
'MD5': md5,
'MD5': md5,
'firmware': ('firmware', firmware, 'application/octet-stream')}
)

bar = tqdm(desc='Upload Progress',
total=encoder.len,
dynamic_ncols=True,
unit='B',
unit_scale=True,
unit_divisor=1024
)
total=encoder.len,
dynamic_ncols=True,
unit='B',
unit_scale=True,
unit_divisor=1024
)

monitor = MultipartEncoderMonitor(encoder, lambda monitor: bar.update(monitor.bytes_read - bar.n))

response = requests.post(upload_url, data=monitor, headers={'Content-Type': monitor.content_type})
post_headers = {
'Host': host_ip,
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0',
'Accept': '*/*',
'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Referer': f'{upload_url}/update',
'Connection': 'keep-alive',
'Content-Type': monitor.content_type,
'Content-Length': str(monitor.len),
'Origin': f'{upload_url}'
}


response = requests.post(f"{upload_url}/ota/upload", data=monitor, headers=post_headers)

bar.close()
print(response,response.text)
time.sleep(0.1)

if response.status_code != 200:
message = "\nUpload faild.\nServer response: " + response.text
tqdm.write(message)
else:
message = "\nUpload successful.\nServer response: " + response.text
tqdm.write(message)


env.Replace(UPLOADCMD=on_upload)

0 comments on commit 9ab44bd

Please sign in to comment.