我是靠谱客的博主 结实跳跳糖,最近开发中收集的这篇文章主要介绍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、转接板端:用的是部分代码,主要是思路

/* 新建了一个线程专门等待有线接口 */
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实现

/* 写的伪代码 */
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板的广播发送失败,这个问题一直没有想明白

懂了懂了懂了

有线连接

需要的广播地址是有线网卡的广播地址,不然就会通讯失败,测试代码如下,

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,不然就会出现回发失败,代码如下

udpSocket->readDatagram(datagram.data(),datagram.size(),&host,&port);

最后

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

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部