项目内容:
编写转发程序,与TCP设备通讯,接收TCP设备的信息,进行相应的处理后,通过MQTT转发出去。
细节:
TCP通讯接收的是信息帧,16进制数据,转发出去的是json串
涉及知识:
TCP通讯,多线程,json解析,mqtt通讯
TCP通讯:
方式1:多线程函数方式实现收发
方式2:通过继承threading.Thread,以类的方式实现多线程,在类中可以定义stop方法,在某个时间优雅的杀死该线程
TCP通讯的socket开启与关闭还需要进行研究
多线程的杀死需要研究
TCP通讯时收到的信息帧为16进制,此时如果对其进行处理,可以通过列表进行接收,此时列表中收到的内容为多个10进制的数据,列表的作用可真大
全局变量:
定义的全局变量诸如列表,字典等和不可迭代变量,如果其发生变化,在全局的其他位置也是可以看到变化的,
对于组合型数据,如:列表中嵌套另一个列表,如果子列表发生变化,此时打印主列表,主列表的相应位置也会发生变化
包括在类中定义类的属性为某个列表,此时修改类内对象时,全局变量列表也是要改变的
函数与变量:
可迭代型全局变量在函数中使用时可以不必写入函数的参数中,对于不可迭代型的,只能屈尊写入到函数的参数里了,不过,如果通过 global c 令该值为全局变量,此时就可以在函数中直接调用了
可迭代的全局变量写入参数后,在函数中变化了,其实在全局也已经变化了
多线程:
一个线程在杀死后,不能再以相同的名字再次重启
此时可以考虑通过线程池的方式实现
获取和打印线程号需要进行研究
mqtt通讯的学习:
mqtt通讯的测试是通过程序与MQTT-BOX的交互实现的
MQTT是通过对话题的订阅和发布完成通讯的,
在应用的时候,需要定义的有:client ID HOST PORT user_name passwd这些内容,发布和订阅函数,示例如下:
import paho.mqtt.client as mqtt
import json
import time
import threading
import socketModel as so
HOST = "118.190.136.167"
PORT = 1883
client_id = "ee071f3b-a01c-4237-8d1e-52fe0e5e32d1"
client = mqtt.Client(client_id)
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
# client.subscribe("data/receive") # 订阅消息
client.subscribe("/tl/lcy/test/s")
def on_message(client, userdata, msg):
print("主题:"+msg.topic+" 消息:"+str(msg.payload.decode('utf-8')))
def on_subscribe(client, userdata, mid, granted_qos):
print("On Subscribed: qos = %d" % granted_qos)
def on_disconnect(client, userdata, rc):
if rc != 0:
print("Unexpected disconnection %s" % rc)
def publish_model(client):
while True:
try:
positionA = so.realPosA[-1]
positionB = so.realPosB[-1]
# 这样引用so中的列表内容是有问题的,因为此时只会引入最初的realPosA列表值,如果该列表发生变化,在本函数中是体现不出来的,若要引入实时的值,还需要将该函数定义在“so”中
print('mqtt positionA is:positionA')
data = {"positionA":str(positionA),
"positionB":str(positionB)}
param = json.dumps(data)
client.publish(topic="/tl/lcy/test/p", payload=param, qos=0)
time.sleep(2)
except Exception as e:
print(e)
time.sleep(1)
def mqtt_communication(client,HOST,PORT):
print('start mqtt')
client.username_pw_set(username="tl/lcy/test/2", password="123456")
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(HOST, PORT, 60)
# client.publish("data/send", payload=param, qos=0) # 发送消息
# 起线程将发布与订阅分开
#client.publish(topic="/tl/lcy/test/p", payload=param, qos=0)
t1 = threading.Thread(target=publish_model,kwargs={'client':client,})
t1.start()
client.loop_forever()
if __name__ == '__main__':
mqtt_communication(client,HOST,PORT)
这几天写的代码是真够多,不过吧,走的弯路也不少,以后要继续熟悉代码,加油了