一、利用阿里云服务器实现树莓派外网访问(SSH 反向代理)

1. 树莓派端配置

步骤 1:安装 SSH 服务(若未安装)

sudo apt-get install openssh-server

步骤 2:创建反向代理连接

-p 22:指定阿里云服务器的 SSH 端口

-qngfN:静默模式、后台运行、不分配伪终端

-R:反向代理参数

2222:阿里云服务器用于映射的端口(需自行定义未被占用的端口)

username:阿里云服务器登录用户名

步骤 3:设置开机自启动
将反向代理命令添加到~/.bashrc或创建启动脚本:

echo "ssh -p 22 -qngfNTR 2222:localhost:22 username@114.55.126.125" >> ~/.bashrc
2. 阿里云服务器端配置

步骤 1:检查端口监听状态

ss -ntl | grep 2222

若输出类似LISTEN 0 128 :::2222 :::*,说明端口已成功绑定。

步骤 2:配置防火墙(若使用安全组)
在阿里云控制台的安全组规则中添加入方向规则,允许 TCP 协议访问 2222 端口。

3. 外网访问树莓派
# 格式: ssh -p [服务器映射端口] [树莓派用户名]@[服务器IP]
ssh -p 2222 pi@114.55.126.125

二、树莓派 PWM LED 呼吸灯(含多线程实现)

1. 单线程顺序呼吸灯
import RPi.GPIO as GPIO
import time# 设置GPIO模式为BOARD编号
GPIO.setmode(GPIO.BOARD)# 定义LED引脚(可修改为实际连接的引脚)
YELLOW_LED = 11  # 黄灯
GREEN_LED = 16   # 绿灯# 初始化引脚
GPIO.setup(YELLOW_LED, GPIO.OUT)
GPIO.setup(GREEN_LED, GPIO.OUT)# 创建PWM对象(频率60Hz)
pwm_yellow = GPIO.PWM(YELLOW_LED, 60)
pwm_green = GPIO.PWM(GREEN_LED, 60)# 启动PWM(初始占空比0)
pwm_yellow.start(0)
pwm_green.start(0)try:# 循环3次呼吸效果for _ in range(3):# 黄灯呼吸for dc in range(0, 101, 5):pwm_yellow.ChangeDutyCycle(dc)time.sleep(0.05)for dc in range(100, -1, -5):pwm_yellow.ChangeDutyCycle(dc)time.sleep(0.05)# 绿灯呼吸for dc in range(0, 101, 5):pwm_green.ChangeDutyCycle(dc)time.sleep(0.05)for dc in range(100, -1, -5):pwm_green.ChangeDutyCycle(dc)time.sleep(0.05)finally:# 停止PWM并清理资源pwm_yellow.stop()pwm_green.stop()GPIO.cleanup()
2. 多线程同时呼吸灯实现
import RPi.GPIO as GPIO
import time
import threading# 设置GPIO模式
GPIO.setmode(GPIO.BOARD)# 定义LED引脚
YELLOW_LED = 11
GREEN_LED = 16# 初始化引脚
GPIO.setup(YELLOW_LED, GPIO.OUT)
GPIO.setup(GREEN_LED, GPIO.OUT)# 创建PWM对象
pwm_yellow = GPIO.PWM(YELLOW_LED, 60)
pwm_green = GPIO.PWM(GREEN_LED, 60)# 启动PWM
pwm_yellow.start(0)
pwm_green.start(0)def yellow_breath():"""黄灯呼吸函数"""for _ in range(3):for dc in range(0, 101, 5):pwm_yellow.ChangeDutyCycle(dc)time.sleep(0.05)for dc in range(100, -1, -5):pwm_yellow.ChangeDutyCycle(dc)time.sleep(0.05)def green_breath():"""绿灯呼吸函数"""for _ in range(3):for dc in range(0, 101, 5):pwm_green.ChangeDutyCycle(dc)time.sleep(0.05)for dc in range(100, -1, -5):pwm_green.ChangeDutyCycle(dc)time.sleep(0.05)try:# 创建并启动线程t1 = threading.Thread(target=yellow_breath)t2 = threading.Thread(target=green_breath)t1.start()t2.start()# 等待线程结束t1.join()t2.join()finally:# 清理资源pwm_yellow.stop()pwm_green.stop()GPIO.cleanup()

三、树莓派超声波测距程序

1. 硬件连接

超声波模块 Trig 引脚 → 树莓派 GPIO23(BCM 编号)

