문제
Avahi와 함께 네트워크를 통해 제공 될 수있는 데이터를 출력하는 프로그램을 작성하려고합니다. 내가 본 문서는 DBUS에 서비스를 등록한 다음 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
나는 Avahi가 어떻게 작동하는지에 익숙하지 않으므로 모든 포인터가 도움이 될 것입니다.
해결책
Avahi는 "단지"클라이언트 구현입니다 Zeroconfig 기본적으로 "멀티 캐스트 기반 DNS"프로토콜입니다. Avahi를 사용하여 엔드 포인트를 통해 "데이터"의 가용성을 게시 할 수 있습니다. 실제 데이터는 다른 수단을 통해 검색되어야하지만 일반적으로 원하는 방법을 통해 "호출"할 수있는 엔드 포인트를 등록합니다.
다른 팁
나는 당신의 질문이 4 년 전에 묻는 것을 고려할 때 꽤 늦었다는 것을 알고 있습니다. 그러나 다른 사람들에게 도움이 될 수 있습니다.
다음은 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"]
제휴하지 않습니다 StackOverflow