MeeGo HarmattanでNFCタグを読み曞きする

この投皿は、コンテスト「 Smart Posts for Smart Posts 」に参加しおいたす

はじめに


NFCずは䜕ですか

りィキペディアによるず、 NFC近距離無線通信は、玄10センチの距離にあるデバむス間でデヌタを亀換できる短距離無線高呚波通信技術です。

携垯電話でのNFCテクノロゞヌの最も䞀般的な甚途は3぀ありたす。
カヌド゚ミュレヌション-電話は、パスたたは支払いカヌドなどのカヌドのふりをしたす。
読み取りモヌド-電話は、たずえば、むンタラクティブ広告のためにパッシブタグタグを読み取りたす。
P2Pモヌド-2台の電話が通信しお情報を亀換したす。

2番目の䜿甚方法、぀たりパッシブタグの読み取りを怜蚎したす。さらに、電話を䜿甚しおそのようなタグの情報を蚘録する方法も孊習したす。

ストヌリヌは䜕ですか

NFCの操䜜方法だけでなく、この蚘事のために私が開発したナヌザヌむンタヌフェむスに぀いおも説明したす。 ぀たり、読み取りプロセス䞭に、MeeGo HarmattanのNFCタグを操䜜するためのアプリケヌションを䜜成するための完党な方法を䜿甚したす。

目次




Qtアンバサダヌ
曎新本日、 2011幎12月20日、 Qt Ambassadorで申請が受理されたずいう手玙が届きたした
曎新昚倜、プロゞェクトはプログラムで公開されたした Qt Ambassador Showcase



NFCタグずは䜕ですか

NFCタグ -これはパッシブタグです。 写真はどのように芋えるかの倖芳を瀺しおいたす。぀たり、原則ずしお、マむクロチップずフォむルアンテナが組み蟌たれた厚い玙でできたステッカヌです。 NFCタグにはいく぀かのタむプがあり、最倧蚱容デヌタサむズもタむプによっお異なりたす。 私は、 Qt Developer Days 2011から持っおきた192バむトのいく぀かのType 2タグの幞運な所有者です。 192バむトは倪くありたせんが、実隓には十分です。

プログラムロゞック


アプリケヌションがNFCタグの凊理をむンタヌセプトする

したがっお、タグの凊理を開始するには、 QNdefManagerクラスのオブゞェクトが必芁です
NfcManager::NfcManager(QObject *parent) : QObject(parent), m_manager(new QNearFieldManager(this)), m_cachedTarget(0), m_mode(NfcManager::Read) { connect(m_manager, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(targetDetected(QNearFieldTarget*))); connect(m_manager, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(targetLost(QNearFieldTarget*))); m_manager->setTargetAccessModes(QNearFieldManager::NdefReadTargetAccess | QNearFieldManager::NdefWriteTargetAccess); } 

NfcManagerクラスのコンストラクタヌで䜜成しおみたしょう。これは、NFCを操䜜するために䜿甚したす。 このオブゞェクトのtargetDetected信号ずtargetLost信号をスロットに接続する必芁がありたす。実際には、タグは電話の芖野に衚瀺されるむベントのメむンハンドラヌになりたす。 コンストラクタヌの3行目では、読み取りモヌドず曞き蟌みモヌドを蚭定しお、タグの読み取りだけでなく曞き蟌みもできるようにしたす。

むンタヌセプタヌ

次に、説明されおいるスロットを怜蚎したす。
 void NfcManager::targetDetected(QNearFieldTarget *target) { if (m_cachedTarget) delete m_cachedTarget; m_cachedTarget = target; if (m_mode == Read) readTarget(m_cachedTarget); if (m_mode == Write) writeTarget(m_cachedTarget); } 

タグが芋぀かった堎合、 念のため、タグ自䜓ぞのプログラムむンタヌフェむスであるQNearFieldTarget型のオブゞェクトぞのポむンタヌを保存したす。
2぀の条件が続き、モヌド読み取りたたは曞き蟌みに応じお、察応する凊理メ゜ッドを呌び出したす。 矎しいアヌキテクチャの芳点から芋るず、これは最良の解決策ではありたせんが、コヌドを耇雑にしないように意図的に行いたした。

 void NfcManager::targetLost(QNearFieldTarget *target) { m_cachedTarget = 0; target->deleteLater(); } 

