概述
一、简介
现在有一个需求,不能联网的机器端想要与pc端的qt程序通信,所以在中间添加了一块转接板。
工作模式:机器端串口通信转接板,转接板wifi通信pc端(内网模式下)
那么在你出厂的时候,转接板肯定是不知道你工作环境的wifi账号和密码的,此时你可以:
1、机器端设置wifi的账号和密码以及pc的ip,不做介绍
2、转接板和pc端通过网线直连,pc端设置静态ip(与转接板出厂默认的处于同一网关),此时可以通过socket通信
pc端设置静态ip和恢复动态ip的链接点击此处
二、确定通信建立
2.1、转接板端:开机默认状态:
2.2、pc端:设置的静态ip,有线连接选择 以太网
2.3、查看是否设置成功
2.4、测试,pc端ping转接端ip pc端使用ping 192.168.1.136
2.5、此时在无网络情况下,通过网线直接pc端和转接板端已经可以ping通,接下来就是简单的客户端和服务端通信即可
三、代码实现
3.1、转接板端:用的是部分代码,主要是思路
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31/* 新建了一个线程专门等待有线接口 */ factoryConfig::factoryConfig(QObject *parent):QThread(parent) { /* fix host ip */ hostAddress = "192.168.1.135"; tcpSocket = NULL; } void factoryConfig::run() { QFile f("/sys/class/net/eth0/carrier"); while(1){ if(f.open(QIODevice::ReadOnly|QIODevice::Text)){ QByteArray ba = f.read(1); /* wired connect success!!! */ if(!ba.isEmpty() && ba.toInt()){ if(tcpSocket == NULL){ tcpSocket = new QTcpSocket; } tcpSocket->connectToHost(hostAddress,8888); sleep(3); } f.close(); } tcpSocket->disconnectFromHost(); delete tcpSocket; tcpSocket = NULL; } }
3.2、运行之前链接中所说的pc端设置静态ip和恢复动态ip软件,观看打印数据即可
3.3、剩下的就只是写和读了
4、UDP实现
复制代码
1
2
3
4
5
6
7
8
9
10
11
12/* 写的伪代码 */ QString msg = "helloworld"; udpSocket->writeDatagram(msg.toLatin1(),msg.length(),QHostAddress::Broadcast,port); /* 读的伪代码 */ while(udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize()); udpSocket->readDatagram(datagram.data(),datagram.size()); QString msg=datagram.data(); }
4.1、问题记录Unable to send a message
开发环境是电脑的Qt编程,linux下的arm板Qt编程
我发现,在我电脑端采用广播发送的时候,发送成功了,但是在arm板接收到信息回发时,一直发送失败,最后我也没找到原因
解决方案:只是在接收信息时,获取了发送的ip地址,然后回发的地址改成了确定ip,才通讯成功,
但是为什么电脑端的广播发送可以成功,arm板的广播发送失败,这个问题一直没有想明白
懂了懂了懂了
有线连接
需要的广播地址是有线网卡的广播地址,不然就会通讯失败,测试代码如下,
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces(); foreach (QNetworkInterface interfaces, networkinterfaces) { foreach (QNetworkAddressEntry entry, interfaces.addressEntries()){ QHostAddress broadcastAddress = entry.broadcast(); if (broadcastAddress != QHostAddress::Null && entry.ip() != QHostAddress::LocalHost && entry.ip().protocol() == QAbstractSocket::IPv4Protocol){ QJsonObject jsonObjectip,jsonObject; jsonObjectip.insert("IP", (entry.ip()).toString()); jsonObject.insert("content", jsonObjectip); jsonObject.insert("Title","notify_door_gateway"); QJsonDocument jsonDocument; jsonDocument.setObject(jsonObject); QByteArray dataArray = jsonDocument.toJson(); udpSocket->writeDatagram(dataArray,broadcastAddress, send_port); } } }
追加:后面发现,在一开始对方默认ip不在同一网段的情况下连接不上,前面发现好使只是因为我之前在收到信息时,将ip改为同一网段回复后未清空配置而已
无线连接
需要处于同一网段,不然还是会通信失败
arm板和电脑端的udp有线通信
需要在接收到信息后,获取发送者的ip和端口,然后将本身ip设置为同网段下的ip,不然就会出现回发失败,代码如下
复制代码
1udpSocket->readDatagram(datagram.data(),datagram.size(),&host,&port);
最后
以上就是结实跳跳糖为你收集整理的Qt之开发板和电脑通过网线通信4、UDP实现的全部内容,希望文章能够帮你解决Qt之开发板和电脑通过网线通信4、UDP实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复