MPI/API/NFCMovel
Tabela de conteúdo |
- Para utilização do NFC móvel (integrado ao NFC do celular), é necessário verificar as suas especificações/protocolo.
- O ID geralmente será diferente a cada leitura. Verifique as especificações técnicas:
- 'Simple NDEF Exchange Protocol - Technical Specification - SNEP 1.0NFCForum-TS-SNEP_1.0
Abaixo, exemplo de aplicação implementada com o framework Ionic (multi-plataforma).
A função rwNFC() é utilizada para compartilhar uma mensagem via NFC. Porém, antes de iniciar a sua operação, é necessário verificar se o aparelho possui NFC e, se está ativo. A função NFCcheck() é chamada e retorna:
- NFC_OK caso o aparelho atenda aos requisitos
- NO_NFC se não há modulo NFC no aparelho
- NFC_DISABLED se o módulo NFC existe, porém está desativado.
A função IOSconfig() é chamada para realizar uma configuração adicional de inicio de sessão, caso o sistema operacional em uso é o IOS.
Na função rwNFC() é alocado um listener, que dispara um evento, quando uma tag NDEF é lida. Para evitar que Android Beam® envie respostas padrões, é importante que o programa já compartilhe suas mensagem. Por isso, nas linhas 83 e 84, uma string de login é criada, no formato user:password, e então repassada para a função textRecord(text, languageCode, id).
83 let login:string = this.sharedData.getUser() + ":" + this.sharedData.getPasswd(); 84 let message = this.ndef.textRecord(login, null, null);
A função textRecord encapsula uma mensagem, do tipo plain text, com TNF_WELL_KNOWN* e tipo RTD_TEXT*, e retorna um representação JSON de uma mensagem NDEF.
Para utilizar a função basta passar, como parâmetro, uma mensagem de texto e, opcionalmente, o código ISO/IANA da língua (por exemplo, 'fi', 'en-US', 'fr- CA', 'jp') e um ID.
Esta mensagem NDEF pode ser compartilhada via NFC, utilizando a função this.nfc.share:
85 this.nfc.share([message])
Na função accountEventSubscribe(), a mensagem compartilhada via NFC, é atualizada sempre que uma nova conta é ativada.
- [[1]]
Código exemplo
Linguagem inválida. Você precisa especificar uma linguagem, tal como: <source lang="html4strict">...</source> Linguagens suportadas no realce de sintaxe: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, c_winapi, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, cpp-winapi, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic import { Events } from 'ionic-angular'; import { Platform } from 'ionic-angular'; import { ToastController } from 'ionic-angular'; import { Injectable } from '@angular/core'; import { NFC, Ndef } from '@ionic-native/nfc'; import { OpenNativeSettings } from '@ionic-native/open-native-settings'; import { sharedDataService } from '../sharedDataService/sharedDataService'; @Injectable() export class NFCService { constructor( private nfc: NFC, private ndef: Ndef, public events: Events, public plt: Platform, private openNativeSettings: OpenNativeSettings, public toastCtrl: ToastController, private sharedData: sharedDataService, ) { this.accountEventSubscribe(); } accountEventSubscribe(){ //Evento ocorre quando uma conta for selecionada. Isto inclui a inicializacao do app. this.events.subscribe('storage:read', (key) => { let login:string = this.sharedData.getUser() + ":" + this.sharedData.getPasswd(); let message = this.ndef.textRecord(login, null, null); this.nfc.share([message]).then(data => { console.log('NFCService: SUCCESS ON SHARE - ', data); }, (err) => { console.log('NFCService: ERROR ON SHARE - ', err); }); }); } NFCcheck(){ return new Promise((resolve, reject) => { this.sharedData.get_NO_NFC_DEVICE().then((value) => { if(value)){ reject('NO_NFC'); }else { this.nfc.enabled().then(data => { //console.log('NFCService: Check - ', data); resolve(data); }, (err) => { //'NO_NFC' - Celular sem NFC //'NFC_DISABLED' - NFC disabilitado //'NDEF_PUSH_DISABLED' - Android Beam desabilitado if(err == 'NO_NFC'){ //console.log("NFCService: Check - ", err); this.sharedData.set_NO_NFC_DEVICE(true); reject(err); } if(err == 'NFC_DISABLED'){ //console.log("NFCService: Check - ", err); reject(err); } }); } }); }); } IOSconfig(){ return new Promise((resolve, reject) => { if(this.plt.is('android')){ resolve('CONFIG_OK'); } else { this.nfc.beginSession().subscribe( event => resolve('CONFIG_OK'), err => reject('CONFIG_NOK') ); } }); } rwNFC(){ this.NFCcheck().then((value) => { this.IOSconfig().then((IOSvalue) => { this.nfc.addNdefListener((data) => { console.log('NFCService: Attached ', data); let login:string = this.sharedData.getUser() + ":" + this.sharedData.getPasswd(); let message = this.ndef.textRecord(login, null, null); this.nfc.share([message]).then(data => { console.log('NFCService: SUCCESS ON SHARE - ', data); }, (err) => { console.log('NFCService: ERROR ON SHARE - ', err); //Android Beam desabilitado if(err == 'NDEF_PUSH_DISABLED' && this.plt.is('android') ){ let titleText = 'Android Beam'; let msgText = 'A opção Android Beam deve estar ativada para que ocorra o acesso via NFC'; let buttonsInfo = [{msg:"Cancelar" , color:"connectionNOK"}, {msg:'Configurações' , color:"connectionOK"}]; this.sharedData.showAlert(titleText, msgText, buttonsInfo).then((option) => { if(option==1){ this.openNativeSettings.open('nfcsharing'); } }); } }); }, (err) => { }).subscribe( event => console.log("evento::::", event), err => console.log("erro:::::", err) ); }); }, (err) => { if(err == 'NO_NFC'){ this.sharedData.sendToast("Este celular não suporta NFC", 3000); return; } else if(err == 'NFC_DISABLED'){ this.sharedData.sendToast("Função NFC está desabilitada no celular", 3000); return; } }); } } |