前段时间使用腾讯云进行某医疗项目的开发。该项目使用的协议为MQTT协议,现将一些个人的心得及干货写下来,供参考(若文中有什么地方出现不符的,请批评指正)。
本项目,前期基于本地的服务端,将所采集的个人信息及其所采集的相关医疗数据保存在本地。这样做对于本地的内存要求和后期查看相关信息造成不便。
所以我将该设备通过MQTT协议与腾讯云对接,起初与腾讯云的物联网平台对接进行属性的上报,依此来创建小程序,在移动端进行数据的实时查看。
对于我(大二学生)来说,这个操作是我之前经常使用的,只是为了来实时获取设备端的一些信息。python代码如下,供参考:
# 本代码是我在PyQt5中写的,有些地方可能需要根据不同的运行环境修改
'''
*******************<-腾讯云物联网开发平台->***********************
'''
HOST = "*****************" # ip
PORT = 1883 # 端口号
Username = "*************************" # 用户姓名
Password = "*********************" # 设备密钥
MQTT_site = "***********" # MQTT服务器地址
topic = "$thing/up/property/ID/name"
# 模拟数据
data_1 = {"ID":1,"name":"张三","sex":"男","phone":"123","diagnose":"正常"}
# 连接腾讯云-物联网开发平台
class MqttThread(QThread,QObject):
messageReceived = pyqtSignal(str)
# 初始化,此处进行本地与云端的对接操作
def __init__(self,parent= None):
super().__init__()
self.client = mqtt.Client()
self.client.on_connect = self.on_connect
self.client.on_message = self.on_message
self.client.connect(MQTT_site, PORT, 60 * 12)
self.txy_init()
self.client.loop_start()
self.messageReceived.connect(self.on_messageReceived)
# 物联网开发平台属性上报(json格式)
def property_txy(self):
global data_1
data = {
"method": "report",
"clientToken": "123456", # 例如:123456
"params": {
# message及数据可更改,前面的默认即可
"message": {
"ID": data_1["ID"],
"name": data_1["name"],
"sex": data_1["sex"],
"phone": data_1["phone"],
"diagnose":data_1["diagnose"]
}
}
}
payload = json.dumps(data)
# 此处的topic在前面已经定义
self.client.publish(topic, payload, qos=1)
def txy_init(self):
self.client = mqtt.Client(protocol = 3)
self.client.username_pw_set(Username, Password)
self.client.on_connect = self.on_connect
self.client.connect(HOST, PORT, keepalive = 60 * 12) # 订阅频道
time.sleep(0.02)
def on_connect(self,client, userdata, flags, rc):
print("Connected with result code "+str(rc))
self.client.subscribe("test/topic")
def on_message(self, client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
self.parent.update_lable(str(msg.payload))
def on_messageReceived(self,message):
print("Received meaaage:"+message)
但是在我写完成之后,我突然想到一个关键问题,这样写也不能保存每个人的信息啊,于是我就使用了以下的方式来解决--对象存储。
所实现的效果是,按照采集当天的日期自动创建一个文件夹格式是这样:2024/02/10,当天患者的个人信息按照ID-姓名-性别-电话号码.txt的格式存储到该文件夹下。
最近正在实现的一个操作是,本地端将MySql中所存储的的个人信息(ID,name,sex,phone)删除后,云端也将该患者的信息进行删除。待实现后进行更新。
代码如下:
# 本代码是我在PyQt5中写的,有些地方可能需要根据不同的运行环境修改
# 腾讯云存储
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from qcloud_cos import CosClientError
from qcloud_cos import CosServiceError
import logging
'''
*******************<-腾讯云对象存储->***********************
'''
logging.basicConfig(level=logging.INFO,stream=sys.stdout)
appid = "**********"
secret_id = '***********************' # API密钥ID
secretKey = '**********************' # 创建存储桶的时候生成的KEY
region_info = "******************" # 创建存储桶时选择的地址
token = None # 使用临时密钥需要传入 Token,默认为空,可不填
scheme = 'https' # 默认
bucket = "*****************" # 项目名称-appid
# 对象存储
class Data_txy(QThread):
# 本地与对象存储建立连接
def __init__(self):
super().__init__()
logging.basicConfig(level = logging.INFO,stream = sys.stdout)
config = CosConfig(Region = region_info, Secret_id = secret_id, Secret_key = secretKey, Token = token, Scheme = scheme)
self.client = CosS3Client(config)
# 上传患者信息的文件
def data_storage(self):
self.time_1 = datetime.date.today() # 获取当天日期作为文件夹名称
file_name = ''
# name为本地存储患者信息的文件,内容为ID-name-sex-phone
f = open(name_personal,"r")
for line in f.readlines():
file_name = file_name + str(line.strip('\n')) + '.txt'
f.close()
#上传由 '/' 分隔的对象名,自动创建包含文件的文件夹。想要在此文件夹中添加新文件时,只需要在上传文件至 COS 时,将 Key 填写为此目录前缀即可。
dir_name = str(self.time_1) # 存储桶文件包名称
object_key = dir_name + '/' +file_name
# data_txy_site 为本地存储的所采集的数据
with open(data_txy_site, 'rb') as fp:
response = self.client.put_object(
Bucket = bucket, # Bucket 由 BucketName-APPID 组成
Body = fp,
Key = object_key,
EnableMD5 = True,
StorageClass = str(self.time_1),
ContentType = 'text/html; charset=utf-8'
)
print(response['ETag'])
# 列出对象存储中存储的所有文件
def files_listed(self):
response = self.client.list_objects(Bucket=bucket)
if 'Contents' in response:
for content in response['Contents']:
print(content['Key'])
有问题的地方请批评指正。