1D801Desktop/bluetooth1d801.cpp

200 lines
6.7 KiB
C++
Raw Permalink 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 "bluetooth1d801.h"
using namespace Qt::StringLiterals;
Bluetooth1d801::Bluetooth1d801(QObject *parent):QObject(parent) {
if (localDevice.isValid()) { //при создании экземпляра класса он подключается к свистку
localDevice.powerOn();
localDeviceName = localDevice.name();
qDebug()<< "Итак, имя нашего бт адаптера " <<localDeviceName; // пишет "dongle"
localDevice.setHostMode(QBluetoothLocalDevice::HostDiscoverable);
QList<QBluetoothAddress> remotes;
remotes = localDevice.connectedDevices(); // если например наушники подключены и готовы выплевывает их адрес
// с другими, например сопряженными не работает
qDebug() <<"Подключенные устройства:"<<remotes;
qDebug() <<"если среди них есть 1D801, то что то пошло иначе, чем у разработчика. Попробуйте продолжить работы";
}
}
Bluetooth1d801::~Bluetooth1d801()
{
//отключится от устройства или почикать всё созданное
}
void Bluetooth1d801::startDiscovery()
{
discoveryAgent = new QBluetoothServiceDiscoveryAgent();
connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered,
this, &Bluetooth1d801::serviceDiscovered);
connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished,
this, &Bluetooth1d801::discoveryFinished);
connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::canceled,
this, &Bluetooth1d801::discoveryFinished); //коннект от статика слизал с чата
// начинаем поиск устройств
discoveryAgent->start();
if (discoveryAgent->isActive())
discoveryAgent->stop();
discoveredServices.clear();
// m_discoveryAgent->setUuidFilter(uuid); // можно отфильтровать конкретный сервис
discoveryAgent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
qDebug()<<"Сейчас, я тебе что-нибудь найду";
}
void Bluetooth1d801::stopDiscovery()
{
if (discoveryAgent->isActive()) discoveryAgent->stop();
else {
qDebug()<<"Нечего останавливать";
}
}
void Bluetooth1d801::connectTo(QListWidgetItem *item)
{
// туду проверить, может уже подключен??
QBluetoothServiceInfo service = discoveredServices.value(item);
QBluetoothServiceInfo serviceToConnect = service;
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, &Bluetooth1d801::readSocket);
connect(socket, &QBluetoothSocket::connected, this, QOverload<>::of(&Bluetooth1d801::connected));
connect(socket, &QBluetoothSocket::disconnected, this, &Bluetooth1d801::disconnected);
connect(socket, &QBluetoothSocket::errorOccurred, this, &Bluetooth1d801::onSocketErrorOccurred);
qDebug() << "Мммм.. подключился... ))";
}
void Bluetooth1d801::GetParam()
{
if (!socket){
qDebug()<< "Ты не создал подходящий сокет!!! Я не буду работать!!!";
return;
}
QString message = "Get_Param";
QByteArray text = message.toUtf8() + '\r' + '\n';
socket->write(text);
// взвести коннект
}
void Bluetooth1d801::SetParam()
{
}
void Bluetooth1d801::GetMeas()
{
}
void Bluetooth1d801::GetWave()
{
}
void Bluetooth1d801::GetSpectrum()
{
}
void Bluetooth1d801::GetStatus()
{
}
void Bluetooth1d801::SetTime()
{
}
void Bluetooth1d801::GetSpectrumEnv()
{
}
void Bluetooth1d801::GetWaveEnv()
{
}
void Bluetooth1d801::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_p =new QListWidgetItem(QString::fromLatin1("%1 %2").arg(remoteName, serviceInfo.serviceName()));
discoveredServices.insert(item_p, serviceInfo);
emit discoveryResult(item_p);
//qDebug() << "вот это работает в процедуре addItem" << item_p; // хах, так я определял что должно прелететь в слот родительского класса, ахах
//ui->listWidgetDevice->addItem(item);
}
void Bluetooth1d801::readSocket()
{
// return; // удалить 7.02.2024 - до этого подумать откуда он взялся
while (socket->canReadLine()) {
QByteArray line = socket->readLine().trimmed();
qDebug() << line;
emit rawDataRecived(line);
}
}
void Bluetooth1d801::connected()
{
emit connected(socket->peerName());
}
void Bluetooth1d801::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 Bluetooth1d801::discoveryFinished()
{
//emit discoveryFinishResult(discoveredServices);
}