创建一个程序,由avahi播出
问题描述:
我正试图编写一个程序,输出可以通过网络与avahi服务的数据。我看过的文档似乎说我必须使用dbus注册服务,然后将它连接到avahi,但执行此操作的文档非常稀疏。有谁知道它的良好文档?我一直在看这些:创建一个程序,由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通过端点发布“数据”的可用性。实际的数据必须通过其他方法来检索,但通常你会注册一个可以通过你喜欢的方法“调用”的端点。
答
如果您的程序是用Java编写的,那么您可以使用avahi4j,它提供了一个易于使用的API来在本地网络上注册(并浏览)Bonjour服务。 http://avahi4j.googlecode.com
答
我意识到这个答案很晚,考虑到你的问题在四年前问过。但是,它可能会帮助其他人。
下使用宣布一项服务的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-浏览以验证它确实发布:
[email protected]:~$ 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"]