项目需要与上位机进行通讯,将二维码传给上位机,开始进行无线通讯设计
一、先到官网将案例程序下下来,该程序包含经由Bluetooth,无线LAN,以及通信单元来实现通信的通信样本程序。
二、阅读无线LAN的相关程序及文档,PDA是通过SDK来打开关闭无线LAN设备,同时设定无线连网属性,无线间的通讯是使用WinSock通讯。
而我们在设置无线通讯进行环境部署时,已经启用了无线。故可直接使用Socket进行网络通讯收发数据。 基恩士BT-W155G扫码枪PDA开发--搭建开发环境(二)
Socket类和TcpClient类都是System.Net.Sockets命名空间中的类,用于在网络上进行通信。它们之间的区别如下:
-
Socket类是一个通用的套接字类,可以用于创建各种类型的套接字,包括TCP套接字、UDP套接字和原始套接字等。它提供了底层的网络通信功能,可以直接操作网络连接、发送和接收数据等。Socket类提供了更底层的控制,但使用起来相对复杂。
-
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断线重连/不断重连的简单思路+代码,海量注释http://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的网络互联