UPNP/DLNA avec SWIFT 3 et Xcode 8

Bonjour à  tous,


 


Je suis en train de développer une application de type vidéothèque.


J'ai créer la base de donnée avec coredata, jusque là  pas de soucis.


 


Maintenant j'aimerai utiliser le protocole UPNP ou DLNA pour :


 


1-Récupérer la liste des médias partagés sur un mediaserver


 


2-Récupérer les liens de ces médias et les mettre dans ma base de donnée (lien du type : http:// 192.168.0.30:50002/v/NDLNA/30002.avi?)


 


3-Lancer la lecture des vidéos sur une TV


 


Mon problème est que je ne trouve pas de librairies UPNP en Swift 3.


 


J'ai trouvé plusieurs librairies (UPNPX, UpnpAtom, cyberlink, platinum, Ohnet...) mais que je n'arrive pas à  exploiter. Elles sont en C ou objective C et je ne parvient pas à  les utiliser.


 


Est-ce que quelqu'un a un lien vers une librairie écrite en Swift? Ou une procédure pour utiliser une des librairies que j'ai trouvé?


 


Merci d'avance.


Réponses

  • Bonjour,


    Tu peux parfaitement utiliser une librairie C/C++/ObjectiveC/ObjectiveC++ avec ton code Swift. Je pense d'ailleurs que toute les libraires les plus abouties sont en C/C++. Il serait plus adéquat de créer un wrapper Swift au dessus de ces libraries (enfin surtout pour le C/C++).


     


    Qu'est est donc le problème que tu rencontres lors de l'intégration d'une de ces libraries ?


  • Bonjour,


    Merci pour cette réponse rapide.


     


    En fait j'essaye d'utiliser la librairie UPNPX.


    Et j'essaye de traduire ça en Swift:


     


    https://github.com/fkuehne/upnpx/blob/master/tutorial/pages/discovery.md


     


    J'ai donc commencé par créer un fichier BridgeHeader.h dans lequel j'ai:


     


    #import "../Pods/upnpx/src/api/UPnPDB.h"


     


    Ensuite j'essaye de traduire les éléments du lien que j'ai donné plus haut.



    NSArray *mDevices; -> var mDevices:NSArray=[] -> OK

    Sur le clic de mon bouton:



    UPnPDB* db = [[UPnPManager GetInstance] DB]; ->  let db:UPnPDB = UPnPManager.getInstance().db -> A piori OK
    mDevices = [db rootDevices]; -> mDevices = (db.rootDevices)! -> A piori OK

    Ensuite ça se complique pour moi. Il faut traduire  [db addObserver:self];


    Xcode me propose ça:


     


    db.addObserver(observer: NSObject, forKeyPath:String, options:NSKeyValueObservingOptions,context:UnsafeMutableRawPointer?)


     


    Je n'ai pas la moindre idée de comment renseigner les paramètres et de ce qu'ils représentent.


     


    Ensuite il y a une notion de protocole que je ne comprends pas non plus.



    //protocol UPnPDBObserver
    -(void)UPnPDBWillUpdate:(UPnPDB*)sender;
    -(void)UPnPDBUpdated:(UPnPDB*)sender;

    J'ai traduit ça par:


     


    import UIKit


    protocol UPnPDBObserver {

        func UPnPDBUpdated(sender:UPnPDB)

        func UPnPDBWillUpdate (sender:UPnPDB)

    }


    class ReglagesViewController: UIViewController,UPnPDBObserver {

        

        internal func UPnPDBWillUpdate(sender: UPnPDB) {

            print("Will Update")

        }


        internal func UPnPDBUpdated(sender: UPnPDB) {

            print("Updated")

        }


     


    Ensuite je ne sais pas à  quel moment sont appelés les fonctions UPnPDBWillUpdate et UPnPDBUpdated. Je suppose que c'est dans la librairie mais je ne sais pas...


     


    Bref je patauge un peu!!


     


    Merci de ton aide.

  • A priori, addObserver est une méthode de la classe UPnPDB. Il devrait donc être possible de faire db.addObserver(self) avec une classe qui implémente le protocole UPnPDBObserver (comme cela semble être le cas pour la classe ReglagesViewController).


    Ensuite les méthodes semblent être appeler par la librairie sur la découverte de nouveau device. cela te permet de mettre à  jour ton interface par exemple.


  • Quand j'écris ça : db.addObserver(self)


    J'ai l'erreur : Missing arguments...


     


     


    C'est peut être la manière dont j'ai essayé d'implémenter le protocole UPnPDBObserver qui ne va pas??


     


    Je ne maitrise pas du tout cette notion de protocole.


  • db.addObserver(self) est bien appelé depuis la classe qui implémenter le protocole UPnPDBObserver ?


  • Oui l'appel se fait dans la même class que le reste:


     


    Entre temps j'ai fait d'autres essais.


    J'ai enlever la définition du protocol maintenant j'ai ça:


     


    import UIKit


    class ReglagesViewController: UIViewController,UPnPDBObserver {


     


     @IBAction func Upnp(_ sender: UIButton) {

            var mDevices:NSArray=[]

            let db:UPnPDB = UPnPManager.getInstance().db

            mDevices = (db.rootDevices)!

     

            UPnPManager.getInstance().ssdp.searchSSDP

     

            db.add(self)


            print (mDevices )


    }

     


    ça à  l'air de fonctionner avec db.add(self).


     


    Mon problème c'est que je ne sais pas quand la recherche de périphériques est terminée.


     


    Je dois appuyer plusieurs fois sur le bouton pour qu'il y est des résultats dans le mDevices.


     


    Donc il faudrait que j'arrive à  implémenter la fonction UPnPDBUpdated qui à  priori est faite pour ça.


     


    Mais je ne sais pas comment faire?? Est-ce que tu as une idée?


     


    Merci.


  • Salut a tu du nouveau je chercher aussi une lib swift pour la gestion de l'UPNP je veux bien tes modifications si elles sont fonctionnelles 


Connectez-vous ou Inscrivez-vous pour répondre.