2016-03-28 85 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)

相关问题