私は現在、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 コードが最初に実行されると、"alive" メッセージがブロードキャストされ、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 を実行すると、検索時に両方とも「要求」メッセージを受け取ります。