在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), // 返回調用結果的回調函數
null, 0, 0,
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