morena middleware2012

21
MORENA: A Middleware for Programming NFC-enabled Android Applications as Distributed Object-Oriented Programs Andoni Lombide Carreton Kevin Pinte Wolfgang De Meuter ACM/IFIP/USENIX 13th International Conference on Middleware 2012 December 5 2012 Montreal, Canada Monday 28 January 13

Upload: alombide

Post on 08-Jul-2015

192 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Morena middleware2012

MORENA: A Middleware for Programming NFC-enabled Android Applications as Distributed Object-Oriented Programs

Andoni Lombide CarretonKevin PinteWolfgang De Meuter

ACM/IFIP/USENIX 13th International Conference on Middleware 2012December 5 2012Montreal, Canada

Monday 28 January 13

Page 2: Morena middleware2012

• NFC (touch range).

• Callback on activities to detect RFID tags with subscribed MIME-type in memory.

• File access abstraction

RFID in Android

NdefMessage: { , , }

NdefRecord byte array

read write

Monday 28 January 13

Page 3: Morena middleware2012

Drawbacks of the Android NFC API

• Manual failure handling (and NFC causes A LOT of failures because of its hardware characteristics).

• Blocking communication (Android documentation recommends to use a separate thread for many RFID operations).

• Manual data conversion

• Tight coupling with activity-based architecture

Monday 28 January 13

Page 4: Morena middleware2012

Lessons Learnt from Previous Ambient-Oriented Programming Research

• Using objects as first class software representations for RFID-tagged “things” is a nice abstraction.

• These objects can be directly stored in the RFID tags’ memory to minimize data conversion.

• Event-driven discovery (fortunately built-in into Android).

• Asynchronous reads and writes.

Monday 28 January 13

Page 5: Morena middleware2012

Application

Middleware Architecture

Android

Tag level

Thing level One middlewarefor Android 4.0

or higher

Monday 28 January 13

Page 6: Morena middleware2012

Evaluation: WiFi Sharing Application

Monday 28 January 13

Page 7: Morena middleware2012

Evaluation: WiFi Sharing Application

Monday 28 January 13

Page 8: Morena middleware2012

Things

public class WifiConfig extends Thing {

public String ssid_; public String key_;

public WifiConfig(ThingActivity<WifiConfig> activity, String ssid, String key) { super(activity); ssid_ = ssid; key_ = key; } public boolean connect(WifiManager wm) {

// Connect to ssid_ with password key_ };}

From now on, we don’t have to worry about the

activity anymore.

Supported serialization: - JSON-serializable fields. - Skipping transient fields. - Deep serialization, no cycles.

Monday 28 January 13

Page 9: Morena middleware2012

Initializing Things

@Overridepublic void whenDiscovered(EmptyRecord empty) { empty.initialize( myWifiThing, new ThingSavedListener<WifiConfig>() { @Override public void signal(WifiConfig thing) { toast("WiFi joiner created!"); } }, new ThingSaveFailedListener() { @Override public void signal() { toast("Creating WiFi joiner failed, try again."); } });}

As soon as an empty tag is detected

Monday 28 January 13

Page 10: Morena middleware2012

Discovering and Reading Things

@Overridepublic void whenDiscovered(WifiConfig wc) { toast("Joining Wifi network " + wc.ssid_); wc.connect();}

As soon as a WifiConfig tag is detected

Contains cached fields for synchronous access.

Physical reads must be asynchronous.

Monday 28 January 13

Page 11: Morena middleware2012

Saving Modified Things

myWifiConfig.ssid_ = "MyNewWifiName";myWifiConfig.key_ = "MyNewWifiPassword";

myWifiConfig.saveAsync( new ThingSavedListener<WifiConfig>() { @Override public void signal(WifiConfig wc) { toast("WiFi joiner saved!"); } }, new ThingSaveFailedListener() { @Override public void signal() { toast("Saving WiFi joiner failed, try again."); } });

Monday 28 January 13

Page 12: Morena middleware2012

Broadcasting Things to Other Phones

myWifiConfig.broadcast( new ThingBroadcastSuccessListener<WifiConfig>() { @Override public void signal(WifiConfig wc) { toast("WiFi joiner shared!"); } }, new ThingBroadcastFailedListener<WifiConfig>() { @Override public void signal(WifiConfig wc) { toast("Failed to share WiFi joiner, try again."); } });

Will trigger whenDiscovered on the receiving phone with the broadcasted thing

Monday 28 January 13

Page 13: Morena middleware2012

Evaluation: WiFi Sharing Application

Monday 28 January 13

Page 14: Morena middleware2012

Middleware Architecture

Android

Tag level

Thing level One middlewarefor Android 4.0

or higher

Application

Monday 28 January 13

Page 15: Morena middleware2012

Detecting RFID Tags

new MyTagDiscoverer(this, THING_TYPE, new NdefMessageToStringConverter(), new StringToNdefMessageConverter());

private class MyTagDiscoverer extends TagDiscoverer { @Override public void onTagDetected(TagReference tagReference) { readTagAndUpdateUI(tagReference); } @Override public void onTagRedetected(TagReference tagReference) { readTagAndUpdateUI(tagReference); }}

Monday 28 January 13

Page 16: Morena middleware2012

The Tag Reference Abstraction

Monday 28 January 13

Page 17: Morena middleware2012

Reading RFID Tags

tagReference.read( new TagReadListener() { @Override public void signal(TagReference tagReference) { // tagReference.getCachedData() } }, new TagReadFailedListener() { @Override public void signal(TagReference tagReference) { // Deal with failure } });

Monday 28 January 13

Page 18: Morena middleware2012

Writing RFID Tags

tagReference.write( toWrite, new TagWrittenListener() { @Override public void signal(TagReference tagReference) { // Handle write success } }, new TagWriteFailedListener() { @Override public void signal(TagReference tagReference) { // Deal with failure } });

Monday 28 January 13

Page 19: Morena middleware2012

Fine-grained Filtering

private class MyTagDiscoverer extends TagDiscoverer { @Override public void onTagDetected(TagReference tagReference) { readTagAndUpdateUI(tagReference); } @Override public void onTagRedetected(TagReference tagReference) { readTagAndUpdateUI(tagReference); }

@Override public boolean checkCondition(TagReference tagReference) { // Can be used to apply a predicate // on tagReference.getCachedData() }}

Monday 28 January 13

Page 20: Morena middleware2012

Conclusion

• Event-driven discovery.

• Non-blocking communication:

• Things: cached copy, asynchronous saving of cached data.

• TagReferences: first class references to RFID tags offering asynchronous reads and writes.

• Automatic data conversion

• Looser coupling from activity-based architecture

• Data structures over several tags, stronger consistency guarantees?

Monday 28 January 13

Page 21: Morena middleware2012

MORENA: A Middleware for Programming NFC-enabled Android Applications as Distributed Object-Oriented Programs

Andoni Lombide CarretonKevin PinteWolfgang De Meuter

ACM/IFIP/USENIX 13th International Conference on Middleware 2012December 5 2012Montreal, Canada

Monday 28 January 13