2009-10-07 9 views
5

Ich versuche, ein Programm zu schreiben, das Daten ausgibt, die über ein Netzwerk mit Avahi bedient werden können. Die Dokumentation, die ich angeschaut habe, scheint zu sagen, dass ich den Dienst bei dbus registrieren und dann mit awahi verbinden muss, aber die Dokumentation dafür ist ziemlich spärlich. Kennt jemand eine gute Dokumentation dafür? Ich habe auf dieser Suche:Erstellen eines Programms von Avahi gesendet werden

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

Ich bin wirklich nicht vertraut mit, wie avahi überhaupt funktioniert, so würden alle Hinweise hilfreich sein .

Antwort

0

Avahi ist "nur" eine Client-Implementierung von ZeroConfig, die im Grunde ein "Multicast-basiertes DNS" -Protokoll ist. Sie können Avahi verwenden, um die Verfügbarkeit Ihrer "Daten" über Endpunkte zu veröffentlichen. Die tatsächlichen Daten müssen auf andere Weise abgerufen werden, aber Sie würden normalerweise einen Endpunkt registrieren, der durch eine Methode Ihrer Wahl "aufgerufen" werden kann.

-3

Wenn Ihr Programm in Java geschrieben ist, können Sie avahi4j verwenden, das eine einfach zu verwendende API zum Registrieren (und Durchsuchen) von Bonjour-Diensten in Ihrem lokalen Netzwerk bietet.

10

Ich weiß, diese Antwort ist ziemlich spät, wenn man bedenkt, dass Ihre Frage vor vier Jahren gestellt wurde. Es könnte jedoch anderen helfen.

Die folgende kündigt einen Dienst mit 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) 

Mit avahi-browse es zu überprüfen, ob in der Tat veröffentlicht:

[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"]