MPI/API/NFCMovel

De uTech Tecnologia
Ir para: navegação, pesquisa

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.

Código exemplo

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;
                } 		
		});
	}
}
Ferramentas pessoais
Espaços nominais

Variantes
Visualizações
Ações
Navegação
Ferramentas