1D801Desktop/mainwindow.cpp

180 lines
6.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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);
}