Windows Embedded征文比赛

马宁的嵌入式开发研究

Windows Mobile, Windows Embedded
posts - 61, comments - 405, trackbacks - 17, articles - 0

2009年10月31日

我写了不少开发初体验的文章,以前总是在写别人做的产品。但是这次不太一样,因为我也参与了Windows Embedded 6.0 R3的开发。这也是Windows Embedded的中国研发团队的第一个产品,希望大家能够多多关注和支持。

开发环境

Windows Embedded 6.0 R3是在Windows CE 6.0 R2的基础上,增加了下列技术:

· Silverlight for Embedded

· Internet Explorer Embedded浏览器

· Flash Lite支持

· 手势识别Gesture API

· Connection Manager

· Mobile QQ

· Office Viewer

其中Internet Explorer Embedded是由Windows Embedded中国研发团队单独开发的。而Mobile QQ是由腾讯公司开发整合的。所以,这给Windows CE 6.0 R3打上了深深的中国印记。

如果想安装Windows CE 6.0 R3的话,需要首先安装Visual Studio 2005,以及VS 2005 SP1。如果是Vista或者Win7操作系统的话,还需要安装VS 2005 Vista Update。

然后我们要安装Windows CE 6.0,其中包括Platform Builder 6.0开发工具。然后再依次安装Windows CE 6.0 R2和R3。如果已经安装了R2,只需要安装R3的安装包即可。

最后,我们可以选装Mobile QQ和Office Viewer。因为这两个软件是第三方软件,所以是以Windows CE 插件的方式单独安装。

以上所有软件可以从微软网站上下载。Windows CE 6.0需要申请试用版的密钥。下载链接如下:

http://www.microsoft.com/windowsembedded/zh-cn/products/windowsce/getting-started.mspx#opt

定制操作系统

Windows CE操作系统定制与Windows CE 6.0 R2没有区别,仍然是通过来向导进行定制。首先在Visual Studio 2005的菜单中选择New – Project,在对话框中选择Platform Builder for CE 6.0节点,选择OS Design类型。

在欢迎界面之后,选择BSP。BSP是板级支持包的缩写,BSP与硬件设备对应。指定我们创建的OS Deign运行在哪些设备上。在这里我们选择Device Emulator,ARMV4I是Device Emulator处理器类型。

PB2

所有的BSP被放在WINCEROOT的Platform目录下,主要有四种处理器类型:ARMV4I、MIPS、SH4和x86。在这里需要特别指出的是,我们将第三方BSP拷贝到Platform目录中后,该BSP的名称会自动显示在这个列表里。如果BSP无法显示,可能是因为安装时没有选择BSP相应的处理器类型。

在选择BSP之后,我们选择OS Design的模板类型:PDA Device中的Enterprise Web Pad。点击Finish按钮,完成向导,进入PB的主界面。

PB4

选择新组件

接下来,我们来选择Windows CE 6.0 R3新增加的组件。首先打开Platform Builder的Catalog Items View。如果在IDE中没有显示,可以在View菜单中的Other Windows里找到,并显示出来。

sl

Silverlight for Windows Embedded的组件位于Core OS\CEBASE\Shell and User Interface\User Interface\目录下的Silverlight for Windows Embedded,对应的SYSGEN是SYSGEN_XAML_RUNTIME。

手势识别Gesture的支持离得不远,位于Core OS\CEBASE\Shell and User Interface\User Interface\Gesture目录下的Gesture Animation Support,对应的SYSGEN是SYSGEN_PHYSICSENGINE。还有两个相关的SYSGEN就不多做解释了。

Connection Manager位于Core OS\CEBASE\Communication Services and Networking\Networking – General\Connection Manager\目录下的Connection Manager,对应的SYSGEN是SYSGEN_CONNMGR。

Internet Explorer Embedded位于Core OS\CEBASE\Internet Client Services\Browser Application\Internet Explorer 6.0 for Windows Embedded CE - Standard Components\目录下的Internet Explorer 6.0 XAML UI Sample Browser,对应SYSGEN是SYSGEN_IESAMPLE_EXR。还有一个相关的组件是Internet Explorer 6.0 Tiling Engine(SYSGEN_IE_TILEENGINE)。

Flash Lite的支持是在Core OS\CEBASE\Internet Client Services\Browser Application\Flash Lite目录下的Adobe Flash Lite ActiveX Control,对应SYSGEN是SYSGEN_IE_FLASHLITE。

Flash Lite可以支持新的IE Embedded,也可以支持老的IESAMPLE。

添加QQ

这么说大家没什么概念,我们就来看一个实例,将QQ加入到OS Design里。如果已经安装了Mobile QQ的MSI安装包,我们会在Third Party\Tencent节点下,选上Tencent Mobile QQ就可以了。

clip_image006

截图中显示的不是绿色的勾,而是一个红色的叉。我们得到的解释是,这是Platform Builder 6.0的一个BUG,会在以后修复,而不会影响正常功能。

Mobile QQ也会加入一些关联的SYSGEN,比如Cellcore的SMS等。Mobile QQ目前只有中文版,所以,我们还要为OS Design添加中文支持,否则显示会不正确。

在Solution Explorer里选中OSDesign,然后在Project菜单里选择Properties。在弹出的对话框里,选择Configuration Properties节点里的Locale。在右侧的界面中,Locales里选择“简体中文”,在Default locale里选择“简体中文”。

locale

Locale设置完成后,还需要添加中文字体。在Catalog Items View中,选择Core OS\CEBASE\International\Locale Specific Support\Chinese (Simplified) 目录下的一些节点,包括Fonts\ SimSun & NSimSun(Choose 1)中的SimSun & NSimSun,SYSGEN是SYSGEN_FONTS_SIMSUN。还有Input Method Editor目录下的Pocket IME,SYSGEN是SYSGEN_PIME_SC。

cn

