private static AisData? DecodeAisDataMessage(string dataMessage) { StringBuilder sb = new StringBuilder(); foreach (char c in dataMessage) { int i = c; i -= 48; if (i > 40) i -= 8; for (int j = 5; j >= 0; j--) { if (((i >> j) & 1) == 1) sb.Append("1"); else sb.Append("0"); } } if (sb.Length < 89 + 27) return null; string bitString = sb.ToString(); long lat = TreatAsSigned(bitString.Substring(89, 27)); long lon = TreatAsSigned(bitString.Substring(61, 28)); AisData aisObj = new AisData(); aisObj.Latitude = lat / 600000.0; aisObj.Longitude = lon / 600000.0; aisObj.TransponderID = Convert.ToInt32(bitString.Substring(8, 30), 2); aisObj.RateOfTurn = Convert.ToInt32(bitString.Substring(42, 8), 2); aisObj.SpeedOverGround = Convert.ToInt32(bitString.Substring(50, 10), 2) / 10; aisObj.CourseOverGround = Convert.ToInt32(bitString.Substring(116, 12), 2); aisObj.PositionAccuracy = Convert.ToInt32(bitString.Substring(60, 1), 2); aisObj.TrueHeading = Convert.ToInt32(bitString.Substring(128, 9), 2); return aisObj; }
public static void DumpAis(AisData aisObj) { Console.WriteLine("Transponder MMSI: " + aisObj.TransponderID); Console.WriteLine("Latitude: " + aisObj.Latitude); Console.WriteLine("Longitude: " + aisObj.Longitude); Console.WriteLine("SpeedOverGround: " + aisObj.SpeedOverGround); Console.WriteLine("CourseOverGround: " + aisObj.CourseOverGround); Console.WriteLine("PositionAccuracy: " + aisObj.PositionAccuracy); Console.WriteLine("TrueHeading: " + aisObj.TrueHeading); Console.WriteLine("RateOfTurn: " + aisObj.RateOfTurn); }
public String AddOrUpdateAisTransponder(AisData aisData) { Console.WriteLine("Received transponder data: " + aisData.TransponderID); lock (_knownTransponders) { if (_knownTransponders.ContainsKey(aisData.TransponderID)) _knownTransponders[aisData.TransponderID] = aisData; else _knownTransponders.Add(aisData.TransponderID, aisData); } return "OK"; }