J2ME之家

匿名投稿 投稿指南 RSS订阅 J2ME通告:
搜索: 您的位置主页>Symbian>网络编程>

恢复IMEI,IMSI及网络信息(元Id,位置代码)第三版

2008-8-21 00:21:12 来源:j2me之家整理 责任编辑:本站整理 【 点击: 我要投稿 [进入论坛]

[J2ME之家-Symbian网络编程]

此文为开发视界翻译转载者请注明出处(开发视界 www.sf.org.cn)否则追究法律责任
在第二版中,有许多方法可以恢复IMEI与IMSI。其中一种流行的方法是使用第三方的“MobInfo Dll”。在第三版S60系列中没有这种第三方Dll了。代替它的是“CTelephony”。
我看到过许多关于第二版恢复方法的关信息,但从没见到过针对第三版有什么好的方案。
下文即使我对如何恢复IMEI与IMSI信息的贡献。通过使用下文所述的方法,你还可以使用下列代码恢复网络信息(元Id,位置代码)。其可被进一步扩展使用于恢复其他网络信息。

头文件
#ifndef __SYSTEM_MANAGER_H__
#define __SYSTEM_MANAGER_H__

#include <Etel3rdParty.h>

class CystemManager : public CActive
{
public:
typedef enum {EHandsetIMEI, EHandsetIMSI, EHandsetNetworkInfo } InfoType;

public:
static CystemManager* NewL();

//析构函数
~CSystemManager();

public:
// 新方法
void StartL(); // Request

const TPtrC GetIMEI();
const TPtrC GetIMSI();
void GetNetworkInfoL(TUint& aLocation, TUint& aCellId);

private:
// C 构造器
CSystemManager();
// Second-phase constructor
void ConstructL();

// 来自 CActive
void RunL();

// 取消
void DoCancel();

private:
enum TGetInfoState
{
EStart = 1,
EGetPhoneInfo,
EDone
};

private:
InfoType iPhoneInfoType;
TInt iState; // 活动对类似的状态 CTelephony* iTelephony;

CTelephony::TPhoneIdV1 iPhoneId;
CTelephony::TSubscriberIdV1 iSubscriberId;
CTelephony::TNetworkInfoV1 iNetworkInfo;

CActiveSchedulerWait iActiveSchedulerWait;
TBuf<CTelephony::KPhoneSerialNumberSize>iIMEI;
TBuf<CTelephony::KIMSISize> iIMSI;
TUint iCellId;
TUint iLocationAreaCode;
};
#endif // __SYSTEM_MANAGER_H__
Source File

// System includes
#include <badesca.h>
#include <e32std.h>
#include <eikenv.h>
#include <eikappui.h>
#include <eikapp.h>
#include <etelbgsm.h>

//User includes
#include "SystemManager.h"

CSystemManager* CSystemManager::NewL()
{
CSystemManager* self = new (ELeave) CSystemManager();
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(self);

return self;
}

CSystemManager::CSystemManager() : CActive(EPriorityHigh), // 高优先级 iPhoneInfoType(EHandsetIMEI),
iState(EStart),
iTelephony(NULL),
iIMEI(0),
iIMSI(0),
iCellId(0),
iLocationAreaCode(0)
{

}

void CSystemManager::ConstructL()
{
iTelephony = CTelephony::NewL();
CActiveScheduler::Add(this); // 加入周期
}

CSystemManager::~CSystemManager()
{
Cancel(); // Cancel any request, if outstanding
// 删除任何例子
delete iTelephony;
}

void CSystemManager::DoCancel()
{
switch(iPhoneInfoType)
{
case EHandsetIMEI:
iTelephony->CancelAsync(CTelephony::EGetPhoneIdCancel);
break;
case EHandsetIMSI:
iTelephony->CancelAsync(CTelephony::EGetSubscriberIdCancel);
break;
default:
iTelephony->CancelAsync(CTelephony::EGetCurrentNetworkInfoCancel);
break;
}
}

void CSystemManager::StartL()
{
Cancel(); // 取消哀求
iState = EGetPhoneInfo;
switch(iPhoneInfoType)
{
case EHandsetIMEI:
{
CTelephony::TPhoneIdV1Pckg phoneIdPckg( iPhoneId );
iTelephony->GetPhoneId(iStatus, phoneIdPckg);
}
break;
case EHandsetIMSI:
{
CTelephony::TSubscriberIdV1Pckg subscriberIdPckg( iSubscriberId );
iTelephony->GetSubscriberId(iStatus, subscriberIdPckg);
}
break;
case EHandsetNetworkInfo:
{
CTelephony::TNetworkInfoV1Pckg networkInfoPckg( iNetworkInfo );
iTelephony->GetCurrentNetworkInfo(iStatus, networkInfoPckg);
}
break;
}

SetActive(); //周期需求激活
iActiveSchedulerWait.Start();
}

void CSystemManager::RunL()
{
iState = EDone;
if ( iActiveSchedulerWait.IsStarted() )
{
iActiveSchedulerWait.AsyncStop();
if(iStatus == KErrNone)
{
switch(iPhoneInfoType)
{
case EHandsetIMEI:
iIMEI.Append(iPhoneId.iSerialNumber );
break;
case EHandsetIMSI:
iIMSI.Append(iSubscriberId.iSubscriberId );
break;
case EHandsetNetworkInfo:
iCellId = iNetworkInfo.iCellId;
iLocationAreaCode = iNetworkInfo.iLocationAreaCode;
break;
}
}
else
{
// ***********Handle Error here ************
}
}
}

const TPtrC CSystemManager::GetIMEI()
{
iPhoneInfoType = EHandsetIMEI;
iIMEI.Zero();

StartL();
TPtrC ptr(iIMEI.Ptr());
return ptr;
}

const TPtrC CSystemManager::GetIMSI()
{
iPhoneInfoType = EHandsetIMSI;
iIMSI.Zero();

StartL();
TPtrC ptr(iIMSI.Ptr());
return ptr;
}

void CSystemManager::GetNetworkInfoL(TUint& aLocationCode, TUint& aCellId)
{
iPhoneInfoType = EHandsetNetworkInfo;
StartL();
aCellId = iCellId;
aLocationCode = iLocationAreaCode;

return;

}
注释:这份代码需求“ReadDeviceData”功能。
如果你想获取进一步的信息,可在相关站点获取。


Tag:位置 代码 第三 信息 网络 恢复 // void break case iPhoneInfoT
责任编辑:本站整理
  • 用户名: (新注册)密码: 匿名:  请文明参与讨论,禁止漫骂攻击。
    评论总数: [ 查看全部 ] 网友评论
    关于我们 - 联系我们 - 广告服务 - 法律声明 - RSS订阅 - 网站地图 - 返回顶部