Ho usato per decodificare i messaggi AIS con il pacchetto theis (Python) https://github.com/schwehr/noaadata/tree/master/ais fino a quando non ho iniziato a ottenere un nuovo formato dei messaggi. Come forse saprai, i messaggi AIS sono principalmente di due tipi. una parte (un messaggio) o due parti (multi messaggio). Il messaggio n. 5 è sempre disponibile in due parti. Esempio:Creazione di decodificatore messaggi AIS
!AIVDM,2,1,1,A,55?MbV02;H;s<HtKR20EHE:[email protected]@Dn2222222216L961O5Gf0NSQEp6ClRp8,0*1C
!AIVDM,2,2,1,A,88888888880,2*25
ho utilizzato per decodificare questo bene utilizzando il seguente pezzo di codice:
nmeamsg = fields.split(',')
if nmeamsg[0] != '!AIVDM':
return
total = eval(nmeamsg[1])
part = eval(nmeamsg[2])
aismsg = nmeamsg[5]
nmeastring = string.join(nmeamsg[0:-1],',')
bv = binary.ais6tobitvec(aismsg)
msgnum = int(bv[0:6])
-
elif (total>1):
# Multi Slot Messages: 5,6,8,12,14,17,19,20?,21,24,26
global multimsg
if total==2:
if msgnum==5:
if nmeastring.count('!AIVDM')==2 and len(nmeamsg)==13: # make sure there are two parts concatenated together
aismsg = nmeamsg[5]+nmeamsg[11]
bv = binary.ais6tobitvec(aismsg)
msg5 = ais_msg_5.decode(bv)
print "message5 :",msg5
return msg5
Ora sto ottenendo un nuovo formato dei messaggi :
!SAVDM,2,1,7,A,[email protected]`[email protected]:[email protected]@Dp,0*2A,1410825672
!SAVDM,2,2,7,A,4hC`[email protected]`40,2*76,1410825672,1410825673
Nota. il numero all'ultimo indice è l'ora in formato epoca
Ho provato a modificare il mio codice per decodificare questo nuovo formato. Riusco a decodificare i messaggi con una parte. Il mio problema è di tipo multi-messaggio.
nmeamsg = fields.split(',')
if nmeamsg[0] != '!AIVDM' and nmeamsg[0] != '!SAVDM':
return
total = eval(nmeamsg[1])
part = eval(nmeamsg[2])
aismsg = nmeamsg[5]
nmeastring = string.join(nmeamsg[0:-1],',')
dbtimestring = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(nmeamsg[7])))
bv = binary.ais6tobitvec(aismsg)
msgnum = int(bv[0:6])
Il decodificatore non può portare le due linee come una. Quindi la decodifica fallisce perché il messaggio # 5 dovrebbe contenere due stringhe non una. L'errore che ottengo è in queste righe:
if nmeastring.count('!SAVDM')==2 and len(nmeamsg)==13:
aismsg = nmeamsg[5]+nmeamsg[11]
Dove len(nmeamsg)
è sempre 8 (seconda riga) e nmeastring.count('!SAVDM')
è sempre 1
Spero ho spiegato chiaramente in modo che qualcuno può farmi sapere quello che sto manca qui.
UPDATE
Va bene Credo di aver trovato la ragione. Passo messaggio file script riga per riga:
for line in file:
i=i+1
try:
doais(line)
Dove messaggio # 5 dovrebbe essere passato come due linee. Qualche idea su come posso farlo?
UPDATE
ho fatto modificando il codice un po ':
for line in file:
i=i+1
try:
nmeamsg = line.split(',')
aismsg = nmeamsg[5]
bv = binary.ais6tobitvec(aismsg)
msgnum = int(bv[0:6])
print msgnum
if nmeamsg[0] != '!AIVDM' and nmeamsg[0] != '!SAVDM':
print "wrong format"
total = eval(nmeamsg[1])
if total == 1:
dbtimestring = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(nmeamsg[8])))
doais(line,msgnum,dbtimestring,aismsg)
if total == 2: #Multi-line messages
lines= line+file.next()
nmeamsg = lines.split(',')
dbtimestring = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(nmeamsg[15])))
aismsg = nmeamsg[5]+nmeamsg[12]
doais(lines,msgnum,dbtimestring,aismsg)
per lino, riga enumerate (aperto ('log.ais'): è più tipico per python –