2009-10-07 29 views
5

Tôi đang cố gắng viết một chương trình cung cấp dữ liệu có thể được phân phát qua mạng với avahi. Các tài liệu tôi đã xem xét dường như nói rằng tôi phải đăng ký dịch vụ với dbus và sau đó kết nối nó với avahi, nhưng các tài liệu để làm điều này là khá thưa thớt. Có ai biết tài liệu tốt cho nó? Tôi đã nhìn vào những:Tạo chương trình được phát sóng bởi 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

Tôi thực sự không quen với cách avahi làm việc tại tất cả, vì vậy bất kỳ con trỏ sẽ là hữu ích .

Trả lời

0

Avahi là "chỉ" một khách hàng thực hiện ZeroConfig mà về cơ bản là một giao thức "Multicast dựa DNS". Bạn có thể sử dụng Avahi để xuất bản tính khả dụng của "dữ liệu" của bạn thông qua các điểm kết thúc. Các dữ liệu thực tế phải được lấy ra thông qua một số phương tiện khác nhưng bạn thường sẽ đăng ký một điểm cuối có thể được "gọi" thông qua một phương pháp theo ý thích của bạn.

-3

Nếu chương trình của bạn được viết bằng Java, bạn có thể sử dụng avahi4j cung cấp API dễ sử dụng để đăng ký (và duyệt) dịch vụ Bonjour trên mạng cục bộ của bạn. http://avahi4j.googlecode.com

10

Tôi nhận thấy câu trả lời này là khá muộn, khi câu hỏi của bạn được hỏi bốn năm trước. Tuy nhiên, nó có thể giúp đỡ người khác.

Sau đây tuyên bố một dịch vụ sử dụng 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) 

Sử dụng avahi-browse để xác minh nó thực sự được công bố:

[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"] 
Các vấn đề liên quan