From b30da3495d584ca4f343ec8e85259b9a324bbf29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrius=20=C5=A0tikonas?= Date: Thu, 2 Apr 2015 22:10:06 +0100 Subject: [PATCH] Process Discover packets too. --- consolereader.cpp | 12 ++++++++++-- server.cpp | 21 +++++++++++---------- socket.cpp | 34 +++++++++++++++++++++++++--------- socket.h | 5 +++-- 4 files changed, 49 insertions(+), 23 deletions(-) diff --git a/consolereader.cpp b/consolereader.cpp index 8a5bc33..0f23d9e 100644 --- a/consolereader.cpp +++ b/consolereader.cpp @@ -61,6 +61,9 @@ void ConsoleReader::run() case 'd': (*sockets) [number]->tableData(); break; + case 'D': + (*sockets) [number]->discover(); + break; case 'n': { std::string name; @@ -110,10 +113,15 @@ void ConsoleReader::listSockets() std::cout << "_____________________________________________________________________________\n" << std::endl; std::cout << "IP Address: " << (*i)->ip.toString().toStdString() << "\t MAC Address: " << (*i)->mac.toHex().toStdString() << "\t Power: " << ( (*i)->powered ? "On" : "Off" ) << std::endl; std::cout << "Socket Name: " << (*i)->socketName.toStdString() << "\t Remote Password: " << (*i)->remotePassword.toStdString() << "\t Timezone: " << (*i)->timeZone.toHex().toStdString() << std::endl; - std::cout << "Countdown: " << (*i)->countdown.toHex().toStdString() << std::endl; + std::cout << "Countdown: " << (*i)->countdown.toHex().toStdString() << "\t\t\t Time: " << (*i)->socketDateTime.toString().toStdString() << std::endl; } std::cout << "_____________________________________________________________________________\n" << std::endl; - std::cout << "a - add unpaired socket (WiFi needed)\nA - add unpaired socket (no WiFi needed)\nd - update table data\nn - change socket name (max 16 characters)\np - toggle power state\n"; + std::cout << "a - add unpaired socket (WiFi needed)\n"; + std::cout << "A - add unpaired socket (no WiFi needed)\n"; + std::cout << "d - update table data\n"; + std::cout << "D - print internal socket date and time\n"; + std::cout << "n - change socket name (max 16 characters)\n"; + std::cout << "p - toggle power state\n"; std::cout << "P - change remote password (max 12 characters)\nq - quit\ns - pick another socket (default is 1)\nt - change timezone" << std::endl; std::cout << "Enter command: " << std::endl; } diff --git a/server.cpp b/server.cpp index c19e68c..e5c6bd9 100644 --- a/server.cpp +++ b/server.cpp @@ -142,7 +142,7 @@ void Server::readPendingDatagrams() { while ( udpSocketGet->hasPendingDatagrams() ) { - QByteArray reply; + QByteArray reply, mac; reply.resize ( udpSocketGet->pendingDatagramSize() ); QHostAddress sender; quint16 senderPort; @@ -151,7 +151,7 @@ void Server::readPendingDatagrams() if ( reply != discover && reply.left ( 2 ) == magicKey ) // check for Magic Key { - if ( reply.mid ( 4, 2 ) == QByteArray::fromHex ( "71 61" ) ) // Reply to discover packet + if ( reply.mid ( 4, 2 ) == QByteArray::fromHex ( "71 61" ) || reply.mid ( 4, 2 ) == QByteArray::fromHex ( "71 67" )) // Reply to discover packet { bool duplicate = false; for ( std::vector::const_iterator i = sockets->begin() ; i != sockets->end(); ++i ) @@ -168,19 +168,20 @@ void Server::readPendingDatagrams() sockets->push_back ( socket ); Q_EMIT discovered(); } + mac = reply.mid(7,6); } else { - QByteArray mac = reply.mid(6,6); - for ( std::vector::iterator i = sockets->begin() ; i != sockets->end(); ++i ) + mac = reply.mid(6,6); + } + for ( std::vector::iterator i = sockets->begin() ; i != sockets->end(); ++i ) + { + if ( (*i)->mac == mac ) { - if ( (*i)->mac == mac ) - { - (*i)->parseReply(reply); - break; - } - + (*i)->parseReply(reply); + break; } + } } } diff --git a/socket.cpp b/socket.cpp index a4eb001..d4b9c32 100644 --- a/socket.cpp +++ b/socket.cpp @@ -34,15 +34,8 @@ Socket::Socket ( QHostAddress IPaddress, QByteArray reply ) powered = reply.right ( 1 ) == one; // 68:64:00:06:71:61 initial detection ?? - QByteArray timeArray = reply.right(5).left(4); - QDataStream stream(&timeArray, QIODevice::ReadOnly); - stream.setByteOrder(QDataStream::LittleEndian); - uint32_t time; - stream >> time; - socketDateTime.setDate(QDate(1900, 01, 01)); // midnight 1900-01-01 - socketDateTime = socketDateTime.addSecs(time); - qWarning() << "Socket clock:" << socketDateTime.toString(); - + commandID[GlobalDiscover] = QByteArray::fromHex ( "71 61" ); + commandID[Discover] = QByteArray::fromHex ( "71 67" ); commandID[Subscribe] = QByteArray::fromHex ( "63 6c" ); commandID[PowerOn] = QByteArray::fromHex ( "73 66" ); commandID[PowerOff] = commandID[PowerOn]; @@ -53,6 +46,7 @@ Socket::Socket ( QHostAddress IPaddress, QByteArray reply ) QByteArray commandIDPower = QByteArray::fromHex ( "64 63" ); // 2 hex bytes are the total length of the message + datagram[Discover] = commandID[Discover] + mac + twenties; datagram[Subscribe] = commandID[Subscribe] + mac + twenties + rmac + twenties; datagram[PowerOn] = commandIDPower + mac + twenties + zeros + one; datagram[PowerOff] = commandIDPower + mac + twenties + zeros + zero; @@ -123,6 +117,11 @@ void Socket::subscribe() sendDatagram ( Subscribe ); } +void Socket::discover() +{ + sendDatagram ( Discover ); +} + void Socket::toggle() { sendDatagram ( powered ? PowerOff : PowerOn ); @@ -205,6 +204,22 @@ bool Socket::parseReply ( QByteArray reply ) } switch ( datagram ) { + case GlobalDiscover: + case Discover: + { + QByteArray timeArray = reply.right(5).left(4); + QDataStream stream(&timeArray, QIODevice::ReadOnly); + stream.setByteOrder(QDataStream::LittleEndian); + uint32_t time; + stream >> time; + socketDateTime.setDate(QDate(1900, 01, 01)); // midnight 1900-01-01 + socketDateTime.setTime(QTime(0, 0, 0)); + socketDateTime = socketDateTime.addSecs(time); + if ( !initializing ) + { + Q_EMIT stateChanged(); + } + } case Subscribe: case PowerOff: case PowerOn: @@ -264,6 +279,7 @@ bool Socket::parseReply ( QByteArray reply ) ++index; countdown = reply.mid ( index, 2 ); Q_EMIT stateChanged(); + initializing = false; break; } case TimingData: diff --git a/socket.h b/socket.h index 4e8a0a3..f76004f 100644 --- a/socket.h +++ b/socket.h @@ -41,6 +41,7 @@ public: Socket ( QHostAddress, QByteArray ); // from discovery packet ~Socket(); void toggle(); + void discover(); void tableData(); void changeSocketName ( QString newName ); void changeSocketPassword ( QString newPassword ); @@ -56,7 +57,7 @@ public: QDateTime socketDateTime; private: - enum Datagram {Subscribe, PowerOff, PowerOn, TableData, SocketData, TimingData, WriteSocketData, MaxCommands}; + enum Datagram {GlobalDiscover, Discover, Subscribe, PowerOff, PowerOn, TableData, SocketData, TimingData, WriteSocketData, MaxCommands}; void sendDatagram ( Datagram ); void subscribe(); @@ -90,7 +91,7 @@ private: QUdpSocket *udpSocket; QTimer *subscribeTimer; - bool subscribed; + bool subscribed, initializing = true; QQueue commands; };