Process Discover packets too.
This commit is contained in:
parent
354ec34d1e
commit
b30da3495d
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,10 +168,12 @@ 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 )
|
||||||
|
@ -183,7 +185,6 @@ void Server::readPendingDatagrams()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::discoverSockets()
|
void Server::discoverSockets()
|
||||||
|
|
34
socket.cpp
34
socket.cpp
|
@ -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:
|
||||||
|
|
5
socket.h
5
socket.h
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue