mobile天地

mobile天地

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  5 Posts :: 2 Stories :: 25 Comments :: 0 Trackbacks

公告

2008年12月3日 #

         以前查找了好些在.net CF框架上调用设备本地API函数读取手机SIM卡的资料,但各种资料都少了些描述,特别是少了一些引用的结构(struct),造成了资料中的原代码不能直接运行,让很多学习的朋友遇到很多麻烦,花费了多余的时间,走了一些弯路。

         我也遇到了类似的问题,通过补充了一些缺失的代码后,使程序可以正常的读取SIM卡了。

      SIM 卡

  Pocket PC Phone 的内置电话功能使它成为移动电话家族的重要成员,在创建新的连接应用程序时,可以利用该功能。与所有移动电话一样,Pocket PC 电话也需要用户身份模块 (SIM) 卡才能拨打电话(紧急电话除外,拨打紧急电话时无需 SIM 卡)。例如,连接应用程序可以通过在启动连接之前检查用户的个人识别码 (PIN) 代码来利用 SIM 卡的安全功能。

  SIM 卡可以存储移动电话的电话号码以及提供此号码的操作员的身份标识。另外,它还可以存储附加有姓名的电话号码以及多条短消息服务的消息。SIM 卡不仅具有存储器,还具有使卡可以进行安全和加密处理的中央处理器。通常情况下,您需要使用 PIN 代码“登录”到 SIM 卡。

  SIM 管理器 API

  在 Pocket PC Phone 中,您可以使用一系列 Windows CE API 调用(统称为 SIM 管理器)来访问 SIM 卡上的信息。 

  会话以调用 SimInitialize 开始,这将返回一个 SIM 句柄,此后,在调用 SIM 管理器 API 函数时均需要此句柄。通过将此句柄传递给 SimDeinitialize 来终止会话。

  使用 Compact Framework 调用 Windows API

  使用 SDE (Smart Device Extensions) 和 Compact Framework,可以进行 Microsoft? Windows? API 调用,例如使用 Interop(erability) 服务访问 SIM 管理器 API。

  SIM Anyplace 示例

  该示例是使用 Microsoft Visual Studio? .NET、C#、SDE 和 .NET CF 创建的 Pocket PC Phone 的示例应用程序。它展示了如何使用 SIM 管理器 API 访问 SIM 卡。该应用程序包含一个窗体:

  此示例的用途仅限于通过敲击“获取 SIM 信息”按钮从 SIM 卡获取一般信息。但是,通过使用此示例的结构可以将其用途扩展至包含更多的 SIM 管理器 API 功能。

 

  代码演练

  要使用 Compact Framework 的 Interop 服务,需要添加以下代码:

     using System.Runtime.InteropServices;

     创建类 SIMWrap 来存储 Windows API 的原型,该示例需要以下原型:

 

 

       public const int SIM_CAPSTYPE_ALL = 0x3F// 所有联系人
        public const int SIM_PBSTORAGE_SIM = 0x10// 
        public const int SIM_SMSSTORAGE_SIM = 0x2//

        [DllImport(
"cellcore.dll")]
        
public static extern int SimInitialize(uint dwFlags,
        
int lpfnCallBack, uint dwParam, ref int lphSim);

        [DllImport(
"cellcore.dll")]
        
public static extern int SimGetPhonebookStatus(int hSim,
        
uint dwLocation, ref uint lpdwUsed, ref uint lpdwTotal);

        [DllImport(
"cellcore.dll")]
        
public static extern int SimGetDevCaps(int hSim,
        
uint dwCapsType, ref SimCaps lpSimCaps);

        [DllImport(
"cellcore.dll")]
        
public static extern int SimGetSmsStorageStatus(int hSim,
        
uint dwStorage, ref uint lpdwUsed, ref uint lpdwTotal);

        [DllImport(
"cellcore.dll")]
        
public static extern int SimDeinitialize(int hSim);

        [DllImport(
"cellcore.dll")]
        
public static extern int SimReadPhonebookEntry(int hSim, uint dwLocation, uint dwIndex, ref SIMPHONEBOOKENTRY entry);


        [StructLayout(LayoutKind.Sequential)]
        
public struct SimCaps
        {
            
public uint cbSize;
            
public uint dwParams;
            
public uint dwPBStorages;
            
public uint dwMinPBIndex;
            
public uint dwMaxPBIndex;
            
public uint dwMaxPBEAddressLength;
            
public uint dwMaxPBETextLength;
            
public uint dwLockFacilities;
            
public uint dwReadMsgStorages;
            
public uint dwWriteMsgStorages;
            
public uint dwNumLockingPwdLengths;
            
public SimLockingPwdLength rgLockingPwdLengths0;
            
public SimLockingPwdLength rgLockingPwdLengths1;
            
public SimLockingPwdLength rgLockingPwdLengths2;
            
public SimLockingPwdLength rgLockingPwdLengths3;
            
public SimLockingPwdLength rgLockingPwdLengths4;
            
public SimLockingPwdLength rgLockingPwdLengths5;
            
public SimLockingPwdLength rgLockingPwdLengths6;
            
public SimLockingPwdLength rgLockingPwdLengths7;
            
public SimLockingPwdLength rgLockingPwdLengths8;
            
public SimLockingPwdLength rgLockingPwdLengths9;
        }

 

        
//很多文章都缺失的结构

        [StructLayout(LayoutKind.Sequential)]
        
public struct SimLockingPwdLength
        {
            
public uint dwFacility;
            
public uint dwPasswordLength;
        }

 

        
//很多文章都缺失的结构

        [StructLayout(LayoutKind.Sequential)]
        
public struct SIMPHONEBOOKENTRY
        {
            
public uint cbSize; // 
            public uint dwParams; // 
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            
public string lpszAddress; // 联系人电话
            public uint dwAddressType; //
            public uint dwNumPlan; //
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            
public string lpszText; // 联系人姓名
        }

 

 

        
/// <summary>
        
/// 获取SIM卡联系人信息
        
/// </summary>
        
/// <returns></returns>
        public static List<string[]> GetSIMContactList()
        {
            
int hSim = 0;
            List
<string[]> list = new List<string[]>();
            
try
            {
                
int result = SimInitialize(000ref hSim);
                
if (result != 0)
                    
throw new Exception("SIM打卡失败,请检测SIM是否安装!");
                
uint uiUsed = 0;
                
uint uiTotal = 0;
                result 
= SimGetPhonebookStatus(hSim, SIM_PBSTORAGE_SIM, ref uiUsed, ref uiTotal);


                
for (int i = 1; i <= uiUsed; i++)
                {
                    SIMPHONEBOOKENTRY entry 
= new SIMPHONEBOOKENTRY();
                    entry.cbSize 
= (uint)Marshal.SizeOf(typeof(SIMPHONEBOOKENTRY));
                    result 
= SimReadPhonebookEntry(hSim, SIM_PBSTORAGE_SIM, (uint)i, ref entry);
                    list.Add(
new string[2] { entry.lpszText.Trim(), entry.lpszAddress.Trim() });
                }
                
return list;

            }
            
catch
            {
                
throw;
            }
            
finally
            {
                SimDeinitialize(hSim);

            }
        }

 

 

 

          声明适当时,“获取 SIM 信息”按钮所表示的代码如下所示:

          dataGrid1为列表控件

 

           List<string[]> list = SIMWrap.GetSIMContactList();
            DataTable dt 
= new DataTable();
            dt.Columns.Add(
new DataColumn("姓名"typeof(string)));
            dt.Columns.Add(
new DataColumn("号码"typeof(string)));


            
string[] str;
            
for(int i = 0; i < list.Count; i++)
            {
                str 
= list[i];
                DataRow dr 
= dt.NewRow();
                dr[
0= str[0].ToString();
                dr[
1= str[1].ToString();
                dt.Rows.Add(dr);

            }


            dataGrid1.DataSource 
= dt;

 

  小结

  由于 Pocket PC Phone 是移动电话家族的重要成员,因此在创建大型的连接应用程序时可以利用其功能,例如 SIM 卡。使用 SIM 管理器 API、Compact Framework 的 Interop 服务以及 .NET 开发环境,可以获得实现这一功能的工具。

posted @ 2008-12-03 17:42 鳄鱼 阅读(2394) 评论(13) 编辑

目前Windows Mobile的开发资源已经非常多了,我们在这里试着对这些资源进行一个归纳,使第一次进入Windows Mobile领域的开发者能够更容易得找到有用的开发资源。

Windows Mobile是什么

Windows Mobile是微软为智能手机和PDA提供的操作系统,在Windows Mobile 5.0之前分为Pocket PCSmartphone两种版本,Pocket PC中包括PDA版本和带电话功能的Phone Edition。在Windows Mobile 6.0中分为三类:Professional,即Pocket PC Phone Edition; Standard, SmartphoneClassic,即无电话功能的Pocket PC

Windows Mobile是基于Windows CE操作系统开发的针对智能手机和PDA的操作系统平台。所以Windows Mobile的硬件与应用程序都是由相关的标准要求,符合标准才能够运行Windows Mobile操作系统。

获取开发工具

目前Windows Mobile的主流开发平台/语言分为两种:.NET(包括C#VB.NET)和C++。微软已经将这两种开发语言的支持加入到Visual Studio中。Visual Studio 20052008均内置了Windows MobileSDK,可以直接开发Windows Mobile应用程序。Visual Studio也支持安装最新版本的Windows Mobile SDK

如果想用Visual Studio开发Windows Mobile应用程序的话,必须已经获取了Visual Studio Professional或以上版本。

除了Visual Studio外,我们还可以使用免费的eMbedded Visual C++ 4.0来开发C++应用程序。在安装SP4版本后,可以支持基于Windows CE 5.0设备的应用开发(目前Windows Mobile 5.06.0均基于Windows CE 5.0)。下载地址如下:

http://www.microsoft.com/downloads/details.aspx?FamilyId=1DACDB3D-50D1-41B2-A107-FA75AE960856&displaylang=en

eMbedded Visual C++ 4.0 SP4下载地址:

http://www.microsoft.com/downloads/details.aspx?familyid=4A4ED1F4-91D3-4DBE-986E-A812984318E5&displaylang=en

在安装完成开发工具后,还需要根据不同的目标设备安装不同版本的Windows Mobile SDK。我们可以在MSDN网站的下载中查询“Windows Mobile x.0 SDK”,或者直接去下面链接中查找:

http://msdn2.microsoft.com/en-us/windowsmobile/bb264327.aspx

比如,Windows Mobile 6.0 SDK的下载地址:

http://www.microsoft.com/downloads/details.aspx?FamilyID=06111a3a-a651-4745-88ef-3d48091a390b&DisplayLang=en

如果要开发中文版的应用程序,还需要安装单独的本地化模拟器映像文件。Windows Mobile 6.0的语言映像文件下载链接如下:

http://www.microsoft.com/downloads/details.aspx?familyid=38C46AA8-1DD7-426F-A913-4F370A65A582&displaylang=en

除此之外,我们还需要安装ActiveSync 4.5,来使开发环境与Windows Mobile设备相连接。在VistaWindows Mobile Device CenterActiveSync的功能相同。

如果使用.NET Compact Framework来开发应用程序,还需要保证目标设备上安装了.NET CFCLR,如果没有目标设备安装.NET CF,可以下载单独的.NET CF再发布包:

http://www.microsoft.com/downloads/details.aspx?FamilyID=9655156b-356b-4a2c-857c-e62f50ae9a55

网络资源

Windows Mobile开发中心

http://msdn2.microsoft.com/en-us/windowsmobile/default.aspx

 

Windows Mobile产品主页

http://www.microsoft.com/windowsmobile/

http://www.microsoft.com/china/windowsmobile

 

Windows Mobile移动解决方案联盟

http://www.wmisv.com.cn/

 

Pocket PC Developer Network

老牌Pocket PC开发者网站,在EVCEVB时代曾经是开发者唯一的选择,不过后来风头逐渐被OpenNETCF盖过,但目前依旧是最完整的开发文章目录

http://www.pocketpcdn.com/

 

Smartphone Developer Network

Pocket PC Developer Network的姊妹网站

http://www.smartphonedn.com/

 

Code Project

综合性开发者网站,其中CE开发和.NET CF开发部分由许多值得借鉴的示例代码

http://www.codeproject.com/KB/mobile/

 

DEVBUZZ.COM

老牌Embedded Visual Basic开发网站,转型.NET CF后,仍然有一些开发资源值的一看

http://www.devbuzz.com/

开发资源

OpenNETCF

著名的开源类库,早先由多位MVP发起,进行公司化运作,后被Novell收购,先为咨询公司。OpenNETCF的最新版本仍可以免费使用,但不提供源代码。

http://www.opennetcf.com/

 

InTheHand

著名的开源类库,32feet.NET是以BluetoothIrDA开发为主的Shared Source类库。

http://inthehand.net/

 

Mobile Line of Business Solution Accelerator

由微软开发的一套移动商业软件开发指导包

http://www.microsoft.com/downloads/details.aspx?FamilyId=80A5C2C5-4F9B-4C1A-BFF6-2A3C6B68D15B&displaylang=en

 

Mobile Client Software Factory

微软开发的一套软件工厂框架,将设计模式应用于Mobile软件开发

http://msdn2.microsoft.com/en-us/library/aa480471.aspx

下载地址:

http://www.microsoft.com/downloads/details.aspx?FamilyID=F9176708-9F57-4C0F-97FB-F9C65A9BBF22&displaylang=en

 

开发社区

中文的开发论坛:

微软移动开发者论坛

微软的官方开发者论坛,目前的版主是微软最有价值专家(MVP)。

http://forums.microsoft.com/china/default.aspx?ForumGroupID=459&SiteID=15

CSDN嵌入式开发论坛

最大的开发者社区,硬件/嵌入式开发板块中包括“嵌入开发(WinCE)”板块和移动平台板块中包括“Windows Mobile”板块

http://community.csdn.net/

Windows Mobile开发者社区

CSIP创建的开发者讨论社区

http://www.winbile.net/BBS/

马宁的Windows Mobile开发研究

http://groups.csdn.net/aawolf_Mobile

博客园的Windows Mobile应用开发团队博客

shttp://mobiledev.cnblogs.com/

 

英文论坛:

MSDN开发者社区:Smart Device Development

http://forums.microsoft.com/MSDN/default.aspx?ForumGroupID=11&SiteID=1

 Webcast

中文MSDNTechNet Webcast

Windows移动开发系列课程

http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/WindowsMobile.aspx

Windows Mobile 技术开发黄金周

http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/Mobilegoldenweek.aspx

Windows Mobile 2nd 开发黄金周

http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/Mobilegoldenweek2nd.aspx

Windows Mobile 3rd 技术开发黄金周

http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/mobile3rd.aspx

TechNet Windows 移动系列课程

http://www.microsoft.com/china/technet/webcasts/class/mobile.mspx

英文WebcastVirtual Labs

Windows Mobility Marvels

主要针对的是Windows Mobile开发者,包括WebcastVirtual Labs

http://www.microsoft.com/events/series/msdnmobility.aspx

Windows Mobility Marvels部分课程下载

http://www.microsoft.com/downloads/details.aspx?FamilyID=08e4391d-e07d-41fe-b2b8-aa4225281347&DisplayLang=en

 

Windows Mobile Solutions

针对IT ProWindows Mobile用户的Webcast系列

http://www.microsoft.com/events/series/msecmobility.aspx

BLOG

Windows Mobile产品组英文BLOG

Windows Mobile Team Blog

http://blogs.msdn.com/windowsmobile/

.NET Compact Framework Team Blog

http://blogs.msdn.com/netcfteam/

Visual Studio For Device

http://blogs.msdn.com/vsdteam/

SQL Server Compact

http://blogs.msdn.com/SQLServerCompact/

 

产品组成员BLOG

Mike HallBLOG

http://blogs.msdn.com/mikehall/

Rob Tiffany's Windows Mobile Accelerator

主要研究领域为SQL CEBOL Accelerator

http://blogs.msdn.com/robtiffany/

David Kline

.NET Compact Framework应用领域

http://blogs.msdn.com/davidklinems/

Steve Lasker's Web Log

SQL CESync Service for ADO.NET

http://blogs.msdn.com/stevelasker/

Steven Pratschner's .Net CF WebLog

.NET Compact Framework CLR运行机制

http://blogs.msdn.com/stevenpr/

 

英文开发者BLOG

OpenNETCF Blogs

以开发OpenNETCF开源类库闻名的公司,拥有多位重量级MVPBLOG

http://blog.opennetcf.org/

In the hand Blogs

另一个以开发InTheHand开源类库闻名的开发者BLOG

http://inthehand.net/blogs/

 

中文开发者BLOG

马宁的移动开发BLOG

http://blog.csdn.net/aawolf

张欣的BLOG

http://twodays.cnblogs.com/

黎波的BLOG

http://www.cnblogs.com/upto/

鳄鱼的BLOG

http://www.cnblogs.com/kkenn/

posted @ 2008-12-03 11:13 鳄鱼 阅读(320) 评论(0) 编辑