View
712
Download
0
Category
Preview:
Citation preview
“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.“
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
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);
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
Recommended