变电站巡检系统WinCE开发技术说明
概述
本技术文档主要是说明了在变电站巡管理检系统项目中用到的WinCE技术,包括WinCE的平台简介,开发的环境,数据库存储,数据同步,扫描头控制技术,WinCE与PC端的SOCKET通信,.NET下智能设备程序的窗体控制等技术。
WinCE 平台简介
Windows CE是微软为嵌入式设备打造的操作系统,而嵌入式设备可谓多种多样,这就要求CE操作系统必须是可定制的,所以微软将Windows CE设计为模块化的操作系统。说简单点,我们可以把Windows CE想像成一盒积木,你可以用积木搭建出任何物体,但不一定要把所有的积木都用上。
Windows CE搭建出来的物体就是平台,是适应某种有固定标准的嵌入式设备的操作系统子集,最著名的平台就是Pocket PC了,是提供给没有键盘的掌上电脑使用的平台。由于平台和硬件的一致性,所以有时候也用平台的名称来称呼整个系统——硬件与操作系统的总和。
我们也可以自己开发平台,开发工具是微软提供的Platform Builder,Platform Builder的版本号是和Windows CE的版本号一致的。
更多程序员关心的是应用程序的开发,而应用程序开发是针对特定平台的,我们在开发之前必须安装目标平台的SDK,才能够开发出适应目标平台的开发工具。
Windows CE开发环境综述
初学者另外一个比较糊涂的概念是版本的问题,现在市面上能够见到Windows CE的两代产品,它们的内核分别基于Windows CE 3.0和Windows CE.NET(即4.0)。
微软刚面世的Pocket PC 2003和Smart Phone 2003统称为Windows Mobile 2003,我们大多数时候还是习惯地沿用老称谓。
而市面上经常见到的Pocket PC 2002是基于Windows CE 3.0的平台,而Pocket PC 2003则是基于Windows CE.NET的平台,需要注意的是,Pocket PC 2003的内核是Windows CE.NET 4.2。而SmartPhone2003也是基于Windows CE.NET的。SmartPhone的最初版本是2002,基于Windows CE 3.0的,但是微软没有推出SmartPhone2002的中文版。
清晰了平台与CE之间的关系,解释平台与开发工具之间的关系就很容易了。微软提供给应用程序开发者的工具包括:Embedded Visual Tools 3.0,其中包括Embedded Visual C++ 3.0和Embedded Visual Basic 3.0;Embedded Visual C++ 4.0和Visual Studio.NET。
开发工具的版本号是与Windows CE的版本号对应的。EVC3.0和EVB3.0是用来开发基于Windows CE 3.0平台的应用程序的,比较常见的平台有:Pocket PC 2002、Pocket PC 2000、Palm-size PC、HPC。而EVC4.0是用来开发Windows CE.NET平台的程序的,主要包括Pocket PC 2003和SmartPhone 2003。
Visual Studio.NET针对嵌入式设备开发需要SDE的支持,而VS.NET 2003中包括了SDE,不需要另外安装。Visual Studio.NET开发的程序需要目标平台支持.NET Compact Framework。现在支持.NET Compact Framework的平台有Pocket PC 2002和Pocket PC 2003。这里需要注意的是SmartPhone 2003是不支持.NET Compact Framework的。
我们这个变电站巡检系统选择的开发工具是:Visual Studio.NET
手持机(PDA)是:
图片 | 型号 | 操作平台 | 相关参数 | 网上地址 |
| Symbol Mc50 | Win CE.NET 4.2( Microsoft® Windows® Mobile 2003 第二版) | CPU:Intel® Xscale™ 520MHz 内存:64MB RAM/ 64MB ROM 扫描器:推入式锁定磁条阅读器 | http://ewaytech.com.cn/cpyjs2.asp?setid=93 |
开发环境的安装
1. SERVER(服务器)端
1.1 S.NET 2003的安装(在SERVER端的开发文档里有描述)
1.2 SQL SERVER 2000数据库的安装(在SERVER端的开发文档里有描述)
1.3 SQL SERVER CE版的安装(服务器端)
可以去微软的官方网站下载sql server ce安装EXE,还要下载SQL SERVER CE 的SP3;
下载下来后就可以安装了,双击SQL SERVER CE的安装文件就会跳出下面界面
1.4 PDA开发包的安装
去PDA厂商的公开网站下载合适自己的API开发包,我们这个项目用的是SYMBOL的PDA所以我们去SYMBOL的官方网站下载了对应的开发包,直接点安装就可以了,按提示一路NEXT下去就可以了。
注意的是,如果钩选下面的SERVER TOOLS选项,必须先安装 SQL SERVER CE的SP3,才能安装成功!不钩选SERVER TOOLS选项安装完后再安装哪个SP3是一样的。
在安装完SP3后它回自动提示你配置IIS代理,你按它的提示配置就OK了。
2. PDA端
1.4 SQL SERVER CE
直接考sql server ce安装EXE文件到PDA运行就可以了,PDA端不需要安装哪个SP3;
也可以不做任何安装,因为在部署智能设备应用程序到PDA的时候,自动会把SQL SERVER CE数据库也部署到PDA上。
WinCE .net开发的主要技术说明
1. WinCE存储技术
1.1 数据库存储
如何在 PDA上存储数据。从应用程序的角度来看,数据可以保存在关系数据库(例如 Microsoft SQL Server™ CE)、本地文件(例如通常通过 DataSets 管理的 XML 文件)以及在应用程序终止时配置的基于会话的内存内数据结构中等,如果要存储在 PDA上的数据量少(少于 50 至 100 kb),则数据可以存储在本地的 XML 文件中。如果数据量较大,则 SQL Server CE 将提供较高的性能及可靠性。原因是,将使用 SQL Server CE 查询引擎访问数据,该查询引擎支持具有更高性能和可管理性的结构查询语言 (SQL),所以我们在变电站巡检管理系统项目里面用SQL SERVER CE版数据库来存储数据,在PDA端安装好SQL SERVER CE数据库后,就可以对PDA端的的数据库进行QUERY,CREAT,DROP,INSERT,UPDATE,DELETE等操作,下面举一下具体操作的简单例子(对本地数据库(PDA端的数据库操作))。
执行QUERY的操作和执行其它SQL语句有点不同,自己可对比下
1.11 执行QUERY查询语句
using System;
using System.Data;
using System.Data.SqlServerCe;
private stirng ConnectiongString =”Data Source=/My Documents/PDA_SQLCE.sdf”;//库文件的位置
public DataSet Query(string sql,string ConnectionString)
{
System.Data.SqlServerCe.SqlCeConnection conn=null;//声明一个连接
System.Data.SqlServerCe.SqlCeDataAdapter da=new SqlCeDataAdapter();//新建一个数据适配器
System.Data.DataSet ds=new System.Data.DataSet();//新建一个数据集并给它分配内存地址
try
{
conn=new SqlCeConnection(ConnectionString);//实例化一个连接
conn.Open();//打开连接
da.SelectCommand = new SqlCeCommand(sql, conn);//传入查询语句和连接参数实并实例化
da.Fill(ds);//执行SQL语句并把结果集FILL到DS
return ds;
}
catch(System.Data.SqlServerCe.SqlCeException ec)//捕获异常
{
this.ShowErrors("执行查询失败:"+sql,ec);
throw ec;
}
finally
{
da.Dispose();//关闭数据适配器
conn.Dispose(); //关闭连接
}
}
1.12 执行其它SQL语句
public void Execute(string sql,string ConnectionString)
{
System.Data.SqlServerCe.SqlCeConnection conn=null; //声明一个连接
System.Data.SqlServerCe.SqlCeDataAdapter da = new SqlCeDataAdapter();//声明一个数据适配器并给它分配内存空间
try
{
conn=new SqlCeConnection(ConnectionString); //实例化一个连接
conn.Open();//打开连接
da.SelectCommand = new SqlCeCommand(sql, conn); //传入查询语句和连接参数实并实例化
da.SelectCommand.ExecuteNonQuery();//执行SQL语句返回影响的行数
}
catch(SqlCeException ecc) //捕获异常
{
this.ShowErrors("执行SQL失败:"+sql,ecc);
throw ecc;
}
finally
{
conn.Dispose();
da.Dispose();
}
}
1.2 数据库同步技术(上传下载)
SQL SERVER CE版数据库是专门为PDA设计的一种数据库,它能很好的和SQL SERVER 2000进行数据同步(通过IIS作为一个中间代理来进行远程数据同步),PDA端的SQL SERVER CE和PC上的SQL SERVER 2000的数据同步有两种同步方式,复制和远程数据库同步(RDA),因为我们整个项目只用到RDA的数据同步方式,所以下面只例举了SQL SERVER和SQL SERVER CE间的RDA数据同步方式。
1. 21 数据下载(把表结构和数据全部同步到PDA端)
public void MyPull()
{
private string Tb_N=”t_test”;//要同步的表名(服务器上的表)
private string InternetUrl=”http://10.194.14.68/lico_pda/sscesa20.dll”;//IIS代理的地址
private string LocalConnectionString= “Data Source=/My Documents/PDA_SQLCE.sdf”;//把表和数据同步下去后存放的数据库文件
private string rdaOleDbConnectString=” Provider=sqloledb; Data Source=10.194.14.68;Initial Catalog=BDZXJ_SXB;User Id=sa;Password = 010203 ” ;//连接到服务器的字符串
SqlCeRemoteDataAccess rda = null;//声明一个远程数据访问变量
try
{
rda = new SqlCeRemoteDataAccess();//实例化并分配内存空间
rda.InternetUrl = InternetUrl;//给RDA的属性付值
rda.LocalConnectionString = LocalConnectionString; //给RDA的属性付值
rda.Pull( //调用RDA的PULL方法
Tb_N,
sql,
rdaOleDbConnectString,
RdaTrackOption.TrackingOn
);
}
catch(SqlCeException es) //捕获异常
{
ShowErrors("同步"+Tb_N+"失败!",es);
rda.Dispose();
throw es;
}
finally
{
rda.Dispose();
}
}
PULL方法的最后一个参数是表明是否跟踪下载表的数据的变化(只有跟踪的表才能同步回服务器),可以在帮助里面查看更详细的说明。
1. 22 数据上传(把PDA端的数据变化同步到服务器(要刚才下载的表的数据才能同步到服务器))
public void MyPush()
{
private string Tb_N=”t_test”;//要同步的表名(服务器上的表)
private string InternetUrl=”http://10.194.14.68/lico_pda/sscesa20.dll”;//IIS代理的地址
private string LocalConnectionString= “Data Source=/My Documents/PDA_SQLCE.sdf”;//把表和数据同步下去后存放的数据库文件
private string rdaOleDbConnectString=” Provider=sqloledb; Data Source=10.194.14.68;Initial Catalog=BDZXJ_SXB;User Id=sa;Password = 010203 ” ;//连接到服务器的字符串
SqlCeRemoteDataAccess rda = null;//声明一个远程数据访问变量
try
{
rda = new SqlCeRemoteDataAccess();
rda.InternetUrl = InternetUrl;
rda.LocalConnectionString = LocalConnectionString;
rda.Push(Tb_N,
rdaOleDbConnectString,
RdaBatchOption.BatchingOn
);
}
catch(SqlCeException es)
{
ShowErrors(es);
throw es;
}
finally
{
rda.Dispose();
}
}
上传和下载差不多,只是下栽调用pull方法而上传调用了push方法, push方法最后一个参数是表明是否开启事务控制。
2. Symbol扫描头控制技术
要开发PDA端的扫描头,必须有有厂商提供的API包才行,下载和安装API包在前面已经介绍,下面说下它的具体用法:
private Symbol.Barcode.BarcodeReader barcodeReader;//声明一个条码阅读器
this.barcodeReader = new Symbol.Barcode.BarcodeReader();//实例化
this.barcodeReader.Decoders.D2OF5 = Symbol.Barcode.DisabledEnabled.Enabled;//声明条码的标准
this.barcodeReader.Reader.ReadNotify+=new EventHandler(Reader_ReadNotify);//绑定扫描条码事件(其实就是给一个特殊的委托变量指定一个方法入口地址)
this.barcodeReader.Start();//打开扫描头
private void Reader_ReadNotify(object sender, EventArgs e)
{
//扫描后要处理的事情
}
要注意的是要打开扫描头(barcodeReader.Start())后才能触发扫描头事件,我们测试了下扫面头触发事件的规律可总结为:
1. 打开扫描头---扫描到条码----触发扫描头事件
2. 关闭扫描头---打开扫描头-----触发扫描头事件
第1情况是我们想要的,第2种情况是我们要避免的,
我们的处理方法是:只有到条码扫描界面才打开扫描头,且设个标记位使关闭扫描头到打开扫描头这个过程不能触发扫描头事件。
3. WinCE 与 NT平台sockect通讯技术
1. 组件架构
Socket底层组件(Class_PDASocket.dll) Socket_Listener
|
PC 端server |
Socket底层组件(Class_PDASocket.dll) Socket_Client
|
PDA 端 巡检程序 |
USB连接 |
Class_PDASocket 是自己写的一个底层socket组件,提供可运行在普通.net Framwork(普通NT平台) 和精简 .net Framk work框架(WinCE平台)上的socket通讯方法。
包含两个类:
Socket_Listener: 是socket的监听服务器类,提供socket的监听服务
Socket_Client : 作为socket的发送client类,提供socket的发送功能
2. 功能说明
PC 与PDA的socket的基本通讯实现:
PC通过调用Socket_Listener,启动socket监听的服务器,随时监听socket的消息。
PDA通过调用Socket_Client,向PC(socket监听服务器)发送socket消息
PDA向PC发送消息方法: 指定PC的IP,端口,调用Socket_Client发送方法
PC向PDA发送消息方法: 目前只能借用PDA向PC发送通道来向PDA发送消息
之所以PC向PDA发送消息,只能借用PDA向PC发送消息的通道,是因为目前一直无法知道PDA的IP,所以即使PDA也启动一个Socket监听服务,PC也不知道发到那个IP(如果能解决这个问题,PDA与PC的通讯就简单多了)。
3. 程序实现
PC端:
在进入“任务管理“界面,socket的监听服务将被启动,如果收到PDA的socket消息,将会触发OnReceive事件,此事件在”任务管理“界面被绑定到” listener_OnReceive “方法上,也就是说收到socket消息,将会调用listener_OnReceive方法。
listener_OnReceive方法,先把此消息的通讯通道(Stream)存放于全局变量,以便后面给PDA发送消息,然后解析Client发过来的消息,如果是“PDA_Ready”,则回复“Server_Ready”(这样的对话机制是为了保持pda与pc的通讯畅通),如果是其他的消息将不予理会。
当用户在server上点击“任务下载”按钮,server先生成好需要下载的数据表,然后通过全局变量(Stream)向PDA发送“download“命令。
当用户在server上点击“任务上传“,server向PDA发送”Upload“命令,待PDA执行完毕后,server将会处理PDA上传回来的数据。
注意在窗口RW_Form关闭时,记得调用Listener的StopListener方法关闭socket,否则如果异常断开PDA连接,PC上还会有一个线程会阻塞在系统进程中。
PDA端:
PDA端在Form_Load事件中将会启动一个socket通讯线程,专门负责与PDA的通讯。在此线程中,创建一个Socket_Client,通过socket_Client向PC发送socket消息”PDA_Ready”,若收到服务器回应“Server_Ready”,则证明通讯正常(标记ConnectOK=true),收到“Server_Ready“PDA将会回复”waitingCommand“,告诉Server,PDA处于就绪状态,Server可以发命令过来了。
注意此线程是个死循环,当系统进程还处于运行状态(ProcessEnd=false),将会一直执行一下操作:
如果连接正常(ConnectOK=true),PDA将会向server发送“WaitingCommand“消息,表明PDA处于等待命令状态,然后线程sleep 2秒钟;
如果连接中断(ConnectOK=false),PDA将会每隔两秒中向server发送“PDA_Ready“消息,如果发送出错,将会屏蔽异常(如果 不屏蔽,PDA程序将会退出),把标志位connectOk保持false;如果收到”Server_Ready“,将会把connectOk置为true;
当PDA收到server的消息(命令),PDA将会解析,如果是“download“,将会执行Download处理,如果是Upload将会执行Upload处理,如果收到”server_Ready“则把标记位”connectOK“=true
Windows程序其他的一些开发技术
1. 窗体的控制
我们这个项目其实就是在一个FORM上设计多个PANEL,每个PANEL就是PDA上显示的一个用户界面,需要做的只是在适当的时候把想要的看到的PANEL移为当前位置即可。
2. DataGrid 的使用
智能设备程序的DataGrid和一般Windows应用程序的DataGrid大同小异,就少点属性和触发事件,最主要的是少双击事件,不过看了那么多PDA端的应用程序都没见有过双击操作,可能是PDA根本就不提倡双击操作。
现在我们想在DataGrid上实现如下效果:就是符合某种条件的行变成指定的颜色,我们调用了底层的画图函数,对符合条件的行全部重新画过,开始是可以但触动DataGrid的滚动条后就不行了(变回原来的颜色)。现在这个问题还没解决:)
总结
整个项目的技术要点是SOCKET通信和数据同步!