WinCE 基于Wlan的TCP/IP通信
来源:互联网 发布:生产数据追溯 编辑:程序博客网 时间:2024/05/21 17:53
最近一个项目需要使用手持机(PDA)读RFID标签 ,扫描二维条形码并将结果发送到PC上进行后续处理。
为此需要在PDA与PC间频繁的传输数据,于是使用TCP/IP 通信赖实现。
由于在应用时:PC端的主要工作是连接PDA端,并向PDA端发送如打开(Open)条形码扫描模块 ,扫描(Scan)条形码等指令,并接受PDA的操作结果;而PDA端则是根据PC端发送过来的指令然后执行相应的操作,并将结果发回给PC端,如打开(Open)成功则返回 “打开成功!”,扫描条形码成功则将扫描结果发送给PC。因此PDA需要作为服务端(Server ),而PC端需要作为客户端(Client)。
而在选择连接方式时发现:在基于ActiveSync 的Socket通信时PDA端只能作为客户端(Client具体实现参考:点击打开链接),不符合要求,所以选择通过Wlan连接PC与PDA。
首先是PC端(Client):
PC端的工作很简单,只需要发送指令,并接收指令处理结果就可以了。
1.定义接口:IMsgReceiverSender
public interface IMsgReceiverSender { bool Connect(string ip, int port);// 连接手持机 bool SendMsg(Request msg);// 发送消息 void DisConnect();// 断开连接 void StartListening();// 开始监听线程 void StopListening();// 停止监听线程 }
1.1.Connect 连接手持机:在连接成功后立即开启监听线程,准备接收PDA发送过来的数据。
this.tcpClient = new TcpClient(); this.tcpClient.Connect(IPAddress.Parse(ip), port); // 连接手持机 this.networkStream = tcpClient.GetStream();// 获取连接至远程的流 this.OnClientConnected(EventArgs.Empty);// 触发连接成功事件 this.StartListening();// 开始监听从手持机发送过来的消息
1.2.SendMsg 发送指令:连接成功后就可以向PDA发送指令了。
lock (this.networkStream) { if (this.networkStream.CanWrite) ProtocolHandler.Write(this.networkStream, request);// 向手持机发送指令 }
1.3.DisConnect 断开连接:当不需要在PC与PDA之间传输数据时断开连接
if (this.networkStream != null) this.networkStream.Close(); if (this.tcpClient != null) this.tcpClient.Close();
1.4.StartListening 启动监听线程 :在连接建立TCP连接成功后开始监听PDA发送数据的端口。
this.workerThread = new Thread(new ThreadStart(ListenThreadMethod)); this.workerThread.IsBackground = true; this.workerThread.Start();
1.4.1.ListenThreadMethod 监听PDA发送过来的数据线程入口方法
while (true) { try {// 读取手持机发送过来的消息 Reponse reponse = ProtocolHandler.Read(this.networkStream); if (reponse != null)// 触发接收到信息事件 this.OnMessageReceived(new MsgReceiveEvnentArgs(reponse)); } catch (Exception) { this.OnConnectionLost(EventArgs.Empty);// 触发连接断开事件 break;// 退出循环 } }1.5.StopListening 停止监听线程:在端口连接时调用
if (this.tcpListener != null) { this.tcpListener.Stop();// 停止监听 this.tcpListener = null; } if (this.workerThread != null) { this.workerThread.Abort(); Thread.Sleep(100); // 等待线程结束 }
客户端(Client)基本上就完成了,当然在实际应用时还需要添加如:连接超时,订立协议等内容,这将在之后提及。
PDA端(Server )
PDA端作为服务端与PC端基本一致,只是在 StartListening(开启监听线程)时需要在指定的本地 IP 地址和端口号上侦听是否有传入的连接尝试。
PDA端作为服务端与PC端基本一致,只是在 StartListening(开启监听线程)时需要在指定的本地 IP 地址和端口号上侦听是否有传入的连接尝试。
1.定义接口 :IMsgReceiverSender
public interface IMsgReceiverSender { bool DisConnect();// 注销连接 bool SendMsg(Reponse reponse);// 发送响应数据 void StartListening();// 开始监听线程 void StopListening();// 停止监听线程 }
1.1. Disconnect 注销连接:在不需要使用TCP连接的时候调用
if (this.networkStream != null) this.networkStream.Close(); if (this.client != null) this.client.Close();
1.2. SendMsg 发送响应数据:将处理完PC端发送过来的指令后的结果返回给PC
lock (this.networkStream) { if(this.networkStream.CanWrite) // 向PC端发送响应信息 ProtocolHandler.Write(networkStream, reponse); }
1.3.StopListening 停止监听:在注销连接时调用
if (this.listenser != null) { this.listenser.Stop();//停止监听 this.listenser = null; } if (this.workThread != null) { this.workThread.Abort(); Thread.Sleep(100); // 等待背景线程结束 }
1.4.StartListening 开始监听:在程序启动时就调用
this.workThread = new Thread(new ThreadStart(this.ListenThreadMethod)); this.workThread.IsBackground = true; this.workThread.Start();
1.4.1.ListenThreadMethod 监听线程
IPHostEntry ipHostEntry = Dns.GetHostEntry(Dns.GetHostName()); IPAddress[] ips = ipHostEntry.AddressList; IPAddress localIP = null; localIP = ips[0];// 本机IP地址 this.listenser = new TcpListener(localIP, localPort); this.listenser.Start(); while (true) { try { client = this.listenser.AcceptTcpClient(); } catch { break; } // 触发连接成功事件 this.OnClientConnected(EventArgs.Empty); this.networkStream = this.client.GetStream(); while (true) { try { Request cmd = Protocol.ProtocolHandler.Read(this.networkStream); if (cmd != null) { // 触发接收到消息事件 this.OnMessageReceived(new MsgEventArgs(cmd)); } } catch (Exception) { // 触发断开连接事件 this.OnClientLost(EventArgs.Empty); break; } } }
以上基本能满足传输数据的要求了,但是仅仅这样是不够的,在项目中PC端发送的指令,PDA端发送的响应信息都很不规范,所以需要我们自己把这些数据做进一步的处理再进行传输。通常都是使用XML进行传输,所以在我订立的协议里面也是使用XML序列化和反序列化所传输的对象,让程序处理更简便。
- WinCE 基于Wlan的TCP/IP通信
- WinCE 基于Wlan的TCP/IP通信
- 基于TCP/IP的局域网多用户通信
- 基于TCP/IP的局域网多用户通信
- 基于TCP/IP的局域网多用户通信
- 基于TCP/IP的局域网多用户通信
- 基于TCP/IP的局域网多用户通信
- 基于TCP/IP的局域网多用户通信
- 基于TCP/IP的局域网多用户通信
- Java基于TCP/IP的Socket通信
- Java TCP/IP Socket,基于NIO的TCP通信
- 基于TCP/IP的SOCKET接口实现网络通信
- 基于linux简单的TCP/IP网络通信代码
- Java 基于TCP/IP 实现简单的 socket 通信
- 基于TCP/IP协议下的Socket通信
- 基于TCP/IP协议的两实体通信 编码呢
- Java 基于TCP/IP 实现简单的 socket 通信
- Java基于TCP/IP协议的Socket网络通信详解
- android4.0虚拟按键
- DOM、JDOM、DOM4J以SAX的比较
- Android 异步操作AsyncTask
- 云计算的概念,发展现状,实现机制,Google云计算原理
- 打表研究
- WinCE 基于Wlan的TCP/IP通信
- IOS获取视频缩略图
- C#打开文件夹
- 图像编辑之对比度调整(亮度对比度的算法公式)
- uboot 学习
- 尼姆博弈————(杭电2176题)可以做!
- 高新技术知识点总结01
- MySQL分区琐碎
- Ext.net 往后台传递参数