树莓派、MQTT。MQTT数据收发(三)

该系列文章介绍了如何利用树莓派、MQTT协议进行温湿度数据和图片的传输。文章详细阐述了启动MQTT服务器、接收端(Rece_All.py)和发送端(Send_All.py)的实现过程,包括文件名和大小的接收、文件内容的接收与保存、数据的整合以及与发送端的交互。通过这一系统,树莓派可以在同一局域网内与PC进行数据通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

(一)树莓派、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提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值