Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us MySpace Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Windows Live Favorites 
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Toutes les fonctions  ·  Vues d'ensemble  · 

bluetoothservice.cpp Example File
bluetooth/bluetoothservice/bluetoothservice.cpp

    /****************************************************************************
    **
    ** This file is part of the Qt Extended Commercial Package.
    **
    ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    **
    ** $QT_EXTENDED_DUAL_LICENSE$
    **
    ****************************************************************************/

    #include "bluetoothservice.h"

    #include <QBluetoothAbstractService>
    #include <QBluetoothRfcommSocket>
    #include <QBluetoothRfcommServer>
    #include <QBluetoothSdpRecord>
    #include <QBluetoothLocalDevice>
    #include <QBluetoothAddress>
    #include <QBluetoothServiceController>
    #include <Qtopia>
    #include <QtopiaApplication>

    #include <QLabel>
    #include <QVBoxLayout>
    #include <QFile>
    #include <QDebug>

    class BluetoothSerialPortExampleService : public QBluetoothAbstractService
    {
        Q_OBJECT

    public:
        BluetoothSerialPortExampleService(QObject *parent = 0);
        virtual ~BluetoothSerialPortExampleService();

        virtual void start();
        virtual void stop();
        virtual void setSecurityOptions(QBluetooth::SecurityOptions options);

    private slots:
        void newRfcommConnection();

    private:
        bool startRfcommServer(int rfcommChannel);

        QBluetooth::SecurityOptions m_securityOptions;
        quint32 m_sdpRecordHandle;
        QBluetoothRfcommServer *m_rfcommServer;
    };

    BluetoothSerialPortExampleService::BluetoothSerialPortExampleService(QObject *parent)
        : QBluetoothAbstractService("SerialPortExampleService", tr("Serial Port Example"), parent)
    {
        m_securityOptions = 0;
        m_sdpRecordHandle = 0;
        m_rfcommServer = 0;
    }

    BluetoothSerialPortExampleService::~BluetoothSerialPortExampleService()
    {
    }

    void BluetoothSerialPortExampleService::start()
    {
        if (!m_rfcommServer)
            m_rfcommServer = new QBluetoothRfcommServer(this);

        // Read the SDP record that we want to register for this service.
        QFile file(Qtopia::qtopiaDir() + "/etc/bluetooth/sdp/SerialPortSDPRecord.xml");
        if (!file.exists()) {
            emit started(true, tr("Cannot find SDP record file"));
            return;
        }
        if (!file.open(QIODevice::ReadOnly)) {
            emit started(true, tr("Error reading SDP record file"));
            return;
        }
        QBluetoothSdpRecord record = QBluetoothSdpRecord::fromDevice(&file);
        file.close();

        // QBluetoothAbstractService::registerRecord() registers a SDP record and
        // returns the service record handle for the newly registered service.
        m_sdpRecordHandle = registerRecord(record);
        if (m_sdpRecordHandle == 0) {
            emit started(true, tr("Error registering the SDP service"));
            return;
        }

        int rfcommChannel = QBluetoothSdpRecord::rfcommChannel(record);

        if (!startRfcommServer(rfcommChannel)) {
            // The server could not be started, so clean up and unregister the
            // SDP record using QBluetoothAbstractService::unregisterRecord().
            unregisterRecord(m_sdpRecordHandle);
            m_sdpRecordHandle = 0;

            emit started(true, tr("Error starting RFCOMM server"));
            return;
        }

        qDebug() << "Started example Bluetooth service";
        emit started(false, QString());
    }

    void BluetoothSerialPortExampleService::stop()
    {
        if (m_rfcommServer) {
            m_rfcommServer->close();
            delete m_rfcommServer;
            m_rfcommServer = 0;
        }

        if (!unregisterRecord(m_sdpRecordHandle))
            qDebug() << "Error unregistering the SDP service";
        m_sdpRecordHandle = 0;

        qDebug() << "Stopped example Bluetooth service";
        emit stopped();
    }

    void BluetoothSerialPortExampleService::setSecurityOptions(QBluetooth::SecurityOptions options)
    {
        if (m_rfcommServer)
            m_rfcommServer->setSecurityOptions(options);
        m_securityOptions = options;
    }

    bool BluetoothSerialPortExampleService::startRfcommServer(int rfcommChannel)
    {
        if (!m_rfcommServer->setSecurityOptions(m_securityOptions)) {
            qDebug() << "Error setting security options";
            return false;
        }

        QBluetoothLocalDevice localDevice;
        if (!m_rfcommServer->listen(localDevice.address(), rfcommChannel)) {
            qDebug() << "Error listening on server";
            return false;
        }

        connect(m_rfcommServer, SIGNAL(newConnection()),
                this, SLOT(newRfcommConnection()));
        return true;
    }

    void BluetoothSerialPortExampleService::newRfcommConnection()
    {
        QBluetoothRfcommSocket *socket =
                qobject_cast<QBluetoothRfcommSocket *>(m_rfcommServer->nextPendingConnection());
        if (socket) {
            QByteArray greeting("hello, world!");
            socket->write(greeting);
            connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
            socket->disconnect();
        }
    }

    //=================================================================

    /*
        Normally, Bluetooth services in Qtopia are created as server tasks using
        the QTOPIA_TASK macro from QtopiaServerApplication, so that the service
        will run as a background task.

        However, since this example is running from an application instead of as
        a server task, we will use QtopiaApplication::registerRunningTask() to
        register the service as a task, so that it will continue to run after
        you exit the example application.
    */
    BluetoothService::BluetoothService(QWidget *parent, Qt::WFlags f)
        : QMainWindow(parent, f)
    {
        // This is the string used as the service name in the
        // BluetoothSerialPortExampleService constructor.
        QString serviceName = "SerialPortExampleService";

        // Create the service if it has not already been created (if this
        // application has previously been launched).
        QBluetoothServiceController controller;
        if (!controller.services().contains(serviceName)) {

            BluetoothSerialPortExampleService *service = new BluetoothSerialPortExampleService;
            Q_UNUSED(service);   // silence compiler warning

            // Register the service as a task so it will continue to run after the
            // application is closed.
            QtopiaApplication::instance()->registerRunningTask(
                    "BluetoothServiceExample", this);
        }

        QLabel *label = new QLabel(tr("The <b>%1</b> service has been created.<P>Go to Settings -> Bluetooth, open the context menu and click 'My services' to modify the settings for this service.").arg(controller.displayName(serviceName)));

        label->setWordWrap(true);
        setCentralWidget(label);
    }

    BluetoothService::~BluetoothService()
    {
    }

    #include "bluetoothservice.moc"

