基于Raspberry Pi 2 Model B V1.1的远程内容投屏礼物方案咨询
实现简化版联网Heartbox的思路(基于Raspberry Pi 2 Model B V1.1)
嘿,这个把树莓派改成联网版Heartbox的想法超有意思!刚好我折腾过不少树莓派物联网项目,给你梳理一套能落地的实现思路,分硬件、软件、推送端几个模块来讲:
一、硬件选型与准备
- 核心设备:Raspberry Pi 2 Model B V1.1(本身性能足够跑轻量服务和显示逻辑)
- 屏幕:推荐选3.5寸SPI小屏(比如Waveshare的型号),便携性拉满,而且树莓派2支持SPI驱动;如果想要显示效果更好,也可以选7寸HDMI小屏,不过要考虑供电和体积
- 供电:用10000mAh左右的移动电源,再加个带过充过放保护的电源模块(避免树莓派突然断电损坏)
- 可选配件:如果要做外壳,可以用3D打印一个简约的盒子,或者找现成的树莓派屏幕外壳
二、核心功能拆解与方案选择
整个项目核心就是「推送端发内容 → 树莓派接收并处理 → 屏幕显示」,这里给你两个最实用的方案:
方案1:HTTP API接收(适合新手,技术栈友好)
树莓派上跑一个轻量级Web服务,推送端(网页/APP)通过POST请求把文本/图片数据发过来,树莓派收到后触发显示逻辑。优点是开发简单,网页/APP端不用学复杂的物联网协议;缺点是实时性稍弱,适合非高频推送的场景。
方案2:MQTT协议接收(适合物联网场景,低功耗实时)
用MQTT这种轻量级物联网协议,树莓派做订阅者,推送端做发布者,通过公共MQTT Broker(或者自己搭)传递消息。优点是实时性强,带宽占用低,适合后续扩展多设备;缺点是需要了解基础的MQTT概念。
三、具体落地步骤
1. 树莓派系统基础配置
- 刷入Raspberry Pi OS Lite(无桌面,省资源),用
raspi-config开启WiFi、SPI接口(如果用SPI屏)、SSH(方便远程调试) - 配置DDNS或者内网穿透:因为树莓派在家庭内网,全球联网需要让外部能访问到它。如果路由器有公网IP,做端口映射;没有的话用内网穿透工具(比如FRP),或者免费DDNS服务绑定动态IP
2. 推送接收逻辑实现
如果你选HTTP API方案:
- 安装依赖:
pip install flask pillow - 写一个简单的Flask服务,比如:
from flask import Flask, request from PIL import Image, ImageDraw, ImageFont import pygame app = Flask(__name__) # 初始化屏幕显示(以SPI屏为例,需要先装对应驱动) pygame.init() screen = pygame.display.set_mode((320, 240)) @app.route('/push', methods=['POST']) def push_content(): content = request.form.get('text') if content: # 渲染文本到屏幕 screen.fill((255,255,255)) font = pygame.font.Font(None, 36) text_surface = font.render(content, True, (0,0,0)) screen.blit(text_surface, (10, 10)) pygame.display.flip() return "Success" # 后续扩展图片接收 image_file = request.files.get('image') if image_file: img = Image.open(image_file) img = img.resize((320,240)) img.save('/tmp/show_img.jpg') # 用pygame显示图片 img_surface = pygame.image.load('/tmp/show_img.jpg') screen.blit(img_surface, (0,0)) pygame.display.flip() return "Success" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
- 启动服务:
python app.py,然后在路由器上映射5000端口,就能通过公网IP访问这个接口了
如果你选MQTT方案:
- 安装依赖:
pip install paho-mqtt pillow - 写MQTT订阅逻辑:
import paho.mqtt.client as mqtt from PIL import Image, ImageDraw, ImageFont import pygame # 初始化屏幕 pygame.init() screen = pygame.display.set_mode((320, 240)) def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("heartbox/content") def on_message(client, userdata, msg): content = msg.payload.decode('utf-8') # 处理文本显示 screen.fill((255,255,255)) font = pygame.font.Font(None, 36) text_surface = font.render(content, True, (0,0,0)) screen.blit(text_surface, (10, 10)) pygame.display.flip() # 后续扩展图片:可以接收图片的Base64编码,解码后显示 client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message # 连接公共MQTT Broker,比如emqx的免费节点 client.connect("broker.emqx.io", 1883, 60) client.loop_forever()
3. 推送端实现
- 网页端:写个简单的HTML页面,用JS发送POST请求或者MQTT消息。比如:
<!DOCTYPE html> <html> <body> <input type="text" id="content" placeholder="输入要推送的文本"> <button onclick="pushText()">推送文本</button> <script> function pushText() { const content = document.getElementById('content').value; fetch('http://你的公网IP:5000/push', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `text=${content}` }); } </script> </body> </html>
- APP端:初期用低代码工具(比如Thunkable)做个简单界面,集成HTTP请求功能;如果有编程基础,用Flutter写个APP,调用HTTP接口或者MQTT客户端库就行
4. 屏幕显示优化
- 如果用SPI屏,记得安装对应厂商的驱动(比如Waveshare的官方驱动包),避免显示异常
- 可以加个自动息屏逻辑:比如5分钟没新内容就黑屏,收到新内容自动亮屏,用
vcgencmd display_power命令控制屏幕开关
四、进阶优化方向
- 内容缓存:把收到的内容存在本地文件,断网后能显示历史内容
- 加密传输:给HTTP接口加HTTPS,或者MQTT用TLS加密,防止内容被拦截
- 多设备管理:如果以后做多个Heartbox,用MQTT主题区分不同设备,或者在API里加设备ID参数
- 交互功能:比如树莓派加个按钮,按下可以切换显示历史内容
内容的提问来源于stack exchange,提问作者Fel21X




