我是靠谱客的博主 结实跳跳糖,最近开发中收集的这篇文章主要介绍Qt之开发板和电脑通过网线通信4、UDP实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、简介

现在有一个需求,不能联网的机器端想要与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
19
QList<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,不然就会出现回发失败,代码如下

复制代码
1
udpSocket->readDatagram(datagram.data(),datagram.size(),&host,&port);

最后

以上就是结实跳跳糖为你收集整理的Qt之开发板和电脑通过网线通信4、UDP实现的全部内容,希望文章能够帮你解决Qt之开发板和电脑通过网线通信4、UDP实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部