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

4

0 に答える 0