Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Par delà le Mediarouter, fabriquons notre FooBarCast

Par delà le Mediarouter, fabriquons notre FooBarCast

Dans cette session, nous allons explorer les APIs disponibles sur Android pour détecter et contrôler un RaspberryPi que l'on intégrera avec le MediaRouter. En jouant avec le NsdManager, le MediaRouteProvider, ainsi qu'un SDK open source (OCast), nous nous familiariserons avec mDNS, DIAL et verrons comment articuler tout ce petit monde pour diffuser du contenu sur une TV depuis son appli Android.

Db950a4adf54b7a13cd3c70fdcd7e334?s=128

Pierre Crépieux

April 24, 2018
Tweet

Transcript

  1. Fabriquons notre FooBarCast Par delà le MediaRouter, Pierre Crepieux

  2. Agenda MediaRouter framework • MediaRouteButton • MediaRouteProvider • MediaRouter •

    MediaRouter.Callback Présentation du FooBarCast Découverte • rappel sur le réseaux • SSDP • DIAL • mDNS • DNS-SD Intégration • OS • Browser web • OCast
  3. FooBarCast

  4. FooBarCast

  5. FooBarCast

  6. FooBarCast

  7. None
  8. IETF UPNP Forum Netflix DIAL SSDP RFC 791: IP RFC

    768: UDP RFC 793: TCP RFC 2236: IGMP RFC 6762: Multicast DNS RFC 2774: HTTP Extension Draft: General Event Notification Architecture RFC 6763: DNS SD RFC 2616: HTTP
  9. Le MediaRouter MediaRouter Plus qu’une classe … un framework

  10. Le MediaRouter MediaRouter

  11. Le MediaRouter MediaRouter MediaRouter.Callback

  12. Le MediaRouter MediaRouter Application MediaRouter.Callback

  13. Le MediaRouter MediaRouter MediaRouteButton Application MediaRouter.Callback

  14. Le MediaRouter MediaRouter MediaRouteButton MediaRouteActionProvider Application MediaRouter.Callback

  15. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback

  16. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

  17. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

  18. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

    Le MediaRouter permet à une application de piloter un flux media depuis son smartphone vers un appareil donné
  19. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

  20. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

    Une MediaRouter.Callback permet d’être informé des événements relatifs aux changements de routes: •onRouteAdded •onRouteRemoved •onRouteSelected •onRouteUnselected •…
  21. Le MediaRouter MediaRouter MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code MediaRouteButton

  22. Le MediaRouter MediaRouter MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code Le

    MediaRouteButton permet de : • sélectionner les routes (MediaRouteChooserDialog) • les controller (MediaRouteControllerDialog) Généralement associé au MediaRouteActionProvider pour l’afficher dans l’action bar MediaRouteButton
  23. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

  24. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

    Un MediaRouteProvider permet de découvrir des « routes » et de les rendre accessibles à une application en publiant des MediaRouteProviderDescriptor
  25. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

  26. Le MediaRouter MediaRouter MediaRouteButton MediaRouteProvider MediaRouteActionProvider Application MediaRouter.Callback custom code

    L’appli, c’est vous qui voyez … Reste à implémenter un MediaRouteProvider pour découvrir notre Raspberry Pi.
  27. Le MediaRouter MediaRouteProvider.Callback onDescriptorChanged setDescriptor onRouteAdded MediaRouter MediaRouteProvider App MediaRouter.Callback

    addCallback selectRoute MediaRouter.RouteInfo onRouteSelected dismiss MediaRouter.Callback MediaRouteChooserDialog onDiscoveryRequestChanged
  28. Démo

  29. com.orange.labs.foobarcast Le MediaRouter com.google.android.gms your.packagename.provider Home youtube Démo App1 App2

    Applications MediaRouter MediaRouteProvider Route RemotePlaybackClient RouteController RouteController play sendControlRequest onControlRequest play
  30. Découverte

  31. Découverte STB Home GW TV #1 tablette laptop smartphone TV

    #2 HDMI stick
  32. Découverte STB Home GW TV #1 tablette laptop smartphone TV

    #2 HDMI stick
  33. Découverte STB Home GW TV #1 tablette laptop smartphone TV

    #2
  34. Découverte • Comment savoir qu’un service peut être rendu par

    un des équipements du réseau local ? • Plusieurs approches: celle • du bon • de la brute • et du truand
  35. None
  36. Unicast « le truand »

  37. Unicast « le truand »

  38. Unicast

  39. Unicast

  40. Unicast

  41. Unicast

  42. Unicast

  43. Unicast

  44. Unicast

  45. Unicast

  46. Unicast

  47. Unicast

  48. Unicast ?

  49. Unicast ?

  50. Unicast ?

  51. Unicast ?

  52. None
  53. Broadcast « la brut »

  54. Broadcast « la brut »

  55. Broadcast

  56. Broadcast

  57. Multicast

  58. Multicast « le bon »

  59. Multicast « le bon »

  60. Multicast

  61. Multicast

  62. Multicast • Permet d’envoyer du traffic à plusieurs équipements sans

    forcément addresser tout le monde • Utilise une plage d’adresse spécifique: 224.0.0.0 - 239.255.255.255 (11100000.00000000.00000000.00000000) • Nécessite un protocole supplémentaire pour optimiser le routage de flux (IGMP) • De fait, le multicast exclue l’usage de TCP
  63. Multicast

  64. Multicast Foobar indique au groupe 239.255.255.250 qu’il en fait partie

  65. Multicast Le routeur indique à tout le monde qu’il souhaite

    savoir ce qui les intéresse
  66. Multicast Foobar indique au groupe 239.255.255.250 qu’il en fait partie

  67. Multicast Foobar indique au groupe 224.0.0.251 qu’il en fait partie

  68. Multicast Le routeur indique à tout le monde qu’il souhaite

    savoir ce qui les intéresse
  69. Multicast Foobar indique au groupe 224.0.0.251 qu’il en fait partie

  70. Multicast Foobar indique au groupe 239.255.255.250 qu’il en fait partie

  71. Multicast Foobar indique à tout les routeurs qu’il quitte le

    groupe 239.255.255.250
  72. None
  73. None
  74. Découverte • Sans surprise, les protocoles de découvertes s’appuient sur

    le multicast, notamment : • SSDP • DNS-SD (si couplé à mDNS)
  75. SSDP • Simple Service Discovery Protocol • Défini par l’UPNP

    forum • protocole texte basé sur HTTP • annonces et requêtes envoyées en multicast • réponses envoyées en unicast
  76. SSDP

  77. SSDP

  78. SSDP

  79. SSDP

  80. SSDP

  81. SSDP

  82. SSDP

  83. SSDP

  84. SSDP

  85. DIAL • Le protocole DIAL se compose de 2 parties:

    • Découverte de Service (basée sur SSDP) • Détection de serveurs DIAL sur le réseau • Info d’accès au service REST • Service REST (basé sur HTTP) • Lancer/interroger/arrêter une appli sur un appareil
  86. None
  87. DIAL discovery

  88. DIAL discovery • x@x@

  89. DIAL Rest service

  90. GET /apps/Foobar-App HTTP/1.1\r\n Host: 192.168.1.31:8008\r\n HTTP/1.1 200 OK\r\n Content-Type: application/xml\r\n

    \r\n <?xml version="1.0" encoding="UTF-8"?> <service xmlns="urn:dial-multiscreen-org:schemas:dial" dialVer="2.1"> <name>Foobar-App</name> <options allowStop="true"/> <state>stopped</state> <link rel="run" href="run"/> </service> POST /apps/Foobar-App HTTP/1.1\r\n Content-Length: 0\r\n Host: 192.168.1.31:8008\r\n HTTP/1.1 201 Created\r\n Location: http://192.168.1.31:8008/apps/Foobar-App/run\r\n \r\n
  91. GET /apps/Foobar-App/run HTTP/1.1\r\n Host: 192.168.1.31:8008\r\n HTTP/1.1 200 OK\r\n Content-Type: application/xml\r\n

    \r\n <?xml version="1.0" encoding="UTF-8"?> <service xmlns="urn:dial-multiscreen-org:schemas:dial" dialVer="2.1"> <name>Foobar-App</name> <options allowStop="true"/> <state>running</state> <link rel="run" href="run"/> </service> DELETE /apps/Foobar-App/run HTTP/1.1\r\n Host: 192.168.1.31:8008\r\n HTTP/1.1 200 OK\r\n
  92. mDNS/DNS-SD • Ce sont 2 technos complémentaires qui s’appuient largement

    sur DNS. • mDNS: https://tools.ietf.org/html/rfc6762 • permet la résolution de noms sur le réseau locale sans serveur centralisé • DNS-SD: https://tools.ietf.org/html/rfc6763 • permet la découverte de service sur le réseau • souvent associé à mDNS (mais pas obligatoire)
  93. mDNS • Utilise le multicast • Utilise le port 5353

    • utilise le pseudo-TLD .local • Utilise la Section « Answer » dans une requête pour lister les réponse qu’il connait déjà. • Utilise des réponses « non sollicitées » pour annoncer de nouveaux enregistrements. • Utilise des réponse « non sollicitées » avec un TTL de 0 pour annoncer qu’un enregistrement est supprimé.
  94. mDNS

  95. mDNS

  96. DNS-SD • Applicable à DNS et mDNS • Définit comment

    un service peut être décrit avec des enregistrements DNS de type SRV et TXT. • Rechercher les instances d’un service se fait en interrogeant des enregistrements de type PTR • Service Instance Name = <Instance> . <Service> . <Domain> (eg: bob._foobar._tcp) • Permet de lister les services avec une requête sur _services._dns-sd._udp
  97. DNS-SD • sous mac • dns-sd -B _services._dns-sd._udp • dns-sd

    -R "alice" _foobar._tcp . 8008 • dns-sd -L alice _foobar._tcp • sous linux • avahi-browse _services._dns-sd._udp • avahi-publish-service "bob" _foobar._tcp 8888 • …
  98. DNS-SD

  99. DNS-SD

  100. DNS-SD « know answer suppression »

  101. None
  102. parfois source d’ennuis… • https://productforums.google.com/forum/#!topic/ googlehome/lssgm7TjgGs;context-place=forum/ googlehome

  103. parfois source d’ennuis…

  104. NsdManager

  105. Démo

  106. Intégration Une fois l’appareil détecté, reste à le piloter

  107. Intégration • Mediarouter • Découverte

  108. None
  109. None
  110. OCast Browser web Config ws: ws: IPC, System call,… Web

    App SDK JS
  111. OCast

  112. None
  113. Démo

  114. Intégration Raspberry Pi 3 : - SOC Broadcom BCM2837: -

    ARM Cortex A53 (ARMv8) - quad core à 1,2 GHz - GPU Broadcom VideoCore IV. - 1GB RAM - connectivité ethernet, WiFi et Bluetooth
  115. Intégration • Raspbian • Chromium • NodeJS • OCast

  116. Intégration • Raspbian • Chromium • NodeJS • OCast

  117. Intégration Raspberry Pi Zero W : - SOC Broadcom BCM2835:

    - ARM1176JZF-S (ARMv6) - single core 1 GHz - GPU Broadcom VideoCore IV. - 512 Mo de RAM - connectivité sans fil WiFi et Bluetooth
  118. None
  119. Intégration • Yocto • WPE (WebKit Port optimized for Embedded)

    • NodeJS • OCast • et surtout, un bon guide …
  120. None
  121. Démo

  122. Merci