wm6下通过RIL获取基站信息

时间:2022-09-04 19:10:22
在windows mobile6下通过RIL的API获取基站的信息。
调试已通过。数据也能出来。但代码理解得不是很透。主要是函数之间的跳转。谁帮忙讲解下,越详细越好。谢谢!


// cellid.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "ril.h"
#include <windows.h>
#include <commctrl.h>
#include <iostream>
#include "afxwin.h"


HRESULT RILInitializeExt( void );//Initialize RIL
HRESULT Deinitialize( void );//deinitialize RIL
void RILResultCallback(DWORD dwResultCode, HRESULT hrCommandID, const void* pData, DWORD dwDataSize, DWORD dwParam);
void RILNotifyCallback( DWORD dwCode, const void* lpData, DWORD cbData, DWORD dwParam );

HRESULT g_hCellTowerInfo;
HRIL    g_RilHandle = NULL;
RILCELLTOWERINFO  *pCallInfo;

int _tmain(int argc, _TCHAR* argv[])
{

        HRESULT hr = S_FALSE;
        BOOL bResult = FALSE;

        hr = RILInitializeExt( );
        g_hCellTowerInfo = RIL_GetCellTowerInfo(g_RilHandle);   
        // This function retrieves information about the cell tower 
        //currently used by the phone.
        if ( g_hCellTowerInfo > 0 )
        {
                bResult = TRUE;
                Sleep( 1000 );
        }
        else
        {
                bResult = FALSE;
        }

//输出
wchar_t *celldata = new wchar_t[100];
swprintf(celldata,L"%d,%d,%d,%d,%d",pCallInfo->dwCellID ,pCallInfo->dwBaseStationID ,pCallInfo->dwLocationAreaCode ,pCallInfo->dwMobileCountryCode ,pCallInfo->dwMobileNetworkCode );
AfxMessageBox(celldata);

        Deinitialize();
//        getchar();
        return 0;
}

//初始化RIL
//Initialize RIL
HRESULT RILInitializeExt( void )
{
        HRESULT hr = S_FALSE;
        g_hCellTowerInfo = S_FALSE; 
        hr = RIL_Initialize( 1, RILResultCallback, 
                RILNotifyCallback, RIL_NCLASS_ALL, 0, &g_RilHandle );

        g_hCellTowerInfo = S_FALSE;
        return hr;
}




//初始化时用到的回调函数
void RILResultCallback(DWORD dwResultCode, HRESULT hrCommandID, const void* pData, DWORD dwDataSize, DWORD dwParam)
{
        HRESULT hr = RIL_RESULT_OK;
        switch ( dwResultCode ) 
        { 
        case RIL_RESULT_OK: 
                {
                        if ( hrCommandID == g_hCellTowerInfo )
                        {
                                g_hCellTowerInfo = RIL_GetCellTowerInfo(g_RilHandle);   
                                pCallInfo = ((RILCELLTOWERINFO *)pData); 

                        }
                        else
                                break; 
                }
        default:
                break;
        }
        return;
}

void RILNotifyCallback(DWORD dwCode,const void* lpData,DWORD cbData,DWORD dwParam)
{
        HRESULT hr = RIL_RESULT_OK;
        DEBUGMSG( TRUE, ( L"RILNotifyCallback,( 0x%x )\n", dwCode ) );
}



//deinitialize RIL
//释放资源
HRESULT Deinitialize( void )
{
        HRESULT hr = S_FALSE;

        hr = RIL_Deinitialize( &g_RilHandle );
        if ( FAILED( hr ) )
        {
                DEBUGMSG(TRUE, (L"RIL_Deinitialize failed, hr = %x\r\n", hr));
        }
        g_RilHandle = NULL;

        return hr;
}

8 个解决方案

#1


无非就是用了RIL和回调函数,在RIL_Initialize函数中,黑盒分析:回调函数应该是赋给其他变量,在激活的时候,内部再调用这个变量(相当于调用了内部函数)。

#2


拜托详细点么~

#3


大家都很高傲啊

#4


其实我想问的问题可以简化成主要:
        hr = RIL_Initialize( 1, RILResultCallback, 
                RILNotifyCallback, RIL_NCLASS_ALL, 0, &g_RilHandle );
这里面的RILResultCallback和RILNotifyCallback分别什么时候调用。

#5


引用 4 楼 jucery 的回复:
其实我想问的问题可以简化成主要:
hr = RIL_Initialize( 1, RILResultCallback,
RILNotifyCallback, RIL_NCLASS_ALL, 0, &amp;g_RilHandle );
这里面的RILResultCallback和RILNotifyCallback分别什么时候调用。

是这样,RIL全部是回调方式实现的。简单的说就是先初始化,把回调函数指针传进去。等数据传过来了,你的回调函数也就是CALLBACK就被会调用.

#6


引用 4 楼 jucery 的回复:
其实我想问的问题可以简化成主要:
hr = RIL_Initialize( 1, RILResultCallback,
RILNotifyCallback, RIL_NCLASS_ALL, 0, &amp;g_RilHandle );
这里面的RILResultCallback和RILNotifyCallback分别什么时候调用。

就是我上面说的,这个函数初始化的时候,把回调函数放进去(这个初始函数里面肯定会有类似与XX.YY= ZZZ,(ZZZ是回调函数类型的传入参数)这样的赋值,所以当系统获取到基站信息时,就可以直接调用XX.YY(...)这样的函数来调用回调函数了)

#7


解决 结贴
谢谢bsr2009 和 BEYONDMA

#8


学习。学习。

#1


无非就是用了RIL和回调函数,在RIL_Initialize函数中,黑盒分析:回调函数应该是赋给其他变量,在激活的时候,内部再调用这个变量(相当于调用了内部函数)。

#2


拜托详细点么~

#3


大家都很高傲啊

#4


其实我想问的问题可以简化成主要:
        hr = RIL_Initialize( 1, RILResultCallback, 
                RILNotifyCallback, RIL_NCLASS_ALL, 0, &g_RilHandle );
这里面的RILResultCallback和RILNotifyCallback分别什么时候调用。

#5


引用 4 楼 jucery 的回复:
其实我想问的问题可以简化成主要:
hr = RIL_Initialize( 1, RILResultCallback,
RILNotifyCallback, RIL_NCLASS_ALL, 0, &amp;g_RilHandle );
这里面的RILResultCallback和RILNotifyCallback分别什么时候调用。

是这样,RIL全部是回调方式实现的。简单的说就是先初始化,把回调函数指针传进去。等数据传过来了,你的回调函数也就是CALLBACK就被会调用.

#6


引用 4 楼 jucery 的回复:
其实我想问的问题可以简化成主要:
hr = RIL_Initialize( 1, RILResultCallback,
RILNotifyCallback, RIL_NCLASS_ALL, 0, &amp;g_RilHandle );
这里面的RILResultCallback和RILNotifyCallback分别什么时候调用。

就是我上面说的,这个函数初始化的时候,把回调函数放进去(这个初始函数里面肯定会有类似与XX.YY= ZZZ,(ZZZ是回调函数类型的传入参数)这样的赋值,所以当系统获取到基站信息时,就可以直接调用XX.YY(...)这样的函数来调用回调函数了)

#7


解决 结贴
谢谢bsr2009 和 BEYONDMA

#8


学习。学习。