Process Discover packets too.

This commit is contained in:
Andrius Štikonas 2015-04-02 22:10:06 +01:00
parent 354ec34d1e
commit b30da3495d
4 changed files with 49 additions and 23 deletions

View File

@ -61,6 +61,9 @@ void ConsoleReader::run()
case 'd': case 'd':
(*sockets) [number]->tableData(); (*sockets) [number]->tableData();
break; break;
case 'D':
(*sockets) [number]->discover();
break;
case 'n': case 'n':
{ {
std::string name; std::string name;
@ -110,10 +113,15 @@ void ConsoleReader::listSockets()
std::cout << "_____________________________________________________________________________\n" << std::endl; 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 << "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 << "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 << "_____________________________________________________________________________\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 << "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; std::cout << "Enter command: " << std::endl;
} }

View File

@ -142,7 +142,7 @@ void Server::readPendingDatagrams()
{ {
while ( udpSocketGet->hasPendingDatagrams() ) while ( udpSocketGet->hasPendingDatagrams() )
{ {
QByteArray reply; QByteArray reply, mac;
reply.resize ( udpSocketGet->pendingDatagramSize() ); reply.resize ( udpSocketGet->pendingDatagramSize() );
QHostAddress sender; QHostAddress sender;
quint16 senderPort; quint16 senderPort;
@ -151,7 +151,7 @@ void Server::readPendingDatagrams()
if ( reply != discover && reply.left ( 2 ) == magicKey ) // check for Magic Key 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; bool duplicate = false;
for ( std::vector<Socket*>::const_iterator i = sockets->begin() ; i != sockets->end(); ++i ) for ( std::vector<Socket*>::const_iterator i = sockets->begin() ; i != sockets->end(); ++i )
@ -168,19 +168,20 @@ void Server::readPendingDatagrams()
sockets->push_back ( socket ); sockets->push_back ( socket );
Q_EMIT discovered(); Q_EMIT discovered();
} }
mac = reply.mid(7,6);
} }
else else
{ {
QByteArray mac = reply.mid(6,6); mac = reply.mid(6,6);
for ( std::vector<Socket*>::iterator i = sockets->begin() ; i != sockets->end(); ++i ) }
for ( std::vector<Socket*>::iterator i = sockets->begin() ; i != sockets->end(); ++i )
{
if ( (*i)->mac == mac )
{ {
if ( (*i)->mac == mac ) (*i)->parseReply(reply);
{ break;
(*i)->parseReply(reply);
break;
}
} }
} }
} }
} }

View File

@ -34,15 +34,8 @@ Socket::Socket ( QHostAddress IPaddress, QByteArray reply )
powered = reply.right ( 1 ) == one; powered = reply.right ( 1 ) == one;
// 68:64:00:06:71:61 initial detection ?? // 68:64:00:06:71:61 initial detection ??
QByteArray timeArray = reply.right(5).left(4); commandID[GlobalDiscover] = QByteArray::fromHex ( "71 61" );
QDataStream stream(&timeArray, QIODevice::ReadOnly); commandID[Discover] = QByteArray::fromHex ( "71 67" );
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[Subscribe] = QByteArray::fromHex ( "63 6c" ); commandID[Subscribe] = QByteArray::fromHex ( "63 6c" );
commandID[PowerOn] = QByteArray::fromHex ( "73 66" ); commandID[PowerOn] = QByteArray::fromHex ( "73 66" );
commandID[PowerOff] = commandID[PowerOn]; commandID[PowerOff] = commandID[PowerOn];
@ -53,6 +46,7 @@ Socket::Socket ( QHostAddress IPaddress, QByteArray reply )
QByteArray commandIDPower = QByteArray::fromHex ( "64 63" ); QByteArray commandIDPower = QByteArray::fromHex ( "64 63" );
// 2 hex bytes are the total length of the message // 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[Subscribe] = commandID[Subscribe] + mac + twenties + rmac + twenties;
datagram[PowerOn] = commandIDPower + mac + twenties + zeros + one; datagram[PowerOn] = commandIDPower + mac + twenties + zeros + one;
datagram[PowerOff] = commandIDPower + mac + twenties + zeros + zero; datagram[PowerOff] = commandIDPower + mac + twenties + zeros + zero;
@ -123,6 +117,11 @@ void Socket::subscribe()
sendDatagram ( Subscribe ); sendDatagram ( Subscribe );
} }
void Socket::discover()
{
sendDatagram ( Discover );
}
void Socket::toggle() void Socket::toggle()
{ {
sendDatagram ( powered ? PowerOff : PowerOn ); sendDatagram ( powered ? PowerOff : PowerOn );
@ -205,6 +204,22 @@ bool Socket::parseReply ( QByteArray reply )
} }
switch ( datagram ) 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 Subscribe:
case PowerOff: case PowerOff:
case PowerOn: case PowerOn:
@ -264,6 +279,7 @@ bool Socket::parseReply ( QByteArray reply )
++index; ++index;
countdown = reply.mid ( index, 2 ); countdown = reply.mid ( index, 2 );
Q_EMIT stateChanged(); Q_EMIT stateChanged();
initializing = false;
break; break;
} }
case TimingData: case TimingData:

View File

@ -41,6 +41,7 @@ public:
Socket ( QHostAddress, QByteArray ); // from discovery packet Socket ( QHostAddress, QByteArray ); // from discovery packet
~Socket(); ~Socket();
void toggle(); void toggle();
void discover();
void tableData(); void tableData();
void changeSocketName ( QString newName ); void changeSocketName ( QString newName );
void changeSocketPassword ( QString newPassword ); void changeSocketPassword ( QString newPassword );
@ -56,7 +57,7 @@ public:
QDateTime socketDateTime; QDateTime socketDateTime;
private: 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 sendDatagram ( Datagram );
void subscribe(); void subscribe();
@ -90,7 +91,7 @@ private:
QUdpSocket *udpSocket; QUdpSocket *udpSocket;
QTimer *subscribeTimer; QTimer *subscribeTimer;
bool subscribed; bool subscribed, initializing = true;
QQueue<Datagram> commands; QQueue<Datagram> commands;
}; };