Implement basic toggling support.
This commit is contained in:
parent
dc98486dc7
commit
17a2b1325b
|
@ -3,4 +3,4 @@ project(s20)
|
||||||
|
|
||||||
find_package(Qt5 REQUIRED Core Network)
|
find_package(Qt5 REQUIRED Core Network)
|
||||||
add_executable(s20 main.cpp socket.cpp)
|
add_executable(s20 main.cpp socket.cpp)
|
||||||
target_link_libraries(s20 Qt5::Network)
|
target_link_libraries(s20 Qt5::Core Qt5::Network)
|
||||||
|
|
36
main.cpp
36
main.cpp
|
@ -16,22 +16,17 @@
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <set>
|
#include <vector>
|
||||||
|
|
||||||
#include <QByteArray>
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QUdpSocket>
|
|
||||||
|
|
||||||
#include "socket.h"
|
#include "socket.h"
|
||||||
|
|
||||||
|
void readDiscoverDatagrams(QUdpSocket *udpSocketGet, std::vector<Socket> &sockets);
|
||||||
void listSockets(std::vector<Socket> const &sockets);
|
void listSockets(std::vector<Socket> const &sockets);
|
||||||
|
|
||||||
QByteArray discover = QByteArray::fromHex("68 64 00 06 71 61");
|
QByteArray discover = QByteArray::fromHex("68 64 00 06 71 61");
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QCoreApplication s20(argc, argv);
|
|
||||||
|
|
||||||
QUdpSocket *udpSocketSend = new QUdpSocket();
|
QUdpSocket *udpSocketSend = new QUdpSocket();
|
||||||
QUdpSocket *udpSocketGet = new QUdpSocket();
|
QUdpSocket *udpSocketGet = new QUdpSocket();
|
||||||
|
|
||||||
|
@ -39,7 +34,27 @@ int main(int argc, char *argv[])
|
||||||
udpSocketGet->bind(QHostAddress::Any, 10000);
|
udpSocketGet->bind(QHostAddress::Any, 10000);
|
||||||
|
|
||||||
udpSocketSend->write(discover);
|
udpSocketSend->write(discover);
|
||||||
|
udpSocketSend->disconnectFromHost();
|
||||||
|
delete udpSocketSend;
|
||||||
std::vector<Socket> sockets;
|
std::vector<Socket> sockets;
|
||||||
|
|
||||||
|
readDiscoverDatagrams(udpSocketGet, sockets);
|
||||||
|
listSockets(sockets);
|
||||||
|
|
||||||
|
char command;
|
||||||
|
std::cin >> command;
|
||||||
|
switch(command)
|
||||||
|
{
|
||||||
|
case 'q':
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
sockets.begin()->toggle();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void readDiscoverDatagrams(QUdpSocket *udpSocketGet, std::vector<Socket> &sockets)
|
||||||
|
{
|
||||||
while (udpSocketGet->waitForReadyRead(1000)) // 1s
|
while (udpSocketGet->waitForReadyRead(1000)) // 1s
|
||||||
{
|
{
|
||||||
while (udpSocketGet->hasPendingDatagrams())
|
while (udpSocketGet->hasPendingDatagrams())
|
||||||
|
@ -51,7 +66,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
udpSocketGet->readDatagram(datagramGet.data(), datagramGet.size(), &sender, &senderPort);
|
udpSocketGet->readDatagram(datagramGet.data(), datagramGet.size(), &sender, &senderPort);
|
||||||
|
|
||||||
if (datagramGet != discover)
|
if (datagramGet != discover && datagramGet.left(2) == QByteArray::fromHex("68 64"))
|
||||||
{
|
{
|
||||||
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)
|
||||||
|
@ -61,15 +76,12 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
if(!duplicate)
|
if(!duplicate)
|
||||||
{
|
{
|
||||||
Socket socket(sender, datagramGet);
|
const Socket socket(sender, datagramGet);
|
||||||
sockets.push_back(socket);
|
sockets.push_back(socket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
listSockets(sockets);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void listSockets(std::vector<Socket> const &sockets)
|
void listSockets(std::vector<Socket> const &sockets)
|
||||||
|
|
27
socket.cpp
27
socket.cpp
|
@ -17,9 +17,34 @@
|
||||||
|
|
||||||
#include "socket.h"
|
#include "socket.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
Socket::Socket(QHostAddress IPaddress, QByteArray reply)
|
Socket::Socket(QHostAddress IPaddress, QByteArray reply)
|
||||||
{
|
{
|
||||||
ip = IPaddress;
|
ip = IPaddress;
|
||||||
mac = reply.mid(7, 6);
|
mac = reply.mid(7, 6);
|
||||||
|
rmac = mac;
|
||||||
|
std::reverse(rmac.begin(), rmac.end());
|
||||||
powered = reply.right(1) == QByteArray::fromHex("01");
|
powered = reply.right(1) == QByteArray::fromHex("01");
|
||||||
}
|
QByteArray twenties = QByteArray::fromHex("20 20 20 20 20 20");
|
||||||
|
QByteArray zeros = QByteArray::fromHex("00 00 00 00");
|
||||||
|
|
||||||
|
datagram[Subscribe] = QByteArray::fromHex("68 64 00 1e 63 6c") + mac + twenties + rmac + twenties;
|
||||||
|
datagram[PowerOn] = QByteArray::fromHex("68 64 00 17 64 63") + mac + twenties + zeros + QByteArray::fromHex("01");
|
||||||
|
datagram[PowerOff] = QByteArray::fromHex("68 64 00 17 64 63") + mac + twenties + zeros + QByteArray::fromHex("00");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Socket::toggle()
|
||||||
|
{
|
||||||
|
sendDatagram(datagram[Subscribe]); // TODO: process replies
|
||||||
|
sendDatagram(datagram[powered ? PowerOff : PowerOn]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Socket::sendDatagram(QByteArray datagram)
|
||||||
|
{
|
||||||
|
udpSocketSend = new QUdpSocket();
|
||||||
|
udpSocketSend->connectToHost(ip, 10000);
|
||||||
|
udpSocketSend->write(datagram);
|
||||||
|
udpSocketSend->disconnectFromHost();
|
||||||
|
delete udpSocketSend;
|
||||||
|
}
|
||||||
|
|
11
socket.h
11
socket.h
|
@ -17,20 +17,23 @@
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
|
#include <QUdpSocket>
|
||||||
|
|
||||||
class Socket
|
class Socket
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Socket(QHostAddress, QByteArray);
|
Socket(QHostAddress, QByteArray);
|
||||||
|
bool toggle();
|
||||||
|
|
||||||
QHostAddress ip;
|
QHostAddress ip;
|
||||||
QByteArray mac;
|
QByteArray mac;
|
||||||
bool powered;
|
bool powered;
|
||||||
enum {Subscribe, PowerOff, PowerOn};
|
enum {Subscribe, PowerOff, PowerOn};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void sendDatagram(QByteArray datagram);
|
||||||
|
|
||||||
QByteArray datagram[3];
|
QByteArray datagram[3];
|
||||||
// QByteArray::fromHex("68 64 00 1e 63 6c ac cf 23 35 f5 8c 20 20 20 20 20 20 8c f5 35 23 cf ac 20 20 20 20 20 20"), // subscribe
|
QByteArray rmac; // Reveresed mac
|
||||||
// QByteArray::fromHex("68 64 00 17 64 63 ac cf 23 35 f5 8c 20 20 20 20 20 20 00 00 00 00 00"), // power off
|
QUdpSocket *udpSocketSend;
|
||||||
// QByteArray::fromHex("68 64 00 17 64 63 ac cf 23 35 f5 8c 20 20 20 20 20 20 00 00 00 00 01") // power on
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue