第六篇:Android / IoT 如何接入 RTK 模块?——串口、蓝牙、TCP 工程实践

发布时间:2026/10/9 14:54:03

第六篇:Android / IoT 如何接入 RTK 模块?——串口、蓝牙、TCP 工程实践 上一篇我们讲了《NMEA、RTCM、NTRIP 到底是什么——RTK 数据链路详解》很多人已经知道NMEA 负责输出定位结果 RTCM 负责传输差分数据 NTRIP 负责通过网络传输 RTCM但问题来了这些数据在真实项目里到底怎么接Android 怎么拿到 RTK 数据IoT 设备怎么和 RTK 模块通信串口、蓝牙、TCP 又分别是什么场景今天这一篇我们就从工程视角真正讲透Android / IoT 如何接入 RTK 模块一、先理解一个核心问题很多人以为接 RTK 调一个 SDK其实真实工程里很多时候并不是这样。尤其是机器人、割草机、AGV、巡检设备这些场景RTK 模块通常是一个独立硬件。它通过串口蓝牙USBTCP4G 网络把定位数据输出给上层系统。所以在 Android / IoT 工程里真正要做的是接收数据流然后解析数据流最后交给地图和机器人控制系统使用二、RTK 模块到底输出什么RTK 模块通常会输出NMEA 定位数据例如$GNGGA,092750.000,3123.456789,N,12034.567890,E,4,18,0.8,12.3,M,0.0,M,,*6A第一次看到这种数据很多人会懵。但它本质上就是一行文本这一行里面包含时间经纬度Fix 状态卫星数量海拔精度因子所以 Android / IoT 上层最常见的工作就是读取 NMEA 字符串 解析经纬度 判断 Fix 状态 更新机器人当前位置三、真实工程中的整体链路真实项目里通常是这样RTK 模块 ↓ 串口 / 蓝牙 / TCP ↓ Android / Linux / MCU ↓ 解析 NMEA ↓ 转换坐标 ↓ 更新地图位置 ↓ 机器人控制系统使用如果还涉及差分数据链路可能是NTRIP Server ↓ 获取 RTCM 差分流 ↓ 发送给 RTK 模块 ↓ RTK 模块完成解算 ↓ 输出 Fix 后的 NMEA所以你会发现RTK 接入并不是一个点。而是一条完整数据链路。四、第一种接入方式串口这是最常见的方式。在很多机器人设备里RTK 模块会通过 UART 串口连接主控板。例如/dev/ttyS1 /dev/ttyS3 /dev/ttyUSB0Android 或 Linux 上层程序不断从串口读取数据。五、串口接入的核心流程核心流程非常简单打开串口 ↓ 设置波特率 ↓ 读取字节流 ↓ 拼接成完整 NMEA 行 ↓ 解析数据 ↓ 更新定位状态例如波特率可能是9600 38400 115200具体要看 RTK 模块配置。六、串口接入最容易踩的坑1. 半包问题串口读出来的数据不一定是一整行。例如你想要的是$GNGGA,092750.000,3123.456789,N,12034.567890,E,4,18...但实际可能分几次读到$GNGGA,092750.000,3123下一次才读到.456789,N,12034.567890,E,4,18...所以不能每次 read 就立刻解析。必须先缓存。等遇到\n再认为是一条完整 NMEA。2. 粘包问题也可能一次读到多条$GNGGA,... $GNRMC,... $GNGSA,...所以你要按行拆分。而不是按 read 次数拆分。3. 编码问题NMEA 本质是 ASCII 文本。通常按ASCII / UTF-8处理即可。但不要直接乱转编码。否则容易出现解析异常。七、Android 串口读取的核心思想在 Android 里如果设备有串口权限通常会有一个串口库或者厂商提供的 SDK。核心代码思想大概是while (running) { val bytes serialPort.read() buffer.append(bytes.toString(Charsets.US_ASCII)) while (buffer contains \n) { val line buffer.readLine() parseNmea(line) } }重点不是代码多复杂。重点是串口是字节流不是消息流所以你必须自己处理半包 粘包 换行 缓存 异常重连八、第二种接入方式蓝牙有些 RTK 设备比如手持 RTK、外置 GNSS 接收机会通过蓝牙输出定位数据。Android 手机或平板可以通过蓝牙连接。蓝牙接入流程通常是搜索设备 ↓ 配对设备 ↓ 建立蓝牙 Socket ↓ 读取 InputStream ↓ 解析 NMEA你会发现它和串口非常像。因为本质上蓝牙也是数据流只不过底层通信方式不同。九、蓝牙接入的常见问题1. 连接不稳定蓝牙容易受到距离障碍物设备休眠系统省电策略影响。所以必须做断线重连2. Android 权限问题Android 新版本蓝牙权限变复杂了。例如可能涉及BLUETOOTH_CONNECT BLUETOOTH_SCAN ACCESS_FINE_LOCATION不同 Android 版本权限处理不同。这是实际开发中很常见的问题。3. 后台保活问题如果你的 App 退到后台蓝牙连接可能被系统回收。所以机器人类应用通常需要前台服务来维持连接。十、第三种接入方式TCP有些 RTK 模块或者中间设备会直接通过 TCP 输出数据。例如192.168.1.100:9000Android 作为客户端连接这个地址然后持续读取数据。TCP 接入流程通常是创建 Socket ↓ 连接 IP 和端口 ↓ 读取 InputStream ↓ 按行拆分 NMEA ↓ 解析定位结果它和串口、蓝牙一样最终都是读取数据流十一、TCP 接入的常见问题1. 网络断开机器人移动过程中WiFi 或 4G 可能不稳定。所以需要心跳 断线检测 自动重连2. 数据延迟定位数据是实时数据。如果 TCP 数据延迟太大地图上的机器人位置就会滞后。所以要关注时间戳 数据频率 延迟3. 旧数据不能乱用有时候网络恢复后可能会收到缓存数据。但机器人已经移动了。这时候如果直接使用旧定位地图会突然跳。所以工程里要判断数据时间是否过期十二、NMEA 解析应该关注哪些字段在机器人项目中最重要的通常不是所有字段。而是这几个1. 经纬度这是机器人位置的基础。例如latitude longitude2. Fix 状态这个非常关键。比如 GGA 里的定位质量字段。常见含义0无定位 1普通 GPS 2差分定位 4RTK Fix 5RTK Float实际项目里必须根据这个字段判断定位是否可信不能只要有经纬度就用。3. 卫星数量例如satellites 18卫星数量太少定位就不稳定。4. HDOP可以简单理解为定位精度因子数值越小通常越好。如果 HDOP 很大说明当前定位质量不理想。十三、为什么不能只看经纬度这是很多新人容易犯的错。他们只要拿到lat lng就直接显示在地图上。但真实机器人里这是不够的。你还必须判断是否 Fix卫星数量够不够HDOP 是否正常数据是否过期是否突然跳点是否和上一帧位置连续否则机器人地图位置会非常不稳定。十四、RTK 数据进入系统后怎么设计在 Android / IoT 里更建议把 RTK 当成一个独立数据源。例如RtkDataSource ↓ RtkRepository ↓ LocationUseCase ↓ MapViewModel ↓ Map UI / Robot Control不要在 UI 层直接解析 NMEA。因为 NMEA 是底层通信数据。UI 层只应该关心当前位置 定位状态 精度 是否可用十五、推荐的数据模型可以设计一个统一模型data class RtkLocation( val latitude: Double, val longitude: Double, val fixType: FixType, val satelliteCount: Int, val hdop: Double?, val timestamp: Long, val isValid: Boolean )FixType 可以是enum class FixType { NONE, GPS, DGPS, RTK_FLOAT, RTK_FIX }这样上层就不用关心 NMEA 细节。十六、定位数据如何分发在 Android 里 可以用StateFlow SharedFlow Callback LiveData我更建议StateFlow因为定位状态天然是一个当前最新状态例如val rtkLocationFlow: StateFlowRtkLocation?地图页面订阅它。机器人控制模块也可以订阅它。十七、工程里必须做的保护真实项目中一定不能裸用 RTK 数据。至少要做这些保护1. Fix 状态过滤例如只有RTK_FIX才认为是高可信。如果是RTK_FLOAT GPS NONE要降级处理。2. 跳点过滤如果上一秒位置在 A下一秒突然跳出去 20 米就不能立刻相信。要结合速度 时间间隔 最大移动距离判断是否异常。3. 数据超时判断如果超过几秒没有新数据说明定位已经不新鲜了。例如3 秒没有更新就应该认为 RTK 数据不可用。4. 异常重连串口、蓝牙、TCP 都可能断。所以必须有重连机制不能断了就死。十八、差分数据在 Android 里怎么处理这里要分两种情况。第一种RTK 模块自己处理 NTRIP有些高级 RTK 模块自己可以连接 NTRIP Server。它内部完成获取 RTCM 完成解算 输出 NMEAAndroid 只需要读取 NMEA。这种最简单。第二种Android 负责获取 RTCM有些方案里Android 需要连接 NTRIP Server拿到 RTCM 差分流再通过串口或蓝牙写回 RTK 模块。流程是Android 连接 NTRIP ↓ 获取 RTCM ↓ 写入 RTK 模块 ↓ RTK 模块完成 Fix ↓ 输出 NMEA这种就复杂一些。因为 Android 同时要处理NTRIP 网络输入 RTCM 写入模块 NMEA 读取模块本质上是双向数据流。十九、真实机器人定位系统架构真实工程里大概是RTK 模块 ↓ NMEA 数据 ↓ RtkDataSource ↓ RtkRepository ↓ 定位质量判断 ↓ 坐标转换 ↓ 地图系统 ↓ 电子围栏 ↓ 路径规划 ↓ 运动控制如果有 IMURTK IMU 编码器 ↓ 融合定位 ↓ 机器人当前位姿最终机器人需要的不是单纯经纬度。而是当前位姿包括x y heading speed status二十、面试怎么回答如果面试官问“Android / IoT 如何接入 RTK 模块”推荐回答标准答案面试版Android / IoT 接入 RTK 模块本质上是接入 RTK 的数据流。常见方式包括串口 UART蓝牙USBTCP SocketRTK 模块通常会输出 NMEA 数据上层系统需要读取数据流处理半包、粘包按行解析 NMEA。重点解析经纬度Fix 状态卫星数量HDOP时间戳如果需要差分数据Android 还可能需要通过 NTRIP 获取 RTCM再写入 RTK 模块。真实机器人系统中不会直接裸用经纬度而是会做Fix 状态过滤跳点过滤数据超时判断异常重连坐标转换与 IMU / 编码器融合最终提供给地图、电子围栏和运动控制系统使用。二十一、总结一句话总结接 RTK不是简单拿经纬度而是接入一条实时定位数据链路串口、蓝牙、TCP本质都是读取数据流 解析 NMEA 判断定位质量 输出稳定位置真正的工程重点不是能不能读到数据而是数据稳不稳 状态准不准 异常能不能处理 系统能不能长期运行这才是 Android / IoT 接入 RTK 的核心。下篇预告下一篇我们继续《RTK 地图 机器人完整定位系统架构解析》深入讲透RTK 数据如何进入地图系统经纬度如何转换为地图坐标机器人当前位置如何显示电子围栏如何参与判断路径规划如何使用定位数据RTK、IMU、地图、控制系统如何协同工作这些才是真正的机器人定位系统架构。《RTK / GNSS 工程实战系列》为什么机器人能厘米级定位——一篇讲透 GPS、北斗 与 RTKRTK 为什么比 GPS 准——差分定位原理详解机器人为什么会“漂”——RTK 漂移问题详解Point-In-Polygon 是什么——机器人电子围栏核心算法NMEA、RTCM、NTRIP 到底是什么——RTK 数据链路详解Android / IoT 如何接入 RTK 模块——串口、蓝牙、TCP 工程实践RTK 地图 机器人完整定位系统架构解析
延伸阅读

