Criando um programa a ser transmitido por Avahi
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.
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"]