-
Notifications
You must be signed in to change notification settings - Fork 4
/
Iridium_9603N_Beacon_habhub_habitat_uploader.py
135 lines (111 loc) · 6.44 KB
/
Iridium_9603N_Beacon_habhub_habitat_uploader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# Iridium 9603N Beacon HabHub Habitat Uploader
# Builds a dictionary of all existing sbd files
# Once per minute, checks for the appearance of a new sbd file
# When one is found, parses the file and uploads the data to the habhub habitat
# sbd file contains:
# Column 0 = GPS Tx Time (YYYYMMDDHHMMSS) (Start of 9603 Tx session)
# Column 1 = GPS Latitude (degrees) (float)
# Column 2 = GPS Longitude (degrees) (float)
# Column 3 = GPS Altitude (m) (int)
# Column 4 = GPS Speed (m/s) (float)
# Column 5 = GPS Heading (Degrees) (int)
# Column 6 = GPS HDOP (m) (float)
# Column 7 = GPS satellites (int)
# Coulmn 8 = Pressure (Pascals) (int)
# Column 9 = Temperature (C) (float)
# Column 10 = Battery (V) (float)
# Column 11 = Iteration Count (int)
# Converters
# 0:mdates.strpdate2num('%Y%m%d%H%M%S')
import os
import numpy as np
import time
import matplotlib.dates as mdates
import crcmod
import base64
import hashlib
import couchdb
from datetime import datetime
if __name__ == '__main__':
try:
print 'Iridium 9603 Beacon to habhub habitat uploader'
couch = couchdb.Server('http://habitat.habhub.org/')
db = couch['habitat']
callsign = "<your_flight_ID>"
# Build a dictionary of all existing sbd files
sbd = {}
for root, dirs, files in os.walk("."):
if len(files) > 0:
#if root != ".": # Ignore files in this directory - only process subdirectories
#if root == ".": # Ignore subdirectories - only process this directory
for filename in files:
if filename[-4:] == '.sbd': # check for sbd file suffix
longfilename = os.path.join(root, filename)
msnum = int(longfilename[-10:-4]) # extract the message sequence number
sbd[msnum] = longfilename # add the msn and filename to the dictionary
print 'Found',len(sbd),'existing sbd files'
print 'Checking once per minute for new ones...'
# Once per minute, check for the appearance of a new sbd file
while (True):
for l in range(60): # Sleep for 60x1 seconds (to allow KeyboardInterrupt to be detected quickly)
time.sleep(1)
# Identify all the sbd files again
for root, dirs, files in os.walk("."):
if len(files) > 0:
#if root != ".": # Ignore files in this directory - only process subdirectories
#if root == ".": # Ignore subdirectories - only process this directory
for filename in files:
if filename[-4:] == '.sbd':
longfilename = os.path.join(root, filename)
msnum = int(longfilename[-10:-4])
# Check if message sequence number is in the dictionary
# If it isn't then this must be a new sbd file so process it
if sbd.has_key(msnum) == False:
print 'Found new sbd file with MOMSN',msnum
sbd[msnum] = longfilename # Add new msn and filename to dictionary
# Read the sbd file and unpack the data using numpy loadtxt
gpstime,latitude,longitude,altitude,speed,heading,pressure,temperature,battery = \
np.loadtxt(longfilename, delimiter=',', unpack=True, \
usecols=(0,1,2,3,4,5,8,9,10), converters={0:mdates.strpdate2num('%Y%m%d%H%M%S')})
pressure = int(round(pressure)) # Convert pressure to integer
time_str = mdates.num2date(gpstime).strftime('%H:%M:%S,%y%m%d') # Time string (HH:MM:SS,YYMMDD)
location_str = "{:.6f},{:.6f},{}".format(latitude, longitude, int(round(altitude))) # Location
# Assemble the UKHAS format string
ukhas_str = "{},{},{},{:.2f},{:.1f},{},{},{},{}".format( \
callsign, time_str, location_str, speed, heading, pressure, temperature, battery, msnum);
# Calculate checksum
crc16 = crcmod.mkCrcFun(0x11021, 0xFFFF, False, 0x0000)
checksum = "{:04X}".format(crc16(ukhas_str))
# Append the checksum
ukhas_str = "$${}*{}".format(ukhas_str, checksum)
print 'Uploading:',ukhas_str
# Packet ID
packet_base64 = base64.standard_b64encode(ukhas_str+"\n")
packet_sha256 = hashlib.sha256(packet_base64).hexdigest()
# Time Created = backlog time
time_created = mdates.num2date(gpstime).strftime('%Y-%m-%dT%H:%M:%S+00:00')
# Time Uploaded = now
now = datetime.utcnow()
time_uploaded = now.replace(microsecond=0).isoformat()+"+00:00"
## >>>>> Comment from here
## # Upload to the habhub habitat database
## doc_id, doc_rev = db.save({
## "type":"payload_telemetry",
## "_id": packet_sha256,
## "data":{
## "_raw": packet_base64
## },
## "receivers": {
## "BACKLOG": {
## "time_created": time_created,
## "time_uploaded": time_uploaded,
## }
## }
## })
## print 'Doc ID:',doc_id
## print 'Doc Rev:',doc_rev
## >>>>> to here to disable habitat upload
except KeyboardInterrupt:
print 'CTRL+C received...'
finally:
print 'Bye!'