[CF.Skills]C#中如何通过RIL获得基站信息

本文介绍如何在WindowsMobile设备上利用RIL库通过C#语言获取基站信息。具体步骤包括定义数据结构、注册回调函数、调用RIL库函数等。

在Windows Mobile的手机上面, RIL提供了访问Radio模块的接口, 下面以一个简单的示例说明如何在C#中通过RIL获得基站信息.

第一步. 定义必要的数据结构和回调函数

1. 包含基站信息的RILCELLTOWERINFO类

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> None.gif public class RILCELLTOWERINFO
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
publicuintcbSize;
InBlock.gif
publicuintdwParams;
InBlock.gif
publicuintdwMobileCountryCode;//中国的MCC为460
InBlock.gif
publicuintdwMobileNetworkCode;
InBlock.gif
publicuintdwLocationAreaCode;
InBlock.gif
publicuintdwCellID;
InBlock.gif
publicuintdwBaseStationID;
InBlock.gif
publicuintdwBroadcastControlChannel;
InBlock.gif
publicuintdwRxLevel;
InBlock.gif
publicuintdwRxLevelFull;
InBlock.gif
publicuintdwRxLevelSub;
InBlock.gif
publicuintdwRxQuality;
InBlock.gif
publicuintdwRxQualityFull;
InBlock.gif
publicuintdwRxQualitySub;
InBlock.gif
publicuintdwIdleTimeSlot;
InBlock.gif
publicuintdwTimingAdvance;
InBlock.gif
publicuintdwGPRSCellID;
InBlock.gif
publicuintdwGPRSBaseStationID;
InBlock.gif
publicuintdwNumBCCH;
ExpandedBlockEnd.gif}

2.用于异步返回RIL调用结果的回调函数RILRESULTCALLBACK

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> None.gif public delegate void RILRESULTCALLBACK( uint dwCode,
None.gifIntPtrhrCmdID,
None.gifIntPtrlpData,
None.gif
uint cbData,
None.gif
uint dwParam);

3.在RIL主动发出notify的时候回调的提醒函数RILNOTIFYCALLBACK

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> None.gif public delegate void RILNOTIFYCALLBACK( uint dwCode,
None.gifIntPtrlpData,
None.gif
uint cbData,
None.gif
uint dwParam);

注意:这个提醒函数后面不会用到,但它是作为必要的Native函数的参数,在pinvoke的时候是不可缺少的

第二步. 通过pinvoke引用必要的RIL Native函数

RIL_InitializeRIL_GetCellTowerInfoRIL_Deinitialize

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> None.gif [DllImport( " ril.dll " )]
None.gif
private static extern IntPtrRIL_Initialize( uint dwIndex,
None.gifRILRESULTCALLBACKpfnResult,
None.gifRILNOTIFYCALLBACKpfnNotify,
None.gif
uint dwNotificationClasses,
None.gif
uint dwParam,
None.gif
out IntPtrlphRil);
None.gif
None.gif[DllImport(
" ril.dll " )]
None.gif
private static extern IntPtrRIL_GetCellTowerInfo(IntPtrhRil);
None.gif
None.gif[DllImport(
" ril.dll " )]
None.gif
private static extern IntPtrRIL_Deinitialize(IntPtrhRil);

第三步. 通过RIL_GetCellTowerInfo获取基站信息

1.初始化一个RIL的实例并返回它的Handle

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> None.gif hRes = RIL_Initialize( 1 , // RILport1
None.gif
new RILRESULTCALLBACK(rilResultCallback), // 返回调用结果的回调函数
None.gif
null , 0 , 0 ,
None.gif
out hRil); // 返回RIL实例的handle

2.定义回调函数

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->

None.gifprivatestaticAutoResetEventwaithandle=newAutoResetEvent(false);
None.gif
None.gif
publicstaticvoidrilResultCallback(uintdwCode,
None.gifIntPtrhrCmdID,
None.gifIntPtrlpData,
None.gif
uintcbData,
None.gif
uintdwParam)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
//构造一个RILCELLTOWERINFO类用于存放数据
InBlock.gif
rilCellTowerInfo=newRILCELLTOWERINFO();
InBlock.gifMarshal.PtrToStructure(lpData,rilCellTowerInfo);
InBlock.gif

InBlock.gif
//回调通知
ExpandedBlockEnd.gif
waithandle.Set();}

3.调用RIL_GetCellTowerInfo并释放当前RIL实例的handle

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> None.gif RIL_GetCellTowerInfo(hRil);
None.gif
None.gif
// 等待回调函数返回
None.gif
waithandle.WaitOne();
None.gif
None.gif
// 释放RILhandle
None.gif
RIL_Deinitialize(hRil);

结果与分析:

以下是在samsungi718+上的测试结果:

-rilCellTowerInfo:
cbSize2164262660uint
dwBaseStationID706412084uint
dwBroadcastControlChannel0uint
dwCellID0uint //其实这里的cellid在我机器上获取不到,确实非常遗憾
dwGPRSBaseStationID706412084uint
dwGPRSCellID158440uint
dwIdleTimeSlot33993204uint
dwLocationAreaCode706412076uint
dwMobileCountryCode0uint //这个MCC中国应该是460,我这里也没有获取到
dwMobileNetworkCode33993204uint
dwNumBCCH706411928uint
dwParams0uint
dwRxLevel4uint
dwRxLevelFull0uint
dwRxLevelSub706412004uint
dwRxQuality706411908uint
dwRxQualityFull158172uint
dwRxQualitySub67853664uint
dwTimingAdvance0uint

需要注意的是这里的CellTowerInfo在各个机型上面的实现程度不一样,文中提到的RIL相关函数严格来说在Windows Mobile 上面都不是必须被实现的,使用时需考虑到这一点。

欢迎大家在评论中补充更多机型的测试结果。

Enjoy & Merry Xmas!

黄季冬

更新 完整的代码下载地址:http://files.cnblogs.com/fox23/CellIDSample.rar

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值