locked
singleton et une connexion Bluetooth RRS feed

  • Question

  • Bonjour je souhaiterais gérer par le biais de la technique singleton  ma connexion BT

    Voici mon code:

    namespace OBD
    {
     
    
            public  class Singleton
            {
                
                private static volatile Singleton instance;
                private static object syncRoot = new Object();
                public StreamSocket odbSocket;
                PeerInformation gpslimPeer;
                private Singleton()
                {
                    PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
    
                    var peers = await PeerFinder.FindAllPeersAsync();
    
                    if (!peers.Any(p => p.DisplayName.Contains("OBDII")))
                    {
                        MessageBox.Show("ELM327 not found. pair manually");
    
                    }
                    else
                    {
                        gpslimPeer = peers.First(p => p.DisplayName.Contains("OBDII"));
    
                        odbSocket = new StreamSocket();
    
                        await odbSocket.ConnectAsync(gpslimPeer.HostName, "1");
    
                        MessageBox.Show("Connected to ODB");
                        //IHM(String.Format(AppResources.connectetoappareilbt, settings["NomGPS"].ToString()), couleur);
    
    
                    }
                }
    
                public static async Singleton Instance
                {
                    get
                    {
                        if (instance == null)
                        {
                            lock (syncRoot)
                            {
                                if (instance == null)
                                    instance = new  Singleton();
                            }
                        }
    
                        return instance;
                    }
                }
    
                internal static void Instance()
                {
                    throw new NotImplementedException();
                }
            }
        
    }


    Les méthodes await  sortent en erreur.

    Quelqu'un peut m'aider SVP?


    Ceriboo


    • Modifié ceriboo mardi 2 avril 2013 07:06
    mardi 26 mars 2013 17:41

Réponses

  • Bonjour

    Afin de "transversaliser" l'état de connexion Bluetooth, j'ai utilisé une autre méthode que Singleton( que je n'ai toujours pas  assimilée)

    J'ai créé dans le fichier App.xaml.cs

    public static StreamSocket Socket;

    Grâce à ca je l'utilise partout en l'appelant de la manière suivante: App.Socket

    De là, je l'utilise partout où j'en ai besoin.En première page je l'initialise.

    PeerInformation gpslimPeer;

    PeerFinder.AlternateIdentities["Bluetooth:Paired"] = ""; var peers = await PeerFinder.FindAllPeersAsync(); if (!peers.Any(p => p.DisplayName.Contains("nomBT"))) { MessageBox.Show("tool not found. pair manually"); } else { gpslimPeer = peers.First(p => p.DisplayName.Contains("nomBT")); App.Socket = new StreamSocket(); await App.Socket.ConnectAsync(gpslimPeer.HostName, "1"); MessageBox.Show"Connected to the tool"); }


    Dès que je souhaite l'utiliser j'utilise le code je lance la méthode suivante:

    await App.odbSocket.OutputStream.WriteAsync(...)
    Cette méthode qui peut être appelé dans n'importe qu'elle page


    Ceriboo

    • Marqué comme réponse Aurel Bera mardi 2 avril 2013 07:10
    mardi 2 avril 2013 07:05

