mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-21 10:26:06 +03:00
Proper error handling in the uploading python script Much faster OTA example sketch with better results New Update class that simplifies updating the firmware from any source Updated Esp.updateSketch() to use the new class
89 lines
2.2 KiB
Python
Executable File
89 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# this script will push an OTA update to the ESP
|
|
#
|
|
# use it like: python ota_server.py <ESP_IP_address> <sketch.bin>
|
|
#
|
|
# on the ESP side you need code like this: https://gist.github.com/igrr/43d5c52328e955bb6b09 to handle the update
|
|
#
|
|
|
|
from __future__ import print_function
|
|
import socket
|
|
import sys
|
|
import os
|
|
|
|
def serve(remoteAddr, remotePort, filename):
|
|
# Create a TCP/IP socket
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
serverPort = 48266
|
|
server_address = ('0.0.0.0', serverPort)
|
|
print('Starting on %s:%s' % server_address, file=sys.stderr)
|
|
try:
|
|
sock.bind(server_address)
|
|
sock.listen(1)
|
|
except:
|
|
print('Socket Failed', file=sys.stderr)
|
|
return 1
|
|
|
|
content_size = os.path.getsize(filename)
|
|
print('Upload size: %d' % content_size, file=sys.stderr)
|
|
message = '%d %d %d\n' % (0, serverPort, content_size)
|
|
|
|
# Wait for a connection
|
|
print('Sending invitation to:', remoteAddr, file=sys.stderr)
|
|
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
remote_address = (remoteAddr, int(remotePort))
|
|
sent = sock2.sendto(message, remote_address)
|
|
sock2.close()
|
|
|
|
print('Waiting for device...\n', file=sys.stderr)
|
|
try:
|
|
sock.settimeout(10)
|
|
connection, client_address = sock.accept()
|
|
sock.settimeout(None)
|
|
connection.settimeout(None)
|
|
except:
|
|
print('No response from device', file=sys.stderr)
|
|
sock.close()
|
|
return 1
|
|
|
|
try:
|
|
f = open(filename, "rb")
|
|
sys.stderr.write('Uploading')
|
|
sys.stderr.flush()
|
|
while True:
|
|
chunk = f.read(4096)
|
|
if not chunk: break
|
|
sys.stderr.write('.')
|
|
sys.stderr.flush()
|
|
connection.sendall(chunk)
|
|
|
|
print('\nWaiting for result...\n', file=sys.stderr)
|
|
try:
|
|
connection.settimeout(60)
|
|
data = connection.recv(32)
|
|
print('Result: %s' % data, file=sys.stderr)
|
|
connection.close()
|
|
f.close()
|
|
return 0
|
|
except:
|
|
print('Result: No Answer!', file=sys.stderr)
|
|
connection.close()
|
|
f.close()
|
|
return 1
|
|
|
|
finally:
|
|
connection.close()
|
|
f.close()
|
|
sock.close()
|
|
return 1
|
|
|
|
def main(args):
|
|
return serve(args[1], args[2], args[3])
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(sys.argv))
|
|
|