ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在虚拟 IoT 设备上通过 CounterFit 读取 GPS 传感器数据:IoT-For-Beginners 位置追踪课程实战

在虚拟 IoT 设备上通过 CounterFit 读取 GPS 传感器数据:IoT-For-Beginners 位置追踪课程实战 在虚拟 IoT 设备上通过 CounterFit 读取 GPS 传感器数据IoT-For-Beginners 位置追踪课程实战【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本篇文章基于 Microsoft Learn 教育项目 IoT-For-Beginners 中「Transport交通」项目第 1 课《位置追踪》的虚拟硬件实践章节完整讲解如何在无需真实硬件的前提下使用 CounterFit 虚拟 IoT 平台模拟 GPS 传感器并通过 Python 程序从虚拟串口读取原始 GPS 数据。读完本文你将掌握 CounterFit 中 UART GPS 传感器的创建流程、三种数据源经纬度、NMEA 语句、GPX 文件的配置方法以及如何解读原始的 NMEA 输出并进一步用pynmea2解码出可用的经纬度坐标。背景运输场景中的位置追踪与虚拟硬件方案在供应链与物流场景中车队管理需要实时掌握每一辆卡车的位置。给车辆安装 GPS 传感器并将其接入 IoT 系统可以让管理者随时定位车辆、查看已行驶路线、预测到达时间。IoT-For-Beginners 的《位置追踪》一课正是围绕这一主题展开其中既包含地理坐标、GPS 原理、NMEA 协议等理论知识也包含三套动手实践路线ArduinoWio Terminal、树莓派Raspberry Pi以及虚拟设备Virtual IoT Hardware。虚拟设备方案不要求购买任何硬件——CounterFit对应英文原文文档见 virtual-device-gps-sensor.md。虚拟 GPS 传感器的工作原理真实 GPS 传感器通过天线捕获来自 GPS 卫星的无线电波将卫星信号转换成 GPS 定位数据。虚拟版本则用软件模拟这一过程它通过UART 串口serial port暴露给 Python 程序你可以通过三种方式向它喂定位数据数据源说明Lat/Lon直接设置一个明确的纬度、经度以及用于定位的卫星数量NMEA粘贴多条原始的 NMEA 语句逐条发送GPX 文件上传一个包含多个轨迹点的 GPX 文件按顺序逐点返回其中 NMEA 语句是 GPS 行业的标准数据格式会在本课后续部分详细介绍你可以在 课程 README 中找到 NMEA 协议的完整说明。前置准备搭建 CounterFit 虚拟环境并安装串口 Shim如果你的电脑上还没有配置过 CounterFit 虚拟硬件环境请先按照第 1 课《IoT 入门》中的 虚拟单板计算机指南 完成 Python、VS Code 的安装然后按以下步骤创建一个新项目新建名为gps-sensor的文件夹其中只包含一个app.py文件并创建 Python 虚拟环境安装 CounterFit 相关的 pip 包mkdir gps-sensor cd gps-sensor python3 -m venv .venv source ./.venv/bin/activate # macOS/LinuxWindows 使用 .venv\Scripts\activate.bat pip install CounterFit pip install counterfit-connection pip install counterfit-shims-grove额外安装一个UART 串口 shim包它让 CounterFit 能够通过串口与基于 UART 的传感器通信。请务必在激活虚拟环境的终端中执行pip install counterfit-shims-serial⚠️ 如果遇到问题可随时回看第 1 课的 CounterFit Python 项目搭建指南那里详细介绍了虚拟环境激活、VS Code 终端操作等细节。在 VS Code 终端中启动 CounterFit Web 应用它会自动在浏览器中打开counterfit在 CounterFit 中创建 UART GPS 传感器确认 CounterFit Web 应用正在运行后按照以下步骤把 GPS 传感器加入虚拟设备在Sensors传感器面板的Create sensor创建传感器区域展开Sensor type传感器类型下拉框选择UART GPS。保持Port端口为默认值/dev/ttyAMA0——这是树莓派等单板计算机上常见的 UART 串口设备路径虚拟 GPS 传感器就挂在这个地址上。点击Add添加按钮在端口/dev/ttyAMA0上创建 GPS 传感器。创建成功后GPS 传感器会出现在传感器列表中。至此虚拟硬件已经接好接下来开始编写读取数据的程序。编写读取 GPS 数据的 Python 程序打开app.py分三步写入代码。第一步连接 CounterFit 应用。将以下代码放在app.py顶部from counterfit_connection import CounterFitConnection CounterFitConnection.init(127.0.0.1, 5000)这行代码导入counterfit_connection包中的CounterFitConnection类并初始化与本地127.0.0.1即本机 localhost5000 端口的 CounterFit 应用的连接。第二步导入串口库并建立串口连接。在上一段代码下方追加import time import counterfit_shims_serial serial counterfit_shims_serial.Serial(/dev/ttyAMA0)这里从counterfit-shims-serialpip 包中导入serial模块然后连接到/dev/ttyAMA0串口——这正是虚拟 GPS 传感器 UART 端口对应的串口地址。第三步循环读取串口数据并打印。继续追加以下代码def print_gps_data(line): print(line.rstrip()) while True: line serial.readline().decode(utf-8) while len(line) 0: print_gps_data(line) line serial.readline().decode(utf-8) time.sleep(1)这段代码首先定义一个print_gps_data函数把传入的行打印到控制台rstrip()用于去掉行尾换行符。随后程序进入无限循环每次迭代尽可能多地读取串口文本行对每一行调用print_gps_data当所有数据读取完毕后休眠 1 秒再重试。这与真实树莓派上的读串口逻辑一致——对比 code-gps/pi 的实现 可以看出两者唯一的本质差异是树莓派使用serial包并显式指定波特率9600而虚拟设备使用counterfit_shims_serial。完整的可直接运行代码保存在仓库的 code-gps/virtual-device/gps-sensor/app.py。运行程序。启动时必须使用一个与 CounterFit 应用不同的终端否则运行 Python 脚本会占用当前终端导致 CounterFit 失去响应python app.py配置虚拟 GPS 传感器的三种数据源程序启动后回到 CounterFit Web 应用展开 GPS 传感器的设置面板通过修改Source数据源来选择虚拟 GPS 传感器输出数据的方式。共有三种方式方式一Lat/Lon 直接指定经纬度将Source设为Lat/Lon然后填写明确的纬度Latitude、经度Longitude以及用于获得 GPS 定位的卫星数量Satellites。注意该值只会被发送一次因此请勾选Repeat重复复选框让数据每隔 1 秒重复发送一次。方式二发送原始 NMEA 语句将Source设为NMEA在文本框中粘贴若干条 NMEA 语句。所有语句会被依次发送且在每条新的GGA定位数据语句可被读取之前有 1 秒的延迟。你可以使用 nmeagen.org 之类的工具在地图上画线来生成这些语句。同样地这些值只会发送一次如需循环请勾选Repeat复选框数据全部发送完 1 秒后重复。方式三上传 GPX 轨迹文件将Source设为 GPX 文件并上传一个包含轨迹位置点的 GPX 文件。可以从 AllTrails 等流行的地图与徒步网站上直接下载 GPX 文件。这类文件以轨迹形式包含多个 GPS 位置点虚拟 GPS 传感器会以 1 秒为间隔依次返回每一个新位置。与前面两种方式一样数据只会发送一次勾选Repeat即可循环发送。无论使用哪种方式配置完成后都要点击Set设置按钮把配置值提交写入传感器。运行结果与原始 NMEA 输出解读完成配置并点击Set后运行app.py的终端中就会看到 GPS 传感器输出的原始数据形如$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67这串看似乱码的内容其实是标准 GPS 数据。GPS 传感器使用NMEA 0183 标准输出消息每条消息以$开头后跟 2 个字符表示消息来源如GP表示美国 GPS 系统、GN表示俄罗斯 GLONASS 系统再跟 3 个字符表示消息类型其余部分是逗号分隔的字段以换行符结尾。常见的消息类型包括类型含义GGAGPS 定位数据包含纬度、经度、海拔高度以及参与定位计算的可见卫星数量ZDA当前日期与时间含本地时区GSV可见卫星的详细信息以输出中的$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67为例纬度部分为4738.538654,NNMEA 使用(d)ddmm.mmmm格式表示坐标4738.538654即 47 度 38.538654 分换算成十进制度数为 47.6423109方向字符N北纬表示正值纬度。经度部分为12208.341758,W12208.341758即 122 度 8.341758 分换算成十进制度数为 122.1390293方向字符W西经表示负值经度。字段1表示定位质量3表示参与定位的卫星数量164.7,M为海拔高度米-17.1,M为大地水准面差距。NMEA 数据中还包含时间戳因此 IoT 设备必要时可以直接从 GPS 传感器获取时间而不必依赖 NTP 服务器或内部实时时钟。进阶用 pynmea2 解码 NMEA 数据直接读取原始 NMEA 语句可读性差更好的做法是解码成可直接使用的格式。仓库提供了一个使用开源库pynmea2解码 NMEA 数据的进阶版本完整代码见 code-gps-decode/virtual-device/gps-sensor/app.py。在虚拟环境中安装解码库pip install pynmea2在app.py顶部导入import pynmea2将print_gps_data函数替换为解码逻辑def print_gps_data(line): msg pynmea2.parse(line) if msg.sentence_type GGA: lat pynmea2.dm_to_sd(msg.lat) lon pynmea2.dm_to_sd(msg.lon) if msg.lat_dir S: lat lat * -1 if msg.lon_dir W: lon lon * -1 print(f{lat},{lon} - from {msg.num_sats} satellites)这段代码用pynmea2.parse解析从串口读取的每一行当消息类型为GGA定位数据时用dm_to_sd函数把 NMEA 的(d)ddmm.mmmm格式转换成十进制度数再根据方向字符处理正负号南纬取负、西经取负最后连同参与定位的卫星数量一起打印。运行后将看到类似输出47.6423109,-122.1390293 - from 3 satellites小结与延伸练习至此你已经完成了一个完整的虚拟 GPS 传感器读取程序从创建 CounterFit 虚拟硬件、安装串口 shim到通过三种数据源配置定位数据再到读取原始 NMEA 输出并用pynmea2解码出十进制度数坐标。这套代码的物理版树莓派几乎完全相同因此你在虚拟设备上验证通过的逻辑可以直接迁移到真实硬件。课程还提供了两道延伸练习供你继续深入挑战题不依赖第三方库自己动手编写一个 NMEA 解码器从 NMEA 语句中提取纬度与经度见 课程 README 的 Challenge 部分。课后作业挖掘 NMEA 数据中的更多信息——例如获取当前日期与时间、海拔高度或当前速度并让 IoT 设备使用这些数据见 assignment.md。下一步可以继续学习本课后续章节了解如何将 GPS 数据接入云端存储与可视化完成从传感器读取到端到端位置追踪系统的完整闭环。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表