使用 CounterFit 搭建虚拟单板计算机:在 PC 上零硬件完成 IoT 课程实战(IoT-For-Beginners)
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本篇指南围绕开源课程 IoT-For-Beginners 中 虚拟单板计算机(Virtual single-board computer) 这一课时展开,详细讲解如何借助开源项目 CounterFit,在无需购买任何物理 IoT 硬件的前提下,用普通 PC 模拟传感器与执行器,并运行与 Raspberry Pi 物理硬件上完全一致的 Python 代码。读完本文,你将掌握从环境安装、Python 虚拟环境配置、Hello World 验证,到打通 CounterFit 虚拟「硬件」连接的完整实操路径,为后续「夜灯(nightlight)」项目及整个课程其余 23 课扫清起步障碍。
为什么需要一台「虚拟」单板计算机
IoT 课程的传统做法是购买开发板(如 Arduino 或 Raspberry Pi)配合传感器与执行器动手实践。但 IoT-For-Beginners 项目为所有课程提供了三种硬件选型路径,其中一条就是「虚拟设备」:完全不需要采购任何硬件,用你自己的电脑模拟出单板计算机环境。
该方案的核心是开源项目CounterFit——它允许你在本地运行一个应用,模拟温度、湿度、光线、土壤湿度等传感器,以及 LED、继电器等执行器;随后,用本机 Python 代码以访问物理硬件完全相同的方式访问这些虚拟设备。正如课程 第一课 README 所强调的:
💁 你不必购买任何 IoT 硬件来完成作业,可以完全使用虚拟单板计算机来做。
而且虚拟设备路径与 Raspberry Pi 路径共享同一个 Grove 传感器生态,后续如果购买了实体树莓派与传感器,绝大部分代码可以直接迁移。
环境准备:三件免费软件
使用 CounterFit 前,需要在电脑上安装以下免费软件:
| 软件 | 作用 |
|---|---|
| Python | 编写虚拟设备代码的运行时环境 |
| Visual Studio Code (VS Code) | 编写 Python 代码的编辑器(教程以 VS Code 为例) |
| Pylance 扩展 | 为 VS Code 提供 Python 语言支持(智能提示、类型检查等) |
💁 如果你有其他偏好的 Python IDE 或编辑器完全可以自由使用,但课程内所有指令均基于 VS Code 编写。
需要注意:CounterFit 应用本身不在本步骤安装,它按项目单独安装,相关指令会在后续「Hello World」阶段给出。
第一课 Hello World:验证工具链
在进入具体硬件或模拟逻辑之前,先按编程学习传统创建Hello World应用,用来确认三件事:
- Python 与 VS Code 安装正确;
- 能够连接到 CounterFit 的虚拟传感器与执行器服务;
- 整个开发链路端到端可用。
这个应用会被创建在名为nightlight的文件夹中,并在后续课程中不断复用、逐步演化为一个完整的「夜灯」IoT 应用。
配置 Python 虚拟环境
Python 的 Pip 包是别人编写并发布到互联网上的代码包,一条命令即可安装并使用。但默认情况下 Pip 包会安装到系统全局,容易出现版本冲突——例如应用 A 依赖某个包的旧版本,应用 B 安装新版本后 A 就坏了。Python 虚拟环境(venv)本质上是放在专用文件夹里的一个 Python 副本,Pip 包只安装到该文件夹内,从而彻底隔离依赖。
💁 如果你日后使用 Raspberry Pi,则无需(也不建议)在那台设备上设置虚拟环境——Grove 相关包已由安装脚本全局安装。
任务:创建虚拟环境并安装 CounterFit 相关 Pip 包。
在任意位置创建并进入项目目录:
mkdir nightlight cd nightlight在
.venv文件夹中创建虚拟环境:python3 -m venv .venv💁 必须显式调用
python3而非python,以防系统同时装有 Python 2 时python指向旧版本。激活虚拟环境:
Windows(命令提示符 / Windows Terminal 的命令提示符):
.venv\Scripts\activate.batWindows(PowerShell):
.\.venv\Scripts\Activate.ps1若提示「在此系统上禁止运行脚本」,请以管理员身份启动 PowerShell 并执行:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted输入
Y确认,然后重新启动 PowerShell 重试;该执行策略之后可按需重置。macOS 或 Linux:
source ./.venv/bin/activate
💁 这些命令都应在创建虚拟环境的同一位置运行。永远不需要进入
.venv文件夹,激活、装包、跑代码都从创建环境时的那个目录进行。验证虚拟环境中的 Python 版本:
python --version输出形如:
(.venv) ➜ nightlight python --version Python 3.9.1💁 版本号可以不同,只要是 3.6 或更高即可;否则删除该文件夹、安装更新版 Python 后重试。
安装 CounterFit 的三个 Pip 包:
pip install CounterFit pip install counterfit-connection pip install counterfit-shims-grove这三个包的分工如下:
Pip 包 作用 CounterFit主应用,提供本地模拟服务与浏览器 UI counterfit-connection提供 CounterFitConnection类,负责代码与 CounterFit 应用建立连接counterfit-shims-grove提供 Grove 硬件的 shim(垫片层),让你写出与使用 Grove 物理传感器/执行器完全一致的代码 这些包只安装进当前虚拟环境,在该环境外不可用。
编写 Hello World 代码
任务:创建输出"Hello World"的 Python 应用。
在虚拟环境内创建
app.py文件:Windows:
type nul > app.pymacOS / Linux:
touch app.py
用 VS Code 打开当前文件夹:
code .💁 若 macOS 提示
command not found,说明 VS Code 未加入 PATH,按 VS Code 文档「从命令行启动」章节配置后再试;Windows 与 Linux 默认已加入 PATH。VS Code 启动后会自动激活 Python 虚拟环境,所选环境会显示在底部状态栏,状态栏与终端提示符中都会出现
.venv前缀:如果 VS Code 启动时终端已存在,则该终端不会自动激活虚拟环境,最稳妥的做法是用Kill the active terminal instance(终止活动终端实例)按钮关掉它:
通过Terminal -> New Terminal或快捷键
CTRL+`新建终端,新终端会自动加载虚拟环境,终端中会出现激活调用,且提示符带.venv前缀:➜ nightlight source .venv/bin/activate (.venv) ➜ nightlight在 VS Code 中打开
app.py并写入:print('Hello World!')print函数会把传入的内容输出到控制台。在 VS Code 终端运行:
python app.py输出:
(.venv) ➜ nightlight python app.py Hello World!
至此,第一个 Hello World 验证成功,工具链就绪。
连接「硬件」:打通 CounterFit 虚拟设备
这是 Hello World 的第二个阶段:启动 CounterFit 应用并把代码连接上去——相当于把物理 IoT 硬件插到开发套件上的虚拟等价操作。
任务:启动 CounterFit 并建立连接。
在 VS Code 终端启动 CounterFit:
counterfit应用启动后会在浏览器中打开界面,此时显示为Disconnected(未连接),右上角 LED 处于熄灭状态:
在
app.py开头加入连接代码:from counterfit_connection import CounterFitConnection CounterFitConnection.init('127.0.0.1', 5000)第一行从
counterfit_connection模块(来自之前安装的counterfit-connection包)导入CounterFitConnection类;第二行初始化到 CounterFit 应用的连接——127.0.0.1是永远指向本机的回环地址(即localhost),5000为默认端口。💁 若端口 5000 被其他程序占用,可同时修改两处:代码中的端口号,以及启动命令
CounterFit --port <port_number>(将<port_number>替换为目标端口)。由于当前终端正被 CounterFit 占用,需要点击Create a new integrated terminal(新建集成终端)按钮开启新终端:
在新终端中再次运行
python app.py,CounterFit 界面状态会变为Connected,右上角 LED 亮起:
连接成功后,你就拥有了一个「虚拟」IoT 硬件环境。
从 Hello World 到真实传感器:源码级印证
Hello World 阶段只是建立了连接、尚未访问任何模拟硬件。在本课之后的 第 3 课:传感器与执行器 中,会在nightlight应用里真正读取虚拟传感器,其示例代码与本次配置一脉相承。课程提供的完整参考实现在 code/virtual-device/nightlight/app.py:
from counterfit_connection import CounterFitConnection CounterFitConnection.init('127.0.0.1', 5000) print('Hello World!')该文件正是本文所讲步骤的最终落盘结果。而后续课程中虚拟设备读取光线传感器的典型写法(见 第 3 课 code-sensor 参考实现)则展示了如何把 shim 层用起来:
import time from counterfit_connection import CounterFitConnection from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor CounterFitConnection.init('127.0.0.1', 5000) light_sensor = GroveLightSensor(0) while True: light = light_sensor.light print('Light level:', light) time.sleep(1)可以看到,代码模式与在树莓派上操作 Grove 物理光线传感器完全一致——这正是counterfit-shims-grove的核心价值:同一份业务代码,既可在虚拟环境调试运行,也能无缝移植到真实 Grove 硬件。
从源码结构上看,CounterFitConnection.init(host, port)是建立连接的统一入口;counterfit命令行则以--port参数控制模拟服务的监听端口,二者端口必须一致才能握手成功,这是排查「一直 Disconnected」时最值得优先检查的点。
常见问题与排查要点
结合文档中的提示与源码调用关系,整理如下排查清单:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
python版本异常 | 系统同时装有 Python 2 | 创建环境时用python3 -m venv .venv |
| PowerShell 拒绝运行激活脚本 | 系统执行策略受限 | 管理员身份执行Set-ExecutionPolicy -ExecutionPolicy Unrestricted |
python --version低于 3.6 | Python 版本过旧 | 删除.venv,安装新版 Python 后重建 |
command not found(macOS) | VS Code 不在 PATH | 按 VS Code 文档将code加入 PATH |
终端提示符无.venv前缀 | 虚拟环境未激活 | 使用 Kill terminal + New Terminal 重新加载 |
| CounterFit 一直 Disconnected | 端口不一致或未监听 | 统一代码端口与CounterFit --port端口 |
| 虚拟环境外找不到包 | 包仅装进 venv | 始终在激活状态下的.venv环境安装与运行 |
结语
通过本文,你已完成虚拟单板计算机的三步走:环境安装 → Hello World 验证 → CounterFit 连接打通。这套流程是 IoT-For-Beginners 课程中「零硬件起步」路径的地基——后续每一课(从夜灯传感器到云连接、再到机器学习边缘推理)都会在这个nightlight项目与 CounterFit 虚拟硬件之上持续演进。现在,打开你的终端,把counterfit跑起来,开始属于你的 IoT 之旅吧。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考