/// <summary> /// Deserialize the incomming cells data /// </summary> /// <param name="cellsDataStr">cells data</param> /// <returns></returns> public static CellsData DeserializeCellsData(string cellsDataStr) { var splittedCellsData = cellsDataStr.Split(';'); if (splittedCellsData.Length < 3) { return(null); } try { var cellsData = new CellsData { HomeMobileCountryCode = int.Parse(splittedCellsData[0]), HomeMobileNetworkCode = int.Parse(splittedCellsData[1]), RadioType = "gsm" }; for (int i = 2; i < splittedCellsData.Length; i++) { var splittedCellTower = splittedCellsData[i].Split(','); var cellTower = new CellTower() { CellId = long.Parse(splittedCellTower[0], System.Globalization.NumberStyles.HexNumber), LocationAreaCode = int.Parse(splittedCellTower[1], System.Globalization.NumberStyles.HexNumber), MobileCountryCode = int.Parse(splittedCellTower[2]), MobileNetworkCode = int.Parse(splittedCellTower[3]) }; cellsData.CellTowers.Add(cellTower); } return(cellsData); } catch (Exception) { } return(null); }
public string getCoords(CellTower ct) { try { String url = "http://www.google.com/glm/mmap"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(url)); req.Method = "POST"; byte[] pd = PostData(ct.getMobileCountryCode(), ct.getMobileNetworkCode(), ct.getLocationAreaCode(), ct.getTowerId(), false); req.ContentLength = pd.Length; req.ContentType = "application/binary"; Stream outputStream = req.GetRequestStream(); outputStream.Write(pd, 0, pd.Length); outputStream.Close(); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); byte[] ps = new byte[res.ContentLength]; int totalBytesRead = 0; while (totalBytesRead < ps.Length) { totalBytesRead += res.GetResponseStream().Read(ps, totalBytesRead, ps.Length - totalBytesRead); } if (res.StatusCode == HttpStatusCode.OK) { short opcode1 = (short)(ps[0] << 8 | ps[1]); byte opcode2 = ps[2]; System.Diagnostics.Debug.Assert(opcode1 == 0x0e); System.Diagnostics.Debug.Assert(opcode2 == 0x1b); int ret_code = (int)((ps[3] << 24) | (ps[4] << 16) | (ps[5] << 8) | (ps[6])); if (ret_code == 0) { double tlat = ((double)((ps[7] << 24) | (ps[8] << 16) | (ps[9] << 8) | (ps[10]))) / 1000000; double tlon = ((double)((ps[11] << 24) | (ps[12] << 16) | (ps[13] << 8) | (ps[14]))) / 1000000; lat = tlat; lng = tlon; return (tlat + "," + tlon); } else { return null; } } else { return null; } } catch (Exception) { return null; } }
public CellTower getTowerInfo() { IntPtr radioInterfaceLayerHandle = IntPtr.Zero; IntPtr radioResponseHandle = IntPtr.Zero; // Initialize the radio layer with a result callback parameter. radioResponseHandle = RIL_Initialize(1, new RILRESULTCALLBACK(CellDataCallback), null, 0, 0, out radioInterfaceLayerHandle); // The initialize API call will always return 0 if initialization is successful. if (radioResponseHandle != IntPtr.Zero) { return null; } // Query for the current tower data. radioResponseHandle = RIL_GetCellTowerInfo(radioInterfaceLayerHandle); // Wait for cell tower info to be returned since RIL_GetCellTowerInfo invokes the // callback method asynchronously. waithandle.WaitOne(); // Release the RIL handle RIL_Deinitialize(radioInterfaceLayerHandle); // Convert the raw tower data structure data into a CellTower object CellTower ct = new CellTower(); ct.setTowerId(Convert.ToInt32(_towerDetails.dwCellID)); ct.setLocationAreaCode(Convert.ToInt32(_towerDetails.dwLocationAreaCode)); ct.setMobileCountryCode(Convert.ToInt32(_towerDetails.dwMobileCountryCode)); ct.setMobileNetworkCode(Convert.ToInt32(_towerDetails.dwMobileNetworkCode)); return ct; }