WinCE 基于Wlan的TCP/IP通信

17 篇文章 0 订阅

最近一个项目需要使用手持机(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 地址和端口号上侦听是否有传入的连接尝试。
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序列化和反序列化所传输的对象,让程序处理更简便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值