2016-03-28 41 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閱讀器讀取相同的標籤,我也想刪除重複的郵件並僅保留一個。

[{'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 = [] 

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

使用一組做同樣的事情:

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)

相關問題