using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Net;
using System.Xml;
using GMap.NET;
using System.Data.Common;
using GMap.NET.MapProviders;
using System.Text;
using System.Diagnostics;
#if !PocketPC
using System.Net.NetworkInformation;
#endif
#if !MONO
#if SQLite
using System.Data.SQLite;
#endif
#else
using SQLiteConnection=Mono.Data.SqliteClient.SqliteConnection;
using SQLiteTransaction=Mono.Data.SqliteClient.SqliteTransaction;
using SQLiteCommand=Mono.Data.SqliteClient.SqliteCommand;
using SQLiteDataReader=Mono.Data.SqliteClient.SqliteDataReader;
using SQLiteParameter=Mono.Data.SqliteClient.SqliteParameter;
#endif
namespace Demo.WindowsForms
{
public struct VehicleData
{
public int Id;
public double Lat;
public double Lng;
public string Line;
public string LastStop;
public string TrackType;
public string AreaName;
public string StreetName;
public string Time;
public double? Bearing;
}
public enum TransportType
{
Bus,
TrolleyBus,
}
public struct FlightRadarData
{
public string name;
public string hex;
public PointLatLng point;
public int bearing;
public string altitude;
public string speed;
public int Id;
}
public class Stuff
{
#if !PocketPC
public static bool PingNetwork(string hostNameOrAddress)
{
bool pingStatus = false;
using(Ping p = new Ping())
{
byte[] buffer = Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
int timeout = 4444; // 4s
try
{
PingReply reply = p.Send(hostNameOrAddress, timeout, buffer);
pingStatus = (reply.Status == IPStatus.Success);
}
catch(Exception)
{
pingStatus = false;
}
}
return pingStatus;
}
#endif
///
/// gets routes from gpsd log file
///
///
/// start time(UTC) of route, null to read from very start
/// end time(UTC) of route, null to read to the very end
/// max value of PositionDilutionOfPrecision, null to get all
///
public static IEnumerable> GetRoutesFromMobileLog(string gpsdLogFile, DateTime? start, DateTime? end, double? maxPositionDilutionOfPrecision)
{
#if SQLite
using(SQLiteConnection cn = new SQLiteConnection())
{
#if !MONO
cn.ConnectionString = string.Format("Data Source=\"{0}\";FailIfMissing=True;", gpsdLogFile);
#else
cn.ConnectionString = string.Format("Version=3,URI=file://{0},FailIfMissing=True", gpsdLogFile);
#endif
cn.Open();
{
using(DbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM GPS ";
int initLenght = cmd.CommandText.Length;
if(start.HasValue)
{
cmd.CommandText += "WHERE TimeUTC >= @t1 ";
SQLiteParameter lookupValue = new SQLiteParameter("@t1", start);
cmd.Parameters.Add(lookupValue);
}
if(end.HasValue)
{
if(cmd.CommandText.Length <= initLenght)
{
cmd.CommandText += "WHERE ";
}
else
{
cmd.CommandText += "AND ";
}
cmd.CommandText += "TimeUTC <= @t2 ";
SQLiteParameter lookupValue = new SQLiteParameter("@t2", end);
cmd.Parameters.Add(lookupValue);
}
if(maxPositionDilutionOfPrecision.HasValue)
{
if(cmd.CommandText.Length <= initLenght)
{
cmd.CommandText += "WHERE ";
}
else
{
cmd.CommandText += "AND ";
}
cmd.CommandText += "PositionDilutionOfPrecision <= @p3 ";
SQLiteParameter lookupValue = new SQLiteParameter("@p3", maxPositionDilutionOfPrecision);
cmd.Parameters.Add(lookupValue);
}
using(DbDataReader rd = cmd.ExecuteReader())
{
List points = new List();
while(rd.Read())
{
GpsLog log = new GpsLog();
{
log.TimeUTC = (DateTime)rd["TimeUTC"];
log.SessionCounter = (long)rd["SessionCounter"];
log.Delta = rd["Delta"] as double?;
log.Speed = rd["Speed"] as double?;
log.SeaLevelAltitude = rd["SeaLevelAltitude"] as double?;
log.EllipsoidAltitude = rd["EllipsoidAltitude"] as double?;
log.SatellitesInView = rd["SatellitesInView"] as System.Byte?;
log.SatelliteCount = rd["SatelliteCount"] as System.Byte?;
log.Position = new PointLatLng((double)rd["Lat"], (double)rd["Lng"]);
log.PositionDilutionOfPrecision = rd["PositionDilutionOfPrecision"] as double?;
log.HorizontalDilutionOfPrecision = rd["HorizontalDilutionOfPrecision"] as double?;
log.VerticalDilutionOfPrecision = rd["VerticalDilutionOfPrecision"] as double?;
log.FixQuality = (FixQuality)((byte)rd["FixQuality"]);
log.FixType = (FixType)((byte)rd["FixType"]);
log.FixSelection = (FixSelection)((byte)rd["FixSelection"]);
}
if(log.SessionCounter == 0 && points.Count > 0)
{
List ret = new List(points);
points.Clear();
{
yield return ret;
}
}
points.Add(log);
}
if(points.Count > 0)
{
List ret = new List(points);
points.Clear();
{
yield return ret;
}
}
points.Clear();
points = null;
rd.Close();
}
}
}
cn.Close();
}
#else
return null;
#endif
}
static readonly Random r = new Random();
///
/// gets realtime data from public transport in city vilnius of lithuania
///
/// type of transport
/// linenum or null to get all
///
public static void GetVilniusTransportData(TransportType type, string line, List ret)
{
ret.Clear();
//http://stops.lt/vilnius/gps.txt?1318577178193
//http://www.marsrutai.lt/vilnius/Vehicle_Map.aspx?trackID=34006&t=1318577231295
// http://www.troleibusai.lt/eismas/get_gps.php?allowed=true&more=1&bus=1&rand=0.5487859781558404
string url = string.Format(CultureInfo.InvariantCulture, "http://www.troleibusai.lt/eismas/get_gps.php?allowed=true&more=1&bus={0}&rand={1}", type == TransportType.Bus ? 2 : 1, r.NextDouble());
if(!string.IsNullOrEmpty(line))
{
url += "&nr=" + line;
}
#if !PocketPC
url += "&app=GMap.NET.Desktop";
#else
url += "&app=GMap.NET.WindowsMobile";
#endif
string xml = string.Empty;
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.UserAgent = GMapProvider.UserAgent;
request.Timeout = GMapProvider.TimeoutMs;
request.ReadWriteTimeout = GMapProvider.TimeoutMs * 6;
request.Accept = "*/*";
request.KeepAlive = true;
using(HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
using(Stream responseStream = response.GetResponseStream())
{
using(StreamReader read = new StreamReader(responseStream, Encoding.UTF8))
{
xml = read.ReadToEnd();
}
}
#if PocketPC
request.Abort();
#endif
response.Close();
}
}
// 54.690688; 25.2116; 1263522; 1; 48.152; 2011-10-14 14:41:29
if(!string.IsNullOrEmpty(xml))
{
var items = xml.Split('&');
foreach(var it in items)
{
var sit = it.Split(';');
if(sit.Length == 8)
{
VehicleData d = new VehicleData();
{
d.Id = int.Parse(sit[2]);
d.Lat = double.Parse(sit[0], CultureInfo.InvariantCulture);
d.Lng = double.Parse(sit[1], CultureInfo.InvariantCulture);
d.Line = sit[3];
if(!string.IsNullOrEmpty(sit[4]))
{
d.Bearing = double.Parse(sit[4], CultureInfo.InvariantCulture);
}
if(!string.IsNullOrEmpty(sit[5]))
{
d.Time = sit[5];
var t = DateTime.Parse(d.Time);
if(DateTime.Now - t > TimeSpan.FromMinutes(5))
{
continue;
}
d.Time = t.ToLongTimeString();
}
d.TrackType = sit[6];
}
//if(d.Id == 1262760)
//if(d.Line == "13")
{
ret.Add(d);
}
}
}
}
#region -- old --
//XmlDocument doc = new XmlDocument();
//{
// doc.LoadXml(xml);
// XmlNodeList devices = doc.GetElementsByTagName("Device");
// foreach(XmlNode dev in devices)
// {
// VehicleData d = new VehicleData();
// d.Id = int.Parse(dev.Attributes["ID"].InnerText);
// foreach(XmlElement elem in dev.ChildNodes)
// {
// // Debug.WriteLine(d.Id + "->" + elem.Name + ": " + elem.InnerText);
// switch(elem.Name)
// {
// case "Lat":
// {
// d.Lat = double.Parse(elem.InnerText, CultureInfo.InvariantCulture);
// }
// break;
// case "Lng":
// {
// d.Lng = double.Parse(elem.InnerText, CultureInfo.InvariantCulture);
// }
// break;
// case "Bearing":
// {
// if(!string.IsNullOrEmpty(elem.InnerText))
// {
// d.Bearing = double.Parse(elem.InnerText, CultureInfo.InvariantCulture);
// }
// }
// break;
// case "LineNum":
// {
// d.Line = elem.InnerText;
// }
// break;
// case "AreaName":
// {
// d.AreaName = elem.InnerText;
// }
// break;
// case "StreetName":
// {
// d.StreetName = elem.InnerText;
// }
// break;
// case "TrackType":
// {
// d.TrackType = elem.InnerText;
// }
// break;
// case "LastStop":
// {
// d.LastStop = elem.InnerText;
// }
// break;
// case "Time":
// {
// d.Time = elem.InnerText;
// }
// break;
// }
// }
// ret.Add(d);
// }
//}
#endregion
}
public static string sessionId = string.Empty;
public static void GetFlightRadarData(List ret, PointLatLng location, int zoom, bool resetSession)
{
ret.Clear();
if(resetSession || string.IsNullOrEmpty(sessionId))
{
sessionId = GetFlightRadarContentUsingHttp("http://www.flightradar24.com/", location, zoom, string.Empty);
}
// get track for one object
//var tm = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds;
//var r = GetContentUsingHttp("http://www.flightradar24.com/FlightDataService.php?callsign=WZZ1MF&hex=47340F&date=" + tm, p1, 6, id);
//Debug.WriteLine(r);
if(!string.IsNullOrEmpty(sessionId))
{
var response = GetFlightRadarContentUsingHttp("http://www.flightradar24.com/PlaneFeed.json", location, zoom, sessionId);
var items = response.Split(']');
//int i = 0;
foreach(var it in items)
{
if(it.Length > 11)
{
var d = it.Substring(2).Replace(":", ",").Replace("\"", string.Empty).Replace("[", string.Empty);
//Debug.WriteLine(++i + " -> " + d);
// BAW576":["400803",48.9923,1.8083,"144","36950","462","0512","LFPO","A319","G-EUPC"
var par = d.Split(',');
if(par.Length >= 12)
{
var name = par[0];
var hex = par[1];
var lat = par[2];
var lng = par[3];
var bearing = par[4];
var altitude = (int) (int.Parse(par[5]) * 0.3048) + "m";
var speed = (int) (int.Parse(par[6]) * 1.852) + "km/h";
FlightRadarData fd = new FlightRadarData();
fd.name = name;
fd.hex = hex;
fd.bearing = int.Parse(bearing);
fd.altitude = altitude;
fd.speed = speed;
fd.point = new PointLatLng(double.Parse(lat, CultureInfo.InvariantCulture), double.Parse(lng, CultureInfo.InvariantCulture));
fd.Id = Convert.ToInt32(hex, 16);
ret.Add(fd);
//Debug.WriteLine("name: " + name);
//Debug.WriteLine("hex: " + hex);
//Debug.WriteLine("point: " + fd.point);
//Debug.WriteLine("bearing: " + bearing);
//Debug.WriteLine("altitude: " + altitude);
//Debug.WriteLine("speed: " + speed);
}
else
{
#if DEBUG
if(Debugger.IsAttached)
{
Debugger.Break();
}
#endif
}
//Debug.WriteLine("--------------");
}
}
}
}
static string GetFlightRadarContentUsingHttp(string url, PointLatLng p, int zoom, string sid)
{
string ret = string.Empty;
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.UserAgent = GMapProvider.UserAgent;
request.Timeout = GMapProvider.TimeoutMs;
request.ReadWriteTimeout = GMapProvider.TimeoutMs * 6;
request.Accept = "*/*";
request.Referer = "http://www.flightradar24.com/";
request.KeepAlive = true;
request.Headers.Add("Cookie", string.Format(System.Globalization.CultureInfo.InvariantCulture, "map_lat={0}; map_lon={1}; map_zoom={2}; " + (!string.IsNullOrEmpty(sid) ? "PHPSESSID=" + sid + ";" : string.Empty) + "__utma=109878426.303091014.1316587318.1316587318.1316587318.1; __utmb=109878426.2.10.1316587318; __utmz=109878426.1316587318.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)", p.Lat, p.Lng, zoom));
using(HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
if(string.IsNullOrEmpty(sid))
{
var c = response.Headers["Set-Cookie"];
//Debug.WriteLine(c);
if(c.Contains("PHPSESSID"))
{
c = c.Split('=')[1].Split(';')[0];
ret = c;
}
}
using(Stream responseStream = response.GetResponseStream())
{
using(StreamReader read = new StreamReader(responseStream, Encoding.UTF8))
{
var tmp = read.ReadToEnd();
if(!string.IsNullOrEmpty(sid))
{
ret = tmp;
}
}
}
#if PocketPC
request.Abort();
#endif
response.Close();
}
return ret;
}
}
}