隨筆-348  評論-598  文章-0  trackbacks-0

          在Windows Mobile的手機上面, RIL提供了訪問Radio模塊的接口, 下面以一個簡單的示例說明如何在C#中通過RIL獲得基站信息。
          需要注意的是,下面的代碼可能無法在模擬器上面運行,因為缺少必要的類庫,在真機上沒啥問題。
          第一步. 定義必要的數據結構和回調函數
          1. 包含基站信息的RILCELLTOWERINFO類
                  public class RILCELLTOWERINFO
                  {
                      public uint cbSize;
                      public uint dwParams;
                      public uint dwMobileCountryCode;//中國的MCC為460
                      public uint dwMobileNetworkCode;
                      public uint dwLocationAreaCode;
                      public uint dwCellID;
                      public uint dwBaseStationID;
                      public uint dwBroadcastControlChannel;
                      public uint dwRxLevel;
                      public uint dwRxLevelFull;
                      public uint dwRxLevelSub;
                      public uint dwRxQuality;
                      public uint dwRxQualityFull;
                      public uint dwRxQualitySub;
                      public uint dwIdleTimeSlot;
                      public uint dwTimingAdvance;
                      public uint dwGPRSCellID;
                      public uint dwGPRSBaseStationID;
                      public uint dwNumBCCH;
                  }
           
          2.用于異步返回RIL調用結果的回調函數RILRESULTCALLBACK
                  public delegate void RILRESULTCALLBACK(uint dwCode,
                                                         IntPtr hrCmdID,
                                                         IntPtr lpData,
                                                         uint cbData,
                                                         uint dwParam);
           
          3.在RIL主動發出notify的時候回調的提醒函數RILNOTIFYCALLBACK
           
                  public delegate void RILNOTIFYCALLBACK(uint dwCode,
                                                         IntPtr lpData,
                                                         uint cbData,
                                                         uint dwParam);
          注意:這個提醒函數后面不會用到,但它是作為必要的Native函數的參數,在pinvoke的時候是不可缺少的 
           
          第二步. 通過pinvoke引用必要的RIL Native函數 
          RIL_Initialize   , RIL_GetCellTowerInfo,RIL_Deinitialize
                  [DllImport("ril.dll")]
                  private static extern IntPtr RIL_Initialize(uint dwIndex,
                                                              RILRESULTCALLBACK pfnResult,
                                                              RILNOTIFYCALLBACK pfnNotify,
                                                              uint dwNotificationClasses,
                                                              uint dwParam,
                                                              out IntPtr lphRil);

                  [DllImport("ril.dll")]
                  private static extern IntPtr RIL_GetCellTowerInfo(IntPtr hRil);
                  [DllImport("ril.dll")]
                  private static extern IntPtr RIL_Deinitialize(IntPtr hRil);
           
          第三步. 通過RIL_GetCellTowerInfo獲取基站信息
          1.初始化一個RIL的實例并返回它的Handle
                      hRes = RIL_Initialize(1,                                        // RIL port 1
                                            new RILRESULTCALLBACK(rilResultCallback), // 返回調用結果的回調函數
                                            null,  0, 0,                                      
                                            out hRil);                                //返回RIL實例的handle
           
          2.定義回調函數
                  private static AutoResetEvent waithandle = new AutoResetEvent(false);
                  public static void rilResultCallback(uint dwCode,
                                                       IntPtr hrCmdID,
                                                       IntPtr lpData,
                                                       uint cbData,
                                                       uint dwParam)
                  {
                      //構造一個RILCELLTOWERINFO類用于存放數據
                       rilCellTowerInfo = new RILCELLTOWERINFO();
                      Marshal.PtrToStructure(lpData, rilCellTowerInfo);
                      //回調通知
                      waithandle.Set();}
           
          3.調用RIL_GetCellTowerInfo并釋放當前RIL實例的handle
          RIL_GetCellTowerInfo(hRil);
                      //等待回調函數返回
                      waithandle.WaitOne();
                      //釋放RIL handle
                      RIL_Deinitialize(hRil);
           
          結果與分析:
          以下是在samsungi718+上的測試結果:
          -rilCellTowerInfo :
            cbSize 2164262660 uint
            dwBaseStationID 706412084 uint
            dwBroadcastControlChannel 0 uint
            dwCellID 0 uint //其實這里的cellid在我機器上獲取不到,確實非常遺憾
            dwGPRSBaseStationID 706412084 uint
            dwGPRSCellID 158440 uint
            dwIdleTimeSlot 33993204 uint
            dwLocationAreaCode 706412076 uint
            dwMobileCountryCode 0 uint //這個MCC中國應該是460,我這里也沒有獲取到
            dwMobileNetworkCode 33993204 uint
            dwNumBCCH 706411928 uint
            dwParams 0 uint
            dwRxLevel 4 uint
            dwRxLevelFull 0 uint
            dwRxLevelSub 706412004 uint
            dwRxQuality 706411908 uint
            dwRxQualityFull 158172 uint
            dwRxQualitySub 67853664 uint
            dwTimingAdvance 0 uint
          需要注意的是這里的CellTowerInfo在各個機型上面的實現程度不一樣,文中提到的RIL相關函數嚴格來說在Windows Mobile 上面都不是必須被實現的,使用時需考慮到這一點。

          實現代碼:
              public partial class Form1 : Form
              {
                  
          public Form1()
                  {
                      InitializeComponent();
                  }

                  
          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")]
                  
          private static extern IntPtr RIL_Initialize(uint dwIndex,
                                                              RILRESULTCALLBACK pfnResult,
                                                              RILNOTIFYCALLBACK pfnNotify,
                                                              
          uint dwNotificationClasses,
                                                              
          uint dwParam,
                                                              
          out IntPtr lphRil);
                  [DllImport(
          "ril.dll")]
                  
          private static extern IntPtr RIL_GetCellTowerInfo(IntPtr hRil);
                  [DllImport(
          "ril.dll")]
                  
          private static extern IntPtr RIL_Deinitialize(IntPtr hRil);

                  
          private static AutoResetEvent waithandle = new AutoResetEvent(false);
                  
          private static RILCELLTOWERINFO rilCellTowerInfo;
                  
          private IntPtr hRes;
                  
          private IntPtr hRil;
                  
          public static void rilResultCallback(uint dwCode,
                                                       IntPtr hrCmdID,
                                                       IntPtr lpData,
                                                       
          uint cbData,
                                                       
          uint dwParam)
                  {
                      
          //構造一個RILCELLTOWERINFO類用于存放數據
                      rilCellTowerInfo = new RILCELLTOWERINFO();
                      Marshal.PtrToStructure(lpData, rilCellTowerInfo);
                      
          //回調通知
                      waithandle.Set();
                  }
           
           

                  
          private void button1_Click(object sender, EventArgs e)
                  {
                      hRes 
          = RIL_Initialize(1,                                        // RIL port 1
                                           new RILRESULTCALLBACK(rilResultCallback), // 返回調用結果的回調函數
                                           null00,
                                           
          out hRil);    
                      
          //返回RIL實例的handle
                      RIL_GetCellTowerInfo(hRil);
                      
          //等待回調函數返回
                      waithandle.WaitOne();
                      
          //釋放RIL handle
                      RIL_Deinitialize(hRil);

                  }
              }

              
          public class RILCELLTOWERINFO
              {
                  
          public uint cbSize;
                  
          public uint dwParams;
                  
          public uint dwMobileCountryCode;//中國的MCC為460
                  public uint dwMobileNetworkCode;
                  
          public uint dwLocationAreaCode;
                  
          public uint dwCellID;
                  
          public uint dwBaseStationID;
                  
          public uint dwBroadcastControlChannel;
                  
          public uint dwRxLevel;
                  
          public uint dwRxLevelFull;
                  
          public uint dwRxLevelSub;
                  
          public uint dwRxQuality;
                  
          public uint dwRxQualityFull;
                  
          public uint dwRxQualitySub;
                  
          public uint dwIdleTimeSlot;
                  
          public uint dwTimingAdvance;
                  
          public uint dwGPRSCellID;
                  
          public uint dwGPRSBaseStationID;
                  
          public uint dwNumBCCH;
              }


          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2011-06-19 18:22 TiGERTiAN 閱讀(2322) 評論(0)  編輯  收藏 所屬分類: Windows Mobile
          主站蜘蛛池模板: 保定市| 苏尼特左旗| 十堰市| 肇庆市| 九台市| 汝州市| 长葛市| 漳浦县| 夹江县| 南汇区| 宝丰县| 珠海市| 张掖市| 当阳市| 巫溪县| 鞍山市| 灌云县| 驻马店市| 峨眉山市| 简阳市| 阳山县| 罗甸县| 监利县| 阿克| 微博| 新乐市| 高唐县| 乌拉特后旗| 新闻| 陇川县| 郯城县| 万全县| 荔波县| 太原市| 临颍县| 襄樊市| 堆龙德庆县| 赤峰市| 吴川市| 咸宁市| 彝良县|