<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(2306) 評論(0)  編輯  收藏 所屬分類: Windows Mobile
    主站蜘蛛池模板: 国产亚洲精品福利在线无卡一| 欧洲精品码一区二区三区免费看| 亚洲国产主播精品极品网红| 91麻豆最新在线人成免费观看 | 四虎永久在线精品免费一区二区| 亚洲五月六月丁香激情| 亚洲AV无码乱码在线观看牲色| 91成人免费观看网站| 女人体1963午夜免费视频| 人碰人碰人成人免费视频| 亚洲另类无码一区二区三区| 亚洲性一级理论片在线观看| 亚洲VA中文字幕无码一二三区| 亚洲成a人在线看天堂无码| 在线日韩av永久免费观看| 午夜国产精品免费观看| 最近2022中文字幕免费视频 | 免费无码看av的网站| 精品女同一区二区三区免费站| 日韩免费电影网址| 国产在线观看免费av站| 曰韩无码AV片免费播放不卡| 青草青草视频2免费观看| 亚洲日韩av无码中文| 亚洲色偷偷偷综合网| 亚洲深深色噜噜狠狠网站| 久久狠狠爱亚洲综合影院| 亚洲国产精品无码久久久| 亚洲另类春色校园小说| 亚洲日韩中文字幕| 亚洲一区二区三区在线| 亚洲人妖女同在线播放| 久久精品国产亚洲AV蜜臀色欲| 亚洲冬月枫中文字幕在线看| 亚洲日本国产精华液| 亚洲伊人色一综合网| 国产成人精品日本亚洲专区6| 国产精品久久亚洲不卡动漫| 亚洲中文无码永久免| 性色av极品无码专区亚洲| 国产精品亚洲专区一区|