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"