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':
(*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;
}

View File

@ -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<Socket*>::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<Socket*>::iterator i = sockets->begin() ; i != sockets->end(); ++i )
mac = reply.mid(6,6);
}
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;
// 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:

View File

@ -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<Datagram> commands;
};