2009-10-07 9 views
5

Próbuję napisać program, który wyprowadza dane, które mogą być podawane przez sieć z avahi. Dokumentacja, na którą patrzę, wydaje się mówić, że muszę zarejestrować usługę dbus, a następnie podłączyć ją do avahi, ale dokumentacja do tego jest dość nielicznych. Czy ktoś wie o dobrej dokumentacji? Szukałem w nich:Tworzenie programu do nadawania przez avahi

python-dbus: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#exporting-objects

python-avahi: http://www.amk.ca/diary/2007/04/rough_notes_python_and_dbus.html

Jestem naprawdę znają jak avahi działa w ogóle, więc wszelkie wskazówki będą pomocne .

Odpowiedz

0

Avahi to "po prostu" implementacja klienta ZeroConfig, która zasadniczo jest protokołem "multiemisji opartym na DNS". Możesz użyć Avahi do opublikowania dostępności swoich "danych" poprzez punkty końcowe. Rzeczywiste dane muszą być pozyskane w inny sposób, ale zwykle rejestruje się punkt końcowy, który można "wywołać" za pomocą wybranej przez siebie metody.

-3

Jeśli Twój program został napisany w Javie, możesz użyć avahi4j, który zapewnia łatwy w użyciu interfejs API do rejestrowania (i przeglądania) usług Bonjour w sieci lokalnej. http://avahi4j.googlecode.com

10

Zdaję sobie sprawę, że ta odpowiedź jest dość późna, biorąc pod uwagę, że twoje pytanie zadano cztery lata temu. Jednak może pomóc innym.

Poniższy zapowiada usługę przy użyciu avahi/dbus:

import avahi 
import dbus 
from time import sleep 


class ServiceAnnouncer: 
    def __init__(self, name, service, port, txt): 
     bus = dbus.SystemBus() 
     server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER) 
     group = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.EntryGroupNew()), 
           avahi.DBUS_INTERFACE_ENTRY_GROUP) 

     self._service_name = name 
     index = 1 
     while True: 
      try: 
       group.AddService(avahi.IF_UNSPEC, avahi.PROTO_INET, 0, self._service_name, service, '', '', port, avahi.string_array_to_txt_array(txt)) 
      except dbus.DBusException: # name collision -> rename 
       index += 1 
       self._service_name = '%s #%s' % (name, str(index)) 
      else: 
       break 

     group.Commit() 

    def get_service_name(self): 
     return self._service_name 


if __name__ == '__main__': 
    announcer = ServiceAnnouncer('Test Service', '_test._tcp', 12345, ['foo=bar', '42=true']) 
    print announcer.get_service_name() 

    sleep(42) 

Korzystanie avahi-Browse, aby go zweryfikować rzeczywiście opublikowano:

[email protected]:~$ avahi-browse -a -v -t -r 
Server version: avahi 0.6.30; Host name: els-mifr-03.local 
E Ifce Prot Name           Type     Domain 
+ eth0 IPv4 Test Service         _test._tcp   local 
= eth0 IPv4 Test Service         _test._tcp   local 
    hostname = [els-mifr-03.local] 
    address = [10.9.0.153] 
    port = [12345] 
    txt = ["42=true" "foo=bar"] 
Powiązane problemy