更多相关文章

2026/10/7 14:52:29

sssnic-driver未来路线图:3SNIC网卡驱动开发计划展望

sssnic-driver未来路线图:3SNIC网卡驱动开发计划展望 【免费下载链接】sssnic-driver a new NIC driver for 3SNIC ethernet controller sssnic 项目地址: https://gitcode.com/openeuler/sssnic-driver 前往项目官网免费下载:https://ar.openeul…

2026/10/6 15:34:04

裸眼3D内容制作公司实力排行

裸眼3D是通过视差屏障、柱状透镜或光场显示等光学技术,在无需佩戴辅助设备的情况下实现立体视觉效果的视觉内容服务。2026年,裸眼3D行业正从“概念验证”全面迈入“规模化商用”阶段。据共研产业研究院数据,2026年中国裸眼3D出货量约36.1万台…

2026/9/29 4:56:49

Android Studio - Android Studio 自定义预览尺寸

已知分辨率、DPI,求屏幕尺寸 已知分辨率为 x * y 像素,DPI 为 z,屏幕尺寸为 √(x^2 y^2) / z 例如,已知分辨率为 1400 * 800,DPI 为 120,屏幕尺寸为 √(1400^2 800^2) / 120 ≈ 13.44 Android Studio 自…

2026/10/9 14:52:22

