Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError:on_connect()正好接受3个参数(给定4个)_Python_Mqtt - Fatal编程技术网

Python TypeError:on_connect()正好接受3个参数(给定4个)

Python TypeError:on_connect()正好接受3个参数(给定4个),python,mqtt,Python,Mqtt,我尝试在MQTT代理(ubuntu服务器)上执行此代码 从发布服务器获取数据时,将发送到UDP_IP 我的代码: import json import socket import paho.mqtt.client as mqtt # MQTT Settings MQTT_Broker = "192.168.0.106" MQTT_Topic = "#" MQTT_Port = 1883 Keep_Alive_Interval = 45 UDP_IP = "192.168.0.108" UDP_R

我尝试在MQTT代理(ubuntu服务器)上执行此代码

从发布服务器获取数据时,将发送到UDP_IP

我的代码:

import json
import socket
import paho.mqtt.client as mqtt
# MQTT Settings
MQTT_Broker = "192.168.0.106"
MQTT_Topic = "#"
MQTT_Port = 1883
Keep_Alive_Interval = 45
UDP_IP = "192.168.0.108"
UDP_RAW_PORT = 5567
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

def on_connect(mosq, obj, rc):
        mqttc.subscribe(MQTT_Topic, 0)

def on_message(mosq, obj, msg):
        gps_handler(msg.topic, msg.payload)

def gps_handler(Topic, jsonData):
        jsonData = jsonData[1:-1]
        sock.sendto(jsonData, (UDP_IP, UDP_RAW_PORT))
        print jsonData

def on_subscribe(mosq, obj, mid, granted_qos):
        pass

mqttc = mqtt.Client()

# Assign event callbacks
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe

# Connect
mqttc.connect(MQTT_Broker, int(MQTT_Port), int(Keep_Alive_Interval))

# Continue the network loop
mqttc.loop_forever()
当我执行

Traceback (most recent call last):
  File "port_5567.py", line 38, in <module>
    mqttc.loop_forever()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1470, in loop_forever
    rc = self.loop(timeout, max_packets)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 995, in loop
    rc = self.loop_read(max_packets)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1273, in loop_read
    rc = self._packet_read()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1838, in _packet_read
    rc = self._packet_handle()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2291, in _packet_handle
    return self._handle_connack()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2349, in _handle_connack
    self.on_connect(self, self._userdata, flags_dict, result)
TypeError: on_connect() takes exactly 3 arguments (4 given)
回溯(最近一次呼叫最后一次):
文件“port_5567.py”,第38行,在
mqttc.loop_forever()
文件“/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py”,第1470行,在循环中
rc=self.loop(超时,最大数据包数)
文件“/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py”,第995行,在循环中
rc=自循环读取(最大数据包数)
文件“/usr/local/lib/python2.7/dist packages/paho/mqtt/client.py”,第1273行,循环读取
rc=自。\数据包\读取()
文件“/usr/local/lib/python2.7/dist packages/paho/mqtt/client.py”,第1838行,数据包读取
rc=自身。\数据包\句柄()
文件“/usr/local/lib/python2.7/dist packages/paho/mqtt/client.py”,第2291行,位于数据包句柄中
返回自我。_handle_connack()
文件“/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py”,第2349行,位于句柄连接中
连接上的self.on(self,self.\u用户数据,标志,结果)
TypeError:on_connect()正好接受3个参数(给定4个)
我不知道为什么在ubuntu服务器上出现这个错误


在Raspberry Pi(debian)上,它可以工作。

即使这些函数最初不是定义为类的一部分,当您像调用类的方法一样调用它们时,实例Python将传递隐式
self
参数,就像它们一直是类的一部分一样

要修复此问题,只需添加
self
参数

def on_connect(self, mosq, obj, rc):
        self.subscribe(MQTT_Topic, 0)

mqttc.on_connect = on_connect

# Repeat for other functions as well.

即使这些函数最初不是定义为类的一部分,当您像调用类实例的方法一样调用它们时,Python将传递隐式
self
参数,就像它们一直是类的一部分一样

要修复此问题,只需添加
self
参数

def on_connect(self, mosq, obj, rc):
        self.subscribe(MQTT_Topic, 0)

mqttc.on_connect = on_connect

# Repeat for other functions as well.

在0.9版本(最新版本为1.4)之后,为连接上的
请求的签名已更改。你可以在这里看到

您可以在官方文档中找到许多带有旧签名的示例。但是,必须添加
标志
参数:

on_connect(client, userdata, flags, rc)
根据您使用的名称,将声明:

def on_connect(mosq, obj, flags, rc)

对于python2.7,我的脚本可以同时处理这两个签名(我不知道它是如何处理的),但是对于python3(3.7),它不能处理。

在连接上为
请求的签名在0.9版本(最新版本是1.4)之后发生了更改。你可以在这里看到

您可以在官方文档中找到许多带有旧签名的示例。但是,必须添加
标志
参数:

on_connect(client, userdata, flags, rc)
根据您使用的名称,将声明:

def on_connect(mosq, obj, flags, rc)

对于python2.7,我的脚本可以同时处理这两个签名(我不知道它是如何处理的),但是对于python3(3.7),它却没有。on_connect是一个实例方法。它隐式地将实例作为第一个参数传递给方法(通常称为
self
),谢谢!它很有用,但是为什么不需要在Raspberry Pi上使用self?您在这两台机器上使用的是什么版本的python(也是什么版本的python MQTT库)?
mqttc.on_connect
是一种实例方法。它隐式地将实例作为第一个参数传递给方法(通常称为
self
),谢谢!它很有用,但是为什么不需要在Raspberry Pi上使用self?您在这两台机器上使用的是什么版本的python(也是什么版本的python MQTT库)?谢谢!它很有用,但是为什么不需要在树莓皮上使用self呢?这与树莓皮无关。这是python的一般行为;您可以查看我的答案以获得正确的签名。@ArnoBozo您仍然需要添加参数,只是在您的答案中您称之为
客户机
,而我称之为
自我
。也许您选择的名称更清楚,但是说不需要
self
参数是不正确的。缺少一个参数。这不是self/mosq/client,而是flags。谢谢!它很有用,但是为什么不需要在树莓皮上使用self呢?这与树莓皮无关。这是python的一般行为;您可以查看我的答案以获得正确的签名。@ArnoBozo您仍然需要添加参数,只是在您的答案中您称之为
客户机
,而我称之为
自我
。也许您选择的名称更清楚,但是说不需要
self
参数是不正确的。缺少一个参数。它不是self/mosq/client,而是flags。