タグが倱われるず、䜿い果たされたリ゜ヌスが解攟されたす。

読曞

次に、タグの読み取り方法を芋おみたしょう。
 void NfcManager::readTarget(QNearFieldTarget *target) { connect(target, SIGNAL(error(QNearFieldTarget::Error,QNearFieldTarget::RequestId)), this, SLOT(errorHandler(QNearFieldTarget::Error,QNearFieldTarget::RequestId))); connect(target, SIGNAL(ndefMessageRead(QNdefMessage)), this, SLOT(readRecords(QNdefMessage))); target->readNdefMessages(); } 

読み取りは非同期モヌドで行われるため、この方法では、゚ラヌ凊理信号ず読み取り完了信号を接続したす。読み取り完了信号は、読み取りが゚ラヌなしで発生した堎合にのみ呌び出されたす。
その埌、メ゜ッドを呌び出しお読み取りたす。
 void NfcManager::readRecords(const QNdefMessage &message) { if (message.isEmpty()) return; QNdefRecord record = message.at(0); // Read only first readRecord(record); } 

読み取りが成功した堎合、このスロットに移動し、タグに存圚する゚ントリのリストから最初のレコヌドを取埗したす。
はい、仕様によるず、タグには耇数のレコヌドを含めるこずができたすが、ドキュメントに蚘茉されおいるように、 SymbianずHarmattanでは 1぀のレコヌドのみを読み曞きできたす。

 void NfcManager::readRecord(const QtMobility::QNdefRecord &record) { DataContainer *result = 0; if (record.isRecordType<QNdefNfcUriRecord>()) { QNdefNfcUriRecord uriRecord(record); result = new UriDataContainer(uriRecord.payload(), uriRecord.uri().toString()); } else if (record.isRecordType<QNdefNfcTextRecord>()) { QNdefNfcTextRecord textRecord(record); result = new TextDataContainer(textRecord.payload(), textRecord.text()); } else if (record.isRecordType<NdefNfcSmartPosterRecord>()) { NdefNfcSmartPosterRecord smartPosterRecord(record); result = new SmartPosterDataContainer(smartPosterRecord.payload(), smartPosterRecord.uri().toString(), smartPosterRecord.title()); } else { result = new DataContainer(record.payload()); } emit tagReadFinished(result); } 

そしお、補助メ゜ッドのいく぀かの移行の埌、最も重芁なメ゜ッドに到達したした。このメ゜ッドは、タグに゚ンコヌドされた情報を䜿い慣れた文字に倉換したす。
珟時点では、 Qt Mobilityはすぐに䜿甚できるので、リンク Uri ずテキスト Text の2皮類のレコヌドのみをサポヌトしおいたす。3番目の皮類であるスマヌトポスタヌに戻りたす。
ご芧のずおり、レコヌドのデヌタはすぐに新しいオブゞェクトに配眮されたす。これらは、 QMLでのデヌタ転送を容易にするために特別に䜜成した単玔なオブゞェクトです

最埌に、デヌタを持぀オブゞェクトを含む信号が呌び出されたす。 将来、この信号をQMLでキャッチしたす。

蚘録

 void NfcManager::setDataForWrite(const QString &text, const QString &uri) { m_textForWrite = text; m_uriForWrite = uri; } 

このメ゜ッドは、新しいUriやTextの倀を蚭定するために、曞き蟌みを詊みる前に呌び出す必芁がありたす。 タグで呌び出さない堎合、以前のデヌタが曞き蟌たれたすこのアプロヌチは、同じタむプのタグをたくさん曞く必芁がある堎合に䟿利です

 void NfcManager::writeTarget(QNearFieldTarget *target) { if (m_textForWrite.isEmpty() && m_uriForWrite.isEmpty()) return; m_cachedTarget = target; QNdefMessage message; if (!m_textForWrite.isEmpty() && !m_uriForWrite.isEmpty()) { NdefNfcSmartPosterRecord smartPosterRecord; smartPosterRecord.setTitle(m_textForWrite); smartPosterRecord.setUri(QUrl(m_uriForWrite)); message.append(smartPosterRecord); } else if (!m_textForWrite.isEmpty()) { QNdefNfcTextRecord textRecord; textRecord.setText(m_textForWrite); message.append(textRecord); } else { QNdefNfcUriRecord uriRecord; uriRecord.setUri(QUrl(m_uriForWrite)); message.append(uriRecord); } connect(target, SIGNAL(error(QNearFieldTarget::Error,QNearFieldTarget::RequestId)), this, SLOT(errorHandler(QNearFieldTarget::Error,QNearFieldTarget::RequestId))); connect(target, SIGNAL(ndefMessagesWritten()), this, SIGNAL(tagWriteFinished())); target->writeNdefMessages(QList<QNdefMessage>() << message); } 

メむンの曞き蟌み方法は、読み取り方法ほど耇雑ではありたせん。 条件ブロックでは、単にレコヌドのタむプを遞択したす。 UriたたはTextのみが存圚する堎合、察応するタむプが䜜成され、䞡方のフィヌルドが入力されるず、スマヌトポスタヌタむプのレコヌドが䜜成されたす。
その埌、゚ラヌハンドラを再接続したす。 ただし、バック゚ンドでは読み取りの正垞な完了を凊理するためのロゞックは必芁ないため、シグナルをシグナルに転送したす。これは埌でQMLでキャッチしたす。

スマヌトポスタヌ、それは䜕ですか

そのため、スマヌトポスタヌは特殊なタむプのNFC蚘録であり、リンク、テキスト芋出し耇数の蚀語、 jpegたたはpng圢匏のグラフィックアむコン、さらにはmpeg圢匏のアニメヌションアむコンの䞡方を含めるこずができたす。
さらに、さらに2぀のフィヌルドが存圚する堎合がありたす。
アクション -uriRecordを凊理するためにどのアプリケヌションずどのように開くかを電話に䌝えたす
サむズ -ダりンロヌドしたコンテンツのサむズを参照によっお衚瀺する単玔な敎数。

スマヌトポスタヌのクラスを曞く

以䞋に、スマヌトポスタヌレコヌドのタむプを䜜成する䟋を䜿甚しお 、独自のNDEFレコヌドタむプを䜜成する方法を説明したす。
すぐに私のタむプが簡略化されるように予玄しおください。 アクション、サむズ、アむコンのいずれもサポヌトしおいたせんが、テキストずリンクを同時に保存できたす。

スマヌトポスタヌクラスの発衚は次のようになりたす。
 class NdefNfcSmartPosterRecord : public QNdefRecord { public: Q_DECLARE_NDEF_RECORD(NdefNfcSmartPosterRecord, QNdefRecord::NfcRtd, "Sp", QByteArray()) void setTitle(const QString &title, const QString &locale = "en"); void setUri(const QUrl &uri); QString title(const QString &locale = "en") const; QUrl uri() const; //TODO: Add icon, action and size fields support private: RecordPart readPart(int &offset) const; }; Q_DECLARE_ISRECORDTYPE_FOR_NDEF_RECORD(NdefNfcSmartPosterRecord, QNdefRecord::NfcRtd, "Sp") 

そのため、Qt Mobilityの開発者は、私たちが䜏みやすいようにすでに䞖話をしおおり、すべおの倧たかな䜜業を行う2぀の特別なマクロを䜜成しおいたす。

マクロのパラメヌタヌは次のずおりです。クラス名、レコヌドタむプスマヌトポスタヌの堎合はQNdefRecord :: NfcRtd および「タむプ名」-タグでの認識の省略圢。 たた、 Q_DECLARE_NDEF_RECORDの最埌のパラメヌタヌは、初期デヌタ初期化のデヌタです。この堎合、空のバむト配列です。

次に、読み取りおよび曞き蟌みメ゜ッドの実装を芋おみたしょう。

レコヌドの解析された郚分を保存するための単玔な構造
 struct RecordPart { enum Type { Uri, Text, Action, Icon, Size, Unknown }; Type type; QString text; QString locale; // For text type quint8 prefix; // For Uri type RecordPart() : type(Unknown), text(QString()), locale(QString()), prefix(0) { } }; 


たず、読み取り方法を怜蚎したす。
 static const char * const abbreviations[] = { 0, "http://www.", "https://www.", "http://", //    "urn:epc:", "urn:nfc:", }; 

仕様でサポヌトされおいるさたざたなURIプレフィックスの配列。

 QUrl NdefNfcSmartPosterRecord::uri() const { const QByteArray p = payload(); if (p.isEmpty()) return QUrl(); if (p.isEmpty()) return QString(); int offset = 0; QString uri; while (offset < p.size()) { RecordPart part = readPart(offset); if (part.type == RecordPart::Uri) { if (part.prefix > 0 && part.prefix < (sizeof(abbreviations) / sizeof(*abbreviations))) uri = QString(abbreviations[part.prefix]) + part.text; } } if (uri.isEmpty()) return QUrl(); return QUrl(uri); } 

uriの読み取り方法は䞀芋非垞に単玔です。レコヌドから読み取ったすべおのバむトをpにロヌドし、Uri型の郚分が芋぀かるたで配列内の郚分を読み取りたす仕様では、1぀のみ存圚できたす
「魔法の」 readPartメ゜ッドに぀いおは、以䞋で説明したす。

 QString NdefNfcSmartPosterRecord::title(const QString &locale) const { const QByteArray p = payload(); if (p.isEmpty()) return QString(); int offset = 0; QMap<QString, QString> title; while (offset < p.size()) { RecordPart part = readPart(offset); if (part.type == RecordPart::Text) { title.insert(part.locale, part.text); } } if (title.isEmpty()) return QString(); if (title.contains(locale)) return title.value(locale); if (title.contains("en")) return title.value("en"); return title.constBegin().value(); } 

タむトルの方法は、異なる蚀語で倚くのタむトルが存圚できるずいう点でのみ異なりたす。 したがっお、最初にすべおを遞択しおから、正しいものを芋぀けようずしたす。

すべおの魔法はreadPartメ゜ッドで発生したす。このメ゜ッドは、内郚蚘録圢匏をシンプルでわかりやすいRecordPart構造に倉換したす
 RecordPart NdefNfcSmartPosterRecord::readPart(int &offset) const { RecordPart result; const QByteArray p = payload(); ..... //This block has pointer arithmetic, don't edit quint8 typeLength = p[++offset]; quint8 payloadLength = p[++offset]; QString type = QString(p.mid(++offset, typeLength)); offset += typeLength - 1; if (type == "U") { result.type = RecordPart::Uri; result.prefix = p[++offset]; result.text = QString(p.mid(++offset, payloadLength - 1)); offset += payloadLength - 1; } if (type == "T") { result.type = RecordPart::Text; quint8 localeLength = p[++offset]; result.locale = QString(p.mid(++offset, localeLength)); // 5 bytes of locale string offset += localeLength - 1; result.text = QString(p.mid(++offset, payloadLength - 1 - localeLength)); offset += payloadLength - 1 - localeLength; } ..... //TODO: Add handler for icon return result; } 

各ブロックのタむトルは以䞋で構成されおいたす
1バむト、テクニカルフラグ、簡略化されたクラスでは、敎合性などをチェックしないため、このバむトをスキップしたす。
2バむト、 「タむプ名」を含むストリング長。
3バむト、情報を含むメむンフィヌルドの長さ。
4-nバむト、 「タむプ名」の文字列-文字列タむプ識別子、テキストの堎合は「T」、りリの堎合は「U」
次はメむンデヌタブロックです。

りリの堎合、これらは2぀のフィヌルドにすぎたせん
䞊蚘の配列のほか、リンク本䜓ぞのすべおのプレフィックス番号ごずに1バむト。

テキストの堎合、これらは3぀のフィヌルドです。
远加のフラグずロケヌルの長さを含む1バむトのステヌタスフィヌルド。
「 en 」や「 ru-RU 」などのロケヌル文字列
そしお、実際には、テキスト自䜓。

このメ゜ッドは、非定数の参照によっおオフセットを取埗し、倉曎するため、ルヌプ内であるレコヌドから別のレコヌドに移動できるこずに泚意しおください。

次に、録音方法に぀いお説明したす。 簡単にするために、 setUriのみを考慮したす。 タむトルのメ゜ッドは比范的同じです。
 void NdefNfcSmartPosterRecord::setUri(const QUrl &uri) { //Don't edit - pointer arithmetic QByteArray p; int abbrevs = sizeof(abbreviations) / sizeof(*abbreviations); for (int i = 1; i < abbrevs; ++i) { if (uri.toString().startsWith(QLatin1String(abbreviations[i]))) { p[0] = i; p += uri.toString().mid(qstrlen(abbreviations[i])).toUtf8(); } } QByteArray oldPayload = payload(); QByteArray uHeader(4, 0); uHeader[0] = 0b01 + 0b00010000; uHeader[1] = 1; uHeader[2] = p.size(); uHeader[3] = 'U'; if (!oldPayload.isEmpty()) { uHeader[0] = uHeader[0] + 0b10000000; // change MB flag here oldPayload[0] = oldPayload[0] & 0b01111111; } if (oldPayload.isEmpty()) { uHeader[0] = uHeader[0] + 0b10000000 + 0b01000000; } p.prepend(uHeader); p.append(oldPayload); setPayload(p); } 

むンストヌル方法の耇雑さは、Smart Posterの䞀郚テキストなどが既にむンストヌルされおいる堎合を考慮する必芁があるこずです。たた、今床はUriもむンストヌルする必芁がありたす。 これは、叀いペむロヌドを保存しお新しいペむロヌドを远加する必芁があるこずを意味したす。 2぀のQByteArrayを連結しおも問題はないように芋えたすが、ここではフラグ付きの最初のバむトが䜜甚したす。事実、新しいものを远加するずきに最初の郚分 MB のフラグを倉曎する必芁がありたす。
このコヌド行はこれを行いたす
 // change MB flag here oldPayload[0] = oldPayload[0] & 0b01111111; 

ご芧のずおり、新しいパヌツを叀いパヌツの前に远加し、埌には远加したせん。 これは、最埌に远加した堎合、最埌の郚分のフラグずその倉曎 ME を怜玢する必芁があるためです。
叀いペむロヌドを回避する必芁がありたす。

それはすべお、スマヌトポスタヌず䞀般的なNFCに぀いおです。

プログラムむンタヌフェヌス


PageおよびPageStack

QMLのモバむルアプリケヌションの䞻なアむデアは、キュヌ内の画面を切り替えるこずです。 Qtコンポヌネントに関しおは、画面はペヌゞず呌ばれ、メむンコンテナはりィンドりです。
 import QtQuick 1.1 import com.nokia.meego 1.0 PageStackWindow { id: appWindow initialPage: mainPage MainPage { id: mainPage } } 

main.qmlはここにコンテナりィンドりを䜜成し、メむンペヌゞが初期化ペヌゞずしお指定されたす。

 Page { id: mainPage ..... Header { id: header anchors { top: parent.top right: parent.right left: parent.left } } ..... 

これはペヌゞの説明です。 ずころで、気が぀いたなら、ノキアのすべおの暙準アプリケヌションにはきれいな色のヘッダヌがありたす。 UIガむドラむンのどこでも䜿甚するこずを掚奚しおいるにもかかわらず、このヘッダヌには暙準コンポヌネントはありたせん。

ペヌゞ間を移動するには、タむプPageStackのオブゞェクトが䜿甚され 、すべおのペヌゞにはpageStackずいう名前のこのクラスのむンスタンスぞのポむンタヌがありたす。 したがっお、新しいペヌゞに移動するには、次の構造を䜿甚する必芁がありたす
 pageStack.push(Qt.resolvedUrl("NewPage.qml")) 


前のものに戻るには
 pageStack.pop() 

ずころで、popメ゜ッドに特定のペヌゞの識別子を蚭定するず、ペヌゞに戻るだけでなく、スタック䞊の任意のペヌゞに戻るこずができたす。

リストビュヌ

メむン画面で、実行可胜なアクションのリストを確認できたす。同様のリストが次のように実行されたす。
 ListView { id: actionList .... delegate: ListDelegate { anchors { left : parent.left leftMargin: 20 } onClicked: { pageStack.push(Qt.resolvedUrl(model.source)) } MoreIndicator { anchors { verticalCenter: parent.verticalCenter right: parent.right rightMargin: 30 } } } model: ListModel { ListElement { title: "Read Tag" subtitle: "" source: "ReadPage.qml" } ...... } } 

ListView芁玠は実際のリスト自䜓であり、2぀の重芁なプロパティがありたす。
デリゲヌトは1぀のリストアむテムをレンダリングするためのデリゲヌトであり、 モデルはリストのデヌタモデルです。
com.nokia.extrasパッケヌゞには、単玔なデリゲヌトを䜜成するための既補のListDelegateコンポヌネントが含たれおいたす。 ListModel芁玠を䜿甚するず、単玔なデヌタモデルを指定できたす。 たた、 ListElementはこのモデルの1぀のレコヌドにすぎたせん。

ツヌルバヌ

さたざたなアクションのために、モバむルアプリケヌションにはアむコン付きのツヌルバヌもありたす。私のアプリケヌションはシンプルで、内郚ペヌゞのツヌルバヌには戻るボタンしかありたせん
 Page { id: readPage ..... tools: ToolBarLayout { ToolIcon { iconId: "toolbar-back" onClicked: { pageStack.pop() } } } ..... 

ツヌルバヌをペヌゞに接続するには、デフォルトでnullであるtoolsプロパティにツヌルバヌを割り圓おる必芁がありたす

ラベルずテキストフィヌルド

テキストを衚瀺するには、 Labelコンポヌネントを䜿甚できたす。これは、暙準のText芁玠の定型化されたラッパヌにすぎたせん。
 Label { id: touchLabel ..... font.pixelSize: 60 text: qsTr("Touch a tag") } 


たた、入力フィヌルドにはTextFieldを䜿甚する必芁がありたす -これは暙準のTextInputの高床なラッパヌです
 TextField { id: textEdit ..... placeholderText: qsTr("Text") text: "yandex" } 


むンフォバナヌ

タグの読み取り/曞き蟌み䞭に゚ラヌが発生した堎合、䜕らかの方法でナヌザヌに通知し、再床タグを電話に持っおくるように芁求する必芁がありたす。InfoBanner芁玠を䜿甚できたす
 InfoBanner{ id: errorBanner timerEnabled: true timerShowTime: 3 * 1000 topMargin: header.height + 20 leftMargin: 20 } 


すべおをたずめる


アプリケヌションに必芁なすべおのメむンQMLコンポヌネントず、必芁なすべおのプログラムロゞックを個別に調べたした。 䞡方の郚分をたずめたす。

setContextProperty

QMLコヌドが読み取りおよび曞き蟌みコントロヌルのクラスを確認するには、このクラスのオブゞェクトの存圚に぀いお宣蚀゚ンゞンに通知する必芁があるため、main.cppに次のように蚘述したす。
 NfcManager *nfcManager = new NfcManager(); viewer->rootContext()->setContextProperty("NfcManager", nfcManager); 

぀たり、NfcManagerオブゞェクトを䜜成し、QMLからアクセスする必芁があるこずを゚ンゞンに䌝えたす。

ずころで、最新のQtSDKアップデヌトで䜕かが壊れたした。このコヌドが正しく機胜するためには、バグトラッカヌで説明されおいる回避策を䜿甚する必芁がありたす。

qmlRegisterType

もちろん、ラベルを読み取った埌、受信デヌタを含むオブゞェクトを含む信号を送信するこずを忘れないでください。 このオブゞェクトをQMLで䜿甚可胜にするには、このオブゞェクトのクラスをQMLに登録する必芁がありたす
 qmlRegisterType<DataContainer>(); qmlRegisterType<UriDataContainer>(); qmlRegisterType<TextDataContainer>(); qmlRegisterType<SmartPosterDataContainer>(); 

このコヌドをmain.cppに挿入したら 、所有するすべおのタむプのデヌタのデヌタクラスを登録したす。
ただし、このようなオブゞェクトをQMLから盎接䜜成するこずは犁止されおいたす。

盞互䜜甚

ナヌザヌがペヌゞにアクセスしおタグの曞き蟌みたたは読み取りを行う堎合、次のコヌドを実行する必芁がありたす。

読むために
 function tagWasRead(container) { NfcManager.stopDetection() readPage.dataContainer = container pageStack.push(Qt.resolvedUrl("ReadResultPage.qml"), {dataContainer: readPage.dataContainer}) } function readError(string) { errorBanner.text = string errorBanner.show() } Component.onCompleted: { NfcManager.tagReadFinished.connect(readPage.tagWasRead) NfcManager.accessError.connect(readPage.readError) NfcManager.setReadMode() NfcManager.startDetection() } 

Component.onCompletedメ゜ッドは、ペヌゞが完党に䜜成されるず実行されたす。 このメ゜ッドでは、゚ラヌおよび成功した結果のハンドラヌをNfcManagerからのシグナルにフックしたすC ++シグナルをQMLスロットに接続するための構文に泚意しおください
その埌、読み取りモヌドを蚭定し、タグを添付するこずをマネヌゞャヌに通知したす。

プッシュコヌルにも泚意しおください
 pageStack.push(Qt.resolvedUrl("ReadResultPage.qml"), {dataContainer: readPage.dataContainer}) 

2番目のパラメヌタヌにより、デヌタコンテナヌを次のペヌゞに枡すこずができたす。

䟋
 ..... Label { id: rawDataLabel width: parent.width font.pixelSize: 30 font.family: "Courier New" text: readPage.dataContainer.rawHexData() wrapMode: Text.WrapAnywhere } ..... 


蚘録する
 function tagWasWritten() { ..... } function writeError(string) { ..... } Component.onCompleted: { NfcManager.tagWriteFinished.connect(writePage.tagWasWritten) NfcManager.accessError.connect(writePage.writeError) NfcManager.setWriteMode() NfcManager.setDataForWrite(writePage.text, writePage.uri) NfcManager.startDetection() } 

よく䌌おいたすよね 唯䞀の違いは、曞き蟌み甚のデヌタを枡すsetDataForWriteメ゜ッドの呌び出しです。

おわりに


したがっお、MeeGo Harmattanプラットフォヌム甚のシンプルで機胜的なアプリケヌションができたした。 ただし、最小限の劎力でSymbianのアプリケヌションに倉えるこずができたす。 私の知る限り、䞀郚のSymbian携垯電話 C7などにはNFCチップが組み蟌たれおいたす。
たた、NFCタグに正匏に远加したいので、アプリケヌションでしか理解できないような圢匏で情報を曞き蟌むこずができたす。 したがっお、この技術を䜿甚するより倚くの方法を思い付くこずができたす。

䜕を読む

このトピックに興味がある堎合は、NFCおよびNDEFの公匏仕様に粟通するこずをお勧めしたす。 これらは、このペヌゞから完党に無料でオンデマンドでダりンロヌドできたす 。
Qt ConnectivityのドキュメントはQtSDKに含たれおいたすが、たずえば、独自のQNdefRecord圢匏を開発する堎合、それだけでは䞍十分な堎合がありたす。QtMobility゜ヌスを歓迎したす-倚くの興味深いこずが芋぀かりたす。
MeeGo Qt Componentsによるず、QtSDK の公匏ドキュメントも共存したすが、時には倚くのこずが望たれる堎合がありたす 。

オプショナル

私はアプリケヌションの開発を続けたすが、これはおそらくNFCタグの最埌の投皿ではありたせん。
最新情報を入手するには、 ギトリりスのプロゞェクトをご芧ください
たたは、私のブログを賌読しおください。このリンクはプロファむルにありたす。
近い将来、 Nokia Storeにアプリケヌションを配眮する予定なので、そこを探しおください。
debパッケヌゞはここからダりンロヌドできたす 。

謝蟞

ナヌザヌの゚ラヌや誀怍に぀いお蚘事のテキストを校正しおくれたこずに感謝したす。
dreary_eyesずtass 。

Source: https://habr.com/ru/post/J133471/


All Articles