I have written a server to publish on avahi via dbus. The same code working perfectly with Python 2.7, but throws error with Python 3.7
ERROR:dbus.connection:Unable to set arguments (dbus.Int32(-1), dbus.Int32(-1), dbus.UInt32(0), 'SETup', '_http._tcp', dbus.String('local'), 'surabhi-Latitude.local', dbus.UInt16(11732), dbus.Array(['f=abc', 't=test'], signature=dbus.Signature('ay'))) according to signature 'iiussssqaay': <class 'TypeError'>: an integer is required (got type str)
Traceback (most recent call last):
File "myserver.py", line 17, in <module>
avahiservice = AvahiService("SETup", "_http._tcp", current_port)
File "/home/surabhi/Documents/set_buildv2/set_buildv2/avahiTest/service.py", line 42, in __init__
dbus.Array(self.txt, signature='ay')) # TXT field, this is empty at the moment
File "/usr/lib/python3/dist-packages/dbus/proxies.py", line 70, in __call__
return self._proxy_method(*args, **keywords)
File "/usr/lib/python3/dist-packages/dbus/proxies.py", line 145, in __call__
**keywords)
File "/usr/lib/python3/dist-packages/dbus/connection.py", line 641, in call_blocking
message.append(signature=signature, *args)
TypeError: an integer is required (got type str)
This is my code:
class AvahiService:
def __init__(self, service_name, service_type, port, keep_alive=False):
"""Announce a service over Avahi through dbus
service_name: string with service's name
service_type: string with service's type, eg. '_http._tcp'
port: integer with port number
keep_alive: whether to keep running this server until interruption.
Default is False. Use False if you run this script within your server,
use True if you are running this script as standalone, because the service
disappears as soon as the script stops otherwise.
"""
self.bus = dbus.SystemBus()
self.avahiserver = AvahiServer()
self.path = self.avahiserver.EntryGroupNew()
raw_server = self.bus.get_object('org.freedesktop.Avahi', self.path)
self.server = dbus.Interface(raw_server, 'org.freedesktop.Avahi.EntryGroup')
hostname, domainname = self.avahiserver.GetHostName(), self.avahiserver.GetDomainName()
'''txt: TXT fields as array of string in a format of ["key1=value1", "key2=value2"], by default it's empty (ie. [])'''
self.txt = ["f=abc", "t=test"]
self.server.AddService(dbus.Int32(-1), # avahi.IF_UNSPEC
dbus.Int32(-1), # avahi.PROTO_UNSPEC
dbus.UInt32(0), # flags
service_name, # sname
service_type, # stype
domainname, # sdomain
"{}.{}".format(hostname, domainname), # shost
dbus.UInt16(port), # port
dbus.Array(self.txt, signature='ay')) # TXT field, this is empty at the moment
self.server.Commit()
if keep_alive:
while True:
sleep(60)
when I pass txt as empty field, it works fine.