`
mmdev
  • 浏览: 13242491 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

[CF.Skills]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 />-->publicclassRILCELLTOWERINFO
{
publicuintcbSize;
publicuintdwParams;
publicuintdwMobileCountryCode;//中国的MCC为460
publicuintdwMobileNetworkCode;
publicuintdwLocationAreaCode;
publicuintdwCellID;
publicuintdwBaseStationID;
publicuintdwBroadcastControlChannel;
publicuintdwRxLevel;
publicuintdwRxLevelFull;
publicuintdwRxLevelSub;
publicuintdwRxQuality;
publicuintdwRxQualityFull;
publicuintdwRxQualitySub;
publicuintdwIdleTimeSlot;
publicuintdwTimingAdvance;
publicuintdwGPRSCellID;
publicuintdwGPRSBaseStationID;
publicuintdwNumBCCH;
}

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicdelegatevoidRILRESULTCALLBACK(uintdwCode,
IntPtrhrCmdID,
IntPtrlpData,
uintcbData,
uintdwParam);

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicdelegatevoidRILNOTIFYCALLBACK(uintdwCode,
IntPtrlpData,
uintcbData,
uintdwParam);

注意:这个提醒函数后面不会用到,但它是作为必要的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 />-->[DllImport("ril.dll")]
privatestaticexternIntPtrRIL_Initialize(uintdwIndex,
RILRESULTCALLBACKpfnResult,
RILNOTIFYCALLBACKpfnNotify,
uintdwNotificationClasses,
uintdwParam,
outIntPtrlphRil);

[DllImport(
"ril.dll")]
privatestaticexternIntPtrRIL_GetCellTowerInfo(IntPtrhRil);

[DllImport(
"ril.dll")]
privatestaticexternIntPtrRIL_Deinitialize(IntPtrhRil);

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

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

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

2.定义回调函数

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

privatestaticAutoResetEventwaithandle=newAutoResetEvent(false);

publicstaticvoidrilResultCallback(uintdwCode,
IntPtrhrCmdID,
IntPtrlpData,
uintcbData,
uintdwParam)
{
//构造一个RILCELLTOWERINFO类用于存放数据
rilCellTowerInfo=newRILCELLTOWERINFO();
Marshal.PtrToStructure(lpData,rilCellTowerInfo);

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

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

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

//等待回调函数返回
waithandle.WaitOne();

//释放RILhandle
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

分享到:
评论

相关推荐

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

    ### 如何在C#中通过RIL获取基站信息 在移动通信领域,了解手机与基站之间的交互至关重要。本文将详细介绍如何在C#中利用RIL(Radio Interface Layer)获取基站信息,具体涉及到的数据结构、回调函数以及必要的RIL ...

    C#中通过RIL获得基站信息

    C#中通过RIL获得基站信息,备份资源!!!

    C#中如何通过RIL获得基站信息

    本篇文章将深入探讨如何在C#中通过RIL获取基站信息。 基站信息,通常包括Cell ID、LAC(Location Area Code)和TAC(Tracking Area Code),这些信息对于移动设备的定位、网络状态监测以及故障排查具有重要意义。在...

    ril.zip_RIL_RIL.h_TAPI r_ril.h download_ril.rar

    《RIL技术详解及其在手机开发中的应用》 RIL,全称为Radio Interface Layer,是无线接口层,是操作系统与无线调制解调器(Modem)之间通信的关键组件。在移动设备,尤其是智能手机中,RIL扮演着至关重要的角色,它...

    Andriod_7.x-arm64 RIL库_ril华为_华为909sRIL库_RIL_

    压缩包中的文件提供了关于RIL库的详细信息和资源,包括: 1. **针对Android原生系统添加4G功能需求修改代码.pdf**:这份文档可能详细解释了如何在Android原生系统中添加4G功能,具体可能涵盖了修改RIL库的源码,...

    IMEI_Test.rar_IMEI_RIL_imei RIL_ril.D_ril.dll

    3. **RIL处理请求**:RIL接收到请求后,通过与调制解调器的通信协议,向硬件发送适当的命令来获取IMEI信息。 4. **返回IMEI**:调制解调器响应并返回IMEI,RIL将这个信息封装成操作系统可以理解的格式。 5. **传递给...

    RIL.zip_RIL_RIL A_RIL API_Radio_h0

    微软的RIL库文件“RIL.zip_RIL_RIL A_RIL API_Radio_h0”包含了RIL的相关组件,如Ril.h头文件,这通常是定义了RIL API的接口和函数声明的地方,开发者可以通过这些接口来实现对无线模块的操作。ril.lib是链接库文件...

    GSM.rar_RIL_RIL G_Windows Mobile 6.0_vs2008_windows mobile RIL

    其中,RIL相关的API允许开发者直接与RIL接口交互,从而获取基站信息、进行网络注册、拨打电话、发送短信等功能。 压缩包文件"GSM.rar"很可能包含了开发GSM RIL接口的相关资源,比如源代码、示例项目、库文件或者是...

    2.3.x_libmoto_ril.so_254_13.zip

    更新过程涉及替换系统目录下的原始libmoto_ril.so文件,并确保通过META-INF中的信息进行正确签名和验证。这样的更新对于改善网络连接性能、解决通话和数据连接问题至关重要。同时,由于涉及到系统核心组件,因此在...

    ril.h ril.lib

    "wm 基站定位的demo代码"(如CellIDSample.rar)通常是一些示例程序,演示如何使用RIL库来获取和处理Cell ID信息。开发者可以通过分析和运行这些示例来学习如何在Windows Mobile平台上实现基站定位功能。 080312-...

    ril.dll文件 ril.dll 文件

    ril.dll 文件 ril.dll 文件 ril.dll 文件 ril.dll 文件ril.dll 文件ril.dll 文件ril.dll 文件

    reference-ril.rar_android_android M 原生RIL库_reference-ril_ril-ref

    在Android系统中,Radio Interface Layer(RIL)扮演着至关重要的角色,它是操作系统与无线调制解调器之间的桥梁,负责处理通信相关的任务,如语音通话、数据传输、短信服务等。Android M(即Android 6.0)对原生RIL...

    wince_ril_demo.zip_DEMO_RIL_wince_wince r_windows mobile

    标题中的“wince_ril_demo.zip_DEMO_RIL_wince_wince r_windows mobile”表明这是一个针对Windows CE(Wince)平台的RIL(Radio Interface Layer)演示程序,用于展示如何在Windows Mobile操作系统上调用RIL层的函数...

    Quectel_Android_RIL_Driver_V3.3.41

    当应用程序需要使用无线网络功能时,会通过Android框架向RIL发送请求,RIL驱动接收到这些请求后,将其转换为调制解调器可以理解的命令,并将调制解调器的响应反馈给上层系统。因此,RIL驱动的性能和稳定性直接影响到...

    Android的RIL驱动模块

    在初始化过程中,rild 通过符号 RIL_Init 获取一组函数指针,并与 librefrence_ril.so 建立联系。然后,它会开启 libril.so 中的事件机制,通过 RIL_startEventLoop 函数完成。在这个函数中,它会创建一个 dispatch ...

    ril.h 和 ril.lib

    5. **位置信息**:RIL接口可能还包括获取设备的地理位置信息,如通过GPS或基站定位。 接下来,我们看看`ril.lib`。这是一个预编译的库文件,包含了实现上述接口功能的实际代码。开发者在编译自己的应用程序时,会...

    Ril资料[ril.h、ril.lib] Mobile

    在Android系统中,RIL扮演着处理底层通信任务的角色,如初始化网络连接、拨打电话、发送短信等。本文将深入探讨RIL驱动接口及其在移动开发中的作用。 首先,`ril.h`文件是RIL驱动接口的头文件,它包含了所有RIL相关...

    ril流程分析

    rild.c文件中的main函数是RIL层的入口点,主要完成三个任务:开启libril.so中的事件机制、初始化librefrence_ril.so、通过RIL_Init获取一组函数指针RIL_RadioFunctions,并通过RIL_register完成注册,并打开接受上层...

    移远4g模块 android ril库源码

    通过学习RIL源码,理解和应用AT命令手册,参照硬件设计手册以及使用预编译的RIL库,开发人员能够有效地将4G通信功能整合到他们的产品中,确保其稳定性和高效性。这不仅涉及到了软件层面的驱动移植和接口设计,还涵盖...

Global site tag (gtag.js) - Google Analytics