SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
4.
NFC (Near Field Communication)
• E' una tecnologia wireless a corto raggio (< 10cm)
• Si opera alla frequenza di 13,56MHz
• Può raggiungere una velocità di trasmissione massima di
424 kbit/s
5.
NFC (Near Field Communication)
E' una evoluzione di RFID (Radio Frequency Identification)
6.
RFID vs NFC
RFID NFC
estenzione di RFID
distanze lunghe (3 ~ 100m) distanze corte (< 10cm)
qualsiasi frequenza 13.56 MHz
usa nei vari ambiti usa nellʼambito di sicurezza
nei celluari
8.
NDEF (NFC Data Exchange Format)
NDEF è un formato di incapsulamento dei messaggi (dati) per
scambiare informazioni via NFC.
9.
NDEF (NFC Data Exchange Format)
passive mode active mode
Questo formato consente di scambiare informazioni
• tra due NFC Forum Devices
• tra un NFC Forum Device e un NFC Forum Tag.
10.
NDEF (NFC Data Exchange Format)
Message = n * Records
Records =
Type +
Size +
Payload (binary data)
11.
NDEF (NFC Data Exchange Format)
I messaggi NDEF possono essere di tre tipi :
URI
il contenuto è un link
MIME
il contenuto è specificato da un mime type
NFC-specific types
utilizzi specifici per diverse tecnologie
http://www.nfc-forum.org/specs/spec_list/
12.
NFC e NDEF summary
NFC è una tecnologia NDEF è un formato di
wireless a corto raggio che encapsulamento dei dati
consente di creare una
comunicazione bidirezionale
13.
NFC Technology summary
• NFC
o Wireless a corto raggio (< 10cm)
o Frequenza : 13,56MHz
o Velocità di trasmissione massima : 424 Kbit/s.
o E' una evoluzione di RFID
• NDEF
o Incapsulamento dei messaggi
o NFC Forum Device <=> NFC Forum Device
o NFC Forum Device <=> NFC Forum Tag
o Message = n * Records
o Records = Type + Size + Payload (binary data)
o Types: URI, MIME o NFC-specific types
17.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:icon="@drawable/app_icon.png" ... >
<activity android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
</activity>
...
</application>
</manifest>
• Lʼapplicazione deve dichiarare tutti i suoi
componenti in questo file.
• Permessi, API level, caratteristiche hardware o
software usate, altre libererie API.
18.
Activities
• Ogni Activity rappresenta un unico schermo con
una interfaccia utente.
• Ognuna è indipendente dalle altre.
• UnʼActivity deve definire come main.
• Ogni Activity puo far partire unʼaltra Activity.
• Quando parte una nuova Activity quella precedente
si ferma e si conserva dentro uno Stack.
• Per creare un Activity dobbiamo estendere classe
astratto Activity e suoi metodi.
20.
Intents
Intent
Component name
Action
Data
Category
Extra
Flags
• Componenti di una applicazione (Activities,
Services e Broadcast receivers) vengono attivati
attraverso messaggi, chiamate Intents.
21.
Intent Filters
• Explicit vs Implicit
• Per definire quali Intents (impiciti) deve accettare
un componente.
22.
Services
• Per gestire operazioni
lunghe in background
senza intefaccia utente.
• Servizi hanno due formi:
Started e Bound
23.
Services
• Per gestire operazioni
lunghe in background
senza intefaccia utente.
• Servizi hanno due formi:
Started e Bound
24.
Services
• Per gestire operazioni
lunghe in background
senza intefaccia utente.
• Servizi hanno due formi:
Started e Bound
25.
Services
• Per gestire operazioni
lunghe in background
senza intefaccia utente.
• Servizi hanno due formi:
Started e Bound
26.
Summary
• AndroidManifest.xml definice tutti i componenti
dellʼapplicazione.
• Ogni schermata dellʼapplicazione è unʼActivity.
• Intents sono i messaggi che avviano i componenti.
• Usando Intents Filters si possono filtrare Intents
non desiderati.
• Se ci sono operazioni lunghe che non richiedono
interfaccia utente si possono usare i Services.
28.
NFC e Android summary
• Dichiarazione permessi, Intents e Intent filters in Manifest
• Dispatch systems
o Intent Dispatch System
o Foreground Dispatch System
• Codice: lettura di un tag NDEF
• Codice: scrittura di un tag NDEF
• Codice: Foreground dispatch system
• Codice: Device to Device (Beam)
32.
NFC e Android - dispatch system
• Maggior parte delle APIs sono basate su NDEF
• The tag dispatch system
33.
NFC e Android - dispatch system
• Maggior parte delle APIs sono basate su NDEF
• The tag dispatch system
34.
Intent e Foreground Dispatch Systems
Intent Dispatch System
• dichiara i filtri nel Manifest
• fa partire l'applicazione anche se è spenta
Foreground Dispatch System
• dichiara i filtri mentre in esecuzione
• gestione esclusiva per i tag richiesti
35.
NDEF Tag - Reading
public class MyNFCActivity extends Activity {
@Override
public void onNewIntent(Intent intent) {
Parcelable[] raw = intent.getParcelableArrayExtra(
1
NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage message = (NdefMessage) raw[0];
2
NdefRecord record = message.getRecords()[0];
byte[] payload = record.getPayload();
...
}
}
36.
NDEF Tag - Reading
1
Parcelable[] raw =
intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
• Prendiamo il tag toccato dallʼIntent ricevuto.
37.
NDEF Tag - Reading
2
NdefMessage message = (NdefMessage) raw[0];
NdefRecord record = message.getRecords()[0];
byte[] payload = record.getPayload();
• Prendiamo il primo record del primo messaggio.
• Leggiamo il payload del record.
38.
NDEF Tag - Writing
public class MyNFCActivity extends Activity {
@Override
public void onNewIntent(Intent intent) {
Tag t = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
1
Ndef ndef = Ndef.get( t );
ndef.connect();
final byte[] data = …;
NdefRecord record = new NdefRecord(
NdefRecord.TNF_MIME_MEDIA,
2
"text/plain".getBytes(),
new byte[0],
data);
NdefRecord[] records = new NdefRecord[]{record};
3
NdefMessage message = new NdefMessage( records );
ndef.writeNdefMessage(message);
}
}
39.
NDEF Tag - Writing
1
Tag t = intent.getParcelableExtra(
NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get( t );
ndef.connect();
• Prendiamo il tag toccato dallʼIntent ricevuto.
• Creiamo una istanza Ndef usando quel tag.
40.
NDEF Tag - Writing
2
final byte[] data = …;
NdefRecord record = new NdefRecord(
NdefRecord.TNF_MIME_MEDIA,
"text/plain".getBytes(),
new byte[0],
data);
• Creiamo un record Ndef inserendo i nostri dati come MIME
type text/plain.
41.
NDEF Tag - Writing
3
NdefRecord[] records =
new NdefRecord[]{record};
NdefMessage message =
new NdefMessage( records );
ndef.writeNdefMessage(message);
• Incapsuliamo il record appena creato dentro un messaggio
Ndef.
• Scriviamo il nostro messaggio sul tag usando lʼinstanza di
Ndef che abbiamo creato prima.
42.
Foreground dispatch
public class MyNFCActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState){
Intent i = new Intent(this, getClass());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, i, 0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] {ndef};
techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
}
@Override
public void onPause() {
super.onPause();
mAdapter.disableForegroundDispatch(this);
}
@Override
public void onResume() {
super.onResume();
mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
}
@Override
public void onNewIntent(Intent intent) {
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//do something with tagFromIntent
}
}
43.
Foreground dispatch
public class MyNFCActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState){
Intent i = new Intent(this, getClass());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, i, 0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] {ndef};
techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
}
@Override
public void onPause() {
super.onPause();
mAdapter.disableForegroundDispatch(this);
}
@Override
public void onResume() {
super.onResume();
mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
}
@Override
public void onNewIntent(Intent intent) {
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//do something with tagFromIntent
}
}
44.
Foreground dispatch
public void onCreate(Bundle savedInstanceState){
Intent i = new Intent(this, getClass());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
1 PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, i, 0);
IntentFilter ndef =
new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
2 } catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] {ndef};
3 techListsArray =
new String[][] { new String[] { NfcF.class.getName() } };
}
45.
Foreground dispatch
1
Intent i = new Intent(this, getClass());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, i, 0);
• Usando questo sistema popola i dati del tag quando viene
scansionato.
46.
Foreground dispatch
2
IntentFilter ndef =
new IntentFilter(
NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
• Filtro che accetta tutti i Mime types.
47.
Foreground dispatch
3
intentFiltersArray =
new IntentFilter[] {ndef};
techListsArray =
new String[][] {
new String[] {
Ndef.class.getName()
}
};
• Teniamo i filtri salvati in una variabile globale per usarli
quando abilitiamo dispatch system.
• Impostiamo anche unʼarray con le technologie tag che
lʼapplicazione vuole gestire.
48.
Foreground dispatch
public class MyNFCActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState){
Intent i = new Intent(this, getClass());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, i, 0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] {ndef};
techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
}
@Override
public void onPause() {
1
super.onPause();
mAdapter.disableForegroundDispatch(this);
}
@Override
public void onResume() {
super.onResume();
mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
} 2
@Override
public void onNewIntent(Intent intent) {
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//do something with tagFromIntent 3
}
}
49.
Foreground dispatch
public class MyNFCActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState){
Intent i = new Intent(this, getClass());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, i, 0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] {ndef};
techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
}
@Override
public void onPause() {
1
super.onPause();
mAdapter.disableForegroundDispatch(this);
}
@Override
public void onResume() {
super.onResume();
mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
} 2
@Override
public void onNewIntent(Intent intent) {
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//do something with tagFromIntent 3
}
}
50.
Foreground dispatch
1
@Override
public void onResume() {
super.onResume();
NfcAdapter.getDefaultAdapter(this)
.enableForegroundDispatch(
this,
pendingIntent,
intentFiltersArray,
techListsArray);
}
• Abilitiamo foreground dispatch system quando lʼActivity
prende il controllo.
51.
Foreground dispatch
2
@Override
public void onPause() {
super.onPause();
NfcAdapter.getDefaultAdapter(this)
.disableForegroundDispatch(this);
}
• Disabilitiamo foreground dispatch system quando lʼActivity
perde il controllo.
52.
Foreground dispatch
3
@Override
public void onNewIntent(Intent intent) {
Tag tagFromIntent =
intent.getParcelableExtra(
NfcAdapter.EXTRA_TAG);
//do something with tagFromIntent
}
• Riceviamo lʼIntent allo stesso modo di intent dispatch system.
53.
Device to Device
• Scambiare dati tra due device Android.
• Entrambi i dispositivi deve avere lʼActivity in
foreground e schermo sbloccato.
• Un messaggio NDEF alla volta.
• Basta utilizzare uno dei metodi
– setNdefPushMessage()
– setNdefPushMessageCallback()
54.
Device to Device
setNdefPushMessage()
public class MyNFCActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState)
{
NdefMessage msg = new NdefMessage(...);
mNfcAdapter =
NfcAdapter.getDefaultAdapter(this);
mNfcAdapter.setNdefPushMessage(msg, this);
}
}
55.
Device to Device
setNdefPushMessageCallback()
public class MyNFCActivity extends Activity implements
CreateNdefMessageCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
1 mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcAdapter.setNdefPushMessageCallback(this, this);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
2 NdefMessage msg = new NdefMessage(...);
return msg;
}
}
56.
Device to Device
1
@Override
public void onCreate(
Bundle savedInstanceState) {
mNfcAdapter =
NfcAdapter.getDefaultAdapter(this);
mNfcAdapter.setNdefPushMessageCallback(
this, this);
}
Abilitiamo Beam usando il metodo
setNdefPushMessageCallback
passando come parametri lʼActivity ed
una implementazione di
NfcAdapter.CreateNdefMessageCallback.
57.
Device to Device
2
@Override
public NdefMessage createNdefMessage(
NfcEvent event) {
NdefMessage msg = new NdefMessage(...);
return msg;
}
Creiamo un messaggio da spedire quando avvicina un device
e parte la comunicazione.
58.
NFC e Android summary
• Dichiarazione permessi, Intents e Intent filters in Manifest
• Dispatch systems
o Intent Dispatch System
o Foreground Dispatch System
• Codice: lettura di un tag NDEF
• Codice: scrittura di un tag NDEF
• Codice: Foreground dispatch system
• Codice: Device to Device (Beam)
60.
Safeatwork
Sicurezza sul lavoro e
supporto alla certificazione
Usato dai manutentori e
operai specializzati
Backend web per la gestione
dei dati
Nata su j2me nel 2008
( Nokia 6212 )
www.safeatwork.it
61.
Safeatwork
Download contenuti
• Schede tecniche
• Istruzioni operative
Accesso ai contenuti basato
su NFC
Upload delle attività
• cosa ha fatto l'operatore?
• che procedure ha eseguito?
62.
Safeatwork
Download contenuti
• Schede tecniche
• Istruzioni operative
Accesso ai contenuti basato
su NFC
Upload delle attività
• cosa ha fatto l'operatore?
• che procedure ha eseguito?
63.
Safeatwork
L'interazione prevede prevalentemente l'utilizzo della lettura dei
tag per accedere ai contenuti.
64.
Safeatwork
L'interazione prevede prevalentemente l'utilizzo della lettura dei
tag per accedere ai contenuti.