Toutes les réponses

  • Hello Ceriboo,

    Deux questions:

    1. Pourquoi un singleton asynchrone? J'avais encore jamais vu cette idée... Même sur StackOverFlow, personne n'en parlent :/
    2. Es-tu bien sur WP8?

    Cordialement,

    Mafyou.

    mercredi 27 mars 2013 10:26
  • Bonjour je suis bien sur wp8. Asynchrone car la connexion bt se fait de façon asynchrone.maintenant ce nest pas parce que ce site na pas ce sujet en boite

    que ce truc n'existe pas.ca site stackoverflow je ne connais pas.


    Ceriboo

    mercredi 27 mars 2013 12:53
  • Bref...

    En d'autre terme:

    public class Singleton
    {
       private static Singleton instance;
    
       private Singleton() 
       {
              // Don't load the data here - will be called separately
       }
    
       public static async Task<Singleton> GetInstance()
       {
             if (instance == null)
             {
                instance = new Singleton();
                await instance.LoadData();
             }
    
             return instance;
        }
    }

    Où la méthode "LoadData" est le processus BT.

    Cordialement,

    Mafyou.

    ps: n'oubliez pas la balise de code lorsque vous postez du code.

    • Marqué comme réponse ceriboo mercredi 27 mars 2013 17:04
    • Non marqué comme réponse ceriboo mercredi 27 mars 2013 18:41
    mercredi 27 mars 2013 14:30
  • Ou dois positionner le load data svp? Et comment récupérer les id bt depuis mes pas de codes c# svp. ?Oui je sais j'abuse mais ca évitera que je pose la question plus tard.

    Ceriboo

    mercredi 27 mars 2013 17:04
  • Bonjour
    Avez-vous vu les exemples de code ici:

    http://msdn.microsoft.com/fr-fr/library/windowsphone/develop/jj207007(v=vs.105).aspx#BKMK_BluetoothAPI

    Pour vous, c’est le StreamSocket le plus intéressante. Et utiliser ça avec un Singleton, je dirais qu’on peut avoir des surprises (En théorie, on peut avoir plusieurs threads qui utilise en même temps le même StreamSocket).

    Une solution peut être de créer un objet plus complexe qui fait la gestion de la connexion, aussi que le protocole de communication (quelque chose comme connexion BD).

    Ici vous avez un autre exemple (pour Windows, pas Windows Phone) :
    http://obdcsharpwrapper.codeplex.com/

    Quel est le message d’erreur que vous recevez ?

    Cordialement,



    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.




    jeudi 28 mars 2013 08:14
  • Je regarde ce soir merci

    Ceriboo

    jeudi 28 mars 2013 08:39
  •  

    Où dois-je positionner la fonction LoadData svp? Et comment puis-je récupérer les ID BTdepuis mes pas de codes c# svp. ?Oui, je sais, j'abuse mais cela évitera que je pose la question plus tard.

    Merci pour vos réponses.


    Ceriboo

    Ce qui est en Gras se sont les fautes d'orthographe/grammaire/technique. Le but d'un forum d'aide, c'est de respecter les personnes qui vous répondent. En faisant cela, ce n'est en aucun cas l'impression que vous donnez.

    Ce qui est en Italique n'est pas français, et encore moins compréhensible. Voulez-vous avoir le code C# récupérant les ID BT? Voulez-vous savoir la démarche à appliquer pour réussir à les avoir sans code C#?

    Pour ce qui est du code que je vous ais fourni, la fonction LoadData aurait ce qui était dans votre constructeur privée de votre Singleton.

    Cordialement,

    Mafyou.

    jeudi 28 mars 2013 08:52
  • "Du code que je vous ai fourni"

    Comme quoi le respect n'est pas de votre côté non plus :p

    Je suis désolé de vous avoir offensé avec ces fautes d'orthographe, ce n'était pas le but. J'avais répondu rapidement avec mon portable afin de ne pas trop tarder et effectivement je ne me suis pas relu. Cela m'apprendra. Suite à vos remarques je suis allé voir le site stackoverflow dont vous me parliez et j'ai trouvé le bout de code que vous aviez copié/collé plus haut.

    Ici est effectivement un forum d'entraide mais j'ai bien peur que les personnes de mon niveau n'auraient pas ma place car la réponse que vous m'aviez formulée supposait que j'avais une certaine connaissance( votre niveau?) , ce qui est aussi regrettable. Ou alors un rapide copier/coller depuis un autre site afin de donner l'illusion d'une entraide avérée?

    Bref je ne souhaite pas jeté plus d'huile sur le feu. Je vais regarder les lien de Mr Bera et de la je clôture le débat de mon côté en tout cas.

    Désolé encore pour ce désagrément.


    Ceriboo

    jeudi 28 mars 2013 10:40
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 2 avril 2013 06:35
  • Bonjour

    Afin de "transversaliser" l'état de connexion Bluetooth, j'ai utilisé une autre méthode que Singleton( que je n'ai toujours pas  assimilée)

    J'ai créé dans le fichier App.xaml.cs

    public static StreamSocket Socket;

    Grâce à ca je l'utilise partout en l'appelant de la manière suivante: App.Socket

    De là, je l'utilise partout où j'en ai besoin.En première page je l'initialise.

    PeerInformation gpslimPeer;

    PeerFinder.AlternateIdentities["Bluetooth:Paired"] = ""; var peers = await PeerFinder.FindAllPeersAsync(); if (!peers.Any(p => p.DisplayName.Contains("nomBT"))) { MessageBox.Show("tool not found. pair manually"); } else { gpslimPeer = peers.First(p => p.DisplayName.Contains("nomBT")); App.Socket = new StreamSocket(); await App.Socket.ConnectAsync(gpslimPeer.HostName, "1"); MessageBox.Show"Connected to the tool"); }


    Dès que je souhaite l'utiliser j'utilise le code je lance la méthode suivante:

    await App.odbSocket.OutputStream.WriteAsync(...)
    Cette méthode qui peut être appelé dans n'importe qu'elle page


    Ceriboo

    • Marqué comme réponse Aurel Bera mardi 2 avril 2013 07:10
    mardi 2 avril 2013 07:05