Selenium自动化测试实战:从环境搭建到POM工程化全指南

如果你在测试岗待过一段时间,大概率会遇到这样一个画面:产品迭代快到月底,回归测试却要手动点几百个按钮,点得人眼冒金星。所以我一直觉得,Selenium是测试领域里最值得投入的第一个自动化工具——上手快、资料多、就算…

2026/10/9 14:52:22

ECMS二次开发实战:核心机制、常见坑与笔记体系搭建

1. 从"墨鱼部落格"这个标题里,我读出了什么第一次看到"墨鱼部落格-大量ECMS,开发笔记值得学习"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个个人站长或者独立开发者维护的技术博客,而且…

2026/10/9 14:52:22

PHP全开源聊天室源码实战:WebSocket实时消息与高并发架构

简介:这是一套基于PHP与WebSocket技术构建的全开源H5聊天室源码,面向需要为网站或应用快速集成即时通讯功能的开发者,尤其适合具备一定PHP基础、希望省去从零搭建实时通信框架的人群。资源包共19个文件,约1.5MB,以9个p…

2026/10/9 14:52:22

简单模拟判断机器人应该采取什么动作

代码逐行解析 这段代码实现了一个简单的「指令驱动移动」程序:根据用户输入的指令串(只含 F/B/L/R),让一个点从原点 (0, 0) 出发逐步移动,并打印出完整路线、最终坐标和总步数。 1. compute_route(commands) —— 核心…

2026/10/9 14:52:22

Spring Boot秒杀系统实战:Redis+RabbitMQ高并发源码解析

简介:这是一套基于SpringBoot的电商秒杀系统完整项目源码,面向计算机相关专业的在校学生、教师及企业开发者,尤其适合作为毕业设计、课程设计或项目立项演示的参考方案。项目采用MySQL、SpringBoot、Redis与RabbitMQ技术栈,重点解…

2026/10/9 14:47:22

B站视频AI分拣工具:本地化处理字幕与弹幕的Obsidian知识工作流

1. 这不是收藏夹,是待处理的“视频原料库”你点开B站收藏夹那一刻,心里想的真是“以后慢慢看”吗?我翻过自己三年来的收藏记录——237个视频,平均每个收藏夹里塞着48条,其中62%的视频播放量不足50次,31%甚至…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