我目前正在尝试使用 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,搜索时都会收到“请求”消息。