Slide 1

Slide 1 text

Zeroconf on iOS merpay Tech Talk #1

Slide 2

Slide 2 text

About me • Software Engineer at merpay • Twitter : @_natpenguin • GitHub : natpenguin

Slide 3

Slide 3 text

Agenda • What is the Zeroconf? • Coding on iOS

Slide 4

Slide 4 text

Zeroconf

Slide 5

Slide 5 text

Zero Configuration Networking Zeroconf

Slide 6

Slide 6 text

Zeroconf connecting…

Slide 7

Slide 7 text

Zeroconf connected!

Slide 8

Slide 8 text

Zeroconf connected! No needed human operation

Slide 9

Slide 9 text

Zeroconf • To provide IP address • To automatically resolve the host name • To automatically distribute the host name • To find services

Slide 10

Slide 10 text

History

Slide 11

Slide 11 text

AppleTalk

Slide 12

Slide 12 text

AppleTalk 1984

Slide 13

Slide 13 text

1984 # $

Slide 14

Slide 14 text

Protocol AppleTalk Address Resolution Protocol / AppleTalk Address Resolution Protocol / Datagram Delivery Protocol /FUXPSL Transport 4FTTJPO 1SFTFOUBUJPO "QQMJDBUJPO Routing Table Maintenance Protocol / AppleTalk Echo Protocol / Name Binding Protocol / AppleTalk Transaction Protocol / AppleTalk Update-Based Routing Protocol AppleTalk Filing Protocol Zone Information Protocol / Printer Access Protocol / AppleTalk Session Protocol / AppleTalk Data Stream Protocol

Slide 15

Slide 15 text

Problem

Slide 16

Slide 16 text

Load

Slide 17

Slide 17 text

Problem on AppleTalk

Slide 18

Slide 18 text

Problem on AppleTalk

Slide 19

Slide 19 text

TCP/IP

Slide 20

Slide 20 text

TCP/IP AppleTalk

Slide 21

Slide 21 text

AppleTalk

Slide 22

Slide 22 text

Bonjour

Slide 23

Slide 23 text

Bonjour • Instead of AppleTalk • Resolved the problem of performance • Implementation on TCP/IP • AirPrint / AirPlay(AirTunes) • Only local network

Slide 24

Slide 24 text

Coding

Slide 25

Slide 25 text

Bonjour API • To provide IP address • To automatically resolve the host name • To automatically distribute the host name • To find services

Slide 26

Slide 26 text

Bonjour API • To provide IP address • To automatically resolve the host name • To automatically distribute the host name • To find services

Slide 27

Slide 27 text

Coding

Slide 28

Slide 28 text

Server NetService

Slide 29

Slide 29 text

Server let domain = "local." let type = "_awesome._tcp." let name = "Awesome Service" let port: Int32 = 10000

Slide 30

Slide 30 text

Server let domain = "local." let type = "_awesome._tcp." let name = "Awesome Service" let service = NetService(domain: domain, type: type, name: name, port: port) let port: Int32 = 10000

Slide 31

Slide 31 text

Server let domain = "local." let type = "_awesome._tcp." let name = "Awesome Service" service.publish() let service = NetService(domain: domain, type: type, name: name, port: port) let port: Int32 = 10000

Slide 32

Slide 32 text

https://www.iana.org/assignments/ service-names-port-numbers/ service-names-port-numbers.xhtml Document of Type

Slide 33

Slide 33 text

Client NetServiceBrowser

Slide 34

Slide 34 text

Client let domain = "local." let type = "_awesome._tcp."

Slide 35

Slide 35 text

Client let domain = "local." let type = "_awesome._tcp." browser.searchForServices(ofType: type, inDomain: domain)

Slide 36

Slide 36 text

Client browser.searchForServices(ofType: type, inDomain: domain) func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) let domain = "local." let type = "_awesome._tcp."

Slide 37

Slide 37 text

Client browser.searchForServices(ofType: type, inDomain: domain) func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) let domain = "local." let type = "_awesome._tcp." browser.delegate = self

Slide 38

Slide 38 text

Client extension ViewController: NetServiceBrowserDelegate { func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) { service.resolve(withTimeout: 10.0) } }

Slide 39

Slide 39 text

Client func netServiceDidResolveAddress(_ sender: NetService) extension ViewController: NetServiceBrowserDelegate { func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) { service.resolve(withTimeout: 10.0) } }

Slide 40

Slide 40 text

Client func netServiceDidResolveAddress(_ sender: NetService) extension ViewController: NetServiceBrowserDelegate { func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) { service.delegate = self service.resolve(withTimeout: 10.0) } }

Slide 41

Slide 41 text

Client more BSD Socket CFSocket NSStream

Slide 42

Slide 42 text

https://developer.apple.com/ documentation/foundation/ netservice Document of NetService

Slide 43

Slide 43 text

Command $ dns-sd -B $ dns-sd -L $ dns-sd -G $ dns-sd -H Browsing Resolving a service instance Getting IP Address Help

Slide 44

Slide 44 text

Command $ dns-sd -B _printer._tcp Browsing a printer service

Slide 45

Slide 45 text

Command $ dns-sd -B _printer._tcp Browsing a printer service Browsing for _printer._tcp DATE: ---Mon 20 Aug 2018--- 3:21:58.151 ...STARTING... Timestamp A/R Flags if Domain Service Type Instance Name 3:21:58.151 Add 2 8 local. _printer._tcp. Printer Service

Slide 46

Slide 46 text

iOS12

Slide 47

Slide 47 text

Network.framework

Slide 48

Slide 48 text

Network.framework let name = "Awesome Service" let type = "_awesome._tcp." let domain = "local." let parameters = NWParameters.tcp let port = NWEndpoint.Port(integerLiteral: 10000) listener.service = NWListener.Service(name: name, type: type, domain: domain) guard let listener = try? NWListener(using: parameters, on: port) else { fatalError("Listener can't be initialized") }

Slide 49

Slide 49 text

Android https://github.com/mannodermaus/ RxBonjour https://github.com/andriydruk/ RxDNSSD https://github.com/HQarroum/ android-mdns

Slide 50

Slide 50 text

Paradigm Foo Foo

Slide 51

Slide 51 text

Paradigm Foo Foo Zeroconf

Slide 52

Slide 52 text

Paradigm

Slide 53

Slide 53 text

Paradigm Zeroconf

Slide 54

Slide 54 text

Let’s enjoy