使用Cellular Towers C#Windows Mobile获取多个Cell ID以进行定位

根据Microsoft关于RIL的文档,我已经能够实现检索Cell ID,LAC,MCC,MNC和Signal Strength的代码。 使用这些数据和http://www.opencellid.org/我能够检索到该细胞塔的纬度和经度。 问题是我需要实现某种三角测量算法以获得更准确的位置。 但在考虑三角测量之前,我需要使用多个塔ID。 我怎么能得到它们? 我试图创建一个towerIDs数组并在循环中填充它,而数组中不存在塔ID然后添加它,但如果它存在则忽略它并继续寻找另一个。 显然它没有用,一旦它得到它保持它,如果我删除对象并创建一个新的它得到相同的塔。 我怎么能得到一个不同的?

提前致谢。

using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Threading; namespace GPS_Test { public class CellTower { public int CellID { get; set; } // LAC (Local Area Code) public int LAC { get; set; } // MCC (Mobile Country Code) public int MCC { get; set; } // MNC (Mobile Network Code) public int MNC { get; set; } // Received signal strength public int signalStrength { get; set; } // Base Station ID //public int baseStationID { get; set; } } public class RIL { public delegate void RILRESULTCALLBACK(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwParam); public delegate void RILNOTIFYCALLBACK(uint dwCode, IntPtr lpData, uint cbData, uint dwParam); [DllImport("ril.dll")] public static extern IntPtr RIL_Initialize(uint dwIndex, RILRESULTCALLBACK pfnResult, RILNOTIFYCALLBACK pfnNotify, uint dwNotificationClasses, uint dwParam, out IntPtr lphRil); [DllImport("ril.dll", EntryPoint = "RIL_GetCellTowerInfo")] public static extern IntPtr RIL_GetCellTowerInfo(IntPtr hril); [DllImport("ril.dll")] public static extern IntPtr RIL_Deinitialize(IntPtr hril); [DllImport("ril.dll", EntryPoint = "RIL_GetSignalQuality")] public static extern IntPtr RIL_GetSignalQuality(IntPtr hRil); [StructLayout(LayoutKind.Explicit)] internal class RILCELLTOWERINFO { [FieldOffset(0)] uint dwSize; [FieldOffset(4)] uint dwParams; [FieldOffset(8)] public uint dwMobileCountryCode; [FieldOffset(12)] public uint dwMobileNetworkCode; [FieldOffset(16)] public uint dwLocationAreaCode; [FieldOffset(20)] public uint dwCellID; [FieldOffset(28)] public uint dwBaseStationID; [FieldOffset(36)] public uint dwRxLevel; } [StructLayout(LayoutKind.Explicit)] internal class RILSIGNALQUALITY { [FieldOffset(0)] uint dwSize; [FieldOffset(4)] uint dwParams; [FieldOffset(8)] public int nSignalStrength; [FieldOffset(12)] public uint nMinSignalStrength; [FieldOffset(16)] public uint nMaxSignalStrength; [FieldOffset(20)] public uint dwBitErrorRate; [FieldOffset(24)] public uint nLowSignalStrength; [FieldOffset(28)] public uint nHighSignalStrength; } } public class CellTowerInfo { private static AutoResetEvent dataReceived = new AutoResetEvent(false); private static AutoResetEvent whSignalQuality = new AutoResetEvent(false); private static RIL.RILCELLTOWERINFO towerInfo; private static RIL.RILSIGNALQUALITY signalQuality; public static CellTower GetCellTowerInfo() { IntPtr hRil = IntPtr.Zero; IntPtr hResult = IntPtr.Zero; hResult = RIL.RIL_Initialize(1, new RIL.RILRESULTCALLBACK(CellTowerData), null, 0, 0, out hRil); if (hResult != IntPtr.Zero) return null; hResult = RIL.RIL_GetCellTowerInfo(hRil); dataReceived.WaitOne(); RIL.RIL_Deinitialize(hRil); CellTower ct = new CellTower(); ct.LAC = (int)towerInfo.dwLocationAreaCode; ct.MCC = (int)towerInfo.dwMobileCountryCode; ct.MNC = (int)towerInfo.dwMobileNetworkCode; ct.CellID = (int)towerInfo.dwCellID; ct.signalStrength = GetSignalQuality(); return ct; } public static int GetSignalQuality() { IntPtr hRes = IntPtr.Zero; IntPtr hSignalQ = IntPtr.Zero; hRes = RIL.RIL_Initialize(1, new RIL.RILRESULTCALLBACK(SignalQualityCallback), null, 0, 0, out hSignalQ); hRes = RIL.RIL_GetSignalQuality(hSignalQ); whSignalQuality.WaitOne(); RIL.RIL_Deinitialize(hSignalQ); return signalQuality.nSignalStrength; } private static void CellTowerData(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwPara) { towerInfo = new RIL.RILCELLTOWERINFO(); Marshal.PtrToStructure(lpData, (object)towerInfo); dataReceived.Set(); } private static void SignalQualityCallback(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwPara) { signalQuality = new RIL.RILSIGNALQUALITY(); Marshal.PtrToStructure(lpData, (object)signalQuality); whSignalQuality.Set(); } } } 

尝试保存有关当前信号的所有信息,在这样做之后重新启动服务寻找另一个信号,但首先检查你存储的信号,如果它是相同的忽视并继续寻找。 祝好运!