一、逻辑分析

逻辑一: 

mqtt代理服务器java mqtt服务器代码_开发语言

逻辑二: 

mqtt代理服务器java mqtt服务器代码_后端_02

 注:因为在我们这个课设项目中服务器向客户端传输图片时将一个图片分包传输,所以在客户端需要将图片按序重新组装,然后再进行人脸识别 

二、重要模块代码

1.通过影子设备文件获取userid

a = []#获取userId
with open("/home/simon/mqtt/"+"shadow.ini","r") as ud: 
    mes = ud.read()
    mes_parsed = json.loads(mes)
    meslist = mes_parsed['payload']['state']['reported']['faceList']
    for i in meslist:
        #print(str(i))
        userid = i['userId']
        a.append(int(userid))
        #print(userid)
    #print(a)

2.对文件夹中的图片进行循环扫描

def file_circle(dirs5,houzhui,i,picture):
    global picture2
    for dirs4 in dirs5:
        #print("dirs4:"+dirs4)
        d2 = os.path.basename(dirs4)#图片名加后缀
        num2 = os.path.splitext(d2)[0]#图片名
        basename2 = os.path.splitext(d2)[1] #后缀名
        if(int(num2)==i):
            with open("/home/simon/mqtt/picture_recieve/"+str(num2)+basename2,"rb") as p1:
                picture2 = picture + str(base64.b64encode(p1.read()),encoding="utf-8")#bytes
            break
    return(picture2)

3.当topic为control且type为imageUpdate时需现将存有图片的文件夹中的对应userid的图片删除

if(msg_type=="imageUpdate"):
            rootdir = "/home/simon/mqtt/picture_recieve/"
            file_delete = os.listdir(rootdir)
            for file in file_delete:
                if houzhui in file:
                    del_file = rootdir + file#当代码和要删除的文件不在同一个文件夹时,必须使用绝对路径
                    os.remove(del_file)#删除文件

4.判断接收的到一个userid的图片是否全部收到

key = len(u)-1
        if(key<0):
            u.append(useridnum)
            v[key]=1
        else:
            while(key>=0):
                if(uesridnum==u[key]):
                    v[key]+=1                   
                else:
                    u.append(useridnum)
                    v[key]=1
                if(v[key]==packettotal):
                    break
                key = key-1

5.一张图片接收完以后进行组装

#一张图片全部接收后进行组装
        if(v[key]==packettotal):
            i=1
            #all = r'/home/simon/mqtt/picture_recieve'
            bool_flag2 = False#大循环跳出标志
            dirs2 = []
            dirs0 = []
            for dirs1 in glob.glob('/home/simon/mqtt/picture_recieve'+"/*"+houzhui):
                dirs2.append(dirs1)
                dirs0.append(dirs1)
            #print(dirs2)
            for dirs3 in dirs2:
                #print("dirs3:"+dirs3)
                d1 = os.path.basename(dirs3)#图片名加后缀
                num1 = os.path.splitext(d1)[0]#图片名
                basename1 = os.path.splitext(d1)[1] #后缀名
                if(int(num1)==1):
                    with open("/home/simon/mqtt/picture_recieve/"+str(num1)+basename1,"rb") as p1:
                        picture1 = str(base64.b64encode(p1.read()),encoding="utf-8")#bytes
                    i=i+1
                    bool_flag1 = False#跳出小循环标志
                    while True:
                        if(i!=packettotal):
                            picture1 = file_circle(dirs0,houzhui,i,picture1)
                            i=i+1
                        if(i==packettotal):
                            picture1 = file_circle(dirs0,houzhui,i,picture1)
                            i=1
                            bool_flag1 = True
                            break
                    if(bool_flag1):
                        bool_flag2 = True
                        temp = base64.b64decode(picture1)#bytes
                        with open("/home/simon/mqtt/picture/"+str(recieve_parsed['payload']['user'])+str(recieve_parsed['payload']['userName'])+".jpg","wb") as o:
                            o.write(temp)
                if(bool_flag2):
                    break

6.如果get到的影子设备文件内desired有内容,即表示客户有需要我做的事情,所以完成desired的事情后,将其放置到reported内发送delta,报告给客户表明我做完了这件事

