Add support for initial pairing of the socket (WIP, some manual steps necessary).
This commit is contained in:
parent
e7c521bc10
commit
c7c93181bf
|
@ -18,6 +18,7 @@
|
|||
#include <iostream>
|
||||
|
||||
#include "consolereader.h"
|
||||
#include "server.h"
|
||||
|
||||
ConsoleReader::ConsoleReader ( std::vector<Socket*> *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;
|
||||
}
|
||||
|
|
2
main.cpp
2
main.cpp
|
@ -25,7 +25,7 @@ int main(int argc, char *argv[])
|
|||
QCoreApplication app(argc, argv);
|
||||
|
||||
std::vector<Socket*> *sockets = new std::vector<Socket*>;
|
||||
Server server(sockets);
|
||||
Server server(sockets, 10000);
|
||||
ConsoleReader *reader = new ConsoleReader(sockets);
|
||||
|
||||
return app.exec();
|
||||
|
|
72
server.cpp
72
server.cpp
|
@ -21,30 +21,69 @@
|
|||
#include "consolereader.h"
|
||||
#include "server.h"
|
||||
|
||||
Server::Server ( std::vector<Socket*> *sockets_vector )
|
||||
Server::Server ( std::vector<Socket*> *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<QByteArray> 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;
|
||||
}
|
||||
|
|
7
server.h
7
server.h
|
@ -27,10 +27,10 @@ class QUdpSocket;
|
|||
class Server : public QThread
|
||||
{
|
||||
public:
|
||||
Server ( std::vector<Socket*> *sockets_vector );
|
||||
Server ( std::vector<Socket*> *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<Socket*> *sockets;
|
||||
|
||||
void discoverSockets(uint16_t port);
|
||||
QByteArray listen( QByteArray message = 0 );
|
||||
};
|
||||
|
||||
#endif /* SERVER_H */
|
||||
|
|
Loading…
Reference in New Issue