mqtt publish 大数据量断连_python使用MQTT给硬件传输图片

任务简述

最近因需要用python写一个微服务来用MQTT给硬件传输图片,其中python用的是flask框架,大概流程如下:

mqtt publish 大数据量断连_python使用MQTT给硬件传输图片_第1张图片

协议为:

需要将图片数据封装成多个消息进行传输,每个消息传输的数据字节数为1400Byte。

消息(MQTT Payload) 格式:Web服务器-------->BASE:

mqtt publish 大数据量断连_python使用MQTT给硬件传输图片_第2张图片

反馈:BASE---------> Web服务器:

mqtt publish 大数据量断连_python使用MQTT给硬件传输图片_第3张图片

如果Web服务器发送完一个“数据传输消息”后,5S内没有收到MQTT“反馈消息”或者收到的反馈中显示“数据包不完整”,则重发该“数据传输消息”。

程序流程图

根据上面的协议,可以得到如下的流程图:

mqtt publish 大数据量断连_python使用MQTT给硬件传输图片_第4张图片

对Python感兴趣的小伙伴,记得私信小编“007”领取全套Python资料哦。

代码如下:

# encoding:utf-8from flask import Flask, jsonifyfrom flask_restful import Api, Resource, reqparsefrom PIL import Imagefrom io import BytesIOimport requestsimport os, logging, timeimport paho.mqtt.client as mqttimport structfrom flask_cors import *# 日志配置信息logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s (runing by %(funcName)s',)class Mqtt(object): def __init__(self, img_data, size): self.MQTTHOST = '*******' self.MQTTPORT = "******" # 订阅和发送的主题 self.topic_from_base = 'mqttTestSub' self.topic_to_base = 'mqttTestPub' self.client_id = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) self.client = mqtt.Client(self.client_id) # 完成链接后的回掉函数 self.client.on_connect = self.on_connect # 图片大小 self.size = size # 用于跳出死循环,结束任务 self.finished = None # 包的编号 self.index = 0 # 将收到的图片数据按大小分成列表 self.image_data_list = [img_data[x:x + 1400] for x in range(0, self.size, 1400)] # 记录发布后的数据,用于监控时延 self.pub_time = 0 self.header_to_base = 0xffffeeee self.header_from_base = 0xeeeeffff # 功能标识 self.function_begin = 0x01 self.function_doing = 0x02 self.function_finished = 0x03 # 包的完整和非完整状态 self.whole_package = 0x01 self.bad_package = 0x00 # 头信息的格式,小端模式 self.format_to_base = " 5: # 是否重传第一个包 if self.first == True: self.publish_begin() logging.info('+++ this is timeout first_data +++') # 是否重传最后一个包 elif self.last == True: self.publish('finished', self.function_finished) logging.info('+++ this is timeout last_data +++') else: self.publish(self.index-1, self.function_doing) logging.info('+++ this is timeout middle_data +++') if self.finished == 1: logging.info('+++ all works is finished+++') break print(str(time.time()-begin_time) + 'begin_time - end_time')app = Flask(__name__)api = Api(app)CORS(app, supports_credentials=True)# 接受参数parser = reqparse.RequestParser()parser.add_argument('url', help='mqttImage url', location='args', type=str)class GetImage(Resource): # 得到参数并从图床下载到本地 def get(self): args = parser.parse_args() url = args.get('url') response = requests.get(url) # 获取图片 image = Image.open(BytesIO(response.content)) # 存取图片 add = os.path.join(os.path.abspath(''), 'image.jpg') image.save(add) # 得到图片大小 size = os.path.getsize(add) f = open(add, 'rb') imageData = f.read() f.close() # 进行mqtt传输 mqtt = Mqtt(imageData, size) mqtt.control() # 删除文件 os.remove(add) logging.info('*** the result of control is {} ***'.format(1)) return jsonify({ "imageData": 1 })api.add_resource(GetImage, '/image')if __name__ == '__main__': app.run(debug=True, host='0.0.0.0')

你可能感兴趣的:(mqtt,publish,大数据量断连)