180 lines
6.4 KiB
C++
180 lines
6.4 KiB
C++
#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);
|
||
|
||
}
|
||
|