if(shadow_desired!={}):
            if('state' in shadow_desired):
                state = shadow_desired['state']
            else:state = shadow_reported['state']
            if('faceList' in shadow_desired):
                s_d_facelist = shadow_desired['faceList']#数组
                s_d_f = ",".join('%s'%id for id in s_d_facelist)#字符串
            else:
                s_r_facelist = shadow_reported['faceList']#数组
                s_d_f = ",".join('%s'%id for id in s_r_facelist)#字符串
            data_delta = {
                "type":"delta",
                "state":{
                    "reported":{
                        "state":state,
                        "faceList":[s_d_f]
                    }
                },
                "version":shadow_version,
                "clientToken":str(clientToken)
            }
            data_delta_param = json.dumps(data_delta)
            client.publish("$shadow/operation/414ce45bde0a4bc1949fec75a7d2f699", payload=data_delta_param,qos=2,retain=False)#delta

7.循环扫描存有要发送信息的文件,有信息则发布,然后删除发送的信息,继续循环扫描

while True:
        with open('/home/simon/mqtt/'+'FaceAndTime.json','r',encoding="utf-8") as old_f:
            #读取所有行,每行会是一个字符串
            for j in old_f.readlines():
                if(j):
                    print(j)
                    face = json.loads(j,object_hook=dict2Data)
                    data_face = {
                                "type":"history",
                                "payload":{
                                    "history":[
                                    {
                                        "timestamp":face.timestamp,
                                        "history":{"name":face.name}
                                        }]
                                    },
                                "clientToken":str(clientToken)
                    }
                    client.publish("414ce45bde0a4bc1949fec75a7d2f699/event", payload=str(data_face), qos=0,retain=False)#发送人脸数据
                    with open('/home/simon/mqtt/'+'FaceAndTime.json','w+',encoding="utf-8") as new_f:
                        seek_point = old_f.tell()#光标在被删除行的行首,记录该位置
                        new_f.seek(seek_point,0)#设置光标位置
                        old_f.readline()#读需要删除的行,光标移动到下一行行首
                        next_line=old_f.readline()#被删除行的下一行读给next_line
                        while next_line:#连续覆盖剩余行,后面所有行上移一行
                            new_f.write(next_line)
                            next_line=old_f.readline()
                            new_f.truncate()

三、完整代码

逻辑一: 

import paho.mqtt.client as mqtt
import json
import base64
import uuid
import time
import sys
import multiprocessing
import re
import os
from face_recognition.face_recognition_cli import image_files_in_folder
import glob

HOST = "api.yumik.top" 
PORT = 1883
client_id="414ce45bde0a4bc1949fec75a7d2f699"
clientToken=uuid.uuid4()

class Data(object):
    def __init__(self,name,timestamp):
        self.timestamp = timestamp
        self.name = name
def dict2Data(d):
    return Data(d['name'],d['timestamp'])

a = []#获取userId
with open("/home/simon/mqtt/"+"shadow.ini","r") as ud: 
    mes = ud.read()
    mes_parsed = json.loads(mes)
    meslist = mes_parsed['payload']['state']['reported']['faceList']
    for i in meslist:
        #print(str(i))
        userid = i['userId']
        a.append(int(userid))
        #print(userid)
    #print(a)

#publish event
data_in = {
     "type":"face",
     "payload":{"userList":a,},
     #"payload":{"userList":[2],},
     "clientToken":str(clientToken)
     }
param_in = json.dumps(data_in)
#publish shadow/operation
data1 = {
     "type":"get",
     "clientToken":str(clientToken)
     }
param1 = json.dumps(data1)
 
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))        

def file_circle(dirs5,houzhui,i,picture):
    global picture2
    for dirs4 in dirs5:
        #print("dirs4:"+dirs4)
        d2 = os.path.basename(dirs4)#图片名加后缀
        num2 = os.path.splitext(d2)[0]#图片名
        basename2 = os.path.splitext(d2)[1] #后缀名
        if(int(num2)==i):
            with open("/home/simon/mqtt/picture_recieve/"+str(num2)+basename2,"rb") as p1:
                picture2 = picture + str(base64.b64encode(p1.read()),encoding="utf-8")#bytes
            break
    return(picture2)

picture = ""
houzhui = ""
u = []#存用户的id
v = []#存每个用户的图片数量,递增
def on_message(client, userdata, msg):
    global picture
    global i
    global houzhui
    recieve = msg.payload.decode("utf-8")
    recieve_parsed = json.loads(recieve)
    msg_type = recieve_parsed['type']
    if(msg.topic=="414ce45bde0a4bc1949fec75a7d2f699/control" and (msg_type=="face" or msg_type=="imageUpdate")):
        print("topic:"+msg.topic+" message:"+str(msg.payload.decode('utf-8')))
        print("control achieve!")
        packetnum = recieve_parsed['payload']['packet']
        packettotal = recieve_parsed['payload']['totalPacket']
        picture = recieve_parsed['payload']['userImageBase64']
        temp = base64.b64decode(picture)#bytes
        useridnum = str(recieve_parsed['payload']['user'])
        houzhui = "."+str(recieve_parsed['payload']['user'])
        if(msg_type=="imageUpdate"):
            rootdir = "/home/simon/mqtt/picture_recieve/"
            file_delete = os.listdir(rootdir)
            for file in file_delete:
                if houzhui in file:
                    del_file = rootdir + file#当代码和要删除的文件不在同一个文件夹时,必须使用绝对路径
                    os.remove(del_file)#删除文件
        with open("/home/simon/mqtt/picture_recieve/"+str(packetnum)+"."+str(recieve_parsed['payload']['user']),"wb") as f:
            f.write(temp)#int
        #判断一张图片是否全部接收
        key = len(u)-1
        if(key<0):
            u.append(useridnum)
            v[key]=1
        else:
            while(key>=0):
                if(uesridnum==u[key]):
                    v[key]+=1                   
                else:
                    u.append(useridnum)
                    v[key]=1
                if(v[key]==packettotal):
                    break
                key = key-1
        #一张图片全部接收后进行组装
        if(v[key]==packettotal):
            i=1
            #all = r'/home/simon/mqtt/picture_recieve'
            bool_flag2 = False#大循环跳出标志
            dirs2 = []
            dirs0 = []
            for dirs1 in glob.glob('/home/simon/mqtt/picture_recieve'+"/*"+houzhui):
                dirs2.append(dirs1)
                dirs0.append(dirs1)
            #print(dirs2)
            for dirs3 in dirs2:
                #print("dirs3:"+dirs3)
                d1 = os.path.basename(dirs3)#图片名加后缀
                num1 = os.path.splitext(d1)[0]#图片名
                basename1 = os.path.splitext(d1)[1] #后缀名
                if(int(num1)==1):
                    with open("/home/simon/mqtt/picture_recieve/"+str(num1)+basename1,"rb") as p1:
                        picture1 = str(base64.b64encode(p1.read()),encoding="utf-8")#bytes
                    i=i+1
                    bool_flag1 = False#跳出小循环标志
                    while True:
                        if(i!=packettotal):
                            picture1 = file_circle(dirs0,houzhui,i,picture1)
                            i=i+1
                        if(i==packettotal):
                            picture1 = file_circle(dirs0,houzhui,i,picture1)
                            i=1
                            bool_flag1 = True
                            break
                    if(bool_flag1):
                        bool_flag2 = True
                        temp = base64.b64decode(picture1)#bytes
                        with open("/home/simon/mqtt/picture/"+str(recieve_parsed['payload']['user'])+str(recieve_parsed['payload']['userName'])+".jpg","wb") as o:
                            o.write(temp)
                if(bool_flag2):
                    break
    if(msg.topic=="414ce45bde0a4bc1949fec75a7d2f699/control" and msg_type=="history"):
        print("topic:"+msg.topic+" message:"+str(msg.payload.decode('utf-8')))
    if(msg.topic=="$shadow/operation/result/414ce45bde0a4bc1949fec75a7d2f699"):
        #print("topic:"+msg.topic+" message:"+str(msg.payload.decode('utf-8')))
        print("shadow achieve!")
        #本地的shadow
        with open("/home/simon/mqtt/"+"shadow.ini","r") as sd: 
            vsn = sd.read()
        vsn_parsed = json.loads(vsn)
        in_version = vsn_parsed['payload']['version']
        #get到的shadow
        shadow = msg.payload.decode('utf-8')
        shadow_get = json.loads(shadow)
        shadow_desired = shadow_get['payload']['state']['desired']
        shadow_reported = shadow_get['payload']['state']['reported']
        print(shadow_get)
        shadow_version = shadow_get['payload']['version']#字符串
        if(shadow_desired!={}):
            if('state' in shadow_desired):
                state = shadow_desired['state']
            else:state = shadow_reported['state']
            if('faceList' in shadow_desired):
                s_d_facelist = shadow_desired['faceList']#数组
                s_d_f = ",".join('%s'%id for id in s_d_facelist)#字符串
            else:
                s_r_facelist = shadow_reported['faceList']#数组
                s_d_f = ",".join('%s'%id for id in s_r_facelist)#字符串
            data_delta = {
                "type":"delta",
                "state":{
                    "reported":{
                        "state":state,
                        "faceList":[s_d_f]
                    }
                },
                "version":shadow_version,
                "clientToken":str(clientToken)
            }
            data_delta_param = json.dumps(data_delta)
            client.publish("$shadow/operation/414ce45bde0a4bc1949fec75a7d2f699", payload=data_delta_param,qos=2,retain=False)#delta
        elif(shadow_version!=in_version):
            client.publish("$shadow/operation/414ce45bde0a4bc1949fec75a7d2f699", payload=param1,qos=2,retain=False)#get
        with open("/home/simon/mqtt/"+"shadow.ini","w") as sd: 
            sd.write(msg.payload.decode('utf-8'))

def on_publish(client,userdata,mid):
    print("On onPublish: qos = %d" % mid)

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 client_loop():
    while True:
        with open('/home/simon/mqtt/'+'FaceAndTime.json','r',encoding="utf-8") as old_f:
            #读取所有行,每行会是一个字符串
            for j in old_f.readlines():
                if(j):
                    print(j)
                    face = json.loads(j,object_hook=dict2Data)
                    data_face = {
                                "type":"history",
                                "payload":{
                                    "history":[
                                    {
                                        "timestamp":face.timestamp,
                                        "history":{"name":face.name}
                                        }]
                                    },
                                "clientToken":str(clientToken)
                    }
                    client.publish("414ce45bde0a4bc1949fec75a7d2f699/event", payload=str(data_face), qos=0,retain=False)#发送人脸数据
                    with open('/home/simon/mqtt/'+'FaceAndTime.json','w+',encoding="utf-8") as new_f:
                        seek_point = old_f.tell()#光标在被删除行的行首,记录该位置
                        new_f.seek(seek_point,0)#设置光标位置
                        old_f.readline()#读需要删除的行,光标移动到下一行行首
                        next_line=old_f.readline()#被删除行的下一行读给next_line
                        while next_line:#连续覆盖剩余行,后面所有行上移一行
                            new_f.write(next_line)
                            next_line=old_f.readline()
                            new_f.truncate()

if __name__ == '__main__':
    client = mqtt.Client(client_id)
    client.on_connect = on_connect
    client.connect(HOST, PORT, 60)
    client.on_subscribe = on_subscribe
    client.subscribe("414ce45bde0a4bc1949fec75a7d2f699/control",qos=1)        
    client.subscribe("$shadow/operation/result/414ce45bde0a4bc1949fec75a7d2f699",qos=1)
    client.on_publish = on_publish
    client.publish("414ce45bde0a4bc1949fec75a7d2f699/event", payload=param_in,qos=2,retain=False)#获得图片
    client.publish("$shadow/operation/414ce45bde0a4bc1949fec75a7d2f699", payload=param1,qos=2,retain=False)#get
    client.on_message = on_message
    client.loop_start()
    client_loop()

逻辑二: 

import paho.mqtt.client as mqtt
import json
import base64
import uuid
import time
import sys
import multiprocessing
import re
import os
from face_recognition.face_recognition_cli import image_files_in_folder
import glob

HOST = "api.yumik.top" 
PORT = 1883
client_id="414ce45bde0a4bc1949fec75a7d2f699"
clientToken=uuid.uuid4()

class Data(object):
    def __init__(self,name,timestamp):
        self.timestamp = timestamp
        self.name = name
def dict2Data(d):
    return Data(d['name'],d['timestamp'])

#publish shadow/operation
data1 = {
     "type":"get",
     "clientToken":str(clientToken)
     }
param1 = json.dumps(data1)
 
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))        

def file_circle(dirs5,houzhui,i,picture):
    global picture2
    for dirs4 in dirs5:
        d2 = os.path.basename(dirs4)#图片名加后缀
        num2 = os.path.splitext(d2)[0]#图片名
        basename2 = os.path.splitext(d2)[1] #后缀名
        if(int(num2)==i):
            with open("/home/simon/mqtt/picture_recieve/"+str(num2)+basename2,"rb") as p1:
                picture2 = picture + str(base64.b64encode(p1.read()),encoding="utf-8")#bytes
            break
    return(picture2)

picture = ""
houzhui = ""
u = []#存用户的id
v = []#存每个用户的图片数量,递增
a = []#获取userId
def on_message(client, userdata, msg):
    global picture
    global i
    global houzhui
    recieve = msg.payload.decode("utf-8")
    recieve_parsed = json.loads(recieve)
    msg_type = recieve_parsed['type']
    if(msg.topic=="414ce45bde0a4bc1949fec75a7d2f699/control" and msg_type=="history"):
        print("topic:"+msg.topic+" message:"+str(msg.payload.decode('utf-8')))
    if(msg.topic=="$shadow/operation/result/414ce45bde0a4bc1949fec75a7d2f699"):
        if(msg_type=="get"):
            print("topic:"+msg.topic+" message:"+str(msg.payload.decode('utf-8')))
            print("shadow achieve!")
            #get到的shadow
            #shadow = msg.payload.decode('utf-8')
            #shadow_get = json.loads(shadow)
            shadow_desired = recieve_parsed['payload']['state']['desired']
            shadow_reported = recieve_parsed['payload']['state']['reported']
            shadow_version = recieve_parsed['payload']['version']#字符串
            if(shadow_desired!={}):
                if('faceList' in shadow_desired):
                    s_d_facelist = shadow_desired['faceList']#数组
                    if('state' in shadow_desired):
                        state = shadow_desired['state']
                        data_delta = {
                            "type":"delta",
                            "state":{
                                "reported":{
                                    "state":state,
                                    "faceList":s_d_facelist
                                }
                            },
                            "version":shadow_version,
                            "clientToken":str(clientToken)
                        }
                    else:
                        data_delta = {
                            "type":"delta",
                            "state":{
                                "reported":{
                                    "faceList":s_d_facelist
                                }
                            },
                            "version":shadow_version,
                            "clientToken":str(clientToken)
                        }
                else:
                    state = shadow_desired['state']
                    data_delta = {
                        "type":"delta",
                        "state":{
                            "reported":{
                                "state":state
                            }
                        },
                        "version":shadow_version,
                        "clientToken":str(clientToken)
                    }
                data_delta_param = json.dumps(data_delta)
                client.publish("$shadow/operation/414ce45bde0a4bc1949fec75a7d2f699", payload=data_delta_param,qos=2,retain=False)#delta
            else:#desired内没有内容需要完成时
                with open("/home/simon/mqtt/"+"shadow.ini","r") as ud: 
                    mes = ud.read()
                    mes_parsed = json.loads(mes)
                    meslist = mes_parsed['payload']['state']['reported']['faceList']
                    for i in meslist:
                        userid = i['userId']
                        a.append(int(userid))
                #publish event
                data_in = {
                     "type":"face",
                     "payload":{"userList":a,},
                     #"payload":{"userList":[2,3,4,5],},
                     "clientToken":str(clientToken)
                     }
                param_in = json.dumps(data_in)
                client.publish("414ce45bde0a4bc1949fec75a7d2f699/event", payload=param_in,qos=2,retain=False)#获得图片            
        if(msg_type=="delta"):
            print("topic:"+msg.topic+" message:"+str(msg.payload.decode('utf-8')))
            print("shadow achieve!")
            with open("/home/simon/mqtt/"+"shadow.ini","w") as sd: 
                sd.write(msg.payload.decode('utf-8'))
            with open("/home/simon/mqtt/"+"shadow.ini","r") as ud: 
                mes = ud.read()
                mes_parsed = json.loads(mes)
                meslist = mes_parsed['payload']['state']['reported']['faceList']
                for i in meslist:
                    userid = i['userId']
                    a.append(int(userid))
            #publish event
            data_in = {
                 "type":"face",
                 "payload":{"userList":a,},
                 #"payload":{"userList":[2,3,4,5],},
                 "clientToken":str(clientToken)
                 }
            param_in = json.dumps(data_in)
            client.publish("414ce45bde0a4bc1949fec75a7d2f699/event", payload=param_in,qos=2,retain=False)#获得图片
    if(msg.topic=="414ce45bde0a4bc1949fec75a7d2f699/control" and (msg_type=="face" or msg_type=="imageUpdate")):
        #print("topic:"+msg.topic+" message:"+str(msg.payload.decode('utf-8')))
        print("control achieve!")
        packetnum = recieve_parsed['payload']['packet']
        packettotal = recieve_parsed['payload']['totalPacket']
        picture = recieve_parsed['payload']['userImageBase64']
        temp = base64.b64decode(picture)#bytes
        useridnum = str(recieve_parsed['payload']['user'])
        houzhui = "."+str(recieve_parsed['payload']['user'])
        if(msg_type=="imageUpdate"):
            rootdir = "/home/simon/mqtt/picture_recieve/"
            file_delete = os.listdir(rootdir)
            for file in file_delete:
                if houzhui in file:
                    del_file = rootdir + file#当代码和要删除的文件不在同一个文件夹时,必须使用绝对路径
                    os.remove(del_file)#删除文件
        with open("/home/simon/mqtt/picture_recieve/"+str(packetnum)+"."+str(recieve_parsed['payload']['user']),"wb") as f:
            f.write(temp)#int
        #判断一张图片是否全部接收
        key = len(u)-1
        if(key<0):#接收第一张图片
            u.append(useridnum)
            v.append(1)
        else:
            while(key>=0):
                if(useridnum==u[key]):
                    v[key]+=1                   
                else:
                    u.append(useridnum)
                    v.append(1)
                if(v[key]==packettotal):
                    break
                key = key-1
        #一张图片全部接收后进行组装
        if(v[key]==packettotal):
            i=1
            bool_flag2 = False#大循环跳出标志
            dirs2 = []#大循环的数组
            dirs0 = []#小循环的数组
            for dirs1 in glob.glob('/home/simon/mqtt/picture_recieve'+"/*"+houzhui):
                dirs2.append(dirs1)
                dirs0.append(dirs1)
            for dirs3 in dirs2:
                d1 = os.path.basename(dirs3)#图片名加后缀
                num1 = os.path.splitext(d1)[0]#图片名
                basename1 = os.path.splitext(d1)[1] #后缀名
                if(int(num1)==1):#找到序号为1的照片部分
                    with open("/home/simon/mqtt/picture_recieve/"+str(num1)+basename1,"rb") as p1:
                        picture1 = str(base64.b64encode(p1.read()),encoding="utf-8")#bytes
                    i=i+1
                    bool_flag1 = False#跳出小循环标志
                    while True:
                        if(i!=packettotal):#不是最后一部分就一直组装照片
                            picture1 = file_circle(dirs0,houzhui,i,picture1)
                            i=i+1
                        if(i==packettotal):#找到照片的最后一部分
                            picture1 = file_circle(dirs0,houzhui,i,picture1)
                            i=1
                            bool_flag1 = True
                            break
                    if(bool_flag1):
                        bool_flag2 = True
                        temp = base64.b64decode(picture1)#bytes
                        with open("/home/simon/mqtt/picture/"+str(recieve_parsed['payload']['user'])+str(recieve_parsed['payload']['userName'])+".jpg","wb") as o:
                            o.write(temp)
                if(bool_flag2):
                    break

