创建要由 avahi 播放的节目

Posted

技术标签:

【中文标题】创建要由 avahi 播放的节目【英文标题】:Creating a program to be broadcasted by avahi 【发布时间】:2010-12-04 19:32:28 【问题描述】:

我正在尝试编写一个程序来输出可以通过网络使用 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 的工作原理,所以任何指针都会有所帮助。

【问题讨论】:

【参考方案1】:

考虑到您的问题是四年前提出的,我意识到这个答案已经很晚了。但是,它可能对其他人有所帮助。

以下声明使用 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"]

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于创建要由 avahi 播放的节目的主要内容,如果未能解决你的问题,请参考以下文章

年会音控及节目播放操作

使用腾讯视频播放器播放节目时,提示使用腾讯视频播放器播放节目时,播放器错误。错误码为9798该怎么办?

在 VMware 中使用 avahi @ Ubuntu ping 主机名。没有解决

多个midi节目同时播放?

节目电台播放失败

映射要由服务使用的网络驱动器