创建一个由avahi广播的节目

2024-06-01 03:46:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个程序,输出可以通过avahi网络服务的数据。我看过的文档似乎说,我必须向dbus注册服务,然后将其连接到avahi,但是实现这一点的文档非常少。有人知道它的好文件吗?我一直在看这些:

python数据库单元: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#exporting-objects

Python阿瓦希: http://www.amk.ca/diary/2007/04/rough_notes_python_and_dbus.html

我对avahi的工作原理非常陌生,所以任何建议都会有帮助。在


Tags: 文件数据文档org程序数据库httpdoc
2条回答

Avahi是ZeroConfig的一个客户端实现,它基本上是一个“基于多播的DNS”协议。您可以使用Avahi通过端点发布“数据”的可用性。实际的数据必须通过其他方法来检索,但是您通常会注册一个可以通过您喜欢的方法“调用”的端点。在

考虑到你四年前被问到这个问题,我知道这个答案已经很晚了。然而,它可能会帮助其他人。在

下面宣布使用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验证它是否已发布:

^{pr2}$

相关问题 更多 >