基恩士BT-W155G扫码枪PDA开发--无线通讯

项目需要与上位机进行通讯,将二维码传给上位机,开始进行无线通讯设计

一、先到官网将案例程序下下来,该程序包含经由Bluetooth,无线LAN,以及通信单元来实现通信的通信样本程序。

二、阅读无线LAN的相关程序及文档,PDA是通过SDK来打开关闭无线LAN设备,同时设定无线连网属性,无线间的通讯是使用WinSock通讯。

而我们在设置无线通讯进行环境部署时,已经启用了无线。故可直接使用Socket进行网络通讯收发数据。 基恩士BT-W155G扫码枪PDA开发--搭建开发环境(二)

Socket类和TcpClient类都是System.Net.Sockets命名空间中的类,用于在网络上进行通信。它们之间的区别如下:

  1. Socket类是一个通用的套接字类,可以用于创建各种类型的套接字,包括TCP套接字、UDP套接字和原始套接字等。它提供了底层的网络通信功能,可以直接操作网络连接、发送和接收数据等。Socket类提供了更底层的控制,但使用起来相对复杂。

  2. TcpClient类是基于Socket类的一个高级封装,专门用于创建和操作TCP套接字。它提供了更简单和易用的接口,隐藏了底层的复杂性。TcpClient类封装了Socket类的大部分功能,并提供了一些额外的方法和属性,使得使用TCP套接字更加方便。

基恩士案例程序是使用 TcpClient类 进行通讯。本次开发使用Socket类。

 三、开发环境准备

        1、引用btCommLibNet.dll; 

     

    2、添加命名空间

 

        System.Net命名空间为当前网络上使用的多种协议提供了简单的编程接口,而它所包含的WebRequest类和WebResponse类形成了所谓的可插接式协议的基础,可插接式协议是网络服务的一种实现,它使用户能够开发出使用Internet资源的应用程序,而不必考虑各种不同协议的具体细节。
       System.Net.Sockets命名空间主要提供制作Sockets网络应用程序的相关类,其中Socket类、TcpClient类、TcpListener类和UdpClient类较为常用。

四、网络连接

       设计网络时,在没有连接上时要去不断发起连接直至连接成功, 还有断连后又会不断发起请求连接,直至再次连接成功。博客上找到了很好的文章,我都是照着他的文章写的,很详细,逻辑思路也很清晰,适合我这种小白

C# Socket/TCPClient断线重连/不断重连的简单思路+代码,海量注释icon-default.png?t=N7T8http://t.csdnimg.cn/0hKgI      不过VS2008有些代码没有,移植的时候需要调整,比如线程启动不允许传参。具体代码如下:

      4.1  创建对象

   

        public static bool IsConnet = false;          //判断是否成功连接,设置为全局变量,方便随时控制
        Socket client = null;                         //创建一个新的Socket对象
        IPEndPoint remoteEP = null;                   //创建一个远程设备的EndPoint,用来存放IP及端口号

    4.2  连接代码:连接成功前不断发起请求连接

        //无线连接
        public void Connet()//接收参数是目标ip地址和目标端口号。客户端无须关心本地端口号
        {
            //创建一个新的Socket对象
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

             //创建一个远程设备的EndPoint
            IPAddress ipAddress = IPAddress.Parse("192.168.0.155");   //这里写成固定地址,后续根据需要在改
            int port = 8080;
            remoteEP = new IPEndPoint(ipAddress, port);      //IP及端口号远程设备的EndPoint


            //将方法写进线程中
            Thread thread=new Thread(() =>
            {
                while(!IsConnet)//循环
                {
                    try
                    {
                        client.Connect(remoteEP);   //尝试连接,失败则会跳去catch
                        IsConnet = true;            //成功连接后修改bool值为true,这样下一步循环就不再执行。
                        Intent.dict["ClientState"] = "1";
                        ResMsgOut = "PDA已连上网络" + "\r\n";
                        kaishi();
                        break;                      //在此处加上break,成功就跳出循环,避免死循环
                    }
                    catch
                    {
                        client.Close();//先关闭
                       
                        /*使用新的客户端资源覆盖,上一个已经废弃。如果继续使用以前的资源进行连接,
                        即使参数正确, 服务器全部打开也会无法连接*/
                        client=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
                        Thread.Sleep(1000);//等待1s再去重连
                    }
                }

                /*在连接上后break出来,执行。
                因为需要带参数,所以要用到特别的ParameterizedThreadStart,
                然后开始线程。↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/

                Thread thread2 = new Thread(ClientReceiveData);//接收线程方法
                thread2.IsBackground = true;//该值指示某个线程是否为后台线程。
                thread2.Start();      //参数是用我们自建的Socket对象,就是上面的Socket client=new……
                
            });
            thread.IsBackground = true;//设置为后台线程,在程序退出时自己会自动释放
            thread.Start();//开始执行线程
        }

     4.3 编完后就可以在连接后就会进入不断接收的子线程,接下来写接收程序的代码,在异常断开和正常退出时都去重新进行连接

        public void ClientReceiveData()//Soceket消息的方法
        {
            
            byte[] data = new byte[1024 * 1024];//接收消息的缓冲区
            while (IsConnet)//同样循环中止的条件
            {
                int len = 0;//记录消息长度,以及判断是否连接
                try
                {
                    //连接函数Receive会将数据放入data,从0开始放,之后返回数据长度。
                    len = client.Receive(data, 0, data.Length, SocketFlags.None);
                }
                catch (Exception)
                {
                    //异常退出
                   // client.ShutDown(SocketShutdown.Both);//中止传输
                    IsConnet = false;//注意,此处是全局变量,将其设置为false,防止循环
                    client.Close();//关闭
                    Connet();//重新尝试去连接
                   
                    return;//让方法结束,终结当前接收服务端数据的异步线程
                }
                if (len <= 0)
                {
                    //如果小于0,证明无连接,服务端正常退出
                    //client.ShutDown(SocketShutdown.Both);//中止传输
                    client.Close();//关闭
                    Connet();//重新尝试去连接
                    IsConnet=false;//注意,此处是全局变量,将其设置为false,防止循环
                    return;//让方法结束,终结当前接收服务端数据的异步线程
                }
                //这里做你想要对消息做的处理
                //string str = Encoding.Default.GetString(data, 0, len);//二进制数组转换成字符串……

            }
        }

       4.4 调用程序,在Load程序里面调用连接程序

5,如此就实现了PAD与PC的网络互联

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一(义)元之始

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值