def on_publish(client,userdata,mid):
    print("On onPublish: qos = %d" % mid)

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 client_loop():
    while True:
        with open('/home/simon/mqtt/'+'FaceAndTime.json','r',encoding="utf-8") as old_f:
            #读取所有行,每行会是一个字符串
            for j in old_f.readlines():
                if(j):
                    print(j)
                    face = json.loads(j,object_hook=dict2Data)
                    data_face = {
                                "type":"history",
                                "payload":{
                                    "history":[
                                    {
                                        "timestamp":face.timestamp,
                                        "history":{"name":face.name}
                                        }]
                                    },
                                "clientToken":str(clientToken)
                    }
                    client.publish("414ce45bde0a4bc1949fec75a7d2f699/event", payload=str(data_face), qos=0,retain=False)#发送人脸数据
                    with open('/home/simon/mqtt/'+'FaceAndTime.json','w+',encoding="utf-8") as new_f:
                        seek_point = old_f.tell()#光标在被删除行的行首,记录该位置
                        new_f.seek(seek_point,0)#设置光标位置
                        old_f.readline()#读需要删除的行,光标移动到下一行行首
                        next_line=old_f.readline()#被删除行的下一行读给next_line
                        while next_line:#连续覆盖剩余行,后面所有行上移一行
                            new_f.write(next_line)
                            next_line=old_f.readline()
                            new_f.truncate()

if __name__ == '__main__':
    client = mqtt.Client(client_id)
    client.username_pw_set("device", "15f56228e74f2c978b0c376df35d3df8166da22f858f016f6906430d0c4b6070")
    client.on_connect = on_connect
    client.connect(HOST, PORT, 60)
    client.on_subscribe = on_subscribe
    client.subscribe("414ce45bde0a4bc1949fec75a7d2f699/control",qos=1)        
    client.subscribe("$shadow/operation/result/414ce45bde0a4bc1949fec75a7d2f699",qos=1)
    client.on_publish = on_publish
    client.publish("$shadow/operation/414ce45bde0a4bc1949fec75a7d2f699", payload=param1,qos=2,retain=False)#get
    client.on_message = on_message
    client.loop_start()
    client_loop()