# new-iot **Repository Path**: hiro0729/new-iot ## Basic Information - **Project Name**: new-iot - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-21 - **Last Updated**: 2026-06-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HC IoT 平台 (GoFrame 版) 基于 [GoFrame v2](https://goframe.org) 的物联网平台,参考并重构自 Java Spring Cloud 微服务项目 [MicroCommunityIot](https://github.com/java110/MicroCommunityIot)。 原项目是 20+ 模块的 Spring Cloud 微服务生态(gateway + 18 个域服务 + eureka + hal),本项目将其重构为 **GoFrame 单体应用**,在保持业务语义和数据库兼容的前提下,大幅简化部署与运维。 > 当前进度:**Phase 1–22 已完成**。已注册 **837 个 Cmd**(Java 原版 944 个),覆盖 **241 张表 / 18 业务域 / 完整三层 HAL**(MQTT + Netty TCP/UDP + RTSP/WebSocket)。 --- ## 覆盖度速览 | 维度 | Java 原版 | 本项目 | 说明 | |---|---|---|---| | 业务域 | 18 | 18 | 全部域已落地,见下表 | | Cmd(serviceCode) | 944 | 837 | 837 个业务命令;差值主要是仅前端调用的展示型/弃用接口 | | MySQL 表 | 241 | 241 | DAO/entity/do 全量自动生成,表结构零改动复用 `hc_iot.sql` | | HAL - MQTT | ✅ | ✅ | 4 厂家适配器(yite/yufan/hc_charge/lv_charge) | | HAL - Netty TCP/UDP | ✅ | ✅ | 5 协议检测(松饼/云快充/驴充充/员工牌/微耕) | | HAL - RTSP 视频 | ✅ | ✅ | RTSP 握手 + H.264 FU-A 重组 + WebSocket 广播 | | 服务发现 eureka | ✅ | ❌ | 单体不需要,作架构决策剔除(见 [未复刻模块](#未复刻模块)) | | h5/前端 | ✅ | ❌ | 后端平台,前端不在复刻范围 | ### 三层 HAL 完整覆盖 | 层 | Java 包 | Go 包 | 状态 | |---|---|---|---| | MQTT 设备控制 | `iot-hal/mqtt` | `internal/service/mqtt` | ✅ Phase 18 — 启动时 `Bootstrap` 连接 broker,`DeviceControlService.InitClient` 注册 4 厂家适配器 | | 直连 TCP/UDP | `iot-hal/netty` | `internal/service/netty` | ✅ Phase 20 — TCP/UDP 双 server、`DataHeader.Detect` 5 协议识别、`TcpSocketHolder`/`UdpSocketHolder` 回写 | | RTSP 视频流 | `iot-hal/rtsp` + `iot-hal/websocket` | `internal/service/rtsp` + `internal/service/video` | ✅ Phase 22 — OPTIONS→DESCRIBE→SETUP→PLAY 握手、Digest 401 认证、FU-A 重组、`/ws/videoStream/{machineId}/{clientId}` 广播 | 设备心跳定时任务(`iot-job`)已对接 HAL:门禁心跳走 DB 陈旧度 + netty `HasOnline` 双重判定,yite 心跳走 MQTT `PublishHeartbeat`。 --- ## 技术选型 | 层面 | 技术 | |---|---| | 语言/框架 | Go 1.25 / GoFrame v2.10 | | 数据库 | MySQL(复用原版 `hc_iot.sql`,241 张表) | | 缓存 | Redis(JWT 会话、路由缓存、Mapping 配置) | | 认证 | JWT (HMAC256) + Redis jti 滑动续期 | | MQTT | `paho.mqtt.golang` | | TCP/UDP | Go 标准库 `net`(替代 Java Netty) | | 定时任务 | `gcron`(替代 Java Quartz) | | Excel 导入导出 | `xuri/excelize/v2`(iot-job 队列 worker) | | API 风格 | 统一网关入口 `/iot/api/{service}` + Cmd 分发 | --- ## 目录结构 ``` NewIot/ ├── api/ # API 请求/响应结构定义 │ ├── cmd/v1/ # Cmd 分发入口 API │ └── gateway/v1/ # 网关入口 API ├── internal/ │ ├── cmd/cmd.go # 服务启动 + 路由注册 + 域包导入 + HAL Bootstrap │ ├── consts/ # 全局常量(对应 CommonConstant) │ ├── controller/ │ │ ├── cmd/ # Cmd 分发控制器(对应 CmdApi) │ │ ├── gateway/ # 网关控制器(对应 IotApiController) │ │ │ └── route_resolver.go # 路由解析(对应 AppServiceCheck) │ │ └── video/ # WebSocket 视频流控制器 │ ├── dao/ (241 文件) # gf gen dao 自动生成 │ ├── model/ │ │ ├── entity/ (241) # 表实体 │ │ └── dto/ # 业务 DTO/PO(对应 java110-bean) │ └── service/ │ ├── cmd/ # Cmd 调度核心框架(Dispatcher + CmdHandler) │ ├── auth/ # 认证服务(JWT + 密码哈希) │ ├── cache/ # Redis 缓存服务 │ ├── middleware/ # HTTP 中间件(Ctx/CORS/JwtAuth) │ ├── genid/ # ID 生成(雪花算法 + 业务编码前缀) │ ├── mqtt/ # MQTT HAL(Phase 18) │ ├── netty/ # TCP/UDP HAL(Phase 20) │ ├── rtsp/ # RTSP HAL(Phase 22) │ ├── video/ # WebSocket 视频广播 hub(Phase 22) │ ├── job/ # 定时任务 + xlsx 导入导出 worker(Phase 19/21) │ └── <18 业务域>/ # 见下表 ├── manifest/ │ ├── config/config.yaml # 主配置(gitignore,本地填写) │ ├── sql/hc_iot.sql # 数据库建库脚本(复用原版) │ └── docker/ # Dockerfile ├── go.mod ├── main.go └── README.md ``` --- ## 核心架构对应关系 | Java 原版 | GoFrame 重构 | |---|---| | `@Java110Cmd(serviceCode)` 注解扫描 | `CmdHandler` 接口 + 各域 `init()` 注册到 Dispatcher | | `ServiceCmdEventPublishing` 事件分发 | `CmdDispatcher.Dispatch()` map 查表(进程内直调) | | `CmdApi` (`POST /cmd/{service}`) | `internal/controller/cmd/` | | `IotApiController` (`POST /iot/api/{service}`) | `internal/controller/gateway/` | | `ApiServiceImpl.doService()` | `RouteResolver.Resolve()` → `CmdDispatcher` | | `AuthenticationFactory` (JWT) | `internal/service/auth/auth.go` | | `JwtFilter` | `internal/service/middleware/jwt_auth.go` | | `MappingCache` / `AppRouteCache` | `internal/service/cache/` | | `GenerateCodeFactory` | `internal/service/genid/`(雪花 ID + 编码前缀) | | `java110-db` MyBatis Mapper | `g.DB().Model()` 链式 ORM + 241 DAO | | `iot-hal/mqtt` | `internal/service/mqtt/` | | `iot-hal/netty` (TCP/UDP) | `internal/service/netty/`(标准库 `net`) | | `iot-hal/rtsp` + `websocket` | `internal/service/rtsp/` + `video/` | | `iot-job` (Quartz) | `internal/service/job/`(`gcron`) | | `u_user` / `s_store` / `s_store_staff` | 完全复用原表名和结构 | --- ## 已实现的 18 业务域 | 域 | Go 包 | Cmd 数 | 对应 Java 模块 | 主要能力 | |---|---|---|---|---| | 用户/认证 | `user/` | 151 | iot-user | PC/APP/SSO/微信 OpenId 登录、注册、staff、商户、权限、菜单 | | 系统配置 | `system/` | 72 | iot-system | 系统信息、缓存刷新、配置、商品类目(stub) | | 开发者 | `dev/` | 90 | iot-dev | 映射、应用、菜单、路由、任务、规格、字典 | | 充电桩 | `charge/` | 86 | iot-charge | 充电桩/规则/订单/计费 + MQTT 厂家适配 | | 门禁 | `accessControl/` | 69 | iot-accessControl | 门禁机/人脸/通行记录/访客/passcode | | 停车 | `car/` | 59 | iot-car | 车辆/车主/月卡/车位/优惠券 | | 道闸 | `barrier/` | 55 | iot-barrier | 道闸/进出场/车牌识别/云视频(stub) | | 水电表 | `meter/` | 53 | iot-meter | 抄表/计费/导入 | | 监控 | `monitor/` | 47 | iot-monitor | 监控设备/区域/录像/RTSP 接入 | | 社区域 | `community/` | 42 | iot-community | 小区/楼栋/单元/房屋/入驻 | | 路灯 | `lamp/` | 36 | iot-lamp | 路灯/分组/定时开关 | | 梯控 | `lift/` | 24 | iot-lift | 电梯/派梯 | | 门锁 | `lock/` | 20 | iot-lock | 门锁/钥匙/授权 | | 账务 | `acct/` | 15 | iot-acct | 账户/流水/对账 | | 开放平台 | `openapi/` | 15 | iot-openapi | 第三方车辆/小区同步 | | 任务队列 | `job/` | 3 | iot-job | 业主/车辆/水电表 xlsx 导入导出 worker + 心跳定时任务 | > Cmd 计数为各域去重 `cmdsvc.Register` 调用数;总计 837。 ### 设备动作类命令的 HAL 对接 需要下发硬件的命令(道闸开关、充电启停、门禁开门、路灯开关、梯控派梯、门锁开锁、水电表抄表)已通过 `mqtt.DeviceControlService` 或 `netty` socket holder 路由到对应厂家适配器 / 直连通道,不再是纯 DB 落库。 --- ## 已知 Stub(10 个,外部依赖型) 下列 serviceCode 已注册为 `NotImplementedCmd`,返回明确的「未实现」错误。它们均依赖**外部第三方服务**,在本地无对接凭证时无法实现,留作接入点: | serviceCode | 域 | 外部依赖 | 接入方式 | |---|---|---|---| | `barrier.getCloudFlvVideo` | 道闸 | 厂家云 FLV 视频流 API(HTTP) | 需厂家 appKey/secret,调用返回 FLV URL | | `login.phoneWechatLogin` | 用户 | 微信开放平台 OAuth2 | 需微信 AppID/AppSecret,code 换 session | | `product.queryGoodsClasses` | 系统 | 商品中心微服务(Java 原版独立服务) | 跨服务 HTTP,单体无对应数据源 | | `product.queryProduct` | 系统 | 商品中心微服务 | 同上 | | `workLicense.playPps` | 充电 | 员工牌 PPS 推流协议(私有) | 需厂家 SDK,协议未公开 | | `menu.configMenu` | 开发者 | 菜单可视化配置(前端联动) | 强依赖前端编排,后端无独立数据语义 | | `menuGroupCommunity.updateMenuGroupCommunity` | 用户 | 菜单组跨小区配置 | 同上,前端驱动 | | `service.bindingService` | 开发者 | 服务绑定(eureka 服务发现) | 单体无 eureka,见下 | | `task.startTask` / `task.stopTask` | 开发者 | 动态任务调度(Quartz 远程) | 本项目用 `gcron` 静态注册,无动态启停 | 这些 stub 不影响主流程;接入对应外部服务时,替换为真实 `CmdHandler` 实现即可。 --- ## 未复刻模块 | 模块 | 原因 | |---|---| | `iot-eureka`(服务发现) | 单体架构无多服务注册需求,作架构决策剔除。`service.bindingService` 因此保留为 stub。 | | `iot-web` / h5 前端 | 本项目是后端平台,前端不在复刻范围。 | | `RTSPClientB`(NIO 备选实现) | Java 中的备用 Selector 实现;Go 版用阻塞 `net.Conn` + goroutine 已等价覆盖,无需保留。 | --- ## 快速开始 ### 1. 环境准备 ```bash # Go 1.25+,MySQL 5.7+,Redis 5+ # 可选:MQTT broker(启用心跳/设备控制时需要) ``` ### 2. 初始化数据库 ```bash mysql -u root -p -e "CREATE DATABASE hc_iot DEFAULT CHARACTER SET utf8mb4" mysql -u root -p hc_iot < manifest/sql/hc_iot.sql ``` ### 3. 修改配置 编辑 `manifest/config/config.yaml`(此文件 gitignore,本地填写),确认 database / redis / mqtt / netty 连接信息: ```yaml database: default: link: "root:yTwymysql2020@tcp(127.0.0.1:13306)/hc_iot" redis: default: address: "127.0.0.1:6379" mqtt: enabled: true broker: "tcp://127.0.0.1:1883" netty: tcpPort: 9000 udpPort: 9001 ``` ### 4. 运行 ```bash go run main.go # 或编译后运行(产物约 44M) go build -o newiot . && ./newiot ``` 服务启动后监听 `:8000`(HTTP)、`:9000`(TCP HAL)、`:9001`(UDP HAL)。MQTT/Netty 连接失败仅告警,不阻塞 HTTP 启动。 ### 5. 验证 ```bash # 获取系统信息(无需登录) curl http://localhost:8000/iot/api/login.getSysInfo # PC登录(默认账号 admin/admin) curl -X POST http://localhost:8000/iot/api/login.pcUserLogin \ -H "Content-Type: application/json" \ -d '{"username":"admin","passwd":"admin"}' # 查询小区列表(需登录token) curl -X POST http://localhost:8000/iot/api/community.listCommunitys \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{"page":1,"row":10}' # WebSocket 视频流(浏览器) # ws://localhost:8000/ws/videoStream/{machineId}/{clientId} ``` --- ## 默认账号 数据库 `hc_iot.sql` 预置了两个用户: - `admin` / `admin` — 管理员(level_cd=00) - `dev` / `dev` — 开发者 > 密码在数据库中存储为双重 MD5(`md5(md5(明文+"hc@java110"))`),登录时框架自动哈希比对。 --- ## 开发约定 - **新增 Cmd**:在对应域包内实现 `CmdHandler`(`Validate` + `DoCmd`),在 `init()` 中 `cmdsvc.Register("serviceCode", &XxxCmd{})`。 - **新增表**:`gf gen dao` 自动生成 dao/entity/do,业务代码用 `g.DB().Model("表名")`。 - **设备对接**:MQTT 类走 `mqtt.GetDeviceControl()`;TCP/UDP 类走 `netty.GetHub().Tcp/Udp`;视频走 `rtsp.StartStream` + `video.SendInfo`。 - **每次迭代前先 git commit 留痕**(项目既定工作流)。 --- ## 阶段历程 | 阶段 | 内容 | |---|---| | Phase 1–4 | 网关/Cmd 框架 + user/community/system 域 | | Phase 5–10 | accessControl / car / barrier / charge / meter / monitor / lock / lift / lamp / acct / dev / openapi 域 | | Phase 11–14 | DAO 全量生成(241 表)+ 剩余域补齐 | | Phase 15–17 | gf gen dao + 路由/缓存/认证完善 | | Phase 18 | MQTT HAL Bootstrap + 4 厂家适配器 | | Phase 19 | iot-job xlsx 导入导出 worker(业主/车辆/水电表) | | Phase 20 | Netty TCP/UDP HAL(5 协议检测 + socket holder) | | Phase 21 | 设备心跳定时任务对接 HAL 实际触发 | | Phase 22 | RTSP/WebSocket 视频流 HAL(握手 + H.264 重组 + 广播) | --- ## 许可证 继承自原项目 Apache License 2.0。