Process Discover packets too.
This commit is contained in:
parent
354ec34d1e
commit
b30da3495d
|
@ -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;
|
||||
}
|
||||
|
|
21
server.cpp
21
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<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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
34
socket.cpp
34
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:
|
||||
|
|
5
socket.h
5
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<Datagram> commands;
|
||||
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue