蓝牙基站项目总结(主要涉及TCP 多线程 MQTT)

项目内容:
编写转发程序,与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)

这几天写的代码是真够多,不过吧,走的弯路也不少,以后要继续熟悉代码,加油了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值