编译OS Design后,我们可以在开始菜单后看到QQ的快捷方式,运行后的界面如下:

qq2

最后留个悬念,大家猜一下下面的应用程序界面是用什么做的?

cid

posted @ 2009-10-31 18:05 马宁 阅读(2211) | 评论 (22)编辑

2009年7月5日

作者:马宁

最近被一个软件网络连接的问题,折腾得死去活来。问题本身不复杂,主要是网络设置不同造成的,在这里不多说了。在调试过程中,用到了Windows CE下的几个网络监测工具,才了解到Windows CE下也可以用我们平时用的网络监测工具,写出来和大家共享一下吧。

环境设置

我用Windows CE 6.0 R2环境做实验,开发环境搭建可以参考:

http://blogs.msdn.com/mikehall/archive/2009/06/10/steps-needed-to-install-windows-embedded-ce-6-0-from-scratch.aspx

我们使用Device Emulator作为测试平台,创建OS Design的过程就不多说了,可以参考:

http://blog.csdn.net/aawolf/archive/2007/12/19/1953448.aspx

需要指出的是,需要在OS Design中加入SYSGEN_NETUTILS。如果在Catalog Item中选择的话,选择如图所示的Network Utilities (IpConfig, Ping, Route), TCP/IP选项(SYSGEN_TCPIP)也会被加入。

CE_Network8

OS Design创建和编译完成后,我们要部署到Device Emulator上。设置Device Emulator的外观和网络连接,选择Connectivity Options。下图红色圆圈位置:

CE_Network4

在Connectivity Options对话框里,Download和Transport选择“Device Emulator(DMA)”,Debugger选择“KdStub”,点击Download后的Settings按钮。

CE_Network1

在Display页面里将分辨率设置为640和480。

CE_Network2

在Network页面里,选择“Enable NE2000 …”网卡的选项,这样,PC上的网络连接就可以被映射为Device Emulator的NE2000网卡了。需要提醒一点的是,需要在PC上安装Virtual PC虚拟网卡驱动,最简单的办法就是安装Virtual PC 2007.

CE_Network3

到这里,我们已经配置完Device Emulator的网络配置,选择Target菜单里的Attach Device,将编译好的NK.bin下载到Device Emulator上,并运行。

Ping命令

等Device Emulator启动之后,我们可以在输入命令进行调试了。在Target目录中选Target Control,Command Shell会出现。下图所示:

CE_Network5

先运行ping命令,如果我们直接输入s ping x.x.x.x的话,会在模拟器中显示一个命令行窗口,并且输出执行结果。S的意思是在CE中运行某个应用程序。结果如下图:

CE_Network7

不过问题随之而来,命令行窗口会在ping命令执行完成后,自动退出。我们想查看ping命令的执行情况,就需要眼疾手快了。难道,没有其他的办法了吗?

有,我们输入s ping x.x.x.x /d,执行结果会输出到output窗口中。

CE_Network6

下面的演示我会将output里的结果贴出来,不再截图了。

ipconfig命令

接下来是另外一个简单的网络监测工具:ipconfig。在Command Shell中输入s ipconfig /all /d。/all 是ipconfig的命令,显示所有的配置信息,除此之外还有/renew和/release两个参数,用于更新网卡的IP地址。/d还是将结果显示到Output窗口中。

PB Debugger Loaded symbols for 'D:\NINMA\RELDIR\DEVICEEMULATOR_ARMV4I_RELEASE\IPCONFIG.EXE'

122396 PID:5860042 TID:5890056 Windows IP configuration

122465 PID:5860042 TID:5890056 Ethernet adapter Local Area Connection:

122465 PID:5860042 TID:5890056 IP Address ........ : 192.168.0.163

122465 PID:5860042 TID:5890056 Subnet Mask ....... : 255.255.255.0

122465 PID:5860042 TID:5890056 IP Address ........ : fe80::203:ffff:fe55:8d9f%5

122465 PID:5860042 TID:5890056 Default Gateway ... : 192.168.0.1

122465 PID:5860042 TID:5890056 Adapter Name ...... : NE20001

122465 PID:5860042 TID:5890056 Description ....... : NE20001

122465 PID:5860042 TID:5890056 Adapter Index ..... : 2

122465 PID:5860042 TID:5890056 Address............ : 00 03 ff 55 8d 9f

122465 PID:5860042 TID:5890056 DHCP Enabled....... : YES

122465 PID:5860042 TID:5890056 DHCP Server........ : 192.168.0.1

122465 PID:5860042 TID:5890056 Primary WinsServer :

122465 PID:5860042 TID:5890056 Secondary WinsServer:

122465 PID:5860042 TID:5890056 Lease obtained on : Sunday, July 5 ,2009 18 : 5 : 30

122465 PID:5860042 TID:5890056 Lease expires on : Sunday, July 12 ,2009 18 : 5 : 30

122465 PID:5860042 TID:5890056 AutoConfig Enabled : YES

122465 PID:5860042 TID:5890056

122465 PID:5860042 TID:5890056 Tunnel adapter []:

122467 PID:5860042 TID:5890056 Interface Number .. : 4

122467 PID:5860042 TID:5890056

122468 PID:5860042 TID:5890056 Tunnel adapter [6to4 Pseudo-Interface]:

122468 PID:5860042 TID:5890056 Interface Number .. : 3

122468 PID:5860042 TID:5890056

122469 PID:5860042 TID:5890056 Tunnel adapter [Automatic Tunneling Pseudo-Interface]:

122469 PID:5860042 TID:5890056 Interface Number .. : 2

122470 PID:5860042 TID:5890056 IP Address ........ : fe80::5efe:192.168.0.163%2

122470 PID:5860042 TID:5890056

122474 PID:5860042 TID:5890056 Host name.......... : WindowsCE

122474 PID:5860042 TID:5890056 Domain Name........ :

