2016-03-28 6 views
1

私はRFIDリーダを使用してメッセージを受信して​​います。私はそれらをemptylist = []に追加することによって重複したメッセージを避けようとしています。リストにそれらが存在する場合、メッセージを追加しません。以下は私のコードです:ユニークな着信メッセージをリストに追加するにはどうすればよいですか?

import paho.mqtt.client as mqtt 

def on_connect(client, userdata, flags, rc): 
    print("Connected with result code " + str(rc)) 
    client.subscribe("/whatver/#") 

def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server 
    payloadjson = json.loads(msg.payload.decode('utf-8')) 
    line = payloadjson["value"].split(',') 
    epc = line[1] 


    payload = {'a': epc[11:35], 'b':payloadjson["devicename"], 'c':payloadjson["sensorname"]} 

    emptylist = [] 
    emptylist.append(payload) 

    if payload not in emptylist: 
     emptylist.append(payload) 

    print (emptylist) 

test = mqtt.Client(protocol = mqtt.MQTTv31) 
test.connect(host=_host, port=1883, keepalive=60, bind_address="") 
test.on_connect = on_connect 
test.on_message = on_message 
test.loop_forever() 

は、しかし、私は​​がemptylistに追加されていることを示しており、以下のように出力を取得していますが、複数の区切られたリストの中に保存されています。また、RFIDリーダが同じタグを読み取っている場合、同じ出力を印刷し続けます。重複したメッセージを削除して、RFIDリーダーが同じタグを読み取っても1つだけ保持したいと思います。

[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A 
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': 'abcxxx000000130000627000'}] # from Tag B 
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A 
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A 
. 
. 
. 

どうすればこの問題を解決できますか?

答えて

2

その他の回答に言及すると、セットは重複の保存や印刷を避けるための優れた方法です。 リストを使用してこれを行う(効率的ではありません)ただし、現在のコードのロジックが間違っています。 on_messageが呼び出されるたびに新しく空のemptylistが作成され、新しい​​が追加されるため、次のif payload not in emptylist:はあまり意味がありません。

on_messageコールバック以外でemptylistを初期化する必要があります。例えば、それはemptylistにはすでにない場合にのみ&印刷新しいペイロードを追加します

emptylist = [] 

def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server 
    payloadjson = json.loads(msg.payload.decode('utf-8')) 
    line = payloadjson["value"].split(',') 
    epc = line[1] 

    payload = { 
     'a': epc[11:35], 
     'b':payloadjson["devicename"], 
     'c':payloadjson["sensorname"], 
    } 

    if payload not in emptylist: 
     emptylist.append(payload) 
     print (emptylist) 

。セットを使用して同じことを行うには

emptylist = set() 

def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server 
    payloadjson = json.loads(msg.payload.decode('utf-8')) 
    line = payloadjson["value"].split(',') 
    epc = line[1] 

    payload = { 
     'a': epc[11:35], 
     'b':payloadjson["devicename"], 
     'c':payloadjson["sensorname"], 
    } 

    if payload not in emptylist: 
     emptylist.add(payload) 
     print (emptylist) 

FWIW、emptylistはやや紛らわしい変数名です。 :)

+0

この素晴らしいチップをありがとう! –

0

のいずれかとして、以下に追加しているときは、あなたが存在するかどうかを確認することができます

if payload not in emptylist: 
    emptylist.append(payload) 

または

あなたの最終的な出力にset(emptylist)を選択することができます。

関連する問題