إنشاء برنامج ليتم بثها من قبل avahi
سؤال
وأنا أحاول أن أكتب برنامج بيانات المخرجات التي يمكن تقديمها عبر شبكة اتصال مع avahi. وثائق لقد ألقيت نظرة على ويبدو أن أقول أن تسجل الخدمة مع DBus تثبيت ومن ثم توصيله إلى avahi، ولكن وثائق للقيام بذلك هي جميلة متفرق. لا أحد يعرف من وثائق جيدة لذلك؟ لقد تم النظر إلى هذه:
والثعبان DBus تثبيت: http://dbus.freedesktop.org/doc/dbus -python / وثيقة / tutorial.html # تصدير الكائنات
والثعبان avahi: http://www.amk.ca/diary/2007/04/rough_notes_python_and_dbus.html
وأنا غير مألوف حقا كيف avahi يعمل في كل شيء، لذلك أي مؤشرات سيكون مفيدا.
المحلول
و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-استعراض للتحقق من ذلك هو في الواقع المنشورة:
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"]