122474 PID:5860042 TID:5890056 DNS Servers........ : 62.244.19.19

122474 PID:5860042 TID:5890056 192.168.0.1

122474 PID:5860042 TID:5890056 NODETYPE........... : 8

122474 PID:5860042 TID:5890056 Routing Enabled.... : NO

122474 PID:5860042 TID:5890056 Proxy Enabled...... : NO

122474 PID:5860042 TID:5890056

PB Debugger Unloaded symbols for 'D:\NINMA\RELDIR\DEVICEEMULATOR_ARMV4I_RELEASE\IPCONFIG.EXE'

Netstat命令

接下来是netstat,显示网络当前的状态。输入s netstat -e /d,显示以太网的统计数据,比如发送和接收到的字节数等。

PB Debugger Loaded symbols for 'D:\NINMA\RELDIR\DEVICEEMULATOR_ARMV4I_RELEASE\WINSOCK.DLL'

273033 PID:5120022 TID:514005e

273035 PID:5120022 TID:514005e Interface Statistics Received Sent

273036 PID:5120022 TID:514005e Bytes 145754 14193

273036 PID:5120022 TID:514005e Unicast Packets 503 98

273036 PID:5120022 TID:514005e NonUnicast Packets 19 7

273036 PID:5120022 TID:514005e Discards 0 0

273037 PID:5120022 TID:514005e Errors 0 0

PB Debugger Unloaded symbols for 'D:\NINMA\RELDIR\DEVICEEMULATOR_ARMV4I_RELEASE\WINSOCK.DLL'

273037 PID:5120022 TID:514005e Unknown Protocols 0

273037 PID:5120022 TID:514005e Name =

273037 PID:5120022 TID:514005e Index =2

273037 PID:5120022 TID:514005e Physical Addrress =0003FF558D9F

273037 PID:5120022 TID:514005e Description =NE20001

273037 PID:5120022 TID:514005e Type =6

273037 PID:5120022 TID:514005e Mtu =1500

273037 PID:5120022 TID:514005e Speed - bps =10000000

273038 PID:5120022 TID:514005e Administrative Status =1

273038 PID:5120022 TID:514005e Oprerational Status =5

273038 PID:5120022 TID:514005e Output Queue Length =0

PB Debugger Unloaded symbols for 'D:\NINMA\RELDIR\DEVICEEMULATOR_ARMV4I_RELEASE\NETSTAT.EXE'

输入s s netstat -n /d,会显示当前活动的TCP连接,包括地址和端口号:

471308 PID:53a0062 TID:53b0062 GetTcpTable.

471308 PID:53a0062 TID:53b0062

471308 PID:53a0062 TID:53b0062 UDP TABLE

471308 PID:53a0062 TID:53b0062 Loc Addr Loc Port

471309 PID:53a0062 TID:53b0062 0.0.0.0 137

471309 PID:53a0062 TID:53b0062 0.0.0.0 138

输入s netstat -p tcp /d,会显示指定网络协议的信息,如下:

1998793 PID:5f0003e TID:460006e TCP Statistics:

1998793 PID:5f0003e TID:460006e --------------

1998793 PID:5f0003e TID:460006e Active Opens = 9

PB Debugger Unloaded symbols for 'D:\NINMA\RELDIR\DEVICEEMULATOR_ARMV4I_RELEASE\WINSOCK.DLL'

1998793 PID:5f0003e TID:460006e Passive Opens = 0

1998793 PID:5f0003e TID:460006e Connect Attempt Fails = 0

1998793 PID:5f0003e TID:460006e Reset Connections = 9

1998793 PID:5f0003e TID:460006e Current Connections = 0

1998793 PID:5f0003e TID:460006e Segments Received = 57

1998793 PID:5f0003e TID:460006e Segments Sent = 72

1998793 PID:5f0003e TID:460006e Segments Retransmitted = 2

1998793 PID:5f0003e TID:460006e Errors Received = 0

1998793 PID:5f0003e TID:460006e Sgmnts sent w/Reset Flag= 12

1998793 PID:5f0003e TID:460006e Cumulative Connections = 0

1998793 PID:5f0003e TID:460006e Time-Out Algorithm = 4

1998793 PID:5f0003e TID:460006e Time-Out Minimim = 300

1998793 PID:5f0003e TID:460006e Time-Out Maximum = 120000

1998793 PID:5f0003e TID:460006e Maximum Connections = Dynamic (-1)

-s选项显示各种协议的统计信息,比如IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP和UDPv6协议。-p可以和-s共同使用,用于显示某种协议的统计信息。

-r选项则显示路由表信息,与后边的route print命令类似。

Route命令

输入s route print /d,显示当前的路由表信息:

2379153 PID:4a5006a TID:4bb0076 =============================================================================

2379153 PID:4a5006a TID:4bb0076 Interface List

2379153 PID:4a5006a TID:4bb0076 0x2 00 03 ff 55 8d 9f NE20001

2379153 PID:4a5006a TID:4bb0076 =============================================================================

2379153 PID:4a5006a TID:4bb0076 =============================================================================

2379153 PID:4a5006a TID:4bb0076 Active Routes

PB Debugger Unloaded symbols for 'D:\NINMA\RELDIR\DEVICEEMULATOR_ARMV4I_RELEASE\WINSOCK.DLL'

2379153 PID:4a5006a TID:4bb0076 The no. of entries is ::: 7

2379153 PID:4a5006a TID:4bb0076 Destination Netmask GatewayAddress Interface Metric

2379153 PID:4a5006a TID:4bb0076 ----------------------------------------------------------------------------

2379153 PID:4a5006a TID:4bb0076 0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.163 30

2379153 PID:4a5006a TID:4bb0076 127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1

2379153 PID:4a5006a TID:4bb0076 192.168.0.0 255.255.255.0 192.168.0.163 192.168.0.163 30

