【189】Java Spring利用HTTP轮询远程控制树莓派4B继电器开关

因为项目需求,要实现PC远程控制警铃的效果。警铃结构简单,只需要通上12V的直流电就可以报警。本文的树莓派设备是在树莓派4B的基础上找硬件厂商搞的定制化产品。树莓派4B通过4G网卡连接互联网,并利用GPIO控制12V直流电的继电器开关。树莓派4B每隔5秒就访问一次后端HTTP接口,查询警铃是打开还是关闭。

树莓派的Python 代码:

python 复制代码
import requests
import gpiozero
import time
from time import sleep
import logging
from logging.handlers import TimedRotatingFileHandler

# Config logging
new_formatter = '[%(levelname)s]%(asctime)s:%(msecs)s.%(process)d,%(thread)d#>[%(funcName)s]:%(lineno)s  %(message)s'
fmt = logging.Formatter(new_formatter)
log_handel = TimedRotatingFileHandler('/home/pi/your_disk_path/logs/bell.log', when='M', backupCount=3)
log_handel.setFormatter(fmt)
log_info = logging.getLogger('error')
log_info.setLevel(logging.INFO)
log_info.addHandler(log_handel)


RELAY_PIN = 22
# Triggered by the output pin going high: active_high=True
# Initially off: initial_value=False
relay = gpiozero.OutputDevice(RELAY_PIN, active_high=True, initial_value=False)

def getBellSwitch():
    res = requests.get(url='http://yourhost/api/raspberry/switch?no=1')
    if res.text == '1':
        relay.on()
    else:
        relay.off()
    sleep(5)


while True:
    try:
        getBellSwitch()
    except Exception as e:
        log_info.error(e)

数据库表名是 bell 。表结构如下:

bash 复制代码
id:int   // 主键
no:int   // 设备编号,唯一性约束
heartbeat_time: datetime  //联系服务器的心跳时间
switch: int  // 0是关闭,1是打开

下面是Java示例代码。思路比较简单。树莓派每隔5秒调用一次 /api/raspberry/switch?no=1 接口查询1号警铃的状态。Java接口查询数据库返回switch的值。0表示关闭,1表示打开。

同时 /api/raspberry/updateSwitch 接口给PC调用,用来更新数据库中警铃的开关状态。

java 复制代码
@RestController
@RequestMapping("/api/raspberry")
public class ApiRaspberryController {
	@GetMapping("/switch")
    public int switch(@RequestParam("no") Integer no) {
    	// 根据设备编号查找 bell 表记录,并且返回switch的值。
    	return bell.getSwitch();
	}

	@PostMapping("/updateSwitch")
    public Map<String,Object> updateBellSwitch(@RequestBody Bell bell) {
    	// 根据 no 和 switch 更新对应记录。具体代码省略。
    	// .....
    	Map<String, Object> map = new HashMap<>();
    	map.put("code", 200);
    	map.put("msg", "操作成功");
    	return map;
    }
}
相关推荐
认真的酒窝3 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
Lyn_Li3 小时前
扫描 PDF 歪了怎么办?用 6 种检测方法做本地批量扶正(附开源工具)
python·pdf·ocr·tesseract·开源工具·文档处理·本地处理·扫描件纠偏
金銀銅鐵3 小时前
费马小定理
python·数学·算法
wbs_scy4 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录9174 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
Full Stack Developme6 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
疋瓞7 小时前
python和C++对比(1)_数据类型和数据结构
数据结构·c++·python
程序员老油条8 小时前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2
如此这般英俊8 小时前
手搓Claude Code-第六章 subagent
数据结构·人工智能·python·语言模型·自然语言处理
shushangyun_9 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习