Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Python i pybluez na Nokii n810, czyszczenie starych połączeń

wiesniak 03 Lut 2009 11:11 822 0
  • #1 03 Lut 2009 11:11
    wiesniak
    Poziom 31  

    Od pewnego czasu walczę nad aplikacją w Pythonie (szachy), która ma działać na tabletach Nokii (N810 konkretnie). Jednym z założeń jest możliwość grania poprzez połączenie bluetooth.
    Wszystko działa, można grać przez BT, ale jest problem z listą odnajdywanych serwerów gier, tj. program (klient) wyszukuje grę aktualnie stworzoną przez serwer oraz znajduje wszystkie poprzednio stworzone rozgrywki.
    Wyłączenie i włączenie programu nic nie daje, podobnie jak wyłączenie i włączenie bluetooth w urządzeniu. Wyłączenie samego urządzenia też nic nie daje.
    Poniżej przedstawiam kod klasy, która realizuje całe połączenie dla klienta i serwera:

    Code:
    #!/usr/bin/python2.5 
    
    # -*- coding: utf-8 -*-

    import bluetooth

    import sys
    #from bluetooth import *

    class BTConn(object):
        u"""Klasa udostępniająca metody do połączenia przez BT"""
       
        def __init__(self):
            self.server_sock = None
            self.port = None
            self.client_sock = None
            self.client_address = None
           
            self.uuid = "1e0ca4ea-2c9d-4335-93eb-27fc3a7fa848"
            self.znalezioneSerwery = None
           
        def stworzGre(self, nazwaSerwera):
            self.server_sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)

            self.server_sock.bind(("",bluetooth.PORT_ANY))
            self.server_sock.listen(1)
            bluetooth.advertise_service( self.server_sock, nazwaSerwera , self.uuid, [ self.uuid, bluetooth.SERIAL_PORT_CLASS ], [ bluetooth.SERIAL_PORT_PROFILE ],"SzaHy Team", "Gra w szachy przez BT")
                 
            self.client_sock,self.client_address = self.server_sock.accept()
            #self.client_sock.settimeout(5)
           
        def szukajSerwera(self):
            self.znalezioneSerwery = None
            self.znalezioneSerwery = bluetooth.find_service( None,self.uuid )
            return self.znalezioneSerwery
       
        def polaczZSerwerem(self,numerSerwera):
            wybranySerwer = self.znalezioneSerwery[numerSerwera]
            self.client_sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
            self.client_sock.connect((wybranySerwer["host"],wybranySerwer["port"]))
            #self.client_sock.settimeout(5)
           
        def wyslijDane(self,dane):
            self.client_sock.send(dane)
           
        def odbierzDane(self):
            dane = self.client_sock.recv(128)
            return dane
           
        def zakonczPolaczenie(self):
            if self.client_sock != None:
                self.client_sock.close()
                self.client_sock = None
            if self.server_sock != None:
                bluetooth.stop_advertising( self.server_sock )
                self.server_sock.close()
                self.server_sock = None

    Jak widać, wyszukiwanie rozgrywek następuje po numerze uuid, a więc musi on być jednakowy dla klienta i serwera (=generowanie wartości losowej odpada).
    Szczerze mówiąc, zaczynam się zastanawiać, czy system na tablecie gdzieś tego sobie nie cache'uje i zapomina czyścić. Ale jeśli tak jest, jak się do tego dobrać?

    0 0