193 lines
5.0 KiB
C++
193 lines
5.0 KiB
C++
//
|
|
// Created by sqp on 2022/4/26.
|
|
//
|
|
|
|
#include "discovery.h"
|
|
|
|
#include <QLocalSocket>
|
|
#include <QDataStream>
|
|
#include <QRandomGenerator>
|
|
#include "generatetools.h"
|
|
#include "unix-util.h"
|
|
|
|
namespace KDiscovery {
|
|
const char *SERVER_UNIX_SOCKET_ADDR = "/tmp/kylin.deviceDiscover.socket";
|
|
const int BUF_LEN = 1024;
|
|
|
|
using namespace tlv;
|
|
|
|
Discovery::Discovery(QObject *parent) : QObject(parent)
|
|
{
|
|
m_socket = new QLocalSocket(this);
|
|
connect(m_socket, &QLocalSocket::readyRead, this, &Discovery::onReadyRead);
|
|
connect(m_socket, &QLocalSocket::disconnected, m_socket, &QLocalSocket::deleteLater);
|
|
}
|
|
|
|
Discovery::~Discovery() noexcept
|
|
{
|
|
qInfo() << "~Discovery()";
|
|
// stopDiscovery();
|
|
}
|
|
|
|
void Discovery::startDiscovery()
|
|
{
|
|
qInfo() << "start discovery";
|
|
m_socket->connectToServer(SERVER_UNIX_SOCKET_ADDR);
|
|
GenerateTools::delayMs(200);
|
|
sendRequest(START_DISCOVERY);
|
|
}
|
|
|
|
void Discovery::stopDiscovery()
|
|
{
|
|
qInfo() << "stop discovery";
|
|
|
|
sendRequest(STOP_DISCOVERY);
|
|
|
|
GenerateTools::delayMs(100);
|
|
|
|
// m_socket->close();
|
|
m_discoveryDeviceInfo.clear();
|
|
}
|
|
|
|
void Discovery::onReadyRead()
|
|
{
|
|
char buf[BUF_LEN];
|
|
int len = m_socket->read(buf, BUF_LEN);
|
|
if (len < 0) {
|
|
qWarning() << "recv device info fail";
|
|
}
|
|
getDeviceInfo(buf, len);
|
|
}
|
|
|
|
void Discovery::getDeviceInfo(char *buf, qint64 len)
|
|
{
|
|
DiscoveryDeviceInfo parsedBoxes;
|
|
if (!parsedBoxes.Parse((unsigned char *)buf, len)) {
|
|
qWarning() << "DiscoveryDeviceInfo Parse Failed !\n";
|
|
return;
|
|
}
|
|
|
|
DiscoveryDeviceInfo parsedBox;
|
|
if (!parsedBoxes.GetObjectValue(RESPONSE, parsedBox)) {
|
|
qWarning() << "GetObjectValue Failed !\n";
|
|
return;
|
|
}
|
|
|
|
int value;
|
|
if (!parsedBox.GetResponseValue(RESPONSE, value)) {
|
|
qWarning() << "GetResponseValue Failed !\n";
|
|
return;
|
|
}
|
|
|
|
switch (value) {
|
|
case DEVICE_INFO: {
|
|
{
|
|
char value[128];
|
|
int length = 128;
|
|
if (!parsedBox.GetUuidValue(DEVICE_UUID, value, length)) {
|
|
qWarning() << "GetUuidValue Failed !\n";
|
|
return;
|
|
}
|
|
qInfo() << "GetUuidValue Success " << value;
|
|
m_uuid = value;
|
|
}
|
|
|
|
{
|
|
int value;
|
|
if (!parsedBox.GetDevTypeValue(DEVICE_TYPE, value)) {
|
|
qWarning() << "GetDevTypeValue Failed !\n";
|
|
return;
|
|
}
|
|
qInfo() << "GetDevTypeValue Success " << value;
|
|
if (value != KCommon::DeviceType::PC && value != KCommon::DeviceType::Phone) {
|
|
return;
|
|
}
|
|
m_devType = value;
|
|
}
|
|
|
|
{
|
|
char value[128];
|
|
int length = 128;
|
|
if (!parsedBox.GetDevNameValue(DEVICE_NAME, value, length)) {
|
|
qWarning() << "GetDevNameValue Failed !\n";
|
|
return;
|
|
}
|
|
qInfo() << "GetDevNameValue Success " << value;
|
|
m_deviceName = value;
|
|
}
|
|
|
|
{
|
|
char value[128];
|
|
int length = 128;
|
|
if (!parsedBox.GetDevIpValue(DEVICE_IP, value, length)) {
|
|
qWarning() << "GetDevIpValue Failed !\n";
|
|
return;
|
|
}
|
|
qInfo() << "GetDevIpValue Success " << value;
|
|
m_clientIp = value;
|
|
}
|
|
|
|
{
|
|
int value;
|
|
if (!parsedBox.GetDevPortValue(DEVICE_PORT, value)) {
|
|
qWarning() << "GetDevPortValue Failed !\n";
|
|
return;
|
|
}
|
|
qInfo() << "GetDevPortValue Success " << value;
|
|
m_clientport = value;
|
|
}
|
|
|
|
if (!m_currentDeviceIpList.contains(m_clientIp)) {
|
|
getClientInfo();
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Discovery::getClientInfo()
|
|
{
|
|
KCommon::DiscoveryDeviceInfo deviceInfo;
|
|
|
|
deviceInfo.ip = m_clientIp;
|
|
deviceInfo.port = m_clientport;
|
|
deviceInfo.uuid = m_uuid;
|
|
deviceInfo.deviceType = m_devType;
|
|
deviceInfo.deviceName = m_deviceName;
|
|
|
|
if (!m_discoveryDeviceInfo.contains(m_clientIp)) {
|
|
m_discoveryDeviceInfo.insert(m_clientIp, deviceInfo);
|
|
Q_EMIT sigAllDeviceInfo(m_discoveryDeviceInfo);
|
|
}
|
|
}
|
|
|
|
void Discovery::sendRequest(RequestType type)
|
|
{
|
|
DiscoveryDeviceInfo requestMsg;
|
|
|
|
requestMsg.PutRequestValue(REQUEST, type);
|
|
|
|
if (!requestMsg.Serialize()) {
|
|
qWarning() << "requestMsg Serialize Failed !\n";
|
|
return;
|
|
}
|
|
|
|
DiscoveryDeviceInfo request;
|
|
request.PutObjectValue(REQUEST, requestMsg);
|
|
|
|
if (!request.Serialize()) {
|
|
qWarning() << "REQUEST Serialize Failed !\n";
|
|
return;
|
|
}
|
|
|
|
if (m_socket) {
|
|
if ((m_socket->write((const char *)request.GetSerializedBuffer(), request.GetSerializedBytes())) < 0) {
|
|
qWarning() << "send request fail";
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace KDiscovery
|