news 2026/6/1 12:32:43

基于树莓派与Nmap的局域网设备自动化监控系统搭建指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于树莓派与Nmap的局域网设备自动化监控系统搭建指南

1. 项目概述与核心价值

在家庭网络、小型工作室或者物联网实验环境中,你是否遇到过这样的困惑:路由器后台的设备列表要么过于简陋,要么刷新不及时,你根本搞不清楚此刻到底有哪些设备正连接在你的Wi-Fi或有线网络上。一台本该24小时在线的智能家居中枢突然失联,直到你需要它时才后知后觉;或者,你隐约感觉网速变慢,怀疑有未知设备蹭网,却苦于没有便捷的工具来验证。这种对网络“黑盒”状态的无力感,正是我们动手搭建一个轻量级局域网设备监控系统的初衷。

这个项目的核心,就是利用手边常见的树莓派(Raspberry Pi),配合强大的网络发现工具Nmap,通过编写一个自动化Bash脚本,实现对指定网段内所有设备的周期性“点名”。它不仅能实时列出在线设备的IP地址和主机名,还能记录它们最后一次被看到的时间,形成一个动态更新的设备连接历史。最终,这些信息会被整理成一个简洁的网页,你只需打开浏览器,就能对网络状况一目了然。对于运维爱好者、物联网开发者或是任何希望提升家庭网络透明度的用户来说,这是一个兼具学习价值和实用性的小工程。它不依赖于特定品牌的路由器高级功能,完全由你掌控,数据也保存在本地,在实现基础监控功能的同时,也迈出了理解网络运维自动化的第一步。

2. 方案设计与工具选型解析

2.1 为什么选择Raspberry Pi + Nmap + Bash的组合?

在构思这个监控方案时,我们需要一个稳定、低功耗且能长时间运行的核心硬件。树莓派几乎是为此场景量身定做的:它是一台完整的、基于Linux的微型电脑,功耗极低(通常仅数瓦),可以7x24小时默默运行而不必担心电费;其GPIO引脚和丰富的社区资源也为未来可能的物理状态指示(如用LED灯表示网络异常)留下了扩展空间。相比于用一台台式机或笔记本常年开机,树莓派在成本、能耗和空间占用上都具有明显优势。

至于扫描工具,Nmap(Network Mapper)是网络安全和网络发现领域事实上的标准工具,其可靠性和功能丰富性久经考验。它支持多种扫描技术,能有效地探测出网络内存活的主机。对于我们的需求——快速发现设备,使用Nmap的-sn参数(Ping扫描)是最佳选择。该参数会发送ICMP Echo请求、TCP SYN包到443端口、TCP ACK包到80端口以及ICMP时间戳请求,综合判断主机是否在线。这种方式比单纯的Ping命令更可靠,因为有些设备可能禁用了ICMP回应,但通常会开放某些TCP端口。

而将这一切串联起来的“胶水”,我们选择了Bash脚本。在Linux环境下,Bash脚本是实现自动化任务最直接、最灵活的方式。它能够方便地调用系统命令(如Nmap)、处理文本(解析Nmap输出)、操作文件(更新记录)和控制流程(循环、判断)。整个方案的逻辑清晰:由Cron定时任务触发Bash脚本,脚本调用Nmap进行扫描,然后处理结果并更新网页。这种组合确保了方案的轻量、高效和高度可定制性。

2.2 核心工作流程拆解

整个系统的工作流程可以清晰地分为四个阶段,形成一个自动化闭环:

  1. 定时触发:利用Linux系统的Cron计划任务,每隔设定的时间(例如每15分钟)自动执行一次我们的监控脚本。这是实现“无人值守”自动化的基石。
  2. 网络扫描:脚本被触发后,首先调用Nmap工具,对指定的本地IP地址段(如192.168.1.0/24)进行存活主机扫描。Nmap会返回一个在线设备的IP地址列表。
  3. 数据处理与记录:脚本解析Nmap的扫描结果。对于每一个发现的在线设备IP,它尝试解析其主机名(通过nslookup或类似方法),并获取当前的时间戳。随后,它将“IP地址 - 主机名 - 最后在线时间”这条记录,追加或更新到一个本地的文本数据文件中。这个文件构成了设备连接的历史数据库。
  4. 可视化呈现:脚本读取上一步生成的本地数据文件,将其中的记录动态生成或更新为一个HTML网页。这个网页通过Apache等Web服务器发布,你可以在局域网内的任何设备上,通过浏览器访问树莓派的IP地址来查看实时监控结果。

这个流程的优势在于其松耦合性。扫描、记录、展示三个模块相对独立。例如,你可以很容易地修改脚本,将记录存储到SQLite数据库而不是文本文件,或者更换Web前端框架来美化展示页面,而无需改动核心的扫描逻辑。

3. 环境准备与依赖安装

3.1 树莓派系统初始化

首先,你需要一个已经安装好操作系统的树莓派。推荐使用Raspberry Pi OS Lite(无桌面版)以节省资源,但如果你习惯图形界面,使用桌面版也完全没问题。确保树莓派已经通过有线或无线方式接入到你想要监控的局域网中,并且获取到了一个固定的IP地址(建议在路由器中为其设置静态IP绑定),这能保证Web管理页面访问稳定。

系统启动后,第一件事是进行基础更新,打开终端并执行:

sudo apt update sudo apt upgrade -y

这个过程可能会花费一些时间,但它能确保所有软件包更新到最新状态,避免因旧版本软件导致的兼容性问题。

注意:对于生产环境或希望长期稳定运行的系统,在执行upgrade前,建议先查看更新日志,或先在测试环境进行。不过对于我们这个监控项目,直接升级通常是安全的。

3.2 核心工具Nmap与Web服务器安装

我们的项目依赖两个核心组件:扫描工具Nmap和Web服务器Apache。

安装Nmap:

sudo apt install nmap -y

安装完成后,可以通过nmap --version命令验证是否安装成功。Nmap的功能非常强大,但我们本项目主要只用其最基本的存活主机发现功能。

安装Apache Web服务器:

sudo apt install apache2 -y