2379153 PID:4a5006a TID:4bb0076 192.168.0.163 255.255.255.255 127.0.0.1 127.0.0.1 30

2379153 PID:4a5006a TID:4bb0076 192.168.0.255 255.255.255.255 192.168.0.163 192.168.0.163 30

2379153 PID:4a5006a TID:4bb0076 224.0.0.0 240.0.0.0 192.168.0.163 192.168.0.163 30

2379153 PID:4a5006a TID:4bb0076 255.255.255.255 255.255.255.255 192.168.0.163 192.168.0.163 1

2379153 PID:4a5006a TID:4bb0076 =============================================================================

Route除了print命令外,还有Add和Delete命令。大家可以参考Route的帮助,我们就不多解释了。

Tracert命令

Tracert命令用于跟踪你的设备到某个IP地址的路由。输入s Tracert www.sohu.com –p,需要说明的是,Tracert结果输入到output的参数是-p。

Tracing route to www.sohu.com [222.35.250.135]

over a maximum of 30 hops:

2634835 PID:27002de TID:5650052 1

2634847 PID:27002de TID:5650052 5 ms

2634853 PID:27002de TID:5650052 6 ms

2634855 PID:27002de TID:5650052 1 ms

2635521 PID:27002de TID:5650052 192.168.0.1

2635521 PID:27002de TID:5650052

2636524 PID:27002de TID:5650052 2

2640537 PID:27002de TID:5650052 *

2640720 PID:27002de TID:5650052 179 ms

2640923 PID:27002de TID:5650052 203 ms

2641022 PID:27002de TID:5650052 222.35.*.*

2641022 PID:27002de TID:5650052

2641823 PID:27002de TID:5650052 3

2642038 PID:27002de TID:5650052 213 ms

2642241 PID:27002de TID:5650052 199 ms

2642444 PID:27002de TID:5650052 200 ms

2642543 PID:27002de TID:5650052 222.35.*.*

2642543 PID:27002de TID:5650052

2643345 PID:27002de TID:5650052 4

2643755 PID:27002de TID:5650052 406 ms

2643958 PID:27002de TID:5650052 202 ms

2644060 PID:27002de TID:5650052 102 ms

2644980 PID:27002de TID:5650052 222.35.*.*

2644981 PID:27002de TID:5650052

2645883 PID:27002de TID:5650052 5

2649895 PID:27002de TID:5650052 *

2650171 PID:27002de TID:5650052 273 ms

2650381 PID:27002de TID:5650052 205 ms

2656618 PID:27002de TID:5650052 222.35.*.*

Trace complete.

好了,对于Windows CE上的网络监测工具,我们就先介绍到这里。我们将在后边继续介绍另一个功能强大的网络检测工具——netlog。

更多关于Windows Embedded CE开发的文章,请参考“Windows Embedded CE 中国研发团队”的中文博客:http://blogs.msdn.com/wincechina/

posted @ 2009-07-05 19:05 马宁 阅读(1884) | 评论 (4)编辑

2009年6月21日

作者:马宁

Windows Mobile 6.5的DTK终于发布了,其中最吸引人的是两个功能:Widgets和Gesture API。Widgets是近来非常流行的一项技术,用于显示一些常用信息,比如天气、股票、新闻和体育等。Google Android和Symbian上已经有了类似的技术,可以说,Widgets是很好地结合了移动设备与互联网的技术。虽然Widgets开发简单,但很有可能改变移动互联网的未来格局。目前Windows Mobile 6.5的Widgets是基于W3C的Widgets草案,支持2008年12月22日草案,链接在http://www.w3.org/TR/2008/WD-widgets-20081222/

开发环境

好了,接下来,我们就要看一下,如何为Windows Mobile 6.5开发一个Widgets控件。首先,我们需要下载Windows Mobile 6.5的DTK,下载链接为:

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=20686a1d-97a8-4f80-bc6a-ae010e085a6e

Windows Mobile 6.5的DTK需要与Windows Mobile 6 SDK配合使用,Windows Mobile 6 SDK的下载地址:

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

由于很多Widgets都需要联网,所以测试环境也需要ActiveSync的支持。Vista应该使用Windows Mobile Device Center 6.1,下载地址:

http://www.microsoft.com/windowsmobile/en-us/help/synchronize/device-center-download.mspx

编写Widgets

接下来,我们就可以来开发一个Widgets了。首先创建一个WidgetDemo的文件夹,创建一个叫做widget.htm的文件,将下面的HTML代码拷贝到文件中:

<html>

<head> 

<title>Cool Widget!</title> 

</head> 

<body> 

I'm a cool windows mobile 6.5 widget 

<!-- Search Google -->

<form method="get" action="http://www.google.cn/custom" target="google_window">

<table bgcolor="#ffffff">

<tr><td nowrap="nowrap" valign="top" align="left" height="32">

<a href="http://www.google.com/">

<img src="http://www.google.com/logos/Logo_25wht.gif" border="0" alt="Google" align="middle"></img></a>

<label for="sbi" style="display: none">????????</label></tr>

<tr>

<input type="text" name="q" size="31" maxlength="150" value="" id="sbi"></input>

<label for="sbb" style="display: none">??????</label>

<input type="submit" name="sa" value="??" id="sbb"></input>

<input type="hidden" name="client" value="pub-9289651901062754"></input>

<input type="hidden" name="forid" value="1"></input>

<input type="hidden" name="ie" value="UTF-8"></input>

<input type="hidden" name="oe" value="UTF-8"></input>

<input type="hidden" name="cof" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1"></input>

<input type="hidden" name="hl" value="zh_CN"></input>

</td></tr></table>

</form>

<!-- Search Google -->

</body> 

</html>

这个Widget就是调用Google的搜索页面。原来的Widget Demo没有Google搜索的代码,我从网上找了一个示例加了进去。接下来,创建一个叫做config.xml的文件,将下列代码拷贝到文件中:

