2013-10-15 64 views
2

繼微軟的RIL文檔後,我已經能夠實現檢索Cell ID,LAC,MCC,MNC和Signal Strength的代碼。使用這些數據和http://www.opencellid.org/我能夠檢索該細胞塔的經度和緯度。問題是我需要實現某種三角測量算法來獲得更準確的位置。但在考慮三角測量之前,我需要多個塔ID才能使用。我怎樣才能得到它們?我嘗試創建一個towerID數組並將其填充到一個循環中,而塔ID不存在於數組中,然後添加它,但是如果它存在,則忽略它並繼續尋找另一個。很明顯,它不起作用,一旦它得到一個它保留它,如果我刪除對象,並創建一個新的它得到同一個塔。我怎樣才能得到一個不同的?獲取使用蜂窩塔的位置的多個單元ID C#Windows Mobile

在此先感謝。

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(); 
     } 
    } 
} 

回答

2

試圖保存所有有關的電流信號的信息,這樣做後,重新啓動尋找另一個信號服務,但首先要檢查您已經存儲的一個,如果是相同的無視和繼續尋找。 祝你好運!

+1

這就是我所做的,非常感謝,你搖滾! – MrCujo