Apache安装完成后会自动启动。你可以立即在局域网内另一台电脑的浏览器中输入树莓派的IP地址(例如http://192.168.1.100),如果看到“Apache2 Debian Default Page”之类的页面,说明Web服务器已正常运行。

Apache的默认网页根目录是/var/www/html,我们后续生成的监控页面live_ipaddress.html就将放在这个目录下。需要确保运行脚本的用户(通常是pi)有向该目录写入文件的权限。一个简单直接(但并非最安全)的授权方式是:

sudo chown -R pi:www-data /var/www/html/ sudo chmod -R 775 /var/www/html/

这条命令将目录的所有者改为pi用户,所属组改为www-data(Apache运行时的用户组),并赋予读写执行权限。在实际操作中,更精细的权限控制是必要的,但为了简化初期的搭建过程,我们可以先这样设置。

4. 监控脚本详解与定制

4.1 脚本源码解析与编写

与其从第三方仓库克隆一个现成脚本,我更推荐你自己理解并编写核心部分,这样不仅能完全掌控,出了问题也更容易排查。下面我们来逐段拆解一个实现该功能的Bash脚本check_alive_nmap.sh

#!/bin/bash # 设备监控脚本 - 使用Nmap扫描网络并更新状态网页 # 用法:./check_alive_nmap.sh <网络地址/子网掩码> # 示例:./check_alive_nmap.sh 192.168.1.0/24 # 1. 参数检查与变量定义 if [ $# -ne 1 ]; then echo "错误:请提供网络地址和子网掩码作为参数。" echo "示例: $0 192.168.1.0/24" exit 1 fi SUBNET=$1 TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') DATA_FILE="/home/pi/network_devices.log" HTML_FILE="/var/www/html/live_ipaddress.html" # 2. 使用Nmap进行存活扫描 echo "[$TIMESTAMP] 开始扫描网络 $SUBNET ..." # -sn: Ping扫描(不进行端口扫描),-oG: 输出为Grepable格式便于解析 nmap -sn -oG - $SUBNET > /tmp/nmap_scan.txt # 3. 处理扫描结果,更新数据文件 echo "[$TIMESTAMP] 处理扫描结果..." # 从Nmap输出中提取所有在线的IP地址 grep "Status: Up" /tmp/nmap_scan.txt | awk '{print $2}' | while read IP do # 尝试获取主机名,如果失败则显示为‘unknown-host’ HOSTNAME=$(nslookup $IP 2>/dev/null | grep -oP "name = \K.*" || echo "unknown-host") # 在数据文件中查找该IP是否已有记录 if grep -q "^$IP " $DATA_FILE; then # 如果存在,则更新该行的时间戳和主机名(主机名可能变化) sed -i "/^$IP /c\\$IP $HOSTNAME $TIMESTAMP" $DATA_FILE else # 如果不存在,则追加新记录 echo "$IP $HOSTNAME $TIMESTAMP" >> $DATA_FILE fi done # 4. 生成HTML网页 echo "[$TIMESTAMP] 生成状态网页..." cat > $HTML_FILE << EOF <!DOCTYPE html> <html> <head> <title>局域网设备在线状态监控</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f4f4; } h1 { color: #333; } table { border-collapse: collapse; width: 100%; background-color: white; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } th, td { border: 1px solid #ddd; padding: 12px; text-align: left; } th { background-color: #4CAF50; color: white; } tr:nth-child(even) { background-color: #f2f2f2; } .timestamp { font-size: 0.9em; color: #666; } a { color: #0066cc; text-decoration: none; } a:hover { text-decoration: underline; } </style> </head> <body> <h1>🖧 局域网设备连接状态</h1> <p>最后更新于: <span class="timestamp">$TIMESTAMP</span></p> <table> <tr> <th>IP 地址</th> <th>主机名</th> <th>最后在线时间</th> </tr> EOF # 读取数据文件,按时间倒序排列,生成表格行 sort -k3 -r $DATA_FILE | while read LINE do IP=$(echo $LINE | awk '{print $1}') HOSTNAME=$(echo $LINE | awk '{print $2}') LAST_SEEN=$(echo $LINE | awk '{print $3, $4}') # 将IP地址转换为可点击的链接(假设设备有Web界面) echo " <tr>" >> $HTML_FILE echo " <td><a href=\"http://$IP\" target=\"_blank\">$IP</a></td>" >> $HTML_FILE echo " <td>$HOSTNAME</td>" >> $HTML_FILE echo " <td>$LAST_SEEN</td>" >> $HTML_FILE echo " </tr>" >> $HTML_FILE done cat >> $HTML_FILE << EOF </table> <p><em>注:IP地址可点击,尝试访问设备的Web管理界面(如果存在)。</em></p> </body> </html> EOF echo "[$TIMESTAMP] 扫描完成。网页已更新: file://$HTML_FILE"

脚本关键点解析:

  1. 参数化设计:脚本通过$1接收命令行传入的子网参数(如192.168.1.0/24),这使得脚本可以灵活适应不同家庭的网络环境,无需修改代码。
  2. Nmap输出解析:使用-oG -参数让Nmap输出“可grep”的格式,便于用grepawk快速提取在线设备的IP地址。这是处理Nmap结果的一种高效方法。
  3. 数据去重与更新:脚本维护一个文本文件network_devices.log作为简易数据库。每次扫描时,对于已存在的IP更新其时间戳和主机名;对于新发现的IP则追加记录。这保证了历史记录的连续性。
  4. 动态HTML生成:利用Bash的“Here Document”(cat > file << EOF ... EOF)语法,动态生成一个完整的HTML页面。页面样式内嵌在<style>标签中,使表格更美观易读。同时,它将IP地址生成了超链接,方便你快速跳转到设备的管理界面(如路由器、智能摄像头后台),这是一个非常实用的功能增强。

4.2 脚本部署与权限设置

将上述脚本内容保存到树莓派上,例如/home/pi/check_alive_nmap.sh。然后需要赋予它可执行权限:

chmod +x /home/pi/check_alive_nmap.sh

首次运行测试,指定你的局域网网段:

./check_alive_nmap.sh 192.168.1.0/24

运行后,检查两个文件是否生成:

  • /home/pi/network_devices.log:应包含扫描到的设备记录。
  • /var/www/html/live_ipaddress.html:应是一个格式良好的网页。

在浏览器中访问http://[你的树莓派IP]/live_ipaddress.html,你应该能看到一个列出了当前在线设备的表格。

5. 实现自动化与后台运行

5.1 使用Cron配置定时任务

手动执行脚本不是我们的目的,我们需要它定时自动运行。Linux的Cron守护进程就是为此而生。编辑当前用户(pi)的Cron表:

crontab -e

如果是第一次编辑,可能会让你选择编辑器,选择nano即可。在文件末尾添加一行,例如让脚本每15分钟运行一次:

*/15 * * * * /home/pi/check_alive_nmap.sh 192.168.1.0/24 >> /home/pi/nmap_monitor.log 2>&1

这行Cron表达式的含义是:在每小时的0, 15, 30, 45分钟执行一次命令。命令末尾的>> /home/pi/nmap_monitor.log 2>&1将脚本的标准输出和错误输出都重定向追加到一个日志文件中,便于日后排查问题。

Cron配置心得

  • */15表示每15分钟。你可以根据需要调整,例如0 * * * *表示每小时整点运行,0 */6 * * *表示每6小时运行一次。对于家庭网络,15分钟或30分钟的间隔是一个不错的平衡点,既能及时反映设备状态变化,又不会对网络和树莓派造成明显负担。
  • 确保脚本的路径是绝对路径(/home/pi/...),因为Cron执行时的环境变量与交互式Shell不同。
  • 保存并退出编辑器(在nano中是Ctrl+X,然后按Y确认,再按回车)。Cron配置会立即生效。

5.2 系统服务化进阶方案(可选)

虽然Cron简单有效,但它对于需要更精细控制(如依赖服务启动顺序、失败重启)的脚本来说略显不足。一个更专业的做法是将脚本封装成一个Systemd服务。

创建服务文件:

sudo nano /etc/systemd/system/nmap-monitor.service

写入以下内容:

[Unit] Description=Nmap Network Monitor Service After=network-online.target Wants=network-online.target [Service] Type=oneshot User=pi ExecStart=/home/pi/check_alive_nmap.sh 192.168.1.0/24 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

然后,创建一个定时器文件来替代Cron:

sudo nano /etc/systemd/system/nmap-monitor.timer

写入以下内容:

[Unit] Description=Run Nmap monitor every 15 minutes [Timer] OnCalendar=*:0/15 Persistent=true [Install] WantedBy=timers.target

启用并启动定时器:

sudo systemctl daemon-reload sudo systemctl enable nmap-monitor.timer sudo systemctl start nmap-monitor.timer

使用systemctl list-timers可以查看所有活动的定时器。这种方式的好处是,你可以使用journalctl -u nmap-monitor.service来查看详细的、结构化的日志,并且管理起来更符合现代Linux系统的规范。

6. 功能增强与个性化定制

基础功能实现后,你可以根据个人需求对这个监控系统进行多种增强,让它变得更加强大和贴心。

6.1 添加设备别名与类型标识

原始的network_devices.log文件只记录了IP和主机名,但主机名可能是一串难以理解的字符(如DESKTOP-7A3B2C1)。我们可以在脚本中添加一个“设备别名”映射文件,让显示更友好。

创建一个映射文件/home/pi/device_aliases.cfg,内容格式如下:

# 格式: MAC地址或IP 别名 类型 # MAC地址更稳定,因为IP可能变化 dc:a6:32:xx:xx:xx 主卧树莓派 Server b8:27:eb:yy:yy:yy 客厅电视 TV 192.168.1.105 我的手机 Mobile

然后,在脚本的数据处理部分,在获取HOSTNAME之后,可以添加逻辑来读取这个配置文件。首先需要用arp -anmap -sn配合-sP(已弃用,但旧版可用)或更复杂的方法获取IP对应的MAC地址,然后去配置文件中查找匹配的别名和类型。将找到的别名替换或附加到显示的主机名上,并将类型信息也输出到HTML表格中。

6.2 实现异常状态告警

单纯的记录还不够,我们希望能主动获知异常。一个简单的告警思路是:检查关键设备是否离线。

可以在脚本末尾,扫描并更新数据后,添加一个检查环节。例如,你有一台IP为192.168.1.10的NAS是关键设备:

# 在脚本末尾添加 CRITICAL_DEVICE="192.168.1.10" if ! grep -q "^$CRITICAL_DEVICE " $DATA_FILE; then # 如果关键设备不在最新扫描的数据文件中(注意:DATA_FILE包含历史,需判断时间) # 更严谨的做法是检查最后在线时间是否超过阈值(比如1小时) echo "[$TIMESTAMP] 警告:关键设备 $CRITICAL_DEVICE 可能离线!" >> /home/pi/alert.log # 这里可以扩展为发送邮件、推送通知到手机等 # 例如使用curl调用邮件API或Pushover、Server酱等推送服务 # curl -s -X POST https://api.pushover.net/1/messages.json \ # -d "token=YOUR_TOKEN&user=YOUR_USER&message=NAS设备离线!" fi

要实现有效的告警,需要结合时间判断,因为DATA_FILE包含所有历史设备。你需要判断该设备最后一次在线时间是否远早于当前时间(例如超过1小时)。这需要更精细的日期时间比较逻辑,可以使用date命令将时间戳转换为Unix时间戳(自1970年以来的秒数)再进行计算。

6.3 美化网页与增加图表

当前的HTML页面是功能性的,但可以做得更美观、信息更丰富。你可以:

  • 引入轻量级CSS框架如PureCSSBulma,让表格和页面更现代化。
  • 使用JavaScript(如Chart.js)读取历史日志文件,绘制设备在线时间的趋势图。
  • 在表格中增加“在线时长”列,通过计算当前时间与“最后在线时间”的差值来显示。
  • 根据设备最后在线时间,用不同颜色高亮显示行(例如,1小时内在线用绿色,1-24小时用黄色,超过24小时用灰色),视觉上更直观。

这些增强需要你具备一定的前端开发知识,但即使是一些简单的CSS样式改动,也能极大提升使用体验。关键在于,整个系统的数据源(network_devices.log)是稳定的,前端展示层可以自由发挥。

7. 常见问题排查与优化技巧

在实际部署和运行过程中,你可能会遇到一些问题。下面是一些常见情况的排查思路和优化建议。

7.1 扫描不到设备或结果不全

可能原因及解决方案:

  1. 子网范围错误:这是最常见的问题。确保你输入的SUBNET参数正确。在树莓派上运行ip aifconfig命令,查看其自身的IP地址和子网掩码。例如,如果树莓派IP是192.168.1.105,掩码是255.255.255.0,那么子网通常是192.168.1.0/24
  2. 权限不足:Nmap的某些扫描类型(如SYN扫描-sS)需要root权限。我们的脚本使用的是-sn(Ping扫描),通常普通用户即可运行。但如果遇到问题,可以尝试在脚本的Nmap命令前加上sudo,并配置pi用户无需密码运行sudo nmap(通过visudo编辑)。
  3. 防火墙拦截:局域网内某些设备或路由器可能设置了防火墙,禁止了ICMP回显请求(Ping)。Nmap的-sn扫描会尝试多种探测包,但并非万能。可以尝试使用更激进的扫描方式,例如sudo nmap -PS22,80,443 -sn $SUBNET,它通过向目标的22、80、443端口发送TCP SYN包来探测,即使对方禁了Ping也可能有效。
  4. 扫描速度过快:默认情况下,Nmap会并发发送大量探测包。在有些路由器或网络设备上,这可能会被误认为是攻击而临时限制。可以添加--max-rate 20参数限制每秒最多发送20个包,降低扫描速度:nmap -sn --max-rate 20 -oG - $SUBNET

7.2 网页无法访问或显示异常

  1. Apache未运行或端口被占用:使用sudo systemctl status apache2检查Apache服务状态。确保它处于active (running)状态。如果端口80被其他程序占用,需要排查。
  2. 文件权限问题:确保/var/www/html/live_ipaddress.html文件对Apache进程(用户www-data)是可读的。如果脚本是用pi用户运行的,生成文件后,可以运行sudo chown www-data:www-data /var/www/html/live_ipaddress.html来更改所有者。
  3. HTML文件格式错误:如果脚本在生成HTML时被意外中断,可能会导致HTML标签不完整,页面无法正常渲染。检查脚本中生成HTML的“Here Document”部分是否正确闭合,特别是循环生成表格行的部分。可以在浏览器中按F12打开开发者工具,查看“控制台”是否有语法错误提示。

7.3 数据文件无限增长与清理策略

脚本会不断向network_devices.log文件追加记录。随着时间的推移,这个文件会变得非常大,包含大量过时的历史记录(例如一年前连接过一次的访客手机)。

解决方案:定期清理旧数据。可以在Cron中再添加一个定时任务,每天凌晨清理一次超过一定天数的记录。例如,创建一个清理脚本cleanup_old_devices.sh

#!/bin/bash DATA_FILE="/home/pi/network_devices.log" # 保留最近30天的记录 DAYS_TO_KEEP=30 TIMESTAMP_THRESHOLD=$(date -d "$DAYS_TO_KEEP days ago" '+%Y-%m-%d') # 使用awk处理:只保留时间戳晚于阈值(即最近30天内)的记录 awk -v threshold="$TIMESTAMP_THRESHOLD" '$3 >= threshold' $DATA_FILE > /tmp/network_devices_temp.log mv /tmp/network_devices_temp.log $DATA_FILE echo "$(date): 已清理30天前的设备记录。" >> /home/pi/cleanup.log

赋予执行权限并添加到Cron:0 2 * * * /home/pi/cleanup_old_devices.sh(每天凌晨2点执行)。

7.4 性能考量与对网络的影响

这是一个需要长期关注的点。频繁的网络扫描会消耗树莓派的CPU资源和网络带宽。

  • 树莓派性能:对于-sn扫描一个/24网段(254个地址),单次扫描对树莓派Zero到Pi 4来说都毫无压力。CPU占用是短暂且轻微的。
  • 网络影响:扫描会产生微小的网络流量。每15分钟扫描一次254个地址,产生的流量几乎可以忽略不计,不会对正常的网络使用(如看视频、玩游戏)造成任何可感知的影响。关键在于扫描速率。使用--max-rate参数限制发包速率,如前面提到的--max-rate 20,能进一步确保扫描行为“友好”,不会冲击网络设备。
  • 优化建议:如果你的网络设备非常多(例如大型智能家居环境),可以考虑将扫描间隔延长到30分钟或1小时。或者,如果你只关心少数特定设备,可以修改脚本,不再扫描整个子网,而是轮流Ping一个特定的IP地址列表,这样对网络的影响就更小了。

这个由树莓派、Nmap和Bash脚本构建的局域网监控系统,其魅力在于它的简洁、透明和高度可控。它没有商业软件那些花哨的界面和复杂的功能,但却精准地解决了“我的网络里现在有什么”这个核心问题。从第一次在网页上看到自己所有设备列表的成就感,到后来根据需求一步步添加别名、告警功能,整个过程就是一个典型的“发现问题-解决问题-优化方案”的极客实践。它可能不会成为你每天都必须打开看的工具,但当你需要排查网络问题、清点IoT设备或者只是单纯好奇时,这个默默运行在角落的小系统总能给你一个清晰、准确的答案。这种对自身网络环境的掌控感,正是DIY精神的乐趣所在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 12:31:21

编辑距离(Edit Distance)——从字符串相似度到动态规划经典模型

引言在自然语言处理&#xff08;NLP&#xff09;、搜索引擎纠错、DNA序列比对、拼写检查系统等领域&#xff0c;经常需要衡量两个字符串之间的相似程度。例如&#xff1a;kitten sitting显然两个单词非常接近&#xff0c;但究竟有多接近&#xff1f;如何用数学方法描述这种“接…

作者头像 李华
网站建设 2026/6/1 12:30:35

拆分APK安装难题?SAI为你提供终极解决方案

拆分APK安装难题&#xff1f;SAI为你提供终极解决方案 【免费下载链接】SAI Android split APKs installer 项目地址: https://gitcode.com/gh_mirrors/sa/SAI 还在为无法安装拆分APK文件而烦恼吗&#xff1f;当你在Android设备上遇到那些神秘的.xapk、.apks或.apkm文件…

作者头像 李华
网站建设 2026/6/1 12:29:47

基于Arduino与红外遥控的四通道家庭自动化系统DIY指南

1. 项目概述与核心思路作为一个玩了十多年电子DIY的老玩家&#xff0c;我始终觉得&#xff0c;家庭自动化最迷人的地方不在于它有多“智能”&#xff0c;而在于它能把一个抽象的控制想法&#xff0c;通过自己的双手&#xff0c;变成看得见、摸得着的物理现实。今天要聊的这个“…

作者头像 李华
网站建设 2026/6/1 12:29:09

工业相机参数看着都简单,真到现场最容易翻车的是这 5 个

很多人第一次拿到工业相机&#xff0c;先看的都是分辨率。 像素高一点&#xff0c;听起来就更专业&#xff1b;参数表长一点&#xff0c;感觉就更能打。可真到项目现场&#xff0c;先出问题的往往不是算法&#xff0c;而是你一开始就把参数看偏了。 工业相机最容易被误解的地方…

作者头像 李华
网站建设 2026/6/1 12:29:09

【C++】 —— 笔试刷题day_17

一、小乐乐改数字 题目解析 这道题&#xff0c;它们给定一个数&#xff0c;我们要对它进行修改&#xff1b;如果某一位是奇数&#xff0c;就把它变成1,&#xff1b;如果是偶数&#xff0c;就把它变成0&#xff1b; 让我们输出最后得到的数。 算法思路 这道题&#xff0c;总体…

作者头像 李华
网站建设 2026/6/1 12:25:49

18.Web API 实战:元素与表单属性的获取和修改

目录 一、获取/修改元素属性 1. 图片元素属性操作示例 2. 输入框与图片的交互示例 二、获取/修改表单元素属性 1. 代码示例&#xff1a;切换按钮的文本 2. 代码示例&#xff1a;点击计数 3. 代码示例&#xff1a;全选/取消全选按钮 一、获取/修改元素属性 可以通过 Elem…

作者头像 李华