AIS 数据采集器搭建全流程
日期:2026-09-25
项目路径:C:\ais_project
MQTT 服务器:
TDengine 数据库:ais
基于TDengine的数据库存储,将从mqttx收到的数据存入超级表中,并根据唯一ID创建子表存储,便于查询数据。
一、环境准备
写在最开始,默认已经安装好TDengine/Pycharm/MQTTX
1.1 安装依赖
pip install paho-mqtt taospy
1.2 确认 TDengine
Windows:检查 taosd 服务是否运行
可以打开 Windows 服务管理器,或按 Win+R 输入 services 打开服务窗口,检查 taosd 服务是否正在运行。
1.3 创建数据库
进入 taos CLI:
taos
执行 SQL:
CREATE DATABASE IF NOT EXISTS ais; USE ais;
二、建表
2.1 创建四张超级表
-- 动态表
CREATE STABLE st_dynamic ( ts TIMESTAMP, lon DOUBLE, lat DOUBLE, sog FLOAT, cog FLOAT, heading FLOAT, nav_status INT ) TAGS ( segment NCHAR(16), mmsi BIGINT );
-- 静态表
CREATE STABLE st_static ( ts TIMESTAMP, ship_name NCHAR(64), imo NCHAR(32), call_sign NCHAR(32), ship_type INT ) TAGS ( segment NCHAR(16), mmsi BIGINT );
-- 航次表
CREATE STABLE st_sail ( ts TIMESTAMP, event_type NCHAR(32), status NCHAR(32) ) TAGS ( segment NCHAR(16), mmsi BIGINT );
-- 状态/错误日志表
CREATE STABLE st_status ( ts TIMESTAMP, level NCHAR(16), source NCHAR(32), err_msg NCHAR(512) ) TAGS ( segment NCHAR(16), mmsi BIGINT );
2.2 验证建表结果
SHOW STABLES;
预期输出四行:st_dynamic、st_static、st_sail、st_status
三、部署采集器
3.1 创建采集器文件
在 C:\ais_project 或者{你想存放的文件夹}下新建 ais_collector.py
3.2 配置连接信息
TD_CONFIG = {
"host": "localhost",
"user": "root",
"password": "taosdata",
"database": "ais"
}
MQTT_CONFIG = {
"host": "服务器地址",
"port": 1883,
"user": "",
"password": "",
"topics": [
订阅主题
]
}
3.3 启动采集器
1.cmd命令行中输入cd C:\ais_project python ais_collector.py
2.或者在Pycharm项目文件夹中打开于终端,输入python ais_collector.py
正常启动后日志示例:
2026-09-25 17:05:00 | INFO | TDengine 连接成功 2026-09-25 17:05:00 | INFO | MQTT 连接成功 [接收] Topic=topic | 数据=413772468,2026-09-25 17:05:28,107.100860000,29.769935000,291,511,74,15,-128,0,2,238660,238650= [动态] MMSI=413772468 | 写入成功 | 类型=dynamic
四、常见问题与解决方案
问题1:MQTT 连接失败 [WinError 10061]
原因:MQTT 服务器地址或端口配置错误
解决:检查 MQTT_CONFIG 中的 host 和 port,确认用户名密码正确
问题2:JSON 解析失败 Extra data
原因:数据是 CSV 格式,不是 JSON
解决:已使用 CSV 解析方式,无需处理
问题3:Invalid column name
原因:INSERT 语句中的列名与表结构不匹配
解决:用 DESCRIBE st_xxx; 查看表结构,对齐列名
问题4:Table does not exist
原因:超级表未创建
解决:执行第二章的建表语句
问题5:统计在线船舶数不准
原因:COUNT(DISTINCT tbname) 在 TDengine 中行为不可靠
解决:改用 COUNT(DISTINCT mmsi),mmsi 是 TAG,统计准确