35
IT’S ZEROCONF Bonjour Android Roberto Orgiu Giuseppe Mariniello Android Developer Backend Developer

Bonjour Android, it's ZeroConf

Embed Size (px)

Citation preview

IT’S ZEROCONFBonjour Android

Roberto Orgiu

Giuseppe Mariniello

Android Developer

Backend Developer

WHAT IS ZEROCONF?

“ZERO-CONFIGURATION NETWORKING IS A SET OF TECHNOLOGIES THAT AUTOMATICALLY CREATES A USABLE COMPUTER NETWORK BASED ON THE INTERNET PROTOCOL SUITE (TCP/IP) WHEN COMPUTERS OR NETWORK PERIPHERALS ARE INTERCONNECTED.“

WHAT IS ZEROCONF

WHAT IS ZEROCONF

“IT DOES NOT REQUIRE MANUAL OPERATOR INTERVENTION OR SPECIAL CONFIGURATION SERVERS.“

WHERE CAN WE FIND ZEROCONF?

ALMOST EVERYWHERE

BONJOUR ANDROID, IT’S ZEROCONF

THINK “DIFFERENT”

▸ ZeroConf is a standard

▸ UPnP/DLNA are somehow similar, but different people and ideas

▸ Apple has its own implementation, called Bonjour (once Rendezvous)

▸ On Android, we have very different solutions for using it

APPLE OFTEN REFERS TO ZEROCONF AS BONJOUR, GIVING THEIR OWN DEFINITION OF THE CONCEPTS

BONJOUR ANDROID, IT’S ZEROCONF

FUN FACT

Wut? Why do you even…?

BONJOUR ANDROID, IT’S ZEROCONF

HOW DOES IT WORK?Ehy! I am 192.168.1.50 and I have the service DroidConService running on port 56472!

Great! Exactly what I was looking for!

BONJOUR ANDROID, IT’S ZEROCONF

▸ No infrastructure needed

▸ Simplicity over scalability

▸ 4 areas: IP interface configuration, translation between host name and IP address, IP multicast address allocation, service discovery

▸ Aware of network changes

▸ Still a draft

HOW DOES IT WORK?

BONJOUR ANDROID, IT’S ZEROCONF

▸ Configure netmask

▸ Allocate unique IP address

IP INTERFACE CONFIGURATION

BONJOUR ANDROID, IT’S ZEROCONF

▸ Allows hostnames to be mapped to IP addresses and back

▸ Failure proof with retry mechanism

▸ Conflict detection

TRANSLATION BETWEEN HOST NAME AND IP ADDRESS

BONJOUR ANDROID, IT’S ZEROCONF

IP MULTICAST ADDRESS ALLOCATION

▸ List which of the scopes (local, site-local, link-local) are available

▸ Select a multicast address preventing conflicts

BONJOUR ANDROID, IT’S ZEROCONF

SERVICE DISCOVERY

▸ Service must be discoverable via identifier and/or type

▸ Discovery without the use of a service-specific protocol and should complete in a timely manner (10s of seconds)

▸ Prompt detection of new services in a timely manner (10s of seconds)

DRAF

T

BONJOUR ANDROID, IT’S ZEROCONF

HOW DOES IT WORK?

▸ Each part must start with _ (underscore)

▸ The second part only allows _tcp or _udp

_ServiceType._TransportProtocolName.

List of common services goo.gl/EXh1g

BONJOUR ANDROID, IT’S ZEROCONF

WHAT ABOUT ANDROID?

▸ API FROM 4.1

▸ JMDNS FOR JAVA

▸ APPLE NATIVE (C++) IMPLEMENTATION

BONJOUR ANDROID, IT’S ZEROCONF

JMDNS FOR JAVA

▸ Easy to implement

▸ Runs on the main thread, unless we specify otherwise

▸ Distributed as JAR or via Maven repo

▸ Long start-up time

▸ Compatible with all the Android versions

BONJOUR ANDROID, IT’S ZEROCONF

WHAT ABOUT ANDROID?

▸ API FROM 4.1

▸ JMDNS FOR JAVA

▸ APPLE NATIVE (C++) IMPLEMENTATION

BONJOUR ANDROID, IT’S ZEROCONF

APPLE NATIVE (C++) IMPLEMENTATION

▸ Ported to Android by Apple

▸ Open-sourced

▸ Needs Android NDK

▸ Few projects come with it already packed in

▸ Short startup time

▸ More complex logic

