1D801Desktop/mainwindow.cpp

180 lines
6.4 KiB
C++
Raw Normal View History

2024-02-01 14:27:06 +03:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCore/qmetaobject.h>
#include <QLatin1StringView>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*
if (localDevice.isValid()) { //при создании экземпляра класса он подключается к сввистку
localDevice.powerOn();
localDeviceName = localDevice.name();
qDebug() <<localDeviceName; // пишет "dongle"
localDevice.setHostMode(QBluetoothLocalDevice::HostDiscoverable);
QList<QBluetoothAddress> remotes;
remotes = localDevice.connectedDevices(); // если например наушники подключены и готовы выплевывает их адрес
// с другими, например сопряженными не работает
qDebug() <<remotes;
}
*/
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QBluetoothServiceDiscoveryAgent *discoveryAgent = new QBluetoothServiceDiscoveryAgent(this);
connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered,
this, &MainWindow::serviceDiscovered);
connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished,
this, &MainWindow::discoveryFinished);
connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::canceled,
this, &MainWindow::discoveryFinished); //странный коннект - слизал с бтчата (всмысле с указателями. Наверное это норм для динамических штук)
// начинаем поиск устройств
discoveryAgent->start();
if (discoveryAgent->isActive())
discoveryAgent->stop();
ui->listWidgetDevice->clear();
// m_discoveryAgent->setUuidFilter(uuid); // подумай? может стоит впиздячить его на релизе
discoveryAgent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
ui->labelConnect->setText("Сейчас, я тебе что-нибудь найду");
}
void MainWindow::stopDiscovery()
{/*
if (m_discoveryAgent){
m_discoveryAgent->stop();
}
*/
}
void MainWindow::serviceDiscovered(const QBluetoothServiceInfo &serviceInfo)
{
qDebug() << "Discovered service on"
<< serviceInfo.device().name() << serviceInfo.device().address().toString();
qDebug() << "\tService name:" << serviceInfo.serviceName();
qDebug() << "\tDescription:"
<< serviceInfo.attribute(QBluetoothServiceInfo::ServiceDescription).toString();
qDebug() << "\tProvider:"
<< serviceInfo.attribute(QBluetoothServiceInfo::ServiceProvider).toString();
qDebug() << "\tL2CAP protocol service multiplexer:"
<< serviceInfo.protocolServiceMultiplexer();
qDebug() << "\tRFCOMM server channel:" << serviceInfo.serverChannel();
const QBluetoothAddress address = serviceInfo.device().address();
/* // если находятся много сервисов в одной железке, то названия не дублируются
for (const QBluetoothServiceInfo &info : std::as_const(m_discoveredServices)) {
if (info.device().address() == address)
return; //
}
*/
//! [serviceDiscovered]
QString remoteName;
if (serviceInfo.device().name().isEmpty())
remoteName = address.toString();
else
remoteName = serviceInfo.device().name();
QListWidgetItem *item =new QListWidgetItem(QString::fromLatin1("%1 %2").arg(remoteName, serviceInfo.serviceName()));
discoveredServices.insert(item, serviceInfo);
ui->listWidgetDevice->addItem(item);
//! [serviceDiscovered]
}
void MainWindow::discoveryFinished()
{
ui->labelConnect->setText("Я сделал всё, что мог");
}
void MainWindow::deviceDiscovered(const QBluetoothDeviceInfo &device)
{
ui->listWidgetDevice->addItem(device.name());
qDebug() << "Found new device:" << device.name() << '(' << device.address().toString() << ')';
}
void MainWindow::on_pushButton_2_clicked()
{
auto items = ui->listWidgetDevice->selectedItems();
if (items.size()) {
QListWidgetItem *item = items[0];
QBluetoothServiceInfo service = discoveredServices.value(item);
qDebug() << "Connecting to service" << service.serviceName() //валим инфу в дебаг
<< "on" << service.device().name();
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol); //создание сокета
qDebug() << "Create socket";
socket->connectToService(service);
connect(socket, &QBluetoothSocket::readyRead, this, &MainWindow::readSocket);
connect(socket, &QBluetoothSocket::connected, this, QOverload<>::of(&MainWindow::connected));
connect(socket, &QBluetoothSocket::disconnected, this, &MainWindow::disconnected);
connect(socket, &QBluetoothSocket::errorOccurred, this, &MainWindow::onSocketErrorOccurred);
qDebug() << "ConnectToService done";
ui->labelConnect->setText("Похоже получилось подключится");
}
}
void MainWindow::readSocket()
{
if (!socket)
return;
while (socket->canReadLine()) {
QByteArray line = socket->readLine().trimmed();
qDebug() << line;
ui->listWidgetResponse->addItem(line.toHex());
emit messageReceived(socket->peerName(),
QString::fromUtf8(line.constData(), line.length()));
}
}
void MainWindow::onSocketErrorOccurred(QBluetoothSocket::SocketError error)
{
if (error == QBluetoothSocket::SocketError::NoSocketError)
return;
QMetaEnum metaEnum = QMetaEnum::fromType<QBluetoothSocket::SocketError>();
QString errorString = socket->peerName()// + ' '_L1
+ metaEnum.valueToKey(static_cast<int>(error)) + " occurred"; //_L1;
emit socketErrorOccurred(errorString);
}
void MainWindow::connected()
{
emit connected(socket->peerName());
}
void MainWindow::on_pushButtonGetParam_clicked()
{
if (!socket){
qDebug()<< "Ты не создал подходящий сокет!!! Я не буду работать!!!";
return;
}
QString message = "Get_Param";
QByteArray text = message.toUtf8() + '\r' + '\n';
socket->write(text);
}