系列文章目录
(一)树莓派、MQTT。 DHT11、MFRC522(一)
(二)树莓派、MQTT。树莓派定时温湿度采集,图片采集(二)
(三)树莓派、MQTT(四)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
树莓派与PC通过MQTT通信
树莓派通过MQTT传输图片参考:
https://blog.youkuaiyun.com/EndaZ/article/details/124298490
一、启动MQTT服务器
本系统不接外网,确保树莓派、服务器、PC在同一局域网
二、接收端
1、Rece_All.py
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 5 15:45:42 2022
@author: 嗯哒
"""
import paho.mqtt.client as mqtt
import pandas as pd
import time
import os
import struct
count = 0
Tag = 0
Tag_2 = 0
new_filename = 0
filesize = 0
fp = 0
writer = 0
def on_connect(client, userdata, flags, rc):
print("Connect with result: "+str(rc))
def on_message(client, userdata, msg):
global Tag,new_filename,filesize,count,fp,writer,Tag_2
# Tag==0 表示接收文件名,文件大小数据
if Tag == 0:
buf = msg.payload
#接收到‘D’表示温湿度csv接收完成,准备接收图片
if buf == bytes(('D').encode('UTF-8')):
Tag = 0
return
#接收到‘P’表示图片接收完成,本轮数据接收结束,return返回。Tag置为2
elif buf == bytes(('P').encode('UTF-8')):
Tag = 2
print('end')
return
#接收文件名,文件大小
if buf:
filename, filesize = struct.unpack('128sl', buf)
fn = filename.strip(str.encode('\00'))
print(fn)
if str(fn)[2:-1] == 'Data.csv' and os.path.exists('./Data.csv'):
new_filename = os.path.join('./','new_'+str(fn)[2:-1])
fp = open(new_filename, 'wb')
Tag_2 = 1
else:
new_filename = os.path.join('./', str(fn)[2:-1])
print ('file new name is {0}, filesize is {1}'.format(new_filename, filesize))
fp = open(new_filename, 'wb')
Tag_2 = 2
print('receiving...')
Tag = 1
#Tag==1 表示接收文件内容
elif Tag == 1:
fp.write(msg.payload)
if fp.tell() >= filesize:
Tag = 0
print('1 Round over.')
fp.close()
time.sleep(1)
if Tag_2 == 1:
df = pd.read_csv('Data.csv',index_col=0)
df2 = pd.read_csv('new_Data.csv',index_col=0)
df = pd.concat([df,df2],ignore_index=True)
df.to_csv('./Data.csv')
Tag_2=0
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
#127.0.0.1 为MQTT服务器地址
client.connect('127.0.0.1', 1883, 600)
#订阅主题 Pi_1
client.subscribe('Pi-1', qos=0)
client.loop_start()
print('start')
while True:
#Tag==2时表示一轮接收完成,向发送端发送‘OK’
if (Tag == 2):
client.publish('Rece', payload = bytes(('OK').encode('UTF-8')), qos =0)
Tag = 0
#print('end')
#break
else:
pass
#关闭连接
#client.loop_stop()
三、发送端
1、Send_All.py
import time
import paho.mqtt.client as mqtt
import os
import struct
import pandas as pd
def on_connect(client, userdata, flags, rc):
print("Connect with result "+str(rc))
def on_message(client, userdata, msg):
global message
message = msg.payload
print("接收到的消息为:"+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_messafe = on_message
client.connect('192.168.137.1', 1883, 600)
client.subscribe('Rece', qos=0)
client.loop_start()
message = 0
#发送Data.csv
filepath = "/home/pi/Program/Final_P/Data.csv"
if os.path.isfile(filepath):
# 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
fileinfo_size = struct.calcsize('128sl')
# 定义文件头信息,包含文件名和文件大小
fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode('utf-8')),os.stat(filepath).st_size)
#print(os.stat(filepath).st_size)
client.publish('Pi-1', payload = fhead, qos =0)
time.sleep(3)
filesize=os.stat(filepath).st_size
print ('client filepath: {0}'.format(filepath))
fp = open(filepath, 'rb')
re_size=0
#数据切片
while 1:
if filesize - re_size >= 1024:
data = fp.read(1024)
re_size += 1024
else:
data = fp.read(filesize - re_size)
#print(len(data))
if not data:
print ('{0} file send over...'.format(filepath))
print(' ')
break
client.publish('Pi-1', payload = data, qos =0)
time.sleep(1)
client.publish('Pi-1', bytes(('D').encode('UTF-8')), qos =0)
print('Data.csv send end.')
print('Server is receiving, wait patiently please !')
print('Sending Photo now...')
#发送图片
df = pd.read_csv('/home/pi/Program/Final_P/Pic.csv')
row = df.shape[0]
i=0
while i < row:
global message
path = df['图片'][i]
i+=1
if os.path.exists(path):
#图片存在,发送图片
filepath = path
if os.path.isfile(filepath):
# 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
fileinfo_size = struct.calcsize('128sl')
# 定义文件头信息,包含文件名和文件大小
fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode('utf-8')),os.stat(filepath).st_size)
print(os.stat(filepath).st_size)
client.publish('Pi-1', payload = fhead, qos =0)
time.sleep(3)
filesize=os.stat(filepath).st_size
print ('client filepath: {0}'.format(filepath))
fp = open(filepath, 'rb')
re_size=0
#图片数据切片
while 1:
if filesize - re_size >= 1024:
data = fp.read(1024)
re_size += 1024
else:
data = fp.read(filesize - re_size)
print(len(data))
if not data:
print ('{0} file send over...'.format(filepath))
print(' ')
break
client.publish('Pi-1', payload = data, qos =0)
time.sleep(1)
else:
if message == bytes(('OK').encode('UTF-8')):
break
client.publish('Pi-1', payload = bytes(('P').encode('UTF-8')), qos =0)
print('Photos send end.')
print('Server is receiving, wait patiently please !')
client.loop_stop()
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。