Nokianfcdevelopment1 0-1-110423141942 Phpapp02

Embed Size (px)

Citation preview

  • NFC Development with Qt on Symbian and MeeGo

    1 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    NFC Forum and the NFC Forum logo are trademarks of the Near Field Communication Forum.

    Andreas Jakl

    [@mopius]

    nfcinteractor.com

    Technology Wizard

    Nokia

    NFC Introduction bit.ly/NfcIntro Windows (Phone) 8 NFC App Scenarios bit.ly/NFCAppScenarios NFC Development on the Windows 8 Platform bit.ly/Win8NFC R

    ela

    ted

    Pre

    sen

    tati

    on

    s

  • 2

    NFC Development

    2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • NFC Development Alternatives

    3 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Java ME

    Works on Series 40 and Symbian devices.

    Limited use of smartphone features.

    Qt Mobility

    Cross-platform API.

    Best flexibility and ease of app

    development.

    Symbian Native

    Low level control over devices NFC support.

    More complex, platform knowledge required.

    Windows Phone 8

    Proximity APIs Similar on Windows 8

    Extra presentation: bit.ly/Win8NFC

    Lumia 610 NFC WP7 bit.ly/WpNfc

  • 4 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    NFC Developer Offering

    Tools

    Qt Development

    Qt SDK 1.2 Qt Mobility 1.2

    Symbian Development

    Symbian Belle SDK

    Java ME development

    Nokia 6212 Classic NFC SDK or Symbian Belle SDK

    Channel

    Nokia Store NFC Collection

  • 5 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Java ME NFC Development

    Both free IDEs come with

    extensive, generic Java ME support

    on board.

    Extend with Nokia 6212 Classic NFC SDK (or Symbian Belle SDK)*

    * http://www.developer.nokia.com/Community/Wiki/Developing_NFC_Applications#Java_ME_based_development

  • Contactless Communication API

    6 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    JSR 257

    Tag discovery and data exchange

    NDEF messages

    Example project: Nfc Creator

    https://projects.developer.nokia.com/

    nfccreator

  • Symbian Platform NFC API Exposes NFC middleware at the platform level

    Aimed at Symbian platform developers

    Platform specific coding/skills needed

    Low abstraction

    Development

    Carbide.c++ IDE

    Symbian Belle SDK

    Optional: Qt for Symbian

    7 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • 8

    Qt Mobility NFC

    2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • 9 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    What is Qt?

    Developer

    Publish to Nokia Store (Symbian, MeeGo) Windows Linux Mac Embedded

    App Source Code

    Using Qt SDK for Dev. environment Testing Translation Help

    Using Qt framework for User Interface Networking Location (GPS) Web integration ...

  • Qt NFC Development Requirements

    Qt SDK 1.2 Contains: Qt 4.7.4, Qt Mobility 1.2

    Windows: Nokia Suite

    Symbian Nokia C7 / 801T with Symbian Anna / Belle

    or 603 / 700 / 701 / 808 with Nokia Belle+

    Install Qt SDKs Symbian Anna or Belle target *

    MeeGo Nokia N9

    Install Qt SDKs MeeGo Harmattan target

    10 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    More information: bit.ly/StartNfc

    * Apps compiled with the Symbian Anna target are compatible to Symbian^3, Anna & Belle.

  • 11 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Qt Mobility

    Mobility 1.0

    Bearer Management API Contacts Location Messaging Multimedia Publish and Subscribe Service Framework Sensors System Information Versit

    Mobility 1.1

    Camera Document Gallery Feedback Landmarks Maps/Navigation Organizer Service Framework Out of process

    Mobility 1.2

    Connectivity (Bluetooth, NFC)

  • Qt Mobility 1.2 NFC Interact with

    NFC Forum tags

    Target detection

    NDEF message handlers

    Reading and writing NDEF messages

    Send tag specific commands

    Register for app autostart on tag touch

    NFC Forum devices

    LLCP peer-to-peer sockets

    12 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • 13 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    API Overview* QNearFieldManager

    Detects and filters targets

    QLlcpServer Listen for new server socket connections.

    QNearFieldTarget Query properties,

    read/write messages, send commands or

    establish a client socket

    QNdefMessage Collection of 0 or more

    records

    QNdefRecord Access to NDEF data.

    Subclasses for handling specific details.

    QLlcpSocket Read / write data. For

    server & client sockets.

    * Not a class diagram, but explains sequential usage order

    Generic NFC

    Tag access

    Peer to peer

  • Qt NFC Source Code Qt Mobility is Open Source

    How does a method work? How to make best

    use of it? Take a look at the source code!

    Download complete source package

    Latest source:

    http://qt.gitorious.org/qt-mobility/

    Find implementation in:

    C:\QtMobility\src\connectivity\nfc

    14 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Refresh your Qt Knowledge The following tutorials require basic C++ & Qt skills

    Need more?

    15 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • 16

    Nfc Corkboard

    2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Tasks

    Extend Qt SDK example with NFC:

    Touch tag to create note

    Qt Quick based UI

    C++ based NFC

    Integrate C++ with QML

    https://projects.developer.nokia.com/nfccorkboards

  • Importing the Example

    From Qt Creators Getting

    Started screen

    Search for Corkboards example

    Or open:

    C:\QtSDK\Examples\4.7\declarative\

    toys\corkboards\corkboards.pro

    17 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Choosing Targets

    Select at least the Symbian Anna target

    Qt 4.7.4 & Qt Mobility 1.2 is required

    18 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Test!

    Connect phone via USB ^

    Ovi/Nokia Suite mode

    Start CODA on device

    Check

    Selected Symbian target

    Device is recognized

    Play to compile and deploy!

    19 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • 20 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    App Overview

    main.cpp

    Application startup

    Loads and shows corkboards.qml

    corkboards.qml

    UI definition

    Defines data model and view

    Day.qml

    Delegate for drawing the UI for a single day

    Interaction for notes

    ndefmanager.cpp/.h

    NFC Tag discovery and reading

    We will add this:

  • in: corkboards.qml id: list

    in: corkboards.qml id: flickable

    21 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Model, View & Delegate

    ListModel

    Defines free-form list data source

    Container for ListElement definitions

    ListView

    Shows data from a model in a list

    Horizontal or vertical

    Delegate

    Template defining each item instantiated by the view

    in: Day.qml

  • Add Connectivity

    Edit the Qt project file (corkboards.pro)

    Uncomment & add mobility component: connectivity

    Add LocalServices Capability (for Symbian)

    22 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    CONFIG += mobility

    MOBILITY += connectivity

    symbian:TARGET.CAPABILITY += NetworkServices LocalServices

    Allows Internet access Allows NFC

  • Good to Know: Symbian Security *

    1. Determine the required security / privacy features

    Most common:

    2. Add to Qt project file (.pro)

    23 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    * Qt apps are native apps; therefore, the security model of the target operating system applies.

    Feature Capability

    Internet access, telephony, messaging NetworkServices

    Access location (GPS, etc.) Location

    Camera, record audio UserEnvironment

    Contacts, Calendar ReadUserData / WriteUserData

    Bluetooth, NFC LocalServices

    IMEI, model name, battery status ReadDeviceData

    (See: developer.nokia.com/Community/Wiki/Capabilities)

    symbian:TARGET.CAPABILITY += Location LocalServices

    Basic / User Capabilities

    Extended / System Capabilities

  • Good to Know: Symbian Security

    3. Get the right certificate during development

    24 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    No / Basic Capabilities Extended Capabilities

    Sign up for Nokia Publish account (1) publish.nokia.com

    Request development certificate (free) developer.nokia.com/Distribute/Packaging_and_signing.xhtml

    Sign your app (Qt Creator build settings)

    Test on your develoment device(s)

    Use auto-generated self signed certificate (default, no action required)

  • Good to Know: Symbian Security

    4. Publish

    25 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    No / Basic Capabilities Extended Capabilities

    Sign up for Nokia Publish account (1) publish.nokia.com

    Request unique UID in 0x2... range and development certificate (free)

    developer.nokia.com/Distribute/Packaging_and_signing.xhtml

    Package your Qt app with the Smart Installer (Qt Creator build settings)

    Publish to the Nokia Store Need Certified Signed capabilities? developer.nokia.com/Community/Wiki/Capabilities -> Purchase a Publisher ID ($200 / year) Submit to Certified Signed process @ www.symbiansigned.com

  • NdefManager

    New C++ class

    Right-click the project

    Add New ...

    C++ Class

    Class name: NdefManager

    Base class: QObject

    26 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Qt Meta-Object System

    C++ extended with QObject

    Introspection: meta-information at runtime

    Inter-object communication: signals & slots

    Parent / Child hierarchy: easier memory

    management

    27 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Include

    Headers, define member variable

    28 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include // we will test first!

    QTM_USE_NAMESPACE // Use Qt Mobility namespace

    [...]

    private:

    QNearFieldManager *nfcManager;

    ndefmanager.h

  • 29 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Start Waiting NdefManager::NdefManager(QObject *parent) : QObject(parent)

    {

    // NdefManager (this) is the parent; will automatically delete nfcManager

    nfcManager = new QNearFieldManager(this);

    nfcManager->setTargetAccessModes(QNearFieldManager::NdefReadTargetAccess);

    // React only to Uri records (NfcRtd, "U")

    QNdefFilter filter;

    filter.appendRecord();

    nfcManager->registerNdefMessageHandler(filter,

    this, SLOT(targetDetected(QNdefMessage,QNearFieldTarget*)));

    // Get notified when the tag gets out of range

    connect(nfcManager, SIGNAL(targetLost(QNearFieldTarget*)),

    this, SLOT(targetLost(QNearFieldTarget*)));

    }

    ndefmanager.cpp

  • Signals & Slots Signal

    Emitted when a particular event occurs (e.g., clicked())

    Qt objects: predefined signals

    Also create your own signals

    Slot

    Function called in response to a signal

    Qt objects: predefined slots (e.g., quit())

    Also create your own slots

    Connection signals slots established by developer,

    handled by Qt framework

    30 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Signals & Slots Type safe

    Signal signature must match signature of receiving slot

    (Slot might also have shorter signature and ignore the rest of the

    arguments)

    Loosely coupled

    Emitter doesnt know or care which slots receive signal

    Information encapsulation

    Integrated, independent components

    Slots are normal C++ member functions

    Dont know if signals are connected to them

    31 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Lost & Found

    Methods to handle lost & found tags = Slots

    Tip

    Alt + Enter, and Qt Creator writes the .cpp method definition!

    32 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    private slots:

    void targetDetected(const QNdefMessage &message,

    QNearFieldTarget *target);

    void targetLost(QNearFieldTarget *target);

    ndefmanager.h

  • React

    New target: write debug output to console for now

    Target out of range: delayed object delete

    33 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    void NdefManager::targetDetected(const QNdefMessage &message,

    QNearFieldTarget *target)

    {

    qDebug() deleteLater();

    }

    ndefmanager.cpp

  • Register C++ with QML

    Make your C++ class available in QML

    QML Name: NdefManager

    QML Library: Nfc 1.0

    34 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    #include

    #include "ndefmanager.h"

    int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    qmlRegisterType("Nfc", 1, 0, "NdefManager");

    [...]

    }

    main.cpp

  • NdefManager in QML

    Import module

    Create Instance

    35 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    import Nfc 1.0

    corkboards.qml

    NdefManager {

    id: ndefManager

    }

    corkboards.qml

  • Test! #2

    Run the app

    Touch a URI formatted NDEF tag

    Observe the Application Output

    36 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Parse Tag & Emit Contents

    Revisit and extend the target detection slot

    37 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    void NdefManager::targetDetected(const QNdefMessage &message,

    QNearFieldTarget *target) {

    qDebug()

  • Define the Signal

    Signals have no implementation

    They represent information, not a method to execute

    38 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    signals:

    void nfcReadTagUri(const QUrl& nfcTagUri);

    ndefmanager.h

  • Create new Notes

    Handle our new signal

    on :

    Get current corkboard page append new notes element

    key: noteText, value: URI from NDEF message

    39 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    NdefManager {

    id: ndefManager

    onNfcReadTagUri:

    list.get(flickable.currentIndex).notes.append({"noteText":nfcTagUri})

    }

    corkboards.qml

  • Test! #3

    Touch Uri-formatted NDEF NFC tags to create notes on the

    current page!

    40 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • 41

    Interactive Nfc Corkboard

    2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Tasks

    Extend previous example

    React to any kind of tags

    Write tags by pressing the red flag

    while touching a tag

    https://projects.developer.nokia.com/nfccorkboards

  • 42 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Overview Before QNdefFilter filter;

    filter.appendRecord();

    nfcManager->registerNdefMessageHandler(filter, this,

    SLOT(targetDetected(QNdefMessage,QNearFieldTarget*)));

    void targetDetected(const QNdefMessage &message,

    QNearFieldTarget *target);

    Signal is only emitted when a tag containing all records defined in the filter are found

    Register NDEF filters and detect targets

    The slot directly gets the NDEF message

  • 43 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Overview After connect(nfcManager, SIGNAL(targetDetected(QNearFieldTarget*)),

    this, SLOT(targetDetected(QNearFieldTarget*)));

    nfcManager->startTargetDetection();

    void targetDetected(QNearFieldTarget *target); {

    const bool hasNdefMessage = target->hasNdefMessage();

    if (hasNdefMessage) {

    connect(target, SIGNAL(ndefMessageRead(QNdefMessage)),

    this, SLOT(ndefMessageRead(QNdefMessage)));

    target->readNdefMessages();

    }

    }

    Signals is emitted for every target that is detected

    Detect any kind of targets

    void NdefManager::ndefMessageRead(const QNdefMessage &message) ;

    Another signal is emitted when reading the message from the target is finished

  • React to all targets

    Generic target detection instead of listening to specific tag

    message(s)

    Remove previous targetDetected() with two parameters

    44 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    public slots:

    void nfcWriteTag(const QString& nfcTagText); // New

    private slots:

    void targetDetected(QNearFieldTarget *target); // Modified from prev.

    void ndefMessageRead(const QNdefMessage &message); // New

    private:

    QNearFieldTarget *cachedTarget; // New

    ndefmanager.h

  • 45 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Start Generic Target Detection NdefManager::NdefManager(QObject *parent) : QObject(parent)

    {

    // [...]

    // React only to Uri records (NfcRtd, "U")

    QNdefFilter filter;

    filter.appendRecord();

    nfcManager->registerNdefMessageHandler(filter,

    this, SLOT(targetDetected(QNdefMessage,QNearFieldTarget*)));

    // Get notified when the tag gets out of range

    connect(nfcManager, SIGNAL(targetLost(QNearFieldTarget*)),

    this, SLOT(targetLost(QNearFieldTarget*)));

    connect(nfcManager, SIGNAL(targetDetected(QNearFieldTarget*)),

    this, SLOT(targetDetected(QNearFieldTarget*)));

    nfcManager->startTargetDetection();

    }

    ndefmanager.cpp

  • Read NDEF Message

    Detected a target? Read its message.

    46 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    void NdefManager::targetDetected(QNearFieldTarget *target)

    {

    qDebug() hasNdefMessage();

    if (hasNdefMessage) {

    connect(target, SIGNAL(ndefMessageRead(QNdefMessage)),

    this, SLOT(ndefMessageRead(QNdefMessage)));

    target->readNdefMessages();

    }

    // Cache target to member variable for writing

    cachedTarget = target;

    }

    ndefmanager.cpp

  • Target Lost

    Set cached target to NULL

    47 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    void NdefManager::targetLost(QNearFieldTarget *target) {

    cachedTarget = NULL; // New

    target->deleteLater();

    }

    ndefmanager.cpp

  • Parse NDEF Message

    Same code as before, different method

    48 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    void NdefManager::ndefMessageRead(const QNdefMessage &message) {

    // Go through all records in the message

    foreach (const QNdefRecord &record, message) {

    // Check type

    if (record.isRecordType()) {

    // Convert to the specialized URI record class

    QNdefNfcUriRecord uriRecord(record);

    // Emit a signal with the URI

    emit nfcReadTagUri(uriRecord.uri());

    }

    }

    }

    ndefmanager.cpp

  • 49 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Write URI Ndef Message void NdefManager::nfcWriteTag(const QString &nfcTagText) {

    // The device currently has a target in reach

    if (cachedTarget) {

    // Convert text to a URI, adding missing http:// if necessary

    QUrl convertedUrl = QUrl::fromUserInput(nfcTagText);

    // Check if it is a valid URL

    if (convertedUrl.isValid() && nfcTagText.contains('.')) {

    QNdefMessage message;

    // Create a URI NDEF record

    QNdefNfcUriRecord uriRecord;

    uriRecord.setUri(convertedUrl);

    message.append(uriRecord);

    qDebug() writeNdefMessages(QList()

  • 50 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Extend UI with Write Button Image {

    id: writeButton

    source: "NfcFlag.png"

    rotation: -8 // Note image itself is rotated

    anchors { bottom: parent.bottom; right:parent.right }

    MouseArea {

    anchors.fill: parent

    onClicked: ndefManager.nfcWriteTag(myText.text)

    }

    }

    Day.qml, between lines 122 / 123 (below MouseArea with id: mouse)

    NfcFlag.png \qml\

  • Test! Touch a tag, at the same time press the NFC flag of a note

    Writes the note text to the tag

    Remember to enter a valid URI!

    51 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    The extended solution on Nokia Developer Projects handles additional record types and

    potential errors.

    https://projects.developer.nokia.com/nfccorkboards

  • 52

    Nfc Chat

    2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Tasks

    Develop an NFC chat from scratch

    NFC Peer to Peer mode

    LLCP Protocol (server & client sockets)

    Qt Quick UI

    https://projects.developer.nokia.com/nfcchat

  • 53 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    App Overview

    main.cpp

    Application startup

    Loads and shows main.qml

    main.qml

    UI definition

    Defines data model and view

    nfcpeertopeer.cpp/.h

    Target discovery

    NFC Peer to peer sockets (client & server)

  • New Project

    Qt Quick Application

    Name: NfcChat

    Built-in elements only

    Targets: Symbian Device

    (including Symbian Anna)

    Accept defaults for the rest

    54 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Add Connectivity

    Edit the Qt project file (nfcchat.pro)

    Uncomment & add mobility component: connectivity

    Add LocalServices Capability

    55 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    CONFIG += mobility

    MOBILITY += connectivity

    symbian:TARGET.CAPABILITY += NetworkServices LocalServices

    Allows Internet access Allows NFC

  • UI Design NFC Send Button Button Image

    Copy NfcButton.png to the projects qml folder

    C:\Qt\dev\NfcChat\qml\NfcChat\NfcButton.png

    Open Switch to UI Designer for main.qml

    Create the Button Image

    From Library Resources: drag the button image to the top

    right window corner

    In Properties, change the id to sendButton

    In Properties Layout, set top and right anchors to Parent

    (rectangle1) (Margin: 0)

    Interactivity

    From Library Items: drag the Mouse Area on top of the

    button image (gets a child in the Navigator drag the

    mouse_area1 on the sendButton if it isnt)

    In Properties Layout, set anchors to fill the parent

    56 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • UI Design Message Editor Hello World cleanup

    Delete the Hello World text and the window-wide

    mouse area

    Text Edit element

    From Library Items: drag the Text Edit element

    to the top left window corner

    In Properties, change the Id to sendTextEdit

    In Properties TextEdit, change the text to Hello

    NFC

    In Properties TextEdit, change the font size to

    10 points

    In Properties Layout, set top and left anchors to

    Parent (rectangle1) and the right anchor to

    sendButton (Margin: 0)

    57 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • UI Design Message View ListView

    Will display messages stored in a

    data model

    From Library Items: drag the List

    View element to the window

    In Properties, change the id to

    messageView

    In Properties Layout, set top

    anchor to sendButton. Other edges:

    Parent (rectangle1). All Margin: 0.

    58 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • NfcPeerToPeer

    Go to the Edit view

    New C++ class

    Right-click the project

    Add New ...

    C++ Class

    Class name: NfcPeerToPeer

    Base class: QObject

    59 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • Include

    Headers, define member variable

    60 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    #include

    #include

    #include

    QTM_USE_NAMESPACE // Use Qt Mobility namespace

    [...]

    private:

    QLatin1String nfcUri;

    QNearFieldManager *nfcManager;

    QLlcpServer *nfcServer;

    QLlcpSocket *nfcClientSocket;

    QLlcpSocket *nfcServerSocket;

    nfcpeertopeer.h

  • Search for Targets

    Save own unique service Uri and start target detection

    61 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    NfcPeerToPeer::NfcPeerToPeer(QObject *parent) :

    QObject(parent), nfcUri("urn:nfc:xsn:nokia.com:nfcchat")

    {

    nfcManager = new QNearFieldManager(this);

    connect(nfcManager, SIGNAL(targetDetected(QNearFieldTarget*)),

    this, SLOT(targetDetected(QNearFieldTarget*)));

    connect(nfcManager, SIGNAL(targetLost(QNearFieldTarget*)),

    this, SLOT(targetLost(QNearFieldTarget*)));

    // Only detect other NFC devices. Leave the phone to handle NFC tags.

    nfcManager->startTargetDetection(QNearFieldTarget::NfcForumDevice);

    }

    nfcpeertopeer.cpp

  • Signals & Slots

    Handle targets

    Emit chat messages to the UI

    62 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    private slots:

    void targetDetected(QNearFieldTarget *target);

    void targetLost(QNearFieldTarget *target);

    nfcpeertopeer.h

    signals:

    void chatMessage(const QString& nfcClientMessage);

    nfcpeertopeer.h

  • React

    New target: emit info message

    Target out of range: emit message & delayed object delete

    63 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    void NfcPeerToPeer::targetDetected(QNearFieldTarget *target)

    {

    emit chatMessage("Target detected");

    }

    nfcpeertopeer.cpp

    void NfcPeerToPeer::targetLost(QNearFieldTarget *target)

    {

    target->deleteLater();

    emit chatMessage("Target lost");

    }

    nfcpeertopeer.cpp

  • Register C++ with QML

    Make your C++ class available in QML

    QML Name: NfcPeerToPeer

    QML Library: NfcPeerToPeer 1.0

    64 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    #include

    #include "nfcpeertopeer.h"

    int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    qmlRegisterType("NfcPeerToPeer", 1, 0, "NfcPeerToPeer");

    [...]

    }

    main.cpp

  • NfcPeerToPeer in QML Import module

    Update the list model when a NFC chat message arrives

    65 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    import NfcPeerToPeer 1.0

    main.qml

    NfcPeerToPeer {

    id: nfcPeerToPeer

    onChatMessage: {

    messageModel.append( {"chatMessage": nfcClientMessage} )

    }

    }

    ListModel { id: messageModel }

    ListView { model: messageModel

    delegate: Text { text: chatMessage }

    // [...]

    }

    main.qml

  • Test!

    Run the app on two phones

    Switch phones in the Run Settings

    Touch both phones

    Admire how they detect each other!

    66 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • NFC LLCP Server Socket

    Define slots for new server connections & sending text

    Listen for new server connections

    67 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    NfcPeerToPeer::NfcPeerToPeer(QObject *parent)

    // [...]

    nfcServer = new QLlcpServer(this);

    connect(nfcServer, SIGNAL(newConnection()),

    this, SLOT(handleNewConnection()));

    nfcServer->listen(nfcUri);

    }

    nfcpeertopeer.cpp

    public slots:

    void sendText(const QString& text);

    private slots:

    void handleNewConnection();

    nfcpeertopeer.h

  • Connections & Sending

    Create a socket for a new server connection

    Slot to send chat messages over the server socket

    68 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    void NfcPeerToPeer::sendText(const QString& text) {

    if (nfcServerSocket && nfcServerSocket->isOpen()) {

    nfcServerSocket->write(text.toUtf8());

    emit chatMessage("Message sent");

    }

    }

    nfcpeertopeer.cpp

    void NfcPeerToPeer::handleNewConnection() {

    if (nfcServerSocket) { nfcServerSocket->deleteLater(); }

    nfcServerSocket = nfcServer->nextPendingConnection();

    }

    nfcpeertopeer.cpp

  • Sending Chat Messages

    Call the sendText() slot in MouseAreas onClicked handler

    69 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    onClicked: nfcPeerToPeer.sendText(sendTextEdit.text)

    main.qml

  • NFC LLCP Client Socket

    Define slot to read incoming text

    Create the client socket (to be connected to NFC targets)

    70 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    NfcPeerToPeer::NfcPeerToPeer(QObject *parent)

    // [...]

    nfcClientSocket = new QLlcpSocket(this);

    connect(nfcClientSocket, SIGNAL(readyRead()),

    this, SLOT(readText()));

    }

    nfcpeertopeer.cpp

    private slots:

    void readText();

    nfcpeertopeer.h

  • Connections & Reading Connect the socket to a target in targetDetected()

    Read text from the socket and emit a signal

    Cleanup in targetLost()

    71 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    void NfcPeerToPeer::readText() {

    QByteArray rawData = nfcClientSocket->readAll();

    QString data = QString::fromUtf8(rawData.constData(), rawData.size());

    emit chatMessage(data);

    }

    nfcpeertopeer.cpp

    nfcClientSocket->connectToService(target, nfcUri);

    nfcpeertopeer.cpp

    nfcClientSocket->disconnectFromService();

    nfcpeertopeer.cpp

  • Test! #2

    Touch upper back of two phones

    While touching, press the send button

    72 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    The extended solution on Nokia Developer Projects includes MeeGo support, cached

    text sending, error handling and is based on Qt Quick Components.

    Note: if installing the solution, uninstall your own app first to avoid a name conflict..

    https://projects.developer.nokia.com/nfcchat

  • 73

    NFC Summary

    2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

  • 74 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Nfc Examples Tech. Tag / p2p Showcase

    Nfc Interactor Qt Tag Powerful tag & NDEF reading, dynamic NDEF message composer, reusable tag handling classes, Nfc detection

    Nfc Corkboard Qt Tag Higher-level tag reading / writing, app autostart, Nfc detection

    Nfc Chat Qt p2p p2p data transfer, Nfc detection

    Nfc Creator Java ME Tag Tag reading / writing

    Nfc Settings Qt Quick Qt - Nfc detection

    Nfc Content Handler Plug-in Symbian Tag App autostart

    Nfc NPP Example Qt p2p p2p data transfer (Google NPP protocol)

    Nfc Peer-to-Peer Example Qt p2p p2p data transfer

    Simple LLCP Chat Java ME p2p p2p data transfer

    http://www.developer.nokia.com/Develop/NFC/Code_examples/

    http://www.nfcinteractor.com/

  • 75 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Summary Design

    Guidelines

    developer.nokia.com/NFC

    Develop Distribute

  • Thank You.

    76 2012 Nokia Nokia NFC Development with Qt v2.2.0 November 5, 2012 Andreas Jakl

    Andreas Jakl

    [@mopius]

    nfcinteractor.com

    Technology Wizard

    Nokia

    NFC Introduction bit.ly/NfcIntro Windows (Phone) 8 NFC App Scenarios bit.ly/NFCAppScenarios NFC Development on the Windows 8 Platform bit.ly/Win8NFC R

    ela

    ted

    Pre

    sen

    tati

    on

    s