TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
Better With Friends: Android+NFC+Arduino
1. NFC Bluetooth
Open
Accessory
Better with Friends
(Or "Android: The Loveable Mobile Platform That Plays Well with External Devices")
Pearl Chen Google+: klab.ca/+
pearl@karma-laboratory.com Twitter: @PearlChen
klab.ca/spotlightandroid
2. The future is already here
— it's just not very evenly
distributed.
William Gibson
klab.ca/spotlightandroid
3. About me
Some Comp Sci classes back there too
( Illustration created using modified output from visualize.me and my LinkedIn profile. )
7. The Third Industrial Revolution
From The Economist, April 2012
A number of remarkable technologies are converging: clever software,
novel materials, more dexterous robots, new processes (notably 3D
printing) and a whole range of web-based services. The factory of the
past was based on cranking out zillions of identical products.
The factory of the future will focus on mass customisation.
9. Hardware startups becoming viable
Pebble Kickstarter campaign as of June 2012
[The founder] also shared a photo of the
first Pebble prototype using an Arduino and
some similarly cobbled-together hardware.
That was four years ago.
via Slashgear
10. Looking at the hardware trends
• Small, yet mighty
• Multi-screen
• Always on
• $$$ ⇾ $
Project Glass by Google
Steve Mann - world’s first cyborg
12. And how is this related to Android?
This talk will cover:
• External hardware integration
with Android Open Accessory
• NFC for low-friction interactions
(not related to mobile payments)
• Combining with Bluetooth
13. Professional Android Sensor Programming
Disclaimer: I authored chapter 11 (NFC)
& co-authored 10 (AOA)
(more info here)
klab.ca/spotlightandroid
17. More Android Development Kits!
SparkFun IOIO
Microchip PIC24F ADK
ODroid ADK
klab.ca/spotlightandroid
18. Basic firmware/sketch on Arduino ADK
Note: You can get a fully working but barebones Arduino ADK sketch here: iheartrobotics.com/2011/07/arduino-mega-adk-setup-notes.html
#include <Max3421e.h>
USB and USB host libraries
#include <Usb.h>
#include <AndroidAccessory.h> Google-supplied C++ library
Create a new instance of the AndroidAccessory
AndroidAccessory acc("Manufacturer", "Model",
"Description", "1.0",
"http://www.android.com",
"0000000012345678");
void setup() {
Convenience method that simply calls the
acc.powerOn(); powerOn() method in the Max3421e library.
}
void loop() {
byte msg[0]; Continually check for connection to Android app
if (acc.isConnected()) {
//send something to the Android app
acc.write(msg, 1); Create data that the Android app can read
//or read something
int len = acc.read(msg, sizeof(msg), 1); Read data from Android app into msg variable
}
}
19. Accessory Filter Resource
In xml/accessory_filter.xml:
<resources>
<usb-accessory
manufacturer="Manufacturer"
model="Model" Needs to match the Arduino sketch exactly
version="1.0" />
</resources>
20. Android Manifest
In AndroidManifest.xml (3.1+):
<manifest ...>
<uses-sdk android:minSdkVersion="12" />
<uses-feature android:name="android.hardware.usb.accessory" />
<application ...>
<activity ...>
<meta-data
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
From previous slide
<intent-filter>
<action
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>
</intent-filter> Use intent filter to launch this activity
when ADK is plugged in
</activity>
</application>
</manifest>
21. Activity
In the .java file for your Activity (3.1+):
import com.android.hardware.usb.UsbAccessory;
import com.android.hardware.usb.UsbManager;
//...
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory accessory =
(UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
ParcelFileDescriptor fileDescriptor = manager.openAccessory(accessory);
FileDescriptor fd = fileDescriptor.getFileDescriptor();
FileInputStream inputStream = new FileInputStream(fd);
byte[] buffer = new byte[16384];
Read data from the Arduino
int ret = inputStream.read(buffer); via a FileInputStream
FileOutputStream outputStream = new FileOutputStream(fd);
mOutputStream.write(buffer); Write data to the Arduino
via a FileOutputStream
22. Project ideas
So what can you make with the Open Accessory APIs
and an Arduino?
Things already
1+1=3
available Super
on your phone awesome stuff!
Electronics
components
you can add
23. Things already available on your phone
accelerometer touch screen
GPS camera
wifi/3G
mass storage
proximity/light temperature sensor
sensors
microphone NFC
klab.ca/spotlightandroid
24. Electronics components you can add
Electronics inputs and outputs using LittleBits as an example of various components
klab.ca/spotlightandroid
25. Super awesome stuff!
Music Beta: “Now Playing” by Chris Juergen Aerogarden Monitor by Sam Steele
Space Spheres by NASA Floating Sensor Project by UC Berkeley
klab.ca/spotlightandroid
26. Why Open Accessories are “open”
• iOS developer fees: $99/yr. • Fill out zero forms to start
developing.
• Approval required to be in MFi
program; must sign NDAs. • Pay nothing to Google -- now
or ever.
• Additional Apple licensing fees
and 3rd party certification. • No approval process from
Google to go to market.
• Final product needs to be
approved by Apple • USB connectors and drivers
are readily available.
• One supplier (Avent) produces
the connectors.
klab.ca/spotlightandroid
30. What is NFC?
NFC Scanner
Radiowaves
NFC Sticker:
antenna and flash storage
31. How is it different than RFID?
Low frequency radio waves
can travel far distances.
13.56MHz = NFC
High frequency waves cannot.
NFC works within 10cm only.
32. How is it different than RFID?
Storage with RFID is also limited to simple IDs
versus the complex data NFC tags can hold.
NFC Forum Popular Products Operations Rewrite Capabilities Available Memory Communication Price Range
Type of This Type Specifications Speed (price per unit)
1 Broadcom Topaz ISO 14443A User rewritable; can be 96 bytes, expandable to 2KB 106kbit/s Low
marked as read-only by (~$1-2 USD)
user
2 MIFARE ISO 14443A User rewritable; can be 48 bytes, 144 bytes is 106kbit/s Low
UltraLight marked as read-only by common, expandable to 2KB (~$1-2 USD)
user
3 Sony FeliCa JIS X 6319-4 Manufacture pre- variable, theoretical 1MB 212kbit/s or High
configured to be read- 424kbit/s (~$8-10 USD or
only or re-writable. higher)
4 NXP DESFire, NXP ISO 14443A, Manufacture pre- 4KBfor DESFire, up to Up to 424kbit/s Medium-High
SmartFX ISO 14443B configured to be read- 32KBfor SmartFX (~$3-4 USD)
only or rewritable.
MIFARE Operations Specifications Rewrite Capabilities Available Memory Communicatio Price Range
Type n Speed (price per unit)
Classic 1K ISO 14443A compatible, but NDEF User rewritable; only 752 bytes 106kbit/s Low
is formatted using a proprietary manufacturer can mark (~$1 USD)
protocol as read-only
Classic 4K ISO 14443A compatible, but NDEF User rewritable; only 3440 bytes 106kbit/s Low-Medium
is formatted using a proprietary manufacturer can mark (~$2 USD)
protocol as read-only
35. Activity - Reacting to NFC scans
In the .java file for your Activity:
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
//...
NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
Boolean nfcEnabled = mNfcAdapter.isEnabled();
Give priority to the foreground
mNfcAdapter.enableForegroundDispatch(this, activity to receive NFC scan intents.
mNfcPendingIntent, mReadTagFilters, null);
Enable Android Beam for peer-to-peer
mNfcAdapter.setNdefPushMessageCallback(this,this);
36. Activity - Formatting to NDEF Format
In the .java file for your Activity:
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
//...
// get the values from the form's text fields:
Editable nameField = mName.getText();
JSONObject computerSpecs = new JSONObject(); JSON for readability,
not performance
computerSpecs.put("name", nameField);
String data = computerSpecs.toString();
// create a new NDEF record w/ NDEF message using the app's custom MIME type:
String mimeType = "application/root.gast.playground.nfc"; Unique to your app
byte[] mimeBytes = mimeType.getBytes(Charset.forName("UTF-8"));
byte[] dataBytes = data.getBytes(Charset.forName("UTF-8"));
byte[] id = new byte[0];
NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
mimeBytes, id, dataBytes); Not hard at all!
NdefMessage m = new NdefMessage(new NdefRecord[] { record });
37. Activity - Reading NDEF Format
In the .java file for your Activity:
import android.nfc.Tag;
//...
Parcelable[] rawMsgs =
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage[] msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
NdefRecord record = msgs[0].getRecords()[0];
The info you wanted.
byte[] payload = record.getPayload(); (e.g. string or json)
38. A case for NFC
• Create low friction interactions
• Augment physical objects (even offline)
• Make your software app more tangible
• Engage others to share and connect
• Increase the viralness of your app
• Possibility to be platform agnostic
klab.ca/spotlightandroid
39. Mobile OS support for NFC
Chart updated for Sept 27, 2012
klab.ca/spotlightandroid
40. Don’t worry, this isn’t Apple bashing...
Hey! What By touching
did you just do phones?
there?
Oh, I just sent
him a playlist.
klab.ca/spotlightandroid
41. Thank you!
Oh, and check out some upcoming Arduino workshops!
Sign up for mailing list on karma-laboratory.com.
Pearl Chen Google+: klab.ca/+
pearl@karma-laboratory.com Twitter: @PearlChen
klab.ca/spotlightandroid