0

我目前正在尝试使用 PC 和 Raspberry Pi 制作一个简单的“设备发现”应用程序。我正在使用 Qt 来执行此操作。

这里的想法...

我有一个在我的 PC 上运行的 Qt 应用程序,我点击“搜索”按钮以广播带有“请求”消息的 UDP 数据包作为数据报。这是基本的 UDP.cpp 类(我不包括 GUI 本身)。

    MyUDP::MyUDP(QObject *parent) :
    QObject(parent)
{
    qDebug() << "Binding UDP Socket";
    socket = new QUdpSocket(this);
    socket->bind(QHostAddress::Any, 5000); //bind to 5000
    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}

void MyUDP::deviceDiscover(){
    QByteArray data;
    data.append("Request");
    qDebug() << "Sending broadcast";
    socket->writeDatagram(data, QHostAddress::Broadcast, 5000); //broadcast from port 5000
}

void MyUDP::readyRead(){
    QByteArray buffer;
    buffer.resize(socket->pendingDatagramSize());
    //var to store headers from udp
    QHostAddress sender;
    quint16 sender_port;
    socket->readDatagram(buffer.data(),buffer.size(), &sender, &sender_port);
    qDebug() << "Message from " << sender << " port " << sender_port;
    qDebug() << "Msg: " << buffer;
    if(QString(buffer).compare("PI")==0){
        //add to list
        emit(updateList(sender.toString()));
    }

}

现在在 PI 上,我有一个简单的控制台应用程序,它假设读取广播数据包并回显“PI”消息。

这是 PI 代码

MyUDP::MyUDP(QObject *parent) :
    QObject(parent)
{
    qDebug() << "Binding UDP Socket";
    socket = new QUdpSocket(this);
    socket->bind(QHostAddress::Any, 5000); //bind to 5000
    connect(socket, SIGNAL(readyRead()),this, SLOT(readyRead()));
    qDebug() << "Ready Read signal connected,sending out broadcast";
    QByteArray data;
    data.append("PI");
    qDebug() << "Sending datagram";
    socket->writeDatagram(data, QHostAddress::Broadcast, 5000); //broadcast from port 5000
}

void MyUDP::readyRead(){
    QByteArray buffer;
    buffer.resize(socket->pendingDatagramSize());
    //var to store headers from udp
    QHostAddress sender;
    quint16 sender_port;
    socket->readDatagram(buffer.data(),buffer.size(), &sender, &sender_port);
    qDebug() << "Message from " << sender << " port " << sender_port;
    qDebug() << "Msg: " << buffer;
    if(QString(buffer).compare("Request")==0){
        //send back a "PI" msg
        QByteArray data;
        data.append("PI");
        socket->writeDatagram(data, sender, 5000);
    }
}

现在,当 PI 代码第一次运行时,它会广播一个“活动”消息,PC 应用程序得到它没有问题。

这是我的启动顺序(在 PC 已经运行时启动 PI 应用程序)

Message from   QHostAddress( "192.168.211.1" )   port  5000 
Msg:  "Request" 
Message from   QHostAddress( "192.168.1.111" )   port  5000 
Msg:  "PI" 
Updating list 

现在,当我使用搜索按钮发送广播时,PI 端没有收到任何内容。

我刷新了 iptables 的所有规则并关闭了我的 Windows 防火墙。关于什么会阻止 PI 从 Windows 接收广播的任何想法?

如果我运行 windows-windows,搜索时都会收到“请求”消息。

4

0 回答 0