Pergunta

Estou tentando escrever um programa que produz dados que podem ser servidos em uma rede com Avahi. A documentação que olhei parece dizer que tenho que registrar o serviço no DBUS e depois conectá -lo a Avahi, mas a documentação para fazer isso é bastante escassa. Alguém conhece uma boa documentação para isso? Eu tenho olhado para estes:

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

Não estou muito familiarizado com o modo como Avahi funciona, então qualquer indicador seria útil.

Foi útil?

Solução

Avahi é "apenas" uma implementação do cliente de Zeroconfig que basicamente é um protocolo "DNS com base em multicast". Você pode usar o Avahi para publicar a disponibilidade de seus "dados" por meio de pontos finais. Os dados reais devem ser recuperados por outros meios, mas você normalmente registraria um ponto final que pode ser "invocado" através de um método de seu gosto.

Outras dicas

Sei que essa resposta está muito tarde, considerando que sua pergunta foi feita há quatro anos. No entanto, pode ajudar os outros.

A seguir, anuncia um serviço usando 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)

Usando Avahi-Browse para verificar se é realmente publicado:

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"]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top