File indexing completed on 2024-04-28 03:52:07

0001 /*
0002  * SPDX-FileCopyrightText: 2019 Manuel Weichselbaumer <mincequi@web.de>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005  */
0006 
0007 #include "leserver.h"
0008 
0009 #include <QCoreApplication>
0010 #include <QDebug>
0011 
0012 #include "adapter.h"
0013 #include "device.h"
0014 #include "gattapplication.h"
0015 #include "gattcharacteristic.h"
0016 #include "gattdescriptor.h"
0017 #include "gattmanager.h"
0018 #include "gattservice.h"
0019 #include "initmanagerjob.h"
0020 #include "leadvertisement.h"
0021 #include "leadvertisingmanager.h"
0022 #include "manager.h"
0023 #include "pendingcall.h"
0024 
0025 using namespace BluezQt;
0026 
0027 LeServer::LeServer(Manager *manager, QObject *parent)
0028     : QObject(parent)
0029     , m_manager(manager)
0030 {
0031     auto advertisement = new LEAdvertisement({QStringLiteral("ad100000-d901-11e8-9f8b-f2801f1b9fd1")}, this);
0032     auto call = m_manager->usableAdapter()->leAdvertisingManager()->registerAdvertisement(advertisement);
0033     connect(call, &PendingCall::finished, this, [](BluezQt::PendingCall *call) {
0034         if (call->error()) {
0035             qWarning() << "Register advertisement error: " << call->errorText();
0036             return;
0037         }
0038     });
0039 
0040     auto application = new GattApplication(QStringLiteral("/org/kde/bluezqt"), this);
0041     auto service = new GattService(QStringLiteral("ad100000-d901-11e8-9f8b-f2801f1b9fd1"), true, application);
0042 
0043     GattCharacteristic *characteristic = new GattCharacteristic(QStringLiteral("ad10e100-d901-11e8-9f8b-f2801f1b9fd1"), service);
0044     GattDescriptor::createUserDescription(QLatin1String("MyCharacteristic"), characteristic);
0045 
0046     m_notifyingCharacteristic =
0047         new GattCharacteristic(QStringLiteral("ad10e100-d902-11e8-9f8b-f2801f1b9fd1"), {QStringLiteral("read"), QStringLiteral("notify")}, service);
0048 
0049     auto call2 = m_manager->usableAdapter()->gattManager()->registerApplication(application);
0050 
0051     connect(call2, &PendingCall::finished, this, [](BluezQt::PendingCall *call) {
0052         if (call->error()) {
0053             qWarning() << "Register application error: " << call->errorText();
0054             return;
0055         }
0056     });
0057 
0058     m_characteristicWriteTimer.setInterval(std::chrono::seconds(1));
0059     m_characteristicWriteTimer.setSingleShot(false);
0060     m_characteristicWriteTimer.start();
0061 
0062     static int charValue = 1;
0063     QObject::connect(&m_characteristicWriteTimer, &QTimer::timeout, [this]() {
0064         m_notifyingCharacteristic->writeValue(QByteArray::number(charValue++));
0065     });
0066 }
0067 
0068 int main(int argc, char **argv)
0069 {
0070     QCoreApplication app(argc, argv);
0071 
0072     qDebug() << "Advertising LE services. Ctrl + C to cancel...";
0073 
0074     Manager *manager = new Manager();
0075     InitManagerJob *initJob = manager->init();
0076     initJob->exec();
0077     if (initJob->error()) {
0078         qWarning() << "Error initializing manager:" << initJob->errorText();
0079         return 1;
0080     }
0081 
0082     if (!manager->usableAdapter()) {
0083         qWarning() << "No usable adapter";
0084         return 2;
0085     }
0086     if (!manager->usableAdapter()->leAdvertisingManager()) {
0087         qWarning() << "No LE advertising manager";
0088         return 2;
0089     }
0090     if (!manager->usableAdapter()->gattManager()) {
0091         qWarning() << "No GATT manager";
0092         return 2;
0093     }
0094 
0095     new LeServer(manager);
0096 
0097     return app.exec();
0098 }
0099 
0100 #include "moc_leserver.cpp"