kopia lustrzana https://github.com/projecthorus/wenet
131 wiersze
3.3 KiB
Python
131 wiersze
3.3 KiB
Python
#!/usr/bin/env python2.7
|
|
#
|
|
# Wenet SSDV Upload Script.
|
|
#
|
|
# Copyright (C) 2018 Mark Jessop <vk5qi@rfhead.net>
|
|
# Released under GNU GPL v3 or later
|
|
#
|
|
# Watches the rx_images directory for new images, and uploads the latest image it sees.
|
|
#
|
|
#
|
|
|
|
import base64, requests, datetime, os, glob, time, traceback
|
|
|
|
ssdv_url = "http://ssdv.habhub.org/api/v0/packets"
|
|
|
|
def ssdv_encode_packet(packet,callsign="N0CALL"):
|
|
packet_dict = {
|
|
"type":"packet",
|
|
"packet":base64.b64encode(packet),
|
|
"encoding":"base64",
|
|
# Because .isoformat() doesnt give us the right format... (boo)
|
|
"received":datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
"receiver":callsign,
|
|
}
|
|
return packet_dict
|
|
|
|
def ssdv_upload_single(packet,callsign="N0CALL"):
|
|
packet_dict = ssdv_encode_single(packet,callsign)
|
|
|
|
r = requests.post(ssdv_url,json=packet_dict)
|
|
return r
|
|
|
|
def ssdv_upload_multiple(packet_array,callsign="N0CALL"):
|
|
encoded_array = []
|
|
|
|
for packet in packet_array:
|
|
encoded_array.append(ssdv_encode_packet(packet,callsign))
|
|
|
|
packet_dict = {
|
|
"type": "packets",
|
|
"packets": encoded_array
|
|
}
|
|
try:
|
|
r = requests.post(ssdv_url,json=packet_dict)
|
|
except Exception as e:
|
|
print(e.strerror)
|
|
return r
|
|
|
|
|
|
def ssdv_upload_file(filename,callsign="N0CALL", blocksize=16):
|
|
file_size = os.path.getsize(filename)
|
|
|
|
if file_size % 256 > 0:
|
|
print("File size not a multiple of 256 bytes!")
|
|
return
|
|
|
|
packet_count = file_size/256
|
|
print("Uploading %d packets." % packet_count)
|
|
start_time = datetime.datetime.now()
|
|
|
|
f = open(filename,"rb")
|
|
|
|
while packet_count > 0:
|
|
|
|
if packet_count <=blocksize:
|
|
# Read and transmit remainder of file.
|
|
data = f.read()
|
|
packet_array = [ data[i:i+256] for i in range(0,len(data),256)]
|
|
ssdv_upload_multiple(packet_array,callsign)
|
|
packet_count = 0
|
|
else:
|
|
data = f.read(blocksize*256)
|
|
packet_array = [ data[i:i+256] for i in range(0,len(data),256)]
|
|
ssdv_upload_multiple(packet_array,callsign)
|
|
packet_count = packet_count - blocksize
|
|
|
|
print("%d packets remaining." % packet_count)
|
|
|
|
f.close()
|
|
stop_time = datetime.datetime.now()
|
|
upload_time = (stop_time-start_time).total_seconds()
|
|
print("Upload Completed in %.2f Seconds." % upload_time)
|
|
|
|
def ssdv_dir_watcher(glob_string="./rx_images/*.bin", check_time = 0.5, callsign="N0CALL"):
|
|
# Check what's there now..
|
|
rx_images = glob.glob(glob_string)
|
|
print("Starting directory watch...")
|
|
|
|
while True:
|
|
try:
|
|
time.sleep(check_time)
|
|
|
|
# Check directory again.
|
|
rx_images_temp = glob.glob(glob_string)
|
|
if len(rx_images_temp) == 0:
|
|
continue
|
|
# Sort list. Image filenames are timestamps, so the last element in the array will be the latest image.
|
|
rx_images_temp.sort()
|
|
# Is there an new image?
|
|
if rx_images_temp[-1] not in rx_images:
|
|
# New image! Wait a little bit in case we're still writing to that file, then upload.
|
|
time.sleep(0.5)
|
|
filename = rx_images_temp[-1]
|
|
print("Found new image! Uploading: %s " % filename)
|
|
ssdv_upload_file(filename,callsign=callsign,blocksize=256)
|
|
|
|
rx_images = rx_images_temp
|
|
except KeyboardInterrupt:
|
|
sys.exit(0)
|
|
except:
|
|
traceback.print_exc()
|
|
continue
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
try:
|
|
callsign = sys.argv[1]
|
|
if len(callsign)>6:
|
|
callsign = callsign[:6]
|
|
except:
|
|
print("Usage: python ssdv_upload.py CALLSIGN &")
|
|
sys.exit(1)
|
|
|
|
print("Using callsign: %s" % callsign)
|
|
|
|
|
|
ssdv_dir_watcher(callsign=callsign)
|