From 316a17406b894bcdabad2faaeaba18ab0abdc352 Mon Sep 17 00:00:00 2001 From: Nedim Hadzic Date: Mon, 16 Dec 2013 02:12:22 +0100 Subject: Implemented Bluetooth Low Energy: examples Examples which illustrate how to use BLE API are implemented. First example is an application for discovering LE devices, services and characteristics. Change-Id: Ic144c78499b74934541837df9a53183b4e7e32f7 Reviewed-by: Alex Blasche Reviewed-by: Fabian Bumberger --- .../lowenergyscanner/assets/Characteristics.qml | 128 ++++++++++++ .../bluetooth/lowenergyscanner/assets/Dialog.qml | 57 ++++++ .../bluetooth/lowenergyscanner/assets/Header.qml | 57 ++++++ .../bluetooth/lowenergyscanner/assets/Label.qml | 49 +++++ .../bluetooth/lowenergyscanner/assets/Menu.qml | 86 ++++++++ .../bluetooth/lowenergyscanner/assets/Services.qml | 115 +++++++++++ .../bluetooth/lowenergyscanner/assets/main.qml | 123 ++++++++++++ .../lowenergyscanner/characteristicinfo.cpp | 107 ++++++++++ .../lowenergyscanner/characteristicinfo.h | 74 +++++++ examples/bluetooth/lowenergyscanner/device.cpp | 217 +++++++++++++++++++++ examples/bluetooth/lowenergyscanner/device.h | 111 +++++++++++ examples/bluetooth/lowenergyscanner/deviceinfo.cpp | 72 +++++++ examples/bluetooth/lowenergyscanner/deviceinfo.h | 70 +++++++ .../lowenergyscanner/lowenergyscanner.pro | 33 ++++ examples/bluetooth/lowenergyscanner/main.cpp | 60 ++++++ examples/bluetooth/lowenergyscanner/resources.qrc | 11 ++ .../bluetooth/lowenergyscanner/serviceinfo.cpp | 68 +++++++ examples/bluetooth/lowenergyscanner/serviceinfo.h | 66 +++++++ 18 files changed, 1504 insertions(+) create mode 100644 examples/bluetooth/lowenergyscanner/assets/Characteristics.qml create mode 100644 examples/bluetooth/lowenergyscanner/assets/Dialog.qml create mode 100644 examples/bluetooth/lowenergyscanner/assets/Header.qml create mode 100644 examples/bluetooth/lowenergyscanner/assets/Label.qml create mode 100644 examples/bluetooth/lowenergyscanner/assets/Menu.qml create mode 100644 examples/bluetooth/lowenergyscanner/assets/Services.qml create mode 100644 examples/bluetooth/lowenergyscanner/assets/main.qml create mode 100644 examples/bluetooth/lowenergyscanner/characteristicinfo.cpp create mode 100644 examples/bluetooth/lowenergyscanner/characteristicinfo.h create mode 100644 examples/bluetooth/lowenergyscanner/device.cpp create mode 100644 examples/bluetooth/lowenergyscanner/device.h create mode 100644 examples/bluetooth/lowenergyscanner/deviceinfo.cpp create mode 100644 examples/bluetooth/lowenergyscanner/deviceinfo.h create mode 100644 examples/bluetooth/lowenergyscanner/lowenergyscanner.pro create mode 100644 examples/bluetooth/lowenergyscanner/main.cpp create mode 100644 examples/bluetooth/lowenergyscanner/resources.qrc create mode 100644 examples/bluetooth/lowenergyscanner/serviceinfo.cpp create mode 100644 examples/bluetooth/lowenergyscanner/serviceinfo.h (limited to 'examples/bluetooth/lowenergyscanner') diff --git a/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml b/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml new file mode 100644 index 00000000..6420e893 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml @@ -0,0 +1,128 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + width: 300 + height: 600 + + Header { + id: header + anchors.top: parent.top + headerText: "Characteristics list" + } + + Dialog { + id: info + anchors.centerIn: parent + visible: false + } + + ListView { + id: characteristicview + width: parent.width + + anchors.top: header.bottom + anchors.bottom: menu.top + model: device.characteristicList + + delegate: Rectangle { + id: characteristicbox + height:350 + width: parent.width + + Component.onCompleted: menu.menuText = "Back" + + Label { + id: characteristicName1 + textContent: modelData.characteristicName + anchors.top: parent.top + anchors.topMargin: 5 + + } + + Label { + id: characteristicUuid1 + textContent: modelData.characteristicUuid + anchors.verticalCenter: parent.verticalCenter + } + + Label { + id: characteristicValue + textContent: ("Value: " + modelData.characteristicValue) + anchors.bottom: characteristicHandle.top + anchors.topMargin: 5 + } + + Label { + id: characteristicHandle + textContent: ("Handlers: " + modelData.characteristicHandle) + anchors.bottom: characteristicPermission.top + anchors.topMargin: 5 + } + + Label { + id: characteristicPermission + textContent: modelData.characteristicPermission + anchors.bottom: parent.bottom + anchors.topMargin: 10 + } + + Rectangle { + id: bottomarea + anchors.bottom: characteristicbox.bottom + width: parent.width + height: 2 + color: "#363636" + } + + } + } + + Menu { + id: menu + anchors.bottom: parent.bottom + menuWidth: parent.width + menuText: device.update + menuHeight: (parent.height/6) + onButtonClick: {device.disconnectFromService(); pageLoader.source = "Services.qml"} + } +} diff --git a/examples/bluetooth/lowenergyscanner/assets/Dialog.qml b/examples/bluetooth/lowenergyscanner/assets/Dialog.qml new file mode 100644 index 00000000..002055f4 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/assets/Dialog.qml @@ -0,0 +1,57 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + width: parent.width/2 + height: 62 + z: 50 + property string dialogText: "" + border.width: 1 + border.color: "#363636" + radius: 10 + + Text { + anchors.centerIn: parent + text: dialogText + color: "#363636" + } +} diff --git a/examples/bluetooth/lowenergyscanner/assets/Header.qml b/examples/bluetooth/lowenergyscanner/assets/Header.qml new file mode 100644 index 00000000..c33a0692 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/assets/Header.qml @@ -0,0 +1,57 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + width: parent.width + height: 70 + border.width: 1 + border.color: "#363636" + property string headerText: "" + + Text { + anchors.centerIn: parent + text: headerText + font.bold: true + font.pixelSize: 30 + color: "#363636" + } +} diff --git a/examples/bluetooth/lowenergyscanner/assets/Label.qml b/examples/bluetooth/lowenergyscanner/assets/Label.qml new file mode 100644 index 00000000..e22bca26 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/assets/Label.qml @@ -0,0 +1,49 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Text { + property string textContent: "" + font.pixelSize: 30 + anchors.horizontalCenter: parent.horizontalCenter + color: "#363636" + text: textContent +} diff --git a/examples/bluetooth/lowenergyscanner/assets/Menu.qml b/examples/bluetooth/lowenergyscanner/assets/Menu.qml new file mode 100644 index 00000000..dcd2b89d --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/assets/Menu.qml @@ -0,0 +1,86 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +**$QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + + property real menuWidth: 100 + property real menuHeight: 50 + property string menuText: "Search" + signal buttonClick() + + height: menuHeight + width: menuWidth + + Rectangle { + id: search + width: parent.width + height: parent.height + color: "#363636" + border.width: 1 + border.color: "#E3E3E3" + radius: 10 + Text { + id: searchText + anchors.centerIn: parent + text: menuText + color: "#E3E3E3" + } + + MouseArea { + anchors.fill: parent + onPressed: { + search.width = search.width - 7 + search.height = search.height - 5 + } + + onReleased: { + search.width = search.width + 7 + search.height = search.height + 5 + } + + onClicked: { + ColorAnimation: { to: "#4D4C4C"; duration: 200 } + buttonClick() + } + } + } +} diff --git a/examples/bluetooth/lowenergyscanner/assets/Services.qml b/examples/bluetooth/lowenergyscanner/assets/Services.qml new file mode 100644 index 00000000..31775884 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/assets/Services.qml @@ -0,0 +1,115 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + width: 300 + height: 600 + + Header { + id: header + anchors.top: parent.top + headerText: "Services list" + } + + Dialog { + id: info + anchors.centerIn: parent + visible: false + } + + Component.onCompleted: { info.visible = true; info.dialogText = "Scanning for services...";} + + ListView { + id: servicesview + width: parent.width + anchors.top: header.bottom + anchors.bottom: menu.top + model: device.servicesList + + delegate: Rectangle { + id: servicebox + height:140 + width: parent.width + Component.onCompleted: info.visible = false + + MouseArea { + anchors.fill: parent + onPressed: { servicebox.height= 135; bottomarea.height = 7} + onReleased: { servicebox.height= 140; bottomarea.height = 2} + onClicked: { device.connectToService(modelData.serviceUuid); pageLoader.source = "Characteristics.qml";} + + } + + Label { + id: serviceName1 + textContent: modelData.serviceName + anchors.top: parent.top + anchors.topMargin: 5 + } + + Label { + id: serviceUuid + textContent: modelData.serviceUuid + anchors.bottom: bottomarea.top + anchors.bottomMargin: 5 + } + + Rectangle { + id: bottomarea + anchors.bottom: servicebox.bottom + width: parent.width + height: 2 + color: "#363636" + } + + } + } + + Menu { + id: menu + anchors.bottom: parent.bottom + menuWidth: parent.width + menuText: "Back" + menuHeight: (parent.height/6) + onButtonClick: pageLoader.source = "main.qml" + } +} diff --git a/examples/bluetooth/lowenergyscanner/assets/main.qml b/examples/bluetooth/lowenergyscanner/assets/main.qml new file mode 100644 index 00000000..3c4e27ea --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/assets/main.qml @@ -0,0 +1,123 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + id: back + width: 300 + height: 600 + + Header { + id: header + anchors.top: parent.top + headerText: "Start a Device Discovery" + } + + Dialog { + id: info + anchors.centerIn: parent + visible: false + } + + ListView { + id: theListView + width: parent.width + + anchors.top: header.bottom + anchors.bottom: menu.top + model: device.devicesList + + delegate: Rectangle { + id: box + height:140 + width: parent.width + Component.onCompleted: { info.visible = false; + header.headerText = "Select a device"; + } + + MouseArea { + anchors.fill: parent + onPressed: { box.height= 135; downpart.height = 7} + onReleased: { box.height= 140; downpart.height = 2} + onClicked: {device.scanServices(modelData.deviceAddress); pageLoader.source = "Services.qml"} + + } + + Label { + id: deviceName1 + textContent: modelData.deviceName + anchors.top: parent.top + anchors.topMargin: 5 + } + + Label { + id: deviceAddress1 + textContent: modelData.deviceAddress + anchors.bottom: downpart.top + anchors.bottomMargin: 5 + } + + Rectangle { + id: downpart + anchors.bottom: box.bottom + width: parent.width + height: 2 + color: "#363636" + } + + } + } + + Menu { + id: menu + anchors.bottom: parent.bottom + menuWidth: parent.width + menuHeight: (parent.height/6) + menuText: device.update + onButtonClick: { device.startDeviceDiscovery(); info.dialogText = "Searching..."; info.visible = true;} + } + + Loader { + id: pageLoader + anchors.fill: parent + + } +} diff --git a/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp b/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp new file mode 100644 index 00000000..1d6bfa21 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp @@ -0,0 +1,107 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "characteristicinfo.h" +#include "qbluetoothuuid.h" +#include + +CharacteristicInfo::CharacteristicInfo(): + m_characteristic(QLowEnergyCharacteristicInfo()) +{ +} + +CharacteristicInfo::CharacteristicInfo(const QLowEnergyCharacteristicInfo &characteristic): + m_characteristic(characteristic) +{ + emit characteristicChanged(); +} + +void CharacteristicInfo::setCharacteristic(const QLowEnergyCharacteristicInfo &characteristic) +{ + m_characteristic = QLowEnergyCharacteristicInfo(characteristic); + emit characteristicChanged(); +} + +QString CharacteristicInfo::getName() const +{ + return m_characteristic.name(); +} + +QString CharacteristicInfo::getUuid() const +{ + return m_characteristic.uuid().toString().remove(QLatin1Char('{')).remove(QLatin1Char('}')); +} + +QString CharacteristicInfo::getValue() const +{ + // All characteristics values are in hexadecimal format. + QString hexvalue = ""; + QByteArray a = m_characteristic.value(); + for (int i = 0; i < a.size(); i++){ + hexvalue.append(a.at(i));} + return hexvalue; +} + +QString CharacteristicInfo::getHandle() const +{ + return m_characteristic.handle(); +} + +QString CharacteristicInfo::getPermission() const +{ + QString properties = "Properties:"; + int permission = m_characteristic.permissions(); + if (permission & QLowEnergyCharacteristicInfo::Read) + properties = properties + QStringLiteral(" Read"); + if (permission & QLowEnergyCharacteristicInfo::Write) + properties = properties + QStringLiteral(" Write"); + if (permission & QLowEnergyCharacteristicInfo::Notify) + properties = properties + QStringLiteral(" Notify"); + if (permission & QLowEnergyCharacteristicInfo::Indicate) + properties = properties + QStringLiteral(" Indicate"); + if (permission & QLowEnergyCharacteristicInfo::ExtendedProperty) + properties = properties + QStringLiteral(" ExtendedProperty"); + return properties; +} + +QLowEnergyCharacteristicInfo CharacteristicInfo::getCharacteristic() const +{ + return m_characteristic; +} diff --git a/examples/bluetooth/lowenergyscanner/characteristicinfo.h b/examples/bluetooth/lowenergyscanner/characteristicinfo.h new file mode 100644 index 00000000..7f746960 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/characteristicinfo.h @@ -0,0 +1,74 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CHARACTERISTICINFO_H +#define CHARACTERISTICINFO_H +#include +#include +#include + +class CharacteristicInfo: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString characteristicName READ getName NOTIFY characteristicChanged) + Q_PROPERTY(QString characteristicUuid READ getUuid NOTIFY characteristicChanged) + Q_PROPERTY(QString characteristicValue READ getValue NOTIFY characteristicChanged) + Q_PROPERTY(QString characteristicHandle READ getHandle NOTIFY characteristicChanged) + Q_PROPERTY(QString characteristicPermission READ getPermission NOTIFY characteristicChanged) + +public: + CharacteristicInfo(); + CharacteristicInfo(const QLowEnergyCharacteristicInfo &characteristic); + void setCharacteristic(const QLowEnergyCharacteristicInfo &characteristic); + QString getName() const; + QString getUuid() const; + QString getValue() const; + QString getHandle() const; + QString getPermission() const; + QLowEnergyCharacteristicInfo getCharacteristic() const; + +Q_SIGNALS: + void characteristicChanged(); + +private: + QLowEnergyCharacteristicInfo m_characteristic; +}; + +#endif // CHARACTERISTICINFO_H diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp new file mode 100644 index 00000000..50d51631 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/device.cpp @@ -0,0 +1,217 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "device.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Device::Device(): + localDevice(new QBluetoothLocalDevice()), m_message(QString()), connected(false) +{ + if (localDevice->allDevices().size() == 0) { + setUpdate("Bluetooth adapter not discovered"); + m_adapterPresent = false; + } + else + m_adapterPresent = true; + QBluetoothAddress adapterAddress(localDevice->address()); + discoveryAgent = new QBluetoothDeviceDiscoveryAgent(adapterAddress); + connect(discoveryAgent, SIGNAL(deviceDiscovered(const QBluetoothDeviceInfo&)), + this, SLOT(addDevice(const QBluetoothDeviceInfo&))); + connect(discoveryAgent, SIGNAL(finished()), this, SLOT(scanFinished())); + serviceDiscoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress); + + setUpdate("Search"); +} + +Device::~Device() +{ + delete discoveryAgent; + delete localDevice; + delete serviceDiscoveryAgent; + qDeleteAll(devices); + qDeleteAll(m_services); + qDeleteAll(m_characteristics); + devices.clear(); + m_services.clear(); + m_characteristics.clear(); +} + +void Device::startDeviceDiscovery() +{ + if (m_adapterPresent) { + devices.clear(); + setUpdate("Scanning for devices ..."); + discoveryAgent->start(); + } + else + setUpdate("Bluetooth adapter not discovered"); +} + +void Device::addDevice(const QBluetoothDeviceInfo &info) +{ + if (info.coreConfiguration() == QBluetoothDeviceInfo::LowEnergyCoreConfiguration) { + DeviceInfo *d = new DeviceInfo(info); + devices.append(d); + setUpdate("Last device added: " + d->getName()); + } +} + +void Device::scanFinished() +{ + Q_EMIT devicesDone(); + setUpdate("Done! Scan Again!"); +} + +QVariant Device::getDevices() +{ + return QVariant::fromValue(devices); +} + +QVariant Device::getServices() +{ + return QVariant::fromValue(m_services); +} + +QVariant Device::getCharacteristics() +{ + return QVariant::fromValue(m_characteristics); +} + +QString Device::getUpdate() +{ + return m_message; +} + +void Device::scanServices(QString address) +{ + // We need the current device for service discovery. + for (int i = 0; i < devices.size(); i++) { + if (((DeviceInfo*)devices.at(i))->getAddress() == address ) { + currentDevice.setDevice(((DeviceInfo*)devices.at(i))->getDevice()); + } + } + + m_services.clear(); + //Connecting signals and slots for service discovery + QBluetoothDeviceInfo dev = currentDevice.getDevice(); + connect(serviceDiscoveryAgent, SIGNAL(serviceDiscovered(const QLowEnergyServiceInfo&)), + this, SLOT(addLowEnergyService(const QLowEnergyServiceInfo&))); + connect(serviceDiscoveryAgent, SIGNAL(finished()), this, SLOT(serviceScanDone())); + serviceDiscoveryAgent->setRemoteAddress(dev.address()); + serviceDiscoveryAgent->start(); + setUpdate("Scanning for services..."); + + // Connecting signals and slots for connecting to LE services. + info = new QLowEnergyController(); + connect(info, SIGNAL(connected(QLowEnergyServiceInfo)), this, SLOT(serviceConnected(QLowEnergyServiceInfo))); + connect(info, SIGNAL(error(QLowEnergyServiceInfo)), this, SLOT(errorReceived(QLowEnergyServiceInfo))); + connect(info, SIGNAL(disconnected(QLowEnergyServiceInfo)), this, SLOT(serviceDisconnected(QLowEnergyServiceInfo))); +} + +void Device::addLowEnergyService(const QLowEnergyServiceInfo &service) +{ + ServiceInfo *serv = new ServiceInfo(service); + m_services.append(serv); +} + +void Device::serviceScanDone() +{ + Q_EMIT servicesDone(); + setUpdate("Service scan done!"); +} + +void Device::connectToService(const QString &uuid) +{ + QString serviceUuid = uuid; + serviceUuid = serviceUuid.remove(QLatin1Char('{')).remove(QLatin1Char('}')); + QBluetoothUuid u(serviceUuid); + qDebug() << u; + QLowEnergyServiceInfo a; + for (int i = 0; i < m_services.size(); i++) { + ServiceInfo *service = (ServiceInfo*)m_services.at(i); + a = QLowEnergyServiceInfo(service->getLeService()); + if (a.uuid() == u) + info->connectToService(a); + } +} + +void Device::serviceConnected(const QLowEnergyServiceInfo &service) +{ + m_characteristics.clear(); + setUpdate("Service connected!"); + connected = true; + for (int i = 0; i < service.characteristics().size(); i++) { + CharacteristicInfo *chars = new CharacteristicInfo((QLowEnergyCharacteristicInfo)service.characteristics().at(i)); + m_characteristics.append(chars); + } + emit characteristicsDone(); +} + +void Device::errorReceived(const QLowEnergyServiceInfo &service) +{ + qDebug() << "Error: " << service.errorString(); + setUpdate(service.errorString()); +} + +void Device::setUpdate(QString message) +{ + m_message = message; + emit updateChanged(); +} + +void Device::disconnectFromService() +{ + if (connected) + info->disconnectFromService(); +} + +void Device::serviceDisconnected(const QLowEnergyServiceInfo &service) +{ + setUpdate("Service Disconnected"); +} diff --git a/examples/bluetooth/lowenergyscanner/device.h b/examples/bluetooth/lowenergyscanner/device.h new file mode 100644 index 00000000..00833eac --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/device.h @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the demonstration applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DEVICE_H +#define DEVICE_H + +#include +#include +#include +#include +#include +#include "deviceinfo.h" +#include "qlowenergyserviceinfo.h" +#include "serviceinfo.h" +#include "characteristicinfo.h" + +QT_FORWARD_DECLARE_CLASS (QBluetoothDeviceDiscoveryAgent) +QT_FORWARD_DECLARE_CLASS (QBluetoothDeviceInfo) +QT_FORWARD_DECLARE_CLASS (QBluetoothServiceDiscoveryAgent) +QT_FORWARD_DECLARE_CLASS (QLowEnergyServiceInfo) +QT_FORWARD_DECLARE_CLASS (QLowEnergyCharacteristicInfo) +QT_FORWARD_DECLARE_CLASS (QLowEnergyController) +QT_FORWARD_DECLARE_CLASS (QBluetoothServiceInfo) + +class Device: public QObject +{ + Q_OBJECT + Q_PROPERTY(QVariant devicesList READ getDevices NOTIFY devicesDone) + Q_PROPERTY(QVariant servicesList READ getServices NOTIFY servicesDone) + Q_PROPERTY(QVariant characteristicList READ getCharacteristics NOTIFY characteristicsDone) + Q_PROPERTY(QString update READ getUpdate NOTIFY updateChanged) +public: + Device(); + ~Device(); + QVariant getDevices(); + QVariant getServices(); + QVariant getCharacteristics(); + QString getUpdate(); + +public slots: + void addDevice(const QBluetoothDeviceInfo&); + void startDeviceDiscovery(); + void scanFinished(); + void scanServices(QString address); + void addLowEnergyService(const QLowEnergyServiceInfo&); + void serviceScanDone(); + void serviceConnected(const QLowEnergyServiceInfo &service); + void connectToService(const QString &uuid); + void errorReceived(const QLowEnergyServiceInfo &service); + void disconnectFromService(); + void serviceDisconnected(const QLowEnergyServiceInfo &service); + +Q_SIGNALS: + void devicesDone(); + void servicesDone(); + void characteristicsDone(); + void updateChanged(); + +private: + void setUpdate(QString message); + bool m_adapterPresent; + QBluetoothDeviceDiscoveryAgent *discoveryAgent; + QBluetoothLocalDevice *localDevice; + QBluetoothServiceDiscoveryAgent *serviceDiscoveryAgent; + DeviceInfo currentDevice; + QList devices; + QList m_services; + QList m_characteristics; + QString m_message; + bool connected; + QLowEnergyController *info; +}; + +#endif // DEVICE_H diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp new file mode 100644 index 00000000..433caf6c --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp @@ -0,0 +1,72 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "deviceinfo.h" + +DeviceInfo::DeviceInfo() +{ + device = QBluetoothDeviceInfo(); +} + +DeviceInfo::DeviceInfo(const QBluetoothDeviceInfo &d) +{ + device = QBluetoothDeviceInfo(d); + Q_EMIT deviceChanged(); +} + +QString DeviceInfo::getAddress() +{ + return device.address().toString(); +} + +QString DeviceInfo::getName() +{ + return device.name(); +} + +QBluetoothDeviceInfo DeviceInfo::getDevice() +{ + return device; +} + +void DeviceInfo::setDevice(const QBluetoothDeviceInfo &dev) +{ + device = QBluetoothDeviceInfo(dev); +} diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.h b/examples/bluetooth/lowenergyscanner/deviceinfo.h new file mode 100644 index 00000000..9d4116b4 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/deviceinfo.h @@ -0,0 +1,70 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DEVICEINFO_H +#define DEVICEINFO_H + +#include +#include +#include +#include +#include "deviceinfo.h" + +class DeviceInfo: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString deviceName READ getName NOTIFY deviceChanged) + Q_PROPERTY(QString deviceAddress READ getAddress NOTIFY deviceChanged) +public: + DeviceInfo(); + DeviceInfo(const QBluetoothDeviceInfo &d); + QString getAddress(); + QString getName(); + QBluetoothDeviceInfo getDevice(); + void setDevice(const QBluetoothDeviceInfo &dev); + +Q_SIGNALS: + void deviceChanged(); + +private: + QBluetoothDeviceInfo device; +}; + +#endif // DEVICEINFO_H diff --git a/examples/bluetooth/lowenergyscanner/lowenergyscanner.pro b/examples/bluetooth/lowenergyscanner/lowenergyscanner.pro new file mode 100644 index 00000000..2a8320c7 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/lowenergyscanner.pro @@ -0,0 +1,33 @@ +TARGET = lowenergyscanner +INCLUDEPATH += . + +QT += quick bluetooth + +# Input +SOURCES += main.cpp \ + device.cpp \ + deviceinfo.cpp \ + serviceinfo.cpp \ + characteristicinfo.cpp + +OTHER_FILES += assets/Menu.qml \ + assets/Services.qml \ + bar-descriptor.xml \ + assets/Characteristics.qml \ + assets/Details.qml \ + bar-descriptor.xml \ + assets/Dialog.qml \ + assets/Header.qml \ + assets/Label.qml + +HEADERS += \ + device.h \ + deviceinfo.h \ + serviceinfo.h \ + characteristicinfo.h + +RESOURCES += \ + resources.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/bluetooth/lowenergyscanner +INSTALLS += target diff --git a/examples/bluetooth/lowenergyscanner/main.cpp b/examples/bluetooth/lowenergyscanner/main.cpp new file mode 100644 index 00000000..1a8487c8 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/main.cpp @@ -0,0 +1,60 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include "device.h" + + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + + Device d; + QQuickView *view = new QQuickView; + view->rootContext()->setContextProperty("device", &d); + + view->setSource(QUrl("qrc:/assets/main.qml")); + view->setResizeMode(QQuickView::SizeRootObjectToView); + view->show(); + return app.exec(); +} diff --git a/examples/bluetooth/lowenergyscanner/resources.qrc b/examples/bluetooth/lowenergyscanner/resources.qrc new file mode 100644 index 00000000..49a518e8 --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/resources.qrc @@ -0,0 +1,11 @@ + + + assets/Characteristics.qml + assets/main.qml + assets/Menu.qml + assets/Services.qml + assets/Header.qml + assets/Dialog.qml + assets/Label.qml + + diff --git a/examples/bluetooth/lowenergyscanner/serviceinfo.cpp b/examples/bluetooth/lowenergyscanner/serviceinfo.cpp new file mode 100644 index 00000000..471fb40a --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/serviceinfo.cpp @@ -0,0 +1,68 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "serviceinfo.h" + +ServiceInfo::ServiceInfo(): + m_serviceLe(QLowEnergyServiceInfo()) +{ + +} + +ServiceInfo::ServiceInfo(const QLowEnergyServiceInfo &service): + m_serviceLe(service) +{ + +} + +QLowEnergyServiceInfo ServiceInfo::getLeService() const +{ + return m_serviceLe; +} + +QString ServiceInfo::getName() +{ + return m_serviceLe.name(); +} + +QString ServiceInfo::getUuid() +{ + return m_serviceLe.uuid().toString().remove(QLatin1Char('{')).remove(QLatin1Char('}')); +} diff --git a/examples/bluetooth/lowenergyscanner/serviceinfo.h b/examples/bluetooth/lowenergyscanner/serviceinfo.h new file mode 100644 index 00000000..7605119f --- /dev/null +++ b/examples/bluetooth/lowenergyscanner/serviceinfo.h @@ -0,0 +1,66 @@ +/*************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SERVICEINFO_H +#define SERVICEINFO_H +#include +#include "qlowenergyserviceinfo.h" +#include "qbluetoothuuid.h" + +class ServiceInfo: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString serviceName READ getName NOTIFY serviceChanged) + Q_PROPERTY(QString serviceUuid READ getUuid NOTIFY serviceChanged) +public: + ServiceInfo(); + ServiceInfo(const QLowEnergyServiceInfo &service); + QLowEnergyServiceInfo getLeService() const; + QString getUuid(); + QString getName(); + +Q_SIGNALS: + void serviceChanged(); + +private: + QLowEnergyServiceInfo m_serviceLe; +}; + +#endif // SERVICEINFO_H -- cgit v1.2.3