最近因需要用python写一个微服务来用MQTT给硬件传输图片,其中python用的是flask框架,大概流程如下:
协议为:
需要将图片数据封装成多个消息进行传输,每个消息传输的数据字节数为1400Byte。
消息(MQTT Payload) 格式:Web服务器-------->BASE:
反馈:BASE---------> Web服务器:
如果Web服务器发送完一个“数据传输消息”后,5S内没有收到MQTT“反馈消息”或者收到的反馈中显示“数据包不完整”,则重发该“数据传输消息”。
程序流程图
根据上面的协议,可以得到如下的流程图:
代码如下:
# encoding:utf-8
from flask import Flask, jsonify
from flask_restful import Api, Resource, reqparse
from PIL import Image
from io import BytesIO
import requests
import os, logging, time
import paho.mqtt.client as mqtt
import struct
from 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_da