Создание программы для трансляции на avahi - PullRequest
6 голосов
/ 08 октября 2009

Я пытаюсь написать программу, которая выводит данные, которые можно обслужить по сети с помощью avahi. Документация, на которую я смотрел, похоже, говорит, что я должен зарегистрировать сервис в dbus, а затем подключить его к avahi, но документации для этого довольно мало. Кто-нибудь знает хорошую документацию для этого? Я смотрю на это:

питон-DBus: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#exporting-objects

питон-Avahi: http://www.amk.ca/diary/2007/04/rough_notes_python_and_dbus.html

Я действительно незнаком с тем, как вообще работает avahi, поэтому любые указатели были бы полезны.

Ответы [ 2 ]

10 голосов
/ 07 августа 2013

Я понимаю, что этот ответ довольно поздно, учитывая, что ваш вопрос был задан четыре года назад. Однако это может помочь другим.

Следующее объявляет сервис с использованием 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)

Использование avahi-browse для проверки того, что оно действительно опубликовано:

micke@els-mifr-03:~$ 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"]
1 голос
/ 13 октября 2009

Avahi - это «просто» клиентская реализация ZeroConfig , которая в основном является протоколом «Многоадресная рассылка DNS». Вы можете использовать Avahi для публикации доступности ваших «данных» через конечные точки. Фактические данные должны быть получены с помощью других средств, но вы обычно регистрируете конечную точку, которую можно «вызвать» с помощью метода, который вам нравится.

...