bcl / aisparser Goto Github PK
View Code? Open in Web Editor NEWAIS Parser SDK
Home Page: http://www.aisparser.com
License: Other
AIS Parser SDK
Home Page: http://www.aisparser.com
License: Other
Should switch to using github actions at some point
I've been compiling Python versions using various Visual Studio versions for a few years now and have a set of project files for VS2022 Community Edition - do you have any interest in a pull request providing these new files (and with pre-compiled Python 3.10.4 .pyd if desired)?
Just checking before going through the effort, otherwise I can just push them to a fork.
Hi,
thanks for your work and effort in building this great decoder!
I'm start to working with it and I have no problem with normal message types (1,2,3,4) but I don't know how to work with type 5 sentences. Is it possible to do it with this parser? do you have any example?
I'm just interested in the name, mmsi and shiptype variables so if is not possible to decode type 5 messages is it possible to get these values somehow?
All the best
I'm having an issue parsing incoming messages with ais message type 5. Parsing these message works with AisLib.
Please advise.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "portable.h"
#include "nmea.h"
#include "sixbit.h"
#include "vdm_parse.h"
int main( int argc, char *argv[] )
{
int i = 0;
ais_state ais;
aismsg_5 msg_5;
memset( &ais, 0, sizeof( ais_state ) );
char *msg[] =
{
"!BSVDM,2,2,4,A,54SkDki@000,2*06",
"!BSVDM,2,2,1,A,50E@0000000,2*3C",
"!BSVDM,2,2,7,A,5`5QAhH8880,2*52",
"!BSVDM,2,2,3,A,5H888888880,2*43",
"!BSVDM,2,2,3,B,54SkDki@000,2*02",
"!BSVDM,2,2,9,B,50E@0000000,2*37",
"!BSVDM,2,2,2,A,5P@Ah000000,2*03",
"!BSVDM,2,2,6,A,5`5QAhH8880,2*53",
"!BSVDM,2,2,8,B,5H888888880,2*4B",
"!BSVDM,2,2,2,B,5R1`0j8<M`0,2*79",
"!BSVDM,1,1,,A,53mFl:400000hoG3;@0pE1ADp000,0*39"
};
for(i = 0; i < (sizeof(msg) / sizeof(const char*)) ; i++) {
if(assemble_vdm( &ais, msg[i]) == 0) {
ais.msgid = (unsigned char) get_6bit( &ais.six_state, 6 );
printf("msgid: %d, parse result: %d\n", ais.msgid, parse_ais_5(&ais, &msg_5));
}
}
return 0;
}
Output:
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
msgid: 5, parse result: 2
In the C code it checks for the message sequence, order, and channel number: https://github.com/bcl/aisparser/blob/master/c/src/vdm_parse.c#L458 but in the Java parser it accepts whatever the current channel is: https://github.com/bcl/aisparser/blob/master/java/src/main/java/com/aisparser/Vdm.java#L115
(I no longer have a java development setup so am unable to fix this).
This shouldn't be a problem as long as the parser is fed messages that are from the same channel, and in order.
Taking a quick look at adding a test for Message2 and getting some suspicious results. Couple of surprising things that I see:
longitude
and latitude
in message and position are confusing at it seems that are confusing names as they are signed 1/10000 degree position
and longsThis is also an example of junit4 with test discovery and a touch of cleanup. I did a by hand conversion of tabs to 4 spaces as tabs cause endless tool troubles for me. Would be maybe best to pick a formatter tool and setting and use that?
Thoughts?
package com.aisparser;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests for {@link Message2}. */
@RunWith(JUnit4.class)
public class Message2Test {
// Verifies decode of Msg 2 for a ship in a turn.
@Test
public void testParse() {
Message2 msg = new Message2();
try {
Vdm vdm_message = new Vdm();
int result = vdm_message.add("!AIVDM,1,1,,B,284;UGTdP4301>3L;B@Wk3TnU@A1,0*7C\r\n");
assertEquals("vdm add failed", 0, result);
msg.parse(vdm_message.sixbit());
} catch (Exception e) {
fail(e.getMessage());
}
// From libais:
// 2, 0, 541255006, 4, -78, -271.591522217, false, 0.40000000596,
// 0, 41.947201666666665, -62.606396666666669, 114, 27, 1, 1, false);
assertEquals("msgid", 2, msg.msgid());
assertEquals("repeat", 0, msg.repeat());
assertEquals("userid", 541255006, msg.userid());
assertEquals("nav_status", 4, msg.nav_status());
assertEquals("rot", 178, msg.rot()); // TODO: Expected -78
assertEquals("sog", 4, msg.sog());
assertEquals("pos_acc", 0, msg.pos_acc());
assertEquals("longitude", 25168321, msg.longitude()); // 41.947201666666665
assertEquals("latitude", -37563838, msg.latitude()); // -62.606396666666669
assertEquals("cog", 1996, msg.cog());
assertEquals("true_heading", 114, msg.true_heading());
assertEquals("utc_sec", 27, msg.utc_sec());
assertEquals("regional", 4, msg.regional());
assertEquals("spare", 1, msg.spare());
assertEquals("raim", 0, msg.raim());
assertEquals("sync_state", 2, msg.sync_state());
assertEquals("slot_timeout", 4, msg.slot_timeout());
assertEquals("sub_message", 1089, msg.sub_message());
}
}
Other tests:
!AIVDM,1,1,,B,K815>P8=5EikdUet,0*6B
0, 538005120, 1, false, 0, -79.641666666666666, 24.681666666666668, 11, 223, true, 0
Some samples (good and bad):
2013:
!AIVDM,1,1,,A,KwsMwN0w5h,4*03,d-129,S1156,t034030.00,T30.84481429,r09SMRQ1,1368243629
!AIVDM,1,1,,A,KtMjBpWoDpWCWkRNNP,4*2E,r17MGUS1,1368243671
!AIVDM,1,1,,B,KjAOlWd,2*57,d-115,S0354,t034409.00,T09.44666483,r08SFRE1,1368243854
!AIVDM,1,1,,B,KihWOHjGDVi:60,4*51,r17MGUS2,1368243889
!AIVDM,1,1,,A,KDWw7mMc6B7Ia:<L?v0,2*27,r17MBAR2,1368244345
!AIVDM,1,1,,B,K51=OneVrDwL,0*48,r17MPEL1,1368244601
!AIVDM,1,1,,A,KmV54wGvfn`,2*7B,d-126,S1277,t035734.00,T34.06044244,r05RMSQ1,1368244662
!AIVDM,1,1,,B,KwwdCTs:vrmlFP,4*43,d-120,S1842,t040049.00,T49.12425726,r09SIGN1,1368244850
!AIVDM,1,1,,A,Kw`w1WFcfUKukofwD>wvwu=W,0*45,d-129,S0276,t040507.00,T07.35916518,r09SERE1,1368245110
!AIVDM,1,1,,B,K?LGMMUgg>BaUa@sWKoC,0*25,d-116,S1282,t042834.00,T34.20640534,r05XDCJ1,1368246514
!AIVDM,1,1,,B,KlbRLGDq,0*0C,d-123,S9999,r08TPHI1,1368246834
!AIVDM,1,1,,A,Kp>EkOrj,0*5A,d-122,S1278,t043434.00,T34.09039024,r07RISL1,1368246869
!AIVDM,1,1,,B,KntIBkIn5BV5Wrg3@RqUg6VU4o0,2*5B,r17MSGI1,1368247063
!AIVDM,1,1,,B,KOIg9e88,0*53,d-123,S1323,t044235.00,T35.28790247,r09SSAG1,1368247356
2014:
AIVDM,1,1,,A,K3Jj8f8LdHB<M0:4,0*75,b003669955,1405211802
!AIVDM,1,1,,A,K3Jj8f8LdHB<M0:4,0*75,b003669953,1405211802
!AIVDM,1,1,,A,KhOewGL,2*51,r17MKET3,1405211881
!AIVDM,1,1,,B,KO;fwOwupvL,2*0E,d-116,S0410,t003810.00,T10.93594672,r05SOIN1,1405211891
!AIVDM,1,1,,B,K3Jj8f8LdHB<M0<D,0*00,b003669953,1405211982
!AIVDM,1,1,,B,K3Jj8f8LdHB<M0<D,0*00,b003669955,1405211982
!AIVDM,1,1,,B,K3Jj8f8LdHB<M0<D,0*00,b2003669956,1405211982
!AIVDM,1,1,,A,KiE<@Emd0lW:RmN;u2psrcv<4tGkCh,4*56,r17MLAR1,1405212061
!AIVDM,1,1,,A,K3Jj8f8LdHB<M0>H,0*0D,b003669953,1405212162
!AIVDM,1,1,,A,K3Jj8f8LdHB<M0>H,0*0D,b003669955,1405212162
!AIVDM,1,1,,B,K3Jj8f8LdHB<M0=t,0*31,b003669953,1405216662
!AIVDM,1,1,,A,KjisW189gCtvN`wwWn79voUC,0*4A,d-126,S1898,t015850.00,T50.63288807,r14RHAL1,1405216732
!AIVDM,1,1,,A,K3Jj8f8LdHB<M0=t,0*32,b003669953,1405216842
!AIVDM,1,1,,A,K3Jj8f8LdHB<M0=t,0*32,b003669954,1405216842
!AIVDM,1,1,,B,K3Jj8f8LdHB<M0Al,0*55,b003669954,1405217022
!AIVDM,1,1,,B,K3Jj8f8LdHB<M0Al,0*55,b003669953,1405217022
!AIVDM,1,1,,A,Kq@wig0bK9t,2*73,d-118,S0956,t020625.00,T25.50939899,r07SMAY1,1405217186
!AIVDM,1,1,,A,K3Jj8f8LdHB<M0:8,0*79,b003669954,1405217201
2015:
\n:417909,s:b003669977,c:1442708522*1E\!SAVDM,1,1,,B,K815>P8LTHR:WP5l,0*78
\n:459432,s:b2003669980,c:1442708523*2A\!SAVDM,1,1,,B,K815>P8LTHR:WP5l,0*78
\n:348631,s:b003669979,c:1442708522*19\!SAVDM,1,1,,B,K815>P8LTHR:WP5l,0*78
\n:1142,s:b003669978,c:1442708522*15\!SAVDM,1,1,,B,K815>P8LTHR:WP5l,0*78
\n:460684,s:b003669952,c:1442716940*14\!SAVDM,1,1,,B,K3KC:08<fDB6wT1t,0*71
\n:731686,s:b003669953,c:1442716940*10\!SAVDM,1,1,,B,K3KC:08<fDB6wT1t,0*71
\n:257837,s:b003669978,c:1442716983*17\!SAVDM,1,1,,A,K815>P8<T9B:i5DL,0*60
\n:723537,s:b2003669980,c:1442716982*28\!SAVDM,1,1,,A,K815>P8<T9B:i5DL,0*60
\n:738928,s:b003669953,c:1442717120*1D\!SAVDM,1,1,,A,K3KC:08<fE27141t,0*24
\n:357716,s:b003669978,c:1442720224*19\!SAVDM,1,1,,A,K815>P8<Sv2;KTDP,0*06
\n:769673,s:b003669977,c:1442720224*1D\!SAVDM,1,1,,A,K815>P8<Sv2;KTDP,0*06
\n:986557,s:b2003669981,c:1442720222*2A\!SAVDM,1,1,,A,K815>P8<Sv2;KTDP,0*06
\g:1-2-153450,n:314303,s:r09RWIL1,c:1442720243*7F\!AIVDM,1,1,,B,K2WEMOCvsE9:slWhL`9svD5NkRVGw0,4*28
\n:827066,s:b2003669980,c:1442720402*22\!SAVDM,1,1,,B,K815>P8<SuR;MUD@,0*71
\n:992605,s:b2003669981,c:1442720402*2F\!SAVDM,1,1,,B,K815>P8<SuR;MUD@,0*71
\n:774758,s:b003669977,c:1442720404*1D\!SAVDM,1,1,,B,K815>P8<SuR;MUD@,0*71
\n:65286,s:b2003669980,c:1442723823*1C\!SAVDM,1,1,,A,K815>P8<Si2;o2ET,0*5E
\n:77232,s:b003669952,c:1442723959*21\!SAVDM,1,1,,A,K3KC:08<fkj8`6P4,0*2F
\g:1-2-5332,n:10829,s:r08NHNT1,c:1442723966*58\!AIVDM,1,1,,B,Kvilb3p=mOHjgCMmuPNk,0*05
\n:80577,s:b2003669981,c:1442724003*12\!SAVDM,1,1,,B,K815>P8<Shj;p1mp,0*14
\n:69937,s:b2003669980,c:1442724003*1C\!SAVDM,1,1,,B,K815>P8<Shj;p1mp,0*14
\n:205542,s:b003669954,c:1442791640*1E\!SAVDM,1,1,,A,K3KC:08LeNj:d0CL,0*12
\n:747212,s:b2003669980,c:1442791683*2B\!SAVDM,1,1,,B,K815>P9LShj;r08<,0*7F
\n:914805,s:b2003669981,c:1442791683*2E\!SAVDM,1,1,,B,K815>P9LShj;r08<,0*7F
\n:4975,s:r17MPBR1,c:1442791714*0D\!AIVDM,1,1,,A,Kvwuji3O7mVKJT`DUrQBnSkdWh,4*26
\n:515555,s:b003669953,c:1442791820*11\!SAVDM,1,1,,B,K3KC:08LeNj:d0;h,0*4D
\n:999575,s:b003669952,c:1442791820*1A\!SAVDM,1,1,,B,K3KC:08LeNj:d0;h,0*4D
2017:
\n:363179,s:b003669953,c:1485302726*10\!SAVDM,1,1,,A,K8VSqb9LdTB8WP8t,0*2D
\n:729930,s:b003669955,c:1485302726*19\!SAVDM,1,1,,A,K8VSqb9LdTB8WP8t,0*2D
\n:473,s:rACE0AD6,c:1485302761*4B\!ANVDM,1,1,,B,K5N7L8d<baRpo0FP,0*61
\n:96783,s:b2003669956,c:1485302906*11\!SAVDM,1,1,,B,K8VSqb9LdTB8WP8t,0*2E
\n:711,s:rACE0AD6,c:1485302940*41\!ANVDM,1,1,,A,K5N7L8d<baRpo0FP,0*62
\n:549969,s:b003669950,c:1485303086*18\!SAVDM,1,1,,A,K8VSqb9LdTB8WP:H,0*13
\n:313479,s:b003669889,c:1485303086*18\!SAVDM,1,1,,A,K8VSqb9LdTB8WP:H,0*13
\n:101382,s:b2003669956,c:1485303086*2B\!SAVDM,1,1,,A,K8VSqb9LdTB8WP:H,0*13
\n:953,s:rACE0AD6,c:1485303120*46\!ANVDM,1,1,,B,K5N7L8d<baRpo0FP,0*61
\n:118781,s:b003669955,c:1485312804*17\!SAVDM,1,1,,A,K8VSqb9LdTB8WP;T,0*0E
\n:13454,s:rACE0AD6,c:1485312842*43\!ANVDM,1,1,,B,K5N7L8d<baRpo0FP,0*61
\n:3368,s:r17MEGE1,c:1485312863*00\!AIVDM,1,1,,B,Kj=EBBNqu:K?woNi8pT,2*59
\n:13682,s:rACE0AD6,c:1485313021*46\!ANVDM,1,1,,A,K5N7L8d<baRpo0FP,0*62
\n:2293,s:r17MMET1,c:1485313098*12\!AIVDM,1,1,,B,KwwUde@j:P8,2*40
\n:3399,s:r17MDIL1,c:1485313145*04\!AIVDM,1,1,,B,Kkwv7wtewuuGGSKM:gG5ER5lG0,4*65
\n:435161,s:b2003669956,c:1485313164*2A\!SAVDM,1,1,,A,K8VSqb9LdTB8WP;T,0*0E
\g:1-2-145120,n:294019,s:r08NFTK1,c:1485313181*6F\!AIVDM,1,1,,B,Ksi5TGQo,0*6C
\n:275715,s:b003669955,c:1485316944*13\!SAVDM,1,1,,B,K8VSqb9LdTB8WP9l,0*37
\n:948945,s:b003669952,c:1485316944*1A\!SAVDM,1,1,,B,K8VSqb9LdTB8WP9l,0*37
\n:278168,s:b003669955,c:1485317009*13\!SAVDM,1,1,,B,K8;OfB8<c8ip`7jd,0*03
\n:56827,s:r17MSEW1,c:1485317110*3E\!AIVDM,1,1,,A,KtQ`G2qQh@R3<CgeEnSaIC?qlOmqd4Bq,0*48
\n:845553,s:b003669953,c:1485317124*13\!SAVDM,1,1,,A,K8VSqb9LdTB8WP9l,0*34
\n:884202,s:b003669954,c:1485317124*1A\!SAVDM,1,1,,A,K8VSqb9LdTB8WP9l,0*34
Any pointers about how to fix this?
house@New-MacBook-Pro:~/Documents/Software/AIS/aisparser-master/python/osx$ sudo ./buildit
Password:
aisparser_wrap.c:149:11: fatal error: 'Python.h' file not foundinclude <Python.h>
^
1 error generated.
ld: file not found: aisparser_wrap.o
The current version of the Vdm.add(String) method does not allow messages with no channel code set. If such message is being parsed, it throws a StringIndexOutOfBoundsException.
Is this an issue in the Vdm class or should a valid message always contain a channel code?
Looking at coverage for message1, the throw is the only line not covered. Need a message 1 that has a bad length. I know I've seen plenty in my logs, but need to either find one or make one up. And searching through many TB of logs isn't currently easy at the moment, crafting one would be easier. I'm currently having trouble with maven not doing a good job of showing me assert messages from junit, so it might take a bit.
if (six_state.bit_length() != 168)
throw new AISMessageException("Message 1 wrong length"); // Untested line
And I realize that just hitting every line isn't enough, but it's a start.
https://github.com/schwehr/libais/blob/master/src/test/ais16_test.cc:
TEST(Ais16Test, DecodeAnything) {
// !SAVDO,1,1,,B,@03OwnQ9RgLP3h0000000000,0*32,b003669978,1426173689
std::unique_ptr<Ais16> msg = Init(
"!SAVDO,1,1,,B,@03OwnQ9RgLP3h0000000000,0*32");
Validate(
msg.get(), 0, 3669978, 0,
308461000, 60, 0, // Destination A.
0, 0, 00, // Destination B.
-1);
}
TEST(Ais16Test, BitsLeftOver) {
std::unique_ptr<Ais16> msg(new Ais16("@fffffhfffffffff", 4));
EXPECT_TRUE(msg->had_error());
EXPECT_EQ(AIS_ERR_BAD_BIT_COUNT, msg->get_error());
}
TEST(Ais16Test, InvalidButCommon168Bits) {
// !AIVDM,1,1,,B,@bQBNdhP010Fh<LMb;:GLOvJP4@d,0*7F
std::unique_ptr<Ais16> msg(new Ais16("@bQBNdhP010Fh<LMb;:GLOvJP4@d", 0));
Validate(msg.get(), 2, 705994419, 0, 134218757, 2819, 113, 916638301, 3199,
922, -1);
}
https://github.com/schwehr/libais/blob/master/test/data/typeexamples.json
!AIVDM,1,1,,A,@TFtghNJ4G5?C7mV,0*3D,d-109,S1632,t010843.00,T43.5188,r003669945,1325984926,1325984896
{"repeat": 2, "increment2": 0, "offset2": 0, "increment1": 982, "mmsi": 292499393, "spare2": 6, "mmsi2": 0, "scaled": true, "spare": 3, "device": "stdin", "type": 16, "class": "AIS", "mmsi1": 646208595, "offset1": 3377}
https://github.com/schwehr/libais/blob/master/test/data/test.aivdm
# 16 - "@" Assigned mode command
!AIVDM,1,1,,A,@pCdoqggJc1KHfk`lIowv;WB,0*3C,d-113,S1457,t044938.00,T38.85972309,r01SPTW1,1272430182
!AIVDM,1,1,,B,@;IoLG5SKikg2E6fBW:?sTKV,0*36,r17PJUN1,1272433312
!AIVDM,1,1,,A,@m6t?hGwsbFuG59:M0,4*04,d-124,S2090,t074655.00,T55.73818711,r07RTRU1,1272440816
!AIVDM,1,1,,B,@h3OwhiGOl583h0000000500,0*30,b003669956,1272442253
!AIVDM,1,1,,B,@h3OwhiGOl583h0000000500,0*30,b003669954,1272442372
!AIVDM,1,1,,B,@h3OwhiGOl583h0000000500,0*30,b003669956,1272442494
!AIVDM,1,1,,B,@h3OwhiGOl583h0000000500,0*30,b003669952,1272442614
!AIVDM,1,1,,B,@lI`<5vWhhn2=4NA;Qo6G@,4*62,r17PANC1,1272446831
!AIVDM,1,1,,A,@u9D<59lD97uMwtAOWp,2*68,d-127,S1746,t100546.00,T46.57176849,r09NGMI1,1272449149
https://git.savannah.gnu.org/cgit/gpsd.git/tree/test/sample.aivdm#n667
# From AISHub. These are only a regression test to check that the C and Python
# decoders do the same thing, not yet checked against other
# decoders.
#
# This is the 96-bit version addressing just one destination MMSI.
!AIVDM,1,1,,A,@01uEO@mMk7P<P00,0*18
# Message Type : 16
# Repeat Indicator : 0
# MMSI : 2053501
# Interrogated MMSI 1 : 224251000
# First slot offset : 200
# First slot increment : 0
#
# FIX-ME: Need an example of the 144-bit variant of type 16 with two MMSIs, g.
Items that should probably be setup:
Dear all,
I have been having troubles to parse AIS TYPE 5 messages (they come in 2 parts).
For the Following Messages:
!AIVDM,2,1,9,A,5:U8vcP2<qeM11QB220lE8<u=Dj0MD584pV22216Hh9;C1Pe0Jlm@D1H,074
!AIVDM,2,2,9,A,888888888888880,22D
!AIVDM,2,1,1,B,5:UF2F021k4I118F220ME9E0622222222222221@<PR<75Nn0B4m@D1H,053
!AIVDM,2,2,1,B,888888888888880,226
AIVDM sample.docx
The first message comes as a type 5 message with error =1 which is expected. However, the second message comes with type 10 even though it is a type 5 continuation of the first one.
Anybody has experienced similar issue?
Best regards,
Rodrigo
EDIT: Apprently the asterisc symbol before the checksum is being changed when I update the comment.
I will attach a word file instead.
Due to "virtual" field in aismsg_21 structure, and "true" fields in structures in aismsg_1, 2, 3, 18 and 19 C variant fail to compile.
These words are declared as keywords in C++ and cannot be used as a variable name or structure field.
Changes proposal:
I know very little about java fuzzers, but should be a great way yo find test cases for things like #22. Based on a quick search, here are some possibles. I'm most interested in a coverage based pure jvm solution preferably that is easy to setup with maven.
See also:
Asked for suggestions here:
I can't figure out how I'm supposed to run the AIS text parser c example. I'm operating on Windows 10, but am running through cygwin. I built with make ais_text
, which produced ais_text.exe and tried to run ais_text.exe
with a text file containing NMEA input from https://en.wikipedia.org/wiki/NMEA_0183, but it just hangs. I also tried putting single lines from that text file in the command line, but I am hitting a dead end. The text file for reference contains
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43
$GPGGA,092751.000,5321.6802,N,00630.3371,W,1,8,1.03,61.7,M,55.3,M,,*75
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,16,13,28,070,17,26,23,252,,04,14,186,15*77
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45
Any help would be great!
Having Travis-CI will ensure that pull requests actually work.
For Java, I'm starting by working on a maven config in #17.
Will need separate setups for python and C++.
https://github.com/schwehr/libais/blob/master/src/test/ais17_test.cc:
!AIVDM,1,1,,A,A6WWW6gP00a3PDlEKLrarOwUr8Mg,0*03
0, 444196634, 3, -54.6133, 35.0333, 1, 19, 3513, 277, 6, 1
https://github.com/schwehr/libais/blob/master/test/data/typeexamples.json
!AIVDM,1,1,,B,AwoiGRg:tOw>>9n5f9u>rOvwkraEe6ON,0*34,d-106,S1812,t111948.00,T48.3410012,r003669945,1325416791,1325416731
{"repeat": 3, "spare2": 24, "mmsi": 1065113482, "lon": -90.54833221435547, "scaled": true, "lat": -0.6650000214576721, "spare": 3, "device": "stdin", "type": 17, "class": "AIS"}
https://github.com/schwehr/libais/blob/master/test/data/test.aivdm
# 17 - "A" GNSS broadcast
!AIVDM,1,1,1,A,A;wUJKU>io;WlWuwH`W1PpnuN<isf;5iHtOM1S6q?vsvNrNGOqLcr5mfD6t,2*51,d-127,S1378,t024436.00,T36.76385108,r09SCHA1,1272422678
!AIVDM,1,1,,A,AsjEC:5Ssb2MfUi:@nwgwutp7aOnwmuCodH,2*08,d-122,S0385,r05SANA1,1272423558
!AIVDM,1,1,4,A,AqsNwaiHSwMr97rvcWw5gmknSer?<NwNLGMjKk5pj`acJgCKFh,4*3E,d-126,S9999,r09SMIL1,1272423996
!AIVDM,1,1,,B,A1g:mCPP09M8bVD7wG4r<1vP0030oJrNF03U,0*4A,d-127,S0599,t031915.00,T15.99084234,r07RTRU1,1272424758
!AIVDM,1,1,,A,Asgw4Gg:94e7evilw4kKvvwHbA8i@V:QEEP,2*62,d-127,S0388,t032710.00,T10.35675633,r09NALP1,1272425231
!AIVDM,1,1,,A,Anoh<2JjqhIpsjRuq@,4*0B,d-126,S0110,t033202.00,T02.94217068,r09SGBY1,1272425523
!AIVDM,1,1,,A,A8jGvr7dswqara4nBkbNiwgsin7RM4cWDgpwS0,4*1B,d-129,S0247,t070306.00,T06.59691166,r07STYB1,1272425771
https://git.savannah.gnu.org/cgit/gpsd.git/tree/test/sample.aivdm#n683
# Type 17:
# From AISHub. This is only a regression test to check that the C and Python
# decoders do the same thing, not yet checked against other
# decoders.
!AIVDM,2,1,5,A,A02VqLPA4I6C07h5Ed1h<OrsuBTTwS?r:C?w`?la<gno1RTRwSP9:BcurA8a,0*3A
!AIVDM,2,2,5,A,:Oko02TSwu8<:Jbb,0*11
# Message Type : 17
# Repeat Indicator : 0
# MMSI : 2734450
# Longitude : 17478
# Latitude : 35992
# DGNSS data : 376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa
#
# This one was found in the wild. It has a negative latitude.
!AIVDM,1,1,1,A,A;wUJKU>io;WlWuwH`W1PpnuN<isf;5iHtOM1S6q?vsvNrNGOqLcr5mfD6t,2*51,d-127,S1378,t024436.00,T36.76385108,r09SCHA1,1272422678
# Message Type : 17
# Repeat Indicator : 0
# MMSI : 804870766
# Longitude : 80669
# Latitude : -26818
# DGNSS data : 272:7f7f6289c1838dbd78cc7bb8b17163c7dd0631b93feefe7ba7977f972be85d6e506f
For c++ dev :
int true; //!< 9 bits : True Heading
this name is very bad. true is defined in c++.
trueHeading must be better
char virtual; //!< 1 bit : Virtual/Pseudo AtoN Flag
same problem with virtual, it's c++ keyword
Some userId's is in the form '00000008'. While they are returned as long or int, they will be returned as "8", which will be wrong as mmsi numbers shall be nine digits. A fix is to return it as string type, not long.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.