超声波模块 Echo 引脚 → 树莓派 GPIO24(BCM 编号)

模块 VCC → 树莓派 5V

模块 GND → 树莓派 GND

2. 完整代码
import RPi.GPIO as GPIO
import time# 设置GPIO模式为BCM
GPIO.setmode(GPIO.BCM)# 定义引脚
TRIG_PIN = 23
ECHO_PIN = 24# 初始化引脚
GPIO.setup(TRIG_PIN, GPIO.OUT)
GPIO.setup(ECHO_PIN, GPIO.IN)def measure_distance():"""测量距离函数"""# 发送触发信号GPIO.output(TRIG_PIN, True)time.sleep(0.00001)  # 10微秒GPIO.output(TRIG_PIN, False)# 记录发送和接收时间start_time = time.time()stop_time = time.time()# 等待Echo变为高电平(发送超声波)while GPIO.input(ECHO_PIN) == 0:start_time = time.time()# 等待Echo变为低电平(接收超声波)while GPIO.input(ECHO_PIN) == 1:stop_time = time.time()# 计算距离(声速343m/s,转换为cm)time_elapsed = stop_time - start_timedistance = (time_elapsed * 34300) / 2return distancetry:print("超声波测距程序启动,按Ctrl+C停止")while True:dist = measure_distance()print(f"距离: {dist:.2f} cm")time.sleep(1)  # 每秒测量一次except KeyboardInterrupt:print("程序停止")
finally:GPIO.cleanup()

四、Linux 驱动程序控制 PWM(含编译与测试)

1. 准备编译环境
# 安装内核头文件(树莓派专用)
sudo apt-get install raspberrypi-kernel-headers
2. 驱动程序代码

pwmled.h 文件

#define PWMLED_MAX_BRIGHTNESS 1000typedef enum {PWMLED_CMD_SET_BRIGHTNESS = 0x1,PWMLED_CMD_GET_BRIGHTNESS,
} pwmled_cmd_t;

