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
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?