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.

Pierre Crépieux

April 24, 2018
Tweet

More Decks by Pierre Crépieux

Other Decks in How-to & DIY

Transcript

  1. 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
  2. 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
  3. 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é
  4. 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 •…
  5. 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
  6. 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
  7. 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.
  8. Le MediaRouter MediaRouteProvider.Callback onDescriptorChanged setDescriptor onRouteAdded MediaRouter MediaRouteProvider App MediaRouter.Callback

    addCallback selectRoute MediaRouter.RouteInfo onRouteSelected dismiss MediaRouter.Callback MediaRouteChooserDialog onDiscoveryRequestChanged
  9. 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
  10. 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
  11. 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
  12. Découverte • Sans surprise, les protocoles de découvertes s’appuient sur

    le multicast, notamment : • SSDP • DNS-SD (si couplé à mDNS)
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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)
  18. 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é.
  19. 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
  20. 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 • …
  21. 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
  22. 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
  23. Intégration • Yocto • WPE (WebKit Port optimized for Embedded)

    • NodeJS • OCast • et surtout, un bon guide …