2017-08-07 36 views
0

私はMQTTブローカー(Ubuntuのサーバ)上でこのコードを実行しようとすると、かかる 例外TypeError:on_connect()は正確に3つの引数(与えられた4)

出版社からの取得データは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() 

私は実行するとUbuntuのサーバー上でこのエラーを取得して、なぜ私にはわからない

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) 

、ラズベリーパイ(Debianの)上

ことができます作業。

+1

'mqttc.on_connect'はインスタンスメソッドです。暗黙的にインスタンスをメソッドの最初の引数として渡します(通常は 'self'とも呼ばれます) – Li357

+0

ありがとう!それは便利ですが、なぜラズベリーパイに自分を必要としないのですか? – Link

+1

両方のマシンでどちらのバージョンのPythonを使用していますか(また、どのバージョンのPython MQTTライブラリ)ですか? – hardillb

答えて

3

彼らはあなたのクラスのインスタンスのメソッドであるかのように、彼らはすべてに沿ってあなたのクラスの一部となっているかのように、これらの機能は、元々自分のクラスの一部として定義されていないにもかかわらず、あなたはそれらを呼び出す際に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

ありがとう!それは便利ですが、なぜラズベリーパイに自分を必要としないのですか? – Link

+1

これはRaspberry Piとは関係ありません。これは一般的なPythonの動作です。 – SethMMorton

関連する問題