<?xml version="1.0" encoding="utf-8" ?> 

<widget version="1.0" 

xmlns="http://www.w3.org/ns/widgets" 

id=""> 

<name>My first widget</name> 

<content src="widget.htm" type="text/html" /> 

<access network="true" /> 

<icon src="icon.png"/> 

<description>This is my first widget, 

it won't make a lot of money on the 

marketplace but at least is cute!</description> 

</widget>

这是一个描述性的XML文件,结构非常清晰,不需要多做解释了。注意content,icon和access network三个节点。Content的src就是我们刚编写的widget.htm, 允许Widget访问网络,icon则是显示在Windows Mobile开始菜单里的图标。

zip

现在有了三个文件,我们使用WinZip将其压缩成一个ZIP文件。特别需要指出的是,我们不能压缩这三个文件所在的文件夹,必须选中所有文件之后进行压缩。然后我们将WidgetDemo.zip的扩展名改为WidgetDemo.wgt。

部署Widget

到这里,Widget开发就完成了。通过ActiveSync或者共享目录,将Widget拷贝到Windows Mobile 6.5的模拟器中。

 Widgets1  Widgets2

我们使用File Explorer来找到这个Widget文件,点击之后,会提示是否安装并运行这个Widget。

安装Widget之后,会自动运行,Google的图标来源于网络,所以可能会显示慢一些。如果Google图标没有显示出来,则说明网络连接不通:

Widgets7   Widgets5

输入关键字,点击button,Widget会自动启动IE Mobile,显示搜索结果。

在使用时,我们可以在开始菜单里找到相应的图标,可以打开Widget。还需要说明的是,如何卸载这个Widget。

在开始菜单 - Setting – System - Remove Programs里,可以看到我们的Widget,与卸载普通的应用程序没有区别。

Widgets6

我们的Widget被安装在\Program Files\Widgets\User\7的目录里,目录的序号与安装顺序有关,比如1里就是内置的Live Search。

写在最后

写到这里,Widget的开发就完成了,怎么样?简单吧。Widget开发的简单性,正是它未来可能缔造辉煌的主要优势。任何熟悉HTML和JavaScript的人都可以开发出功能丰富的Widget,而Widget又可以像普通应用程序一样使用。

虽然不像Palm的WebOS那样具有颠覆性,但是依托于目前的技术,才能获得大多数开发者的支持。现在只有Windows Mobile 6.5支持Widget,但其他移动设备是否有可能支持Widget呢?一切皆有可能。

总之,一句话,大有可为!

其实HTML和JavaScript并不是我的强项,下周还是给大家说说Gesture API吧 J

参考资料

Getting started with widgets on Windows Mobile 6.5

http://blogs.msdn.com/windowsmobile/archive/2009/06/04/getting-started-with-widgets-on-windows-mobile-6-5.aspx

Developing Widgets for Windows Mobile 6.5

http://msdn.microsoft.com/en-us/library/dd721906.aspx

Windows Mobile 6.5 Widget系列文章

http://www.shangducms.com/post/Windows-Mobile-Widget.aspx

posted @ 2009-06-21 18:28 马宁 阅读(2506) | 评论 (12)编辑

2009年6月8日

作者:马宁 

Bing正式发布没几天,除了功能和搜索结果外,作为开发者来说,我们关心的还有Bing API啥时候能出。周末浏览MSDN网站时,发现Bing Service已经上线了,链接是:http://msdn.microsoft.com/en-us/library/dd900818.aspx

Bing提供的API很丰富,除了搜索外,还增加了广告Ad、图片、新闻、Phonebook、拼写和视频的搜索。而访问协议有三种:JSON, XML和SOAP。JSON协议用于AJAX应用,XML用于Silverlight应用,SOAP用于传统的.NET等强类型程序。可见,微软在推出API方面还是很有效率的。

使用Bing API的第一步,是去Bing Developer Center上申请一个AppId,每个应用应该使用一个单独的AppId。Bing Developer Center的网址是:http://bing.com/developers 。在页面里先用Live ID登录,然后选择Get a new App ID,填写一些基本信息,然后你就会得到一串很长的AppId。需要注意的是,Bing还有一个网址是http://www.bing.com/developer/ ,估计是为1.1版本准备的,现在还不能申请AppId。大家一定要分清楚。

接下来,我们在Visual Studio 2008里创建一个.NET应用。在Project菜单里选择Add Service Reference,在弹出对话框的Address文本框里填入:

http://api.search.live.net/search.wsdl?AppID=yourAppId

注意:AppID=后要填写你申请到的AppId.

BingApi

在找到LiveSearchService的引用后,将其添加到我们的工程中。接下来,我根据PhoneBook和WebSearch两个例子写了DEMO,更多例子可以参考:

http://msdn.microsoft.com/en-us/library/dd251066.aspx