Publicité

Best Of

Actualités les plus lues

Semaine
Mois
Année
  1. « Quelque chose ne va vraiment pas avec les développeurs "modernes" », un développeur à "l'ancienne" critique la multiplication des bibliothèques 65
  2. Apercevoir la troisième dimension ou l'utilisation multithreadée d'OpenGL dans Qt, un article des Qt Quarterly traduit par Guillaume Belz 0
  3. Les développeurs ignorent-ils trop les failles découvertes dans leur code ? Prenez-vous en compte les remarques des autres ? 17
  4. BlackBerry 10 : premières images du prochain OS de RIM qui devrait intégrer des widgets et des tuiles inspirées de Windows Phone 0
  5. Quelles nouveautés de C++11 Visual C++ doit-il rapidement intégrer ? Donnez-nous votre avis 10
  6. Adieu qmake, bienvenue qbs : Qt Building Suite, un outil déclaratif et extensible pour la compilation de projets Qt 17
  7. La rubrique Qt a besoin de vous ! 1
Page suivante

Le Qt Developer Network au hasard

Logo

Applications mobiles modernes avec Qt et QML

Le Qt Developer Network est un réseau de développeurs Qt anglophone, où ils peuvent partager leur expérience sur le framework. Lire l'article.

Communauté

Ressources

Liens utiles

Contact

  • Vous souhaitez rejoindre la rédaction ou proposer un tutoriel, une traduction, une question... ? Postez dans le forum Contribuez ou contactez-nous par MP ou par email (voir en bas de page).

Qt dans le magazine

Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. Qt qtextended4.4
Copyright © 2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vous avez déniché une erreur ? Un bug ? Une redirection cassée ? Ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP !
 
 
 
 
Partenaires

Hébergement Web