pwmled.c 文件

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/pwm.h>
#include "pwmled.h"MODULE_LICENSE("Dual MIT/GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("PWM LED Driver");#define PWM_PERIOD_NS 1000000  // 1ms周期(1000000纳秒)static struct {struct pwm_device *pwm;unsigned int brightness;
} pwmled;// IOCTL处理函数
long pwmled_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {switch (cmd) {case PWMLED_CMD_SET_BRIGHTNESS:// 限制亮度范围0~1000pwmled.brightness = arg > PWMLED_MAX_BRIGHTNESS ? PWMLED_MAX_BRIGHTNESS : arg;// 计算占空比(亮度*1000纳秒)int duty_ns = pwmled.brightness * 1000;// 配置PWMpwm_config(pwmled.pwm, duty_ns, PWM_PERIOD_NS);// 启用或禁用PWMif (pwmled.brightness > 0) {pwm_enable(pwmled.pwm);} else {pwm_disable(pwmled.pwm);}break;case PWMLED_CMD_GET_BRIGHTNESS:return pwmled.brightness;default:return -EINVAL;}return 0;
}// 文件操作结构体
static struct file_operations fops = {.owner = THIS_MODULE,.unlocked_ioctl = pwmled_ioctl,
};// 杂项设备结构体
static struct miscdevice pwmled_misc = {.minor = MISC_DYNAMIC_MINOR,.name = "pwmled",.fops = &fops,
};// 模块初始化函数
int __init pwmled_init(void) {int ret;// 请求PWM通道0(根据实际硬件修改通道号)pwmled.pwm = pwm_request(0, "pwmled");if (IS_ERR(pwmled.pwm)) {ret = PTR_ERR(pwmled.pwm);printk(KERN_ERR "Failed to request PWM channel\n");return ret;}// 初始化亮度为0pwmled.brightness = 0;// 注册杂项设备ret = misc_register(&pwmled_misc);if (ret < 0) {printk(KERN_ERR "Failed to register misc device\n");pwm_free(pwmled.pwm);return ret;}printk(KERN_INFO "PWM LED driver initialized\n");return 0;
}// 模块退出函数
void __exit pwmled_exit(void) {// 禁用PWMpwm_disable(pwmled.pwm);// 释放PWM资源pwm_free(pwmled.pwm);// 注销杂项设备misc_deregister(&pwmled_misc);printk(KERN_INFO "PWM LED driver unloaded\n");
}module_init(pwmled_init);
module_exit(pwmled_exit);
3. 编译驱动(Makefile)
obj-m += pwmled.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
4. 加载驱动与测试

步骤 1:编译并加载驱动

# 编译驱动
make
# 加载驱动
sudo insmod pwmled.ko

步骤 2:查看设备节点

ls /dev/pwmled

步骤 3:编写测试程序

import os
import fcntl# 定义IOCTL命令
PWMLED_CMD_SET_BRIGHTNESS = 0x1
PWMLED_CMD_GET_BRIGHTNESS = 0x2# 打开设备文件
fd = os.open("/dev/pwmled", os.O_RDWR)
if fd < 0:print("Failed to open /dev/pwmled")exit(1)try:# 设置亮度(0~1000)brightness = 500print(f"设置亮度为: {brightness}")fcntl.ioctl(fd, PWMLED_CMD_SET_BRIGHTNESS, brightness)# 等待5秒time.sleep(5)# 获取当前亮度current_brightness = fcntl.ioctl(fd, PWMLED_CMD_GET_BRIGHTNESS)print(f"当前亮度: {current_brightness}")finally:# 关闭设备文件os.close(fd)

步骤 4:卸载驱动

sudo rmmod pwmled

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85425.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85425.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85425.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web攻防-XSS跨站文件类型功能逻辑SVGPDFSWFHTMLXMLPMessageLocalStorage

知识点&#xff1a; 1、Web攻防-XSS跨站-文件类型-html&pdf&swf&svg&xml 2、Web攻防-XSS跨站-功能逻辑-postMessage&localStorage 一、演示案例-WEB攻防-XSS跨站-文件类型触发XSS-SVG&PDF&SWF&HTML&XML等 1、SVG-XSS SVG(Scalable Vect…

强大模型通过自我和解进步——Unsupervised Elicitation of Language Models——论文阅读笔记

本周关注的工作是&#xff1a;Unsupervised Elicitation of Language Models 这篇文章通篇体现了这样一件事——香蕉皮大需要香蕉大&#xff01; 一句话总结 首先注意&#xff1a;这个工作不是面向对齐的&#xff0c;而是写【如何准备】对齐任务的Reward Model需要的数据集的…

Qt—(Qt初识,槽,信号,事件)

一 Qt初识 暂时不写了 我的理解是类似于c#&#xff0c;是一个组件库&#xff0c;不局限是一个组件框架。 二 Qt Core Qt Core 是 Qt 框架的基础模块&#xff0c;提供非 GUI 的核心功能&#xff1a; 核心类&#xff1a;QObject&#xff08;信号槽机制&#xff09;、QEvent&…

深度学习——基于卷积神经网络实现食物图像分类【2】(数据增强)

文章目录 引言一、项目概述二、环境准备三、数据预处理3.1 数据增强与标准化3.2 数据集准备 四、自定义数据集类五、构建CNN模型六、训练与评估6.1 训练函数6.2 评估函数6.3 训练流程 七、关键技术与优化八、常见问题与解决九、完整代码十、总结 引言 本文将详细介绍如何使用P…

详细说说分布式Session的几种实现方式

1. 基于客户端存储&#xff08;Cookie-Based&#xff09; 原理&#xff1a;将会话数据直接存储在客户端 Cookie 中 实现&#xff1a; // Spring Boot 示例 Bean public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer new DefaultCookieSerializ…

用mac的ollama访问模型,为什么会出现模型胡乱输出,然后过一会儿再访问,就又变成正常的

例子&#xff1a;大模型推理遇到内存不足 1. 场景还原 你在Mac上用Ollama运行如下代码&#xff08;以Python为例&#xff0c;假设Ollama有API接口&#xff09;&#xff1a; import requestsprompt "请写一首关于夏天的诗。" response requests.post("http:…

简说 Linux 用户组

Linux 用户组 的核心概念、用途和管理方法&#xff0c;尽量简明易懂。 &#x1f31f; 什么是 Linux 用户组&#xff1f; 在 Linux 系统中&#xff1a; &#x1f449; 用户组&#xff08;group&#xff09; 是一组用户的集合&#xff0c;用来方便地管理权限。 &#x1f449; 用…

S32DS上进行S32K328的时钟配置,LPUART时钟配置步骤详解

1&#xff1a;S32K328的基础信息 S32K328官网介绍 由下图可知&#xff0c;S32K328的最大主频为 240MHz 2&#xff1a;S32K328时钟树配置 2.1 system clock node 节点说明 根据《S32K3xx Reference Manual》资料说明 Table 143 各个 系统时钟节点 的最大频率如下所示&#…

wordpress小语种网站模板

wordpress朝鲜语模板 紫色风格的韩语wordpress主题&#xff0c;适合做韩国、朝鲜的外贸公司官方网站使用。 https://www.jianzhanpress.com/?p8486 wordpress日文模板 绿色的日语wordpress外贸主题&#xff0c;用来搭建日文外贸网站很实用。 https://www.jianzhanpress.co…

网络:Wireshark解析https协议,firefox

文章目录 问题浏览器访问的解决方法python requests问题 现在大部分的网站已经切到https,很多站点即使开了80的端口,最终还是会返回301消息,让客户端转向到https的一个地址。 所以在使用wireshark进行问题分析的时候,解析tls上层的功能,是必不可少的,但是这个安全交换的…

ollama部署开源大模型

1. 技术概述 Spring AI&#xff1a;Spring 官方推出的 AI 框架&#xff0c;简化大模型集成&#xff08;如文本生成、问答系统&#xff09;&#xff0c;支持多种 LLM 提供商。Olama&#xff1a;开源的本地 LLM 推理引擎&#xff0c;支持量化模型部署&#xff0c;提供 REST API …

Kafka 可靠性保障:消息确认与事务机制(二)

Kafka 事务机制 1. 幂等性与事务的关系 在深入探讨 Kafka 的事务机制之前&#xff0c;先来了解一下幂等性的概念。幂等性&#xff0c;简单来说&#xff0c;就是对接口的多次调用所产生的结果和调用一次是一致的。在 Kafka 中&#xff0c;幂等性主要体现在生产者端&#xff0c…

使用 React.Children.map遍历或修改 children

使用场景&#xff1a; 需要对子组件进行统一处理&#xff08;如添加 key、包裹额外元素、过滤特定类型等&#xff09;。 动态修改 children 的 props 或结构。 示例代码&#xff1a;遍历并修改 children import React from react;// 一个组件&#xff0c;给每个子项添加边框…

智能体三阶:LLM→Function Call→MCP

哈喽&#xff0c;我是老刘 老刘是个客户端开发者&#xff0c;目前主要是用Flutter进行开发&#xff0c;从Flutter 1.0开始到现在已经6年多了。 那为啥最近我对MCP和AI这么感兴趣的呢&#xff1f; 一方面是因为作为一个在客户端领域实战多年的程序员&#xff0c;我觉得客户端开发…

flutter的常规特征

前言 Flutter 是由 Google 开发的开源 UI 软件开发工具包&#xff0c;用于构建跨平台的高性能、美观且一致的应用程序。 一、跨平台开发能力 1.多平台支持&#xff1a;Flutter 支持构建 iOS、Android、Web、Windows、macOS 和 Linux 应用&#xff0c;开发者可以使用一套代码库在…

【Git】代码托管服务

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 Git代码托管服务概述Git核心概念主流Git托管平台Git基础配置仓库创建方式Git文件状态管理常用…

Android 网络请求的选择逻辑(Connectivity Modules)

代码分析 ConnectivityManager packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java 许多APN已经弃用,应用层统一用 requestNetwork() 来请求网络。 [ConnectivityManager] example [ConnectivityManager] requestNetwork() [Connectivi…

C#建立与数据库连接(版本问题的解决方案)踩坑总结

1.如何优雅的建立数据库连接 今天使用这个deepseek写代码&#xff0c;主要就是建立数据库的链接&#xff0c;包括这个建库建表啥的都是他整得&#xff0c;我就是负责执行&#xff0c;然后解决这个里面遇到的一些问题&#xff1b; 其实我学习这个C#不过是短短的4天的时间&…

FastAPI的初步学习(Django用户过来的)

我一直以来是Django重度用户。它有清晰的MVC架构模式、多应用组织结构。它内置用户认证、数据库ORM、数据库迁移、管理后台、日志等功能&#xff0c;还有强大的社区支持。再搭配上Django REST framework (DRF) &#xff0c;开发起来效率极高。主打功能强大、易于使用。 曾经也…

提升IT运维效率 贝锐向日葵推出自动化企业脚本功能

在企业进行远程IT运维管理的过程中&#xff0c;难免会涉及很多需要批量操作下发指令的场景&#xff0c;包括但不限于下列场景&#xff1a; ● ⼤规模设备部署与初始化、设备配置更新 ● 业务软件安装与系统维护&#xff0c;进行安全加固或执行问题修复命令 ● 远程设备监控与…