需要提醒的是,可能是文档没有更新,Bing API的类名称还会发生变化。我发现在2009年6月8日导出的引用中,LiveSearchService的名称变成了LiveSearchPortTypeClient。Web Search的代码如下:

        private void button2_Click(object sender, EventArgs e)
        {
            // LiveSearchService implements IDisposable.
            using (LiveSearchPortTypeClient service = new LiveSearchPortTypeClient())
            {
                try
                {
                    SearchRequest request = BuildRequestWeb();

                    // Send the request; display the response.
                    SearchResponse response = service.Search(request);
                    DisplayResponseWeb(response);
                }
                catch (System.Net.WebException ex)
                {
                    // An exception occurred while accessing the network.
                    Console.WriteLine(ex.Message);
                }
            }
        }

        private SearchRequest BuildRequestWeb()
        {
            SearchRequest request = new SearchRequest();

            // Common request fields (required)
            request.AppId = AppId;
            request.Query = "马宁";
            request.Sources = new SourceType[] { SourceType.Web };

            // Common request fields (optional)
            request.Version = "2.0";
            request.Market = "en-us";
            request.Adult = AdultOption.Moderate;
            request.AdultSpecified = true;
            request.Options = new SearchOption[]
            {
                SearchOption.EnableHighlighting
            };

            // Web-specific request fields (optional)
            request.Web = new WebRequest();
            request.Web.Count = 30;
            request.Web.CountSpecified = true;
            request.Web.Offset = 0;
            request.Web.OffsetSpecified = true;
            request.Web.Options = new WebSearchOption[]
            {
                WebSearchOption.DisableHostCollapsing,
                WebSearchOption.DisableQueryAlterations
            };

            return request;

        }

        private void DisplayResponseWeb(SearchResponse response)
        {
            // Display the results header.
            listBox1.Items.Add("Bing API Version " + response.Version);
            listBox1.Items.Add("Web results for " + response.Query.SearchTerms);
            listBox1.Items.Add(string.Format("Displaying {0} to {1} of {2} results",
                response.Web.Offset + 1,
                response.Web.Offset + response.Web.Results.Length,
                response.Web.Total));

            // Display the Web results.
            System.Text.StringBuilder builder = new System.Text.StringBuilder();
            foreach (WebResult result in response.Web.Results)
            {
                builder.Length = 0;
                builder.AppendLine(result.Title);
                builder.AppendLine(result.Description);
                builder.AppendLine(result.Url);
                builder.Append("Last Crawled: ");
                builder.AppendLine(result.DateTime);

                listBox1.Items.Add(builder.ToString());
                Console.WriteLine();
            }
        }

从代码上来看,很简单,先创建一个LiveSearchPortTypeClient的对象,然后,创建SearchRequest对象,在Request里需要设置的是AppId,Query和Sources。AppId不用多说了,Query里填我们要查的关键字,Sources里指定SourceType,我们这里指定的是SourceType.Web。

image

将SearchRequest参数传递给LiveSearchPortTypeClient的Search方法,会返回一个SearchResponse的对象,里边包含我们的搜索结果。结果会包含在response.Web.Results对象里,最主要的参数是Title、Description和Url。

最后的运行结果就是这样的了:

BingApi2

Bing的好坏还需要时间检验,但是Bing API和Google API应该差不多,而且考虑了不同用户的需求,这也许就是软件公司和互联网公司不一样的地方。同时推出的还有Bing Map API,改天试一下。

 

更多关于Windows Embedded CE开发的文章,请参考“Windows Embedded CE 中国研发团队”的中文博客:http://blogs.msdn.com/wincechina/

posted @ 2009-06-08 14:20 马宁 阅读(4096) | 评论 (19)编辑

2009年5月24日

作者:马宁

Smartphone 2.0,这个概念有点哗众取宠,但是从2002年Smartphone的概念被推出后,智能手机的本身和外部环境改变了很多,在这个时间点上,我们有必要讨论Smartphone下一步会往何处去。我们姑且以Smartphone 2.0为名吧。

什么是智能手机?有人会说,更大的分辨率、更好的CPU,有人会说能上网,有人会说可以玩游戏、听音乐。

那么,每个人、每天都在用的Phone的功能是什么?电话、短信、联系人。Smartphone增加了浏览器(WAP或WEB)、媒体播放器、游戏、IM、Java VM、Ebook Reader等功能。最近SNS Client、 VoIP、App Store和Widget等功能也被加入到Smartphone中。但是这种功能的累加就是Smartphone的未来吗?

从本质上来剖析这些新功能的本质是什么?是服务(Service)。最简单的服务应该就是网站提供的信息浏览服务,这也是互联网最初的基石。信息浏览服务的方式有两种:Pull和 Push。Pull的方式,是用户主动浏览网站的信息,并且点击超链接来获取自己想读的信息,浏览网站和RSS订阅都应该属于Pull方式;Push方式,是将信息进行编辑、整合后,推送给用户,最典型的例子就是手机报。

在2G时代,Service来自电信运营商,是一个相对封闭的生态链,内容提供商(CP)和服务提供商(SP)必须通过运营商的网络向终端用户提供服务。运营商也通过自己的垄断地位和网络的封闭性,将竞争者隔绝在外。这种情况是短缺经济下的产物,在网络带宽稀缺情况下的必然产物。这种现象在互联网初期也能找到,我们用小猫拨号上网时,访问的163、169网站基本都是电信运营商提供的服务。

3G时代,当网络带宽不再稀缺时,运营商发愁的是如何为用户提供各种各样的服务,从而让带宽使用率提高。用户使用1M和10M流量,运营商的成本几乎没有增加,而赚到的却是10倍的钱。

好了,接下来的问题就是,服务来自于谁?移动运营商吗?必须承认,3G时代,很多服务仍然会来自于移动运营商。但是随着用户规模的扩大,运营商会发现,他们在某些小众领域是力不从心的,而小众领域恰巧是推动互联网发展的最大动力之一。互联网的历史告诉我们,一家公司不可能提供所有的服务,AOL不能,Yahoo不能,中国移动同样也不能。所以,当运营商感觉到他们的力不从心时,运营商构筑的樊篱会在一瞬间土崩瓦解。

那么,3G时代,绝大部分的服务会来自于互联网服务商,无论是PC还是Smartphone,人们想访问到熟悉的服务,而不是两套完全不同的信息服务。

随着Web 2.0时代的到来和无线网络带宽的增加,Service不再是单项的信息输送,用户的参与性会越来越强,而更多的用户信息会被加入到互联网中。SNS已经将我们的人际信息加入到互联网中。Smartphone的移动性,会将用户的地理位置信息加入到互联网中。Google Latitude服务已经展示了Location-aware SNS的魅力,下一步可能是和好友聚会整合。

除了3G的到来外,推动Service发展的还有一个重要的力量——“云计算”。云计算会极大降低服务提供者的成本。服务提供者的身份也会发生质的改变,从大的企业迅速转向到小企业甚至是个人,网络服务也即将进入全民草根时代。一些小众化的网络服务,会在云计算时代,撼动整个互联网的传统格局。以后看到由门口大妈提供的煎饼果子价格指数时,千万别觉得稀奇。

而智能手机会对云计算的发展起到一个助推的作用。如果将张亚勤提出的“云端”概念(Cloud + Client)推广到智能设备上,我们就可以得到下面的公式:

Smartphone 2.0 = Phone + Service

我们不必认为Phone就是智能手机,Netbook和MID等产品也会被包括在内。说白了,只要是能够随身携带、连接无线网络、运行在线服务的客户端的智能设备,我们都应该算在Phone中。

Service也不能简单理解为Cloud,毕竟在云计算之外,很多服务提供商已经为我们提供了很多有用的在线服务,这些服务提供商不会因为云计算时代的到来而衰退,而会走一条逐渐融合的道路。

Service应该包括两个方面:一端是运行在互联网上的服务(服务器端应用);另一端是运行在智能设备上的服务客户端。再好的服务也需要落地,互联网的最后一公里将重现在3G时代的智能手机上。尽管现在的智能手机厂商都在哀叹,寻找合适的服务和软件太难,可是在一年以后,将会出现服务提供商为了将服务预置到Smartphone 上而激烈竞争的盛况。得终端者得天下。一些早起的服务提供商已经开始与终端设备制造商谋求合作了,在国内一些MID产品中已经出现了一些网络购物网站的链接。点击链接会进入浏览器,访问购物网站,这只是预置在线服务的初级模式。

那么Service应该以什么方式预置到Smartphone上呢?对于简单的信息浏览和交互操作,浏览器无疑是最好的客户端,JavaScript跨平台的特性能够让在线网络供应商不必担心不同设备的兼容问题。除了浏览器外, Widget也会成为非常流行的一种客户端,网站开发者只需要用HTML和JavaScript编写简单的代码,就可以同时运行在Symbian和Windows Mobile手机上,这将一个多么大的诱惑?

如果在线服务需要提供更多的交互性又该怎么办呢?比如现在非常流行的开心网,使用了RIA技术来设计用户交互游戏。Flash Lite的确改变了互联网的用户体验,微软的Silverlight尽管还在开发中,但是连接Service的能力也不容小觑。RIA技术将成为移动互联网的主流之一。为不同设备编写RIA运行端的成本,显然要低于为不同的硬件平台开发应用的成本。

最后的一种方式就是编写客户端,对于复杂的应用和用户体验设计,单凭JavaScript和RIA就无法解决了。而且,基于浏览器的技术还有一个致命缺陷——无法适应移动网络的时断时续。比如IM和VoIP等复杂的应用,我们还是需要去编写客户端。但是如果去编写客户端的话,就势必面临为多个手机平台编写应用的困境。研发成本增加了,但是,收入未必能够相应增加。这也是制约在线服务进入移动领域的重要因素。

我们有什么解决办法吗?不妨换一个思路来看,当Service无法适应多个Phone时,我们能否让Phone去适应Service呢?看到这句话,可能很多人的脑海里都会出现一个词——定制手机。

定制手机的概念,最早来自于移动运营商,为了增加服务的黏性,运营商凭借垄断地位,要求手机厂商将提供的服务预置到手机中,比如移动的“心机”。再进一步时,运营商对Shell、用户体验都提出要求,为同一运营商定制的手机,无论运行什么样的操作系统,提供的外观、用户体验都是一致的,比如OMS。这就是定制手机。

移动运营商为什么要定制手机?要推广自己的服务。那么,定制手机符合我们对于Smartphone 2.0的定义,是Phone与Service的结合体。但是Service一定要来自运营商吗?上面,我们已经探讨过这个问题,答案是不一定。那么,定制手机一定要来自于移动运营商吗?

所有的服务提供商都可以按自己的要求去定制手机,这不是移动运营商的专利。Google虽然没有定制手机,但是

推自己定制手机前,恐怕要想清楚这么几个问题:

1, 你的服务是否有足够多的人在用?

2, 用你服务的人是否愿意为了使用你的服务而买一部新手机?

3, 你是否有足够多的钱来推广你的服务和手机?

其实这么算起来,能够推出自己定制手机的服务提供商并不多,符合这几个条件的,可能也只有腾讯、百度、新浪、魔兽世界、淘宝等几家了。

我们来想像下这几家定制手机的样子:

1,腾讯,现在已经成为一个庞然大物了,几乎覆盖了所有互联网的领域,IM、在线游戏、门户网站、商城、SNS。但是,在移动领域,QQ一直受制于移动的短信,处于受支配的地位,也一度因为利益分配而和移动吵翻。如果腾讯能够掌握手机终端,将自己的服务预置其中,那么很多年轻人在自己手机上做的,就不再是发短信,而是聊QQ了。QQ用户的忠诚度极高,且对QQ文化极度认可,如果手机定价合理,加上QQ的定制外观,一定会有人趋之若鹜。

2,百度,是一个雄心勃勃的公司,将服务推广到手机领域,是百度必须要做的事情。因为Google已经做了。但是,怎么推广到手机领域,将是百度面临的一个大问题。为运营商提供搜索服务,给移动运营商打工吗?如果那样,百度会重蹈腾讯与移动合作的覆辙,难免为人作嫁衣。将自己的搜索、贴吧、地图、购物等服务,有效整合起来。比如购物时,可以在贴吧里搜索产品评价,然后在地图里寻找附近的实体店,如果发现实体店价格偏高,还可以在购物中下订单。

不过百度不适合自己推定制手机,而应该将自己的服务预置到手机中。那么百度会和谁合作呢?Android手机恐怕不是百度的最佳选择(PR会强烈反对吧?)。本着先易后难的原则,魅族M8也许应该成为百度的第一个合作目标。这两家的业务互补性非常强,一家缺应用,一家缺终端,而且绝对不会到对方的领域中兴风作浪。百度手机、魅族的搜索引擎?不靠谱吧?

3,魔兽世界,在这里指代网络游戏。手机网游不是没人做,而是做不出来,最要命的问题还是出在终端的兼容性上。随着手机硬件性能的提高,游戏在手机上运行将不再是问题,但是如何在手机上跑出最好的效果,定制也许是一条路。

另外,网络游戏是否会有新的玩法,比如结合现实的地理位置,和附近同一个工会的兄弟一起去打怪,或者交换装备?西单的下一个支柱产业也许是游戏装备?

当然,还有一些针对特定人群的服务提供商,比如携程,如果能够直接在手机上订机票和酒店,并且将航班信息保存到手机的日程里,至少这种功能对我来说是有诱惑力的。

定制手机可以用双方的渠道来进行推广,但1+1能否大于2,就看Service和Phone合作上是否能够齐心协力了。合作上可能会有这样几个难点:

1,互联网知名度和手机销售渠道如何整合,Service 提供商必须拥有强大的现金流,对终端的推广进行补贴, 手机厂商要利用自己的渠道推广Service的服务;使用Service的渠道销售手机,比如网上直销,也应该获得分成;

2,在线服务的收益如何分成,iPhone不存在这个问题,因为Phone和Service是一家,但是合作的双方肯定会遇到这个问题;

3,Service和Phone是否真的合适?Service 的更新速度快,Phone的操作系统、开发环境、硬件性能,是否能跟得上Service的发展。

单纯从技术角度上来说,PPLive和开心网也具有定制手机的可能,但是考虑到他们的运营情况和现金流,短时间内恐怕很难。

最后再说说+的问题,对,这个加号也有学问。没有加号,Phone和Service永远都是两个东西。我们可以将+看作一个渠道,沟通服务和用户的渠道。这个渠道做什么用?给用户提供订阅的服务,然后将用户的钱拿走。

提供更多的服务是运营商要关心的事情,3G、WIFI,无非是一条提供服务的高速公路。如何收到钱,这才是Phone和Service要关心的事情。这就涉及到支付的问题了。移动运营商、信用卡、银联、支付宝,都是支付的渠道。支付会是移动互联网最后一公里上的制高点。提供了服务、控制了终端,钱收不上来,也是白搭。现在谁也说不好,谁会赢得最后的胜利,但是缺少了支付手段,Smartphone 2.0恐怕也是水中月、镜中花。

只是想将自己最近的所思所想记录下来,没想到写了这么长,希望对奋斗在3G康庄大道上的朋友们有价值吧。

更多关于Windows Embedded CE开发的文章,请参考“Windows Embedded CE 中国研发团队”的中文博客:http://blogs.msdn.com/wincechina/

posted @ 2009-05-24 15:14 马宁 阅读(1305) | 评论 (10)编辑

2009年5月10日

     摘要: 作者:马宁 在开发Windows CE的应用程序时,经常需要检测平台类型,了解我们的应用程序运行在Pocket PC、Smartphone还是Windows CE上。在这篇文章里,我们介绍如何编写一个应用程序来检测当前运行的平台类型。 在开发Windows CE的操作系统时,我们会遇到另外一种情况:某些应用程序限制了运行的操作系统平台,比如只允许运行在Pocket PC上。而我们如果想在Windo...  阅读全文

posted @ 2009-05-10 11:17 马宁 阅读(1460) | 评论 (2)编辑

2009年5月9日

     摘要: 在MSDN Blog上申请自己的Blog有一阵子了,但是一直没空打理。前几天,张欣在MSN上问我是不是失踪了,才发现太久没有更新Blog了。下面是我在MSDN上Blog的地址。 http://blogs.msdn.com/ninma/ 因为MSDN Blog属于微软的官方博客,所以内容可能会关注于我目前的工作:Windows Embedded CE。想和大家分享Windows Embedded C...  阅读全文

posted @ 2009-05-09 18:24 马宁 阅读(401) | 评论 (0)编辑

     摘要: 作者:马宁 原文:http://blog.mcuol.com/User/aawolf/Article/6389_1.htm .NET Compact Framework已经升级到3.5的版本了,.NET CF 3.5支持LINQ和WCF等新的特性。对于Windows Mobile的开发人员来说,只需要安装一个更新的CAB包就可以了。可是Windows CE的开发者如果想将.NET CF 3.5加...  阅读全文

posted @ 2009-05-09 18:07 马宁 阅读(1524) | 评论 (2)编辑

     摘要: 作者:马宁 原文:http://tech.it168.com/a2008/1223/260/000000260962.shtml 现在大多数主板都支持USB启动,而U盘便于携带的特点,能够让你打造一个属于你自己的PC环境,使用自己熟悉的界面。现在U盘启动的系统已经非常时髦了,比如Ubuntu Linux。而大家有没有想过将Windows XP放到U盘里? Windows XP Home或Pro放...  阅读全文

posted @ 2009-05-09 17:37 马宁 阅读(588) | 评论 (0)编辑

2009年3月12日

     摘要: 作者:马宁魅族在经历了两年多的开发后,M8终于上市了。能够被称为iPhone Killer,说明了M8有自身的优势。之前也有朋友问过我,会买一款M8试试吗?我说,不会,除非M8出SDK。今天是个可能破财的日子,因为M8真的出SDK了……安装魅族M8用的是Windows CE的操作系统,所以配置开发环境并不是很难,以前有过Windows Mobile开发经验的人,配置起来不会...  阅读全文

posted @ 2009-03-12 16:27 马宁 阅读(5303) | 评论 (34)编辑

Windows Embedded征文比赛