سؤال

وأنا أحاول أن أكتب برنامج بيانات المخرجات التي يمكن تقديمها عبر شبكة اتصال مع 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"]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top