diff --git a/consolereader.cpp b/consolereader.cpp index ddd8315..a2bca23 100644 --- a/consolereader.cpp +++ b/consolereader.cpp @@ -18,6 +18,7 @@ #include #include "consolereader.h" +#include "server.h" ConsoleReader::ConsoleReader ( std::vector *sockets_vector ) { @@ -43,6 +44,18 @@ void ConsoleReader::run() std::cin >> command; switch ( command[0] ) { + case 'a': + { + std::cout << "Please set your Orvibo socket to pair mode (rapidly blinking blue light) and connect computer to socket's WiFi network (WiWo-S20)" << std::endl; + std::string ssid; + std::cout << "SSID of your Wifi: "; + std::cin >> ssid; + std::string password; + std::cout << "Password: "; + std::cin >> password; + Server *server = new Server(48899, QByteArray::fromStdString(ssid), QByteArray::fromStdString(password)); // HF-A11 chip can be controlled over port 48899 + break; + } case 'd': (*sockets) [number]->tableData(); break; @@ -94,12 +107,11 @@ 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 << "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 << "_____________________________________________________________________________\n" << std::endl; - std::cout << "d - update table data\nn - change socket name (max 16 characters)\np - toggle power state\nP - change remote password (max 12 characters)\n"; - std::cout << "q - quit\ns - pick another socket (default is 1)\nt - change timezone" << std::endl; + std::cout << "a - add unpaired socket (WiFi needed)\nd - update table data\nn - change socket name (max 16 characters)\np - 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; } diff --git a/main.cpp b/main.cpp index 6c36a24..308355b 100644 --- a/main.cpp +++ b/main.cpp @@ -25,7 +25,7 @@ int main(int argc, char *argv[]) QCoreApplication app(argc, argv); std::vector *sockets = new std::vector; - Server server(sockets); + Server server(sockets, 10000); ConsoleReader *reader = new ConsoleReader(sockets); return app.exec(); diff --git a/server.cpp b/server.cpp index 4633539..220a232 100644 --- a/server.cpp +++ b/server.cpp @@ -21,30 +21,69 @@ #include "consolereader.h" #include "server.h" -Server::Server ( std::vector *sockets_vector ) +Server::Server ( std::vector *sockets_vector, uint16_t port ) { sockets = sockets_vector; - QUdpSocket *udpSocketSend = new QUdpSocket(); udpSocketGet = new QUdpSocket(); - - udpSocketSend->connectToHost ( QHostAddress::Broadcast, 10000 ); - udpSocketGet->bind ( QHostAddress::Any, 10000); - + udpSocketGet->bind ( QHostAddress::Any, port ); connect ( udpSocketGet, &QUdpSocket::readyRead, this, &Server::readPendingDatagrams); - - udpSocketSend->write ( discover ); - udpSocketSend->write ( discover ); - udpSocketSend->disconnectFromHost(); - delete udpSocketSend; + discoverSockets(port); start(); } +Server::Server(uint16_t port, QByteArray ssid, QByteArray password) +{ + QUdpSocket *udpSocketSend = new QUdpSocket(); + udpSocketGet = new QUdpSocket(); + udpSocketGet->bind ( QHostAddress::Any, port); + + QByteArray reply; + + udpSocketGet->writeDatagram ( QByteArray::fromStdString("HF-A11ASSISTHREAD"), QHostAddress::Broadcast, port ); + reply = listen(QByteArray::fromStdString("HF-A11ASSISTHREAD")); + QList list = reply.split(','); + QHostAddress ip(QString::fromLatin1(list[0])); + std::cout << "IP: " << ip.toString().toStdString() << std::endl; + udpSocketGet->writeDatagram ( QByteArray::fromStdString("+ok"), ip, port ); + udpSocketGet->writeDatagram ( QByteArray::fromStdString("AT+WSSSID=") + ssid + QByteArray::fromStdString("\r"), ip, port ); + listen(); + udpSocketGet->writeDatagram ( QByteArray::fromStdString("AT+WSKEY=WPA2PSK,AES,") + password + QByteArray::fromStdString("\r"), ip, port ); // FIXME: support different security settings + listen(); + udpSocketGet->writeDatagram ( QByteArray::fromStdString("AT+WMODE=STA\r"), ip, port ); + listen(); + udpSocketGet->writeDatagram ( QByteArray::fromStdString("AT+Z\r"), ip, port ); // reboot + // FIXME: discover the new socket +} + Server::~Server() { delete udpSocketGet; } +QByteArray Server::listen(QByteArray message) +{ + QByteArray reply; + QHostAddress sender; + quint16 senderPort; + bool stop = false; + while ( !stop ) + { + QThread::msleep(50); + while ( udpSocketGet->hasPendingDatagrams() ) + { + reply.resize ( udpSocketGet->pendingDatagramSize() ); + udpSocketGet->readDatagram ( reply.data(), reply.size(), &sender, &senderPort ); + if (reply != message) + { + stop = true; + std::cout << reply.toStdString() << std::endl; + } + } + } + return reply; +} + void Server::run() { readPendingDatagrams(); @@ -92,8 +131,17 @@ void Server::readPendingDatagrams() } } - std::cout << "Packet not belonging to any socket: " << reply.toHex().toStdString() << std::endl; } } } } + +void Server::discoverSockets(uint16_t port) +{ + QUdpSocket *udpSocketSend = new QUdpSocket(); + udpSocketSend->connectToHost ( QHostAddress::Broadcast, port ); + udpSocketSend->write ( discover ); + udpSocketSend->write ( discover ); + udpSocketSend->disconnectFromHost(); + delete udpSocketSend; +} diff --git a/server.h b/server.h index 65895dd..d299a91 100644 --- a/server.h +++ b/server.h @@ -27,10 +27,10 @@ class QUdpSocket; class Server : public QThread { public: - Server ( std::vector *sockets_vector ); + Server ( std::vector *sockets_vector, uint16_t port ); + Server ( uint16_t port, QByteArray ssid, QByteArray password ); ~Server(); - void discoverSockets (); void readPendingDatagrams(); void run(); @@ -38,6 +38,9 @@ private: QByteArray discover = QByteArray::fromHex ( "68 64 00 06 71 61" ); QUdpSocket *udpSocketGet; std::vector *sockets; + + void discoverSockets(uint16_t port); + QByteArray listen( QByteArray message = 0 ); }; #endif /* SERVER_H */ diff --git a/socket.h b/socket.h index 3adcd97..97718bb 100644 --- a/socket.h +++ b/socket.h @@ -37,7 +37,7 @@ Q_SIGNALS: void datagramQueued(); public: - Socket ( QHostAddress, QByteArray ); + Socket ( QHostAddress, QByteArray ); // from discovery packet ~Socket(); void toggle(); void tableData();