BONJOUR ANDROID, IT’S ZEROCONF

WHAT ABOUT ANDROID?

▸ API FROM 4.1

▸ JMDNS FOR JAVA

▸ APPLE NATIVE (C++) IMPLEMENTATION

BONJOUR ANDROID, IT’S ZEROCONF

ANDROID API

▸ From Android 4.1, custom attributes added with 5.1 (API 21)

▸ Already asynchronous, with return on the main thread

▸ Verbose, but easy to implement

▸ Based on two steps: discovery and resolution

▸ Only one service can be resolved at a time

http://developer.android.com/training/connect-devices-wirelessly/nsd.html

BONJOUR ANDROID, IT’S ZEROCONF

ANDROID API - SERVER

NsdServiceInfo serviceInfo = new NsdServiceInfo(); serviceInfo.setServiceName("DroidConService"); serviceInfo.setServiceType("_http._tcp."); serviceInfo.setPort(randomPort);

nsdManager = Context.getSystemService(Context.NSD_SERVICE); nsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);

Remember to unregister the service upon app closing!

BONJOUR ANDROID, IT’S ZEROCONF

ANDROID API - CLIENT

class Resolver extends NsdManager.ResolveListener {

@Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {}

@Override public void onServiceResolved(NsdServiceInfo serviceInfo) { // here we can use our resolved service } };

Resolve resolveListener = new Resolve();

BONJOUR ANDROID, IT’S ZEROCONF

ANDROID API - CLIENT

class Resolver extends NsdManager.ResolveListener {

@Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {}

@Override public void onServiceResolved(NsdServiceInfo serviceInfo) { // here we can use our resolved service } };

Resolve resolveListener = new Resolve();

BONJOUR ANDROID, IT’S ZEROCONF

ANDROID API - CLIENTclass SimpleDiscoveryListener extends NsdManager.DiscoveryListener { @Override public void onDiscoveryStarted(String regType) {} @Override public void onServiceFound(NsdServiceInfo service) { if (service.getServiceName().contains(“DroidConService")){ nsdManager.resolveService(service, resolveListener); } } @Override public void onServiceLost(NsdServiceInfo service) {} @Override public void onDiscoveryStopped(String serviceType) {} @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { nsdManager.stopServiceDiscovery(this); } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { nsdManager.stopServiceDiscovery(this); }};

BONJOUR ANDROID, IT’S ZEROCONF

ANDROID API - CLIENTclass SimpleDiscoveryListener extends NsdManager.DiscoveryListener { @Override public void onDiscoveryStarted(String regType) {} @Override public void onServiceFound(NsdServiceInfo service) { if (service.getServiceName().contains(“DroidConService")){ nsdManager.resolveService(service, resolveListener); } } @Override public void onServiceLost(NsdServiceInfo service) {} @Override public void onDiscoveryStopped(String serviceType) {} @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { nsdManager.stopServiceDiscovery(this); } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { nsdManager.stopServiceDiscovery(this); }};

BONJOUR ANDROID, IT’S ZEROCONF

ANDROID API - CLIENT

SimpleDiscoveryListener discoveryListener = new SimpleDiscoveryListener(); nsdManager.discoverServices(SERVICE_TYPE,

NsdManager.PROTOCOL_DNS_SD, discoveryListener); nsdManager.stopServiceDiscovery(discoveryListener);

BONJOUR ANDROID, IT’S ZEROCONF

ANDROID API - CLIENT

SimpleDiscoveryListener discoveryListener = new SimpleDiscoveryListener(); nsdManager.discoverServices(SERVICE_TYPE,

NsdManager.PROTOCOL_DNS_SD, discoveryListener); nsdManager.stopServiceDiscovery(discoveryListener);

ARE THERE BETTER WAYS OF DOING IT?

YES, THERE ARE!ARE THERE BETTER WAYS OF DOING IT

BONJOUR ANDROID, IT’S ZEROCONF

BETTER WAYS OF DOING IT

▸ better-zeroconf

▸ RxDNSSD

▸ RxBonjour

▸ ZeRxConf

▸ android-mdns

▸ JmDNS

▸ Apple mDNS

▸ Apple mDNS

▸ JmDNS + Android Native APIs

▸ Apple mDNS

DEMO TIME!

Q & ACHECK THE REPO @ GITHUB.COM/ENNOVA-IT/DROIDCON-DEMO

BONJOUR ANDROID, IT’S ZEROCONFTHANKS FOR WATCHING!