質問
私はのavahiを使用してネットワーク経由で提供することができるデータを出力するプログラムを書くことをしようとしています。私が見てきた文書は、私がDBUSでサービスを登録し、その後のavahiに接続する必要がありますが、これを行うためのドキュメンテーションはかなり希薄であると言っているようです。誰もがそれのために良いドキュメントを知っていますか?私はこれらを見てきます:
のpython-dbusの: http://dbus.freedesktop.org/doc/dbus -python / DOC / tutorial.htmlの#エクスポート・オブジェクトの
の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-ブラウズを使用します:
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"]