4e2cd43a55
iotlcm-onelink-mock:OneLink 挡板服务(本地测试替身)。 - Go module 迁移至 git.5iot.com/iotlcm-public/iotlcm-onelink-mock - 修复同毫秒内多次生成卡导致 ICCID/IMSI 唯一约束冲突 - 补 Apache-2.0 LICENSE,README 重写并新增 docs/deploy.md - 移除内部部署资产(CI 触发器 / 镜像推送脚本 / 指定环境部署文档) - 测试凭据改为 demo_appid / demo_password,真实手机号与内网 IP 脱敏 - 统一 LF 行尾并加 .gitattributes
249 lines
5.9 KiB
Markdown
249 lines
5.9 KiB
Markdown
# iotlcm-onelink-mock
|
||
|
||
OneLink 挡板服务 —— 基于《中移物联网物联卡能力开放调用参考文档 V26.01.1》实现的本地测试替身。
|
||
|
||
用于在没有真实运营商环境时,模拟中国移动 OneLink 的鉴权与卡查询接口,支撑联调、自测与 CI。
|
||
|
||
## 功能
|
||
|
||
- Go 后端,兼容 `/v5/ec/...` 和 `/ec/...` 两种路径。
|
||
- Vue3 管理台,管理多个 `appid/password`、SIM 卡基础信息、状态和固定流量参数。
|
||
- Token 有效期 3600 秒,支持 `refresh=0/1`。
|
||
- 不再连接 MySQL,也不再查询 `t_sim_card_info`。
|
||
- SIM 卡数据由后端一键生成,持久化到本地 SQLite 表 `mock_t_sim_card`。
|
||
- 月流量固定为 `18432 KB`,不再按时间自动增长。
|
||
- 支持按入库模板导出 Excel。
|
||
|
||
## 数据源
|
||
|
||
服务使用 SQLite 数据库作为唯一持久化数据源。默认数据库路径:
|
||
|
||
```text
|
||
data/onelink_mock.db
|
||
```
|
||
|
||
可以通过环境变量覆盖:
|
||
|
||
```text
|
||
BAFFLE_SQLITE_PATH=C:\sqlite\onelink_mock.db
|
||
```
|
||
|
||
后端通过 GoFrame SQLite 驱动直接访问数据库,不依赖本机安装 `sqlite3` 命令行工具。
|
||
|
||
Docker 镜像内会安装 `sqlite` 命令行工具。
|
||
|
||
## 一键生成
|
||
|
||
管理台顶部可输入生成数量,点击“一键生成”后追加新卡数据。
|
||
|
||
生成逻辑:
|
||
|
||
- 不删除旧卡。
|
||
- 不查询旧卡做重复对比。
|
||
- ICCID/MSISDN/IMSI/IMEI 与生成时间戳和序号相关,降低重复概率。
|
||
- 删除卡只在管理台删卡或业务删除逻辑触发时发生。
|
||
|
||
固定生成值:
|
||
|
||
```text
|
||
chanKey=channel_yd_mock
|
||
cardType=1
|
||
upPkgCode=CMIOT-SD-500M-24M-D01
|
||
suppliersCode=SUP_CMCC
|
||
insertToPlugEnabled=true
|
||
carrierTrafficCutoffEnabled=false
|
||
hasTestPeriod=true
|
||
testPeriodDays=30
|
||
hasSilentPeriod=false
|
||
silentPeriodDays=
|
||
silentPeriodLatestExpiryDate=
|
||
```
|
||
|
||
流量固定值:
|
||
|
||
```text
|
||
current_month_usage_kb=18432
|
||
monthly_usage_kb=18432
|
||
daily_usage_kb=614.4
|
||
pool_usage_bytes=18874368
|
||
growth_per_minute_kb=0
|
||
auto_growth_enabled=false
|
||
```
|
||
|
||
## Excel 导出
|
||
|
||
管理台点击“导出 Excel”会下载当前卡数据,表头顺序为:
|
||
|
||
```text
|
||
ICCID
|
||
MSISDN
|
||
IMSI
|
||
IMEI
|
||
通道编号
|
||
卡类型
|
||
上游套餐编码
|
||
供应商编码
|
||
上游激活时间
|
||
是否贴片转插拔
|
||
是否运营商达量断网
|
||
协议到期时间
|
||
是否有测试期
|
||
测试期天数
|
||
测试期最晚过期日期
|
||
是否有沉默期
|
||
沉默期天数
|
||
沉默期最晚过期日期
|
||
```
|
||
|
||
其中:
|
||
|
||
- `协议到期时间` 为激活日期后 1 年。
|
||
- `测试期最晚过期日期` 为激活日期后 30 天。
|
||
- `是否有沉默期=false` 时,沉默期天数和截止日期导出为空。
|
||
|
||
## 已实现接口
|
||
|
||
- `ec/get/token`
|
||
- `ec/query/sim-basic-info`
|
||
- `ec/query/sim-session`
|
||
- `ec/query/sim-status`
|
||
- `ec/query/sim-stop-reason`
|
||
- `ec/query/sim-frozen-state-info`
|
||
- `ec/query/sim-apn-session-info`
|
||
- `ec/query/sim-activated-features-info`
|
||
- `ec/query/sim-operating-status`
|
||
- `ec/query/sim-data-diagnosis`
|
||
- `ec/query/sim-imei`
|
||
- `ec/query/sim-data-usage-inpool`
|
||
- `ec/query/sim-data-usage`
|
||
- `ec/query/sim-data-usage-monthly/batch`
|
||
- `ec/query/sim-data-usage-daily/batch`
|
||
- `ec/query/apn-info`
|
||
- `ec/query/card-bind-status`
|
||
- `ec/query/on-off-status`
|
||
- `ec/query/region-limit-status`
|
||
- `ec/change/sim-status`
|
||
- `ec/operate/sim-apn-function`
|
||
|
||
Chan-compatible unified APIs (GET and POST):
|
||
- `GET|POST /sim/query/sim-basic-info`
|
||
- `GET|POST /sim/query/sim-session`
|
||
- `GET|POST /sim/query/sim-status`
|
||
- `GET|POST /sim/query/sim-status-batch`
|
||
- `GET|POST /sim/query/sim-card-bind-status`
|
||
- `GET|POST /sim/query/sim-device-status`
|
||
- `GET|POST /sim/query/sim-region-limit-status`
|
||
- `GET|POST /sim/query/sim-imei`
|
||
- `GET|POST /sim/query/sim-datausage`
|
||
- `GET|POST /sim/query/sim-datausage-monthly`
|
||
- `GET|POST /sim/query/sim-datausage-monthly-batch`
|
||
- `GET|POST /sim/query/sim-datausage-daily`
|
||
- `GET|POST /sim/query/sim-datausage-daily-batch`
|
||
- `GET|POST /sim/query/sim-apn-info`
|
||
- `GET|POST /sim/change/sim-status`
|
||
- `GET|POST /sim/change/sim-apn`
|
||
|
||
Chan requests use `simKeys` and `reqData`; responses are per-SIM arrays with
|
||
`code`, `message`, `simKey`, and `resData`. The chan endpoints reuse the same
|
||
SQLite SIM cards as the OneLink endpoints.
|
||
|
||
管理接口:
|
||
|
||
- `GET /api/state`
|
||
- `POST /api/generate`
|
||
- `GET /api/cards/export`
|
||
- `POST /api/appids`
|
||
- `POST /api/cards`
|
||
- `DELETE /api/cards`
|
||
|
||
## 环境变量
|
||
|
||
| 变量 | 必填 | 说明 |
|
||
| --- | --- | --- |
|
||
| `BAFFLE_ADDR` | 否 | 监听地址,默认 `:8080` |
|
||
| `BAFFLE_SQLITE_PATH` | 否 | SQLite 数据库路径,默认 `data/onelink_mock.db` |
|
||
|
||
## 本地启动
|
||
|
||
### 1. 启动后端
|
||
|
||
PowerShell:
|
||
|
||
```powershell
|
||
$env:BAFFLE_ADDR=":8080"
|
||
$env:BAFFLE_SQLITE_PATH="C:\sqlite\onelink_mock.db"
|
||
go run .
|
||
```
|
||
|
||
后端默认监听:
|
||
|
||
```text
|
||
http://127.0.0.1:8080
|
||
```
|
||
|
||
### 2. 启动前端
|
||
|
||
```powershell
|
||
cd frontend
|
||
pnpm install --frozen-lockfile
|
||
pnpm run dev
|
||
```
|
||
|
||
前端 dev server 默认监听:
|
||
|
||
```text
|
||
http://127.0.0.1:5173/
|
||
```
|
||
|
||
## Docker 启动
|
||
|
||
```powershell
|
||
docker compose up -d --build
|
||
```
|
||
|
||
访问地址:
|
||
|
||
```text
|
||
http://127.0.0.1:18080/onelink-mock/
|
||
```
|
||
|
||
停止:
|
||
|
||
```powershell
|
||
docker compose down
|
||
```
|
||
|
||
## 默认测试认证
|
||
|
||
```text
|
||
appid=demo_appid
|
||
password=demo_password
|
||
```
|
||
|
||
获取 Token:
|
||
|
||
```text
|
||
http://localhost:8080/v5/ec/get/token?appid=demo_appid&password=demo_password&transid=demo_appid2026070209300000000001
|
||
```
|
||
|
||
## Admin query APIs
|
||
|
||
```text
|
||
GET /api/cards?keyword=<msisdn-or-iccid-or-imsi>&page=1&pageSize=20
|
||
GET /api/orders?page=1&pageSize=20
|
||
```
|
||
|
||
Orders are persisted in the SQLite `mock_order` table and retain all nine fields after a service restart. Existing `mock_t_sim_card` data is preserved.
|
||
|
||
## 部署
|
||
|
||
本地开发用 `docker compose up -d --build` 即可(见上文「Docker 启动」)。若需要通过 Nginx 以子路径方式挂到已有站点,参考 [`docs/deploy.md`](./docs/deploy.md)。
|
||
|
||
## 相关项目
|
||
|
||
本服务是 [iotlcm](https://git.5iot.com/iotlcm-public) 物联网卡全生命周期管理平台的一部分,用于在没有真实运营商通道时提供可预期的上游替身。
|
||
|
||
## License
|
||
|
||
[Apache License 2.0](./LICENSE)
|