문제

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"]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top