2024年04月28日 22:25 产品分类: DAS / DVS 分布式光纤振动监测 DTS 分布式光纤测温
本文档供第三方客户端对接 DTS 设备服务使用,说明 HTTP REST 与 WebSocket 的调用方式、参数含义及响应格式。 适合产品:https://www.glgyzn.com/product/164
| 项目 | 说明 |
|---|---|
| 基础地址 | http://<host>:8088 |
| WebSocket | ws://<host>:8088/ws/stream |
| 数据格式 | 请求/响应均为 JSON(UTF-8) |
| Content-Type | POST 请求使用 application/json |
| 鉴权 | 见下文;OPTIONS 预检无需 Token |
将 <host> 替换为设备 IP,端口默认为 8088(若设备配置了其他端口,以实际为准)。
所有 HTTP 与 WebSocket 请求需携带 API Token(与设备管理员确认 Token 值,默认常为 glgyzn-dts-token)。
| 方式 | 示例 |
|---|---|
| Authorization 头(推荐) | Authorization: Bearer glgyzn-dts-token |
| 自定义头 | X-DTS-Token: glgyzn-dts-token |
| WebSocket 查询参数 | ws://<host>:8088/ws/stream?token=glgyzn-dts-token |
鉴权失败返回 401:
{"ok": false, "error": "unauthorized"}
成功(HTTP 200) — 多数 POST:
{"ok": true, "message": "说明文字"}
失败 — 两种常见格式:
{"ok": false, "error": "错误说明"}
{"ok": false, "message": "错误说明"}
部分 GET 接口直接返回业务 JSON,无 ok 字段。
1. GET /api/v1/health
2. POST /api/v1/connect
3. GET /api/v1/status
4. GET /api/v1/config (可选)
5. POST /api/v1/config (可选)
6. WebSocket /ws/stream (订阅实时数据)
7. POST /api/v1/acquisition/start
8. 接收 WebSocket frame / alarm 消息
9. POST /api/v1/acquisition/stop (需要时)
说明:
acquisition/stop。POST /connect 已连接时再次调用仍返回成功及当前版本。POST /acquisition/start 已在采集时再次调用仍返回成功。| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/v1/health |
健康检查 |
| GET | /api/v1/status |
连接与采集状态 |
| POST | /api/v1/connect |
连接设备 |
| POST | /api/v1/disconnect |
断开设备 |
| GET | /api/v1/config |
读取配置 |
| POST | /api/v1/config |
更新配置 |
| POST | /api/v1/reload-config |
重新加载配置 |
| POST | /api/v1/acquisition/start |
开始采集 |
| POST | /api/v1/acquisition/stop |
停止采集 |
| GET | /api/v1/optical-switch |
查询光开关 |
| POST | /api/v1/optical-switch |
启用/禁用光开关 |
| GET | /api/v1/light-source |
读取光源参数 |
| POST | /api/v1/light-source |
设置光源参数 |
| GET | /api/v1/alarms |
读取告警配置与状态 |
| POST | /api/v1/alarms |
保存告警配置 |
| POST | /api/v1/alarms/acknowledge |
确认恢复告警 |
| POST | /api/v1/alarms/mute |
告警消音 |
| GET | /api/v1/relay-linkage |
读取继电器联动配置 |
| POST | /api/v1/relay-linkage |
保存继电器联动配置 |
| GET | /api/v1/network/ip |
查询主机 IP |
| POST | /api/v1/network/ip |
修改主机 IP |
以下示例中:
HOST = 设备 IP,如 192.168.68.4TOKEN = API Token,如 glgyzn-dts-token/api/v1/health探测服务是否在线。
请求: 无 body
响应:
{"ok": true}
curl:
curl -s "http://HOST:8088/api/v1/health" \
-H "Authorization: Bearer TOKEN"
/api/v1/status查询设备连接状态与采集参数。
响应:
{
"connected": true,
"reading": false,
"version": "V1.2.3.5",
"samplePoints": 16384,
"avgCount": 30000
}
| 字段 | 类型 | 说明 |
|---|---|---|
| connected | bool | 是否已连接采集卡 |
| reading | bool | 是否正在采集 |
| version | string | 采集卡固件版本 |
| samplePoints | number | 当前采样点数 |
| avgCount | number | 当前平均次数 |
curl:
curl -s "http://HOST:8088/api/v1/status" \
-H "Authorization: Bearer TOKEN"
/api/v1/connect连接采集卡及外设(光源、光开关等)。首次连接可能耗时较长,建议 HTTP 超时设为 60–90 秒。
请求体: 空对象 {} 或不传 body
响应:
{
"ok": true,
"message": "连接成功, 版本: V1.2.3.5"
}
| 字段 | 说明 |
|---|---|
| ok | 是否成功 |
| message | 结果说明;失败时为原因;部分外设失败时也可能 ok=true 并在 message 中说明 |
curl:
curl -s -X POST "http://HOST:8088/api/v1/connect" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d "{}"
/api/v1/disconnect停止采集并断开设备连接。
请求体:
{}
响应:
{"ok": true}
curl:
curl -s -X POST "http://HOST:8088/api/v1/disconnect" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d "{}"
/api/v1/acquisition/start开始温度采集。采集数据通过 WebSocket 推送。
前置条件: 已成功 connect,且 samplePoints、avgCount 均 > 0。
请求体:
{
"samplePoints": 16384,
"avgCount": 30000
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| samplePoints | number | 否 | 采样点数;省略则用当前值 |
| avgCount | number | 否 | 平均次数;省略则用当前值 |
响应:
{
"ok": true,
"message": "开始采集"
}
curl:
curl -s -X POST "http://HOST:8088/api/v1/acquisition/start" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"samplePoints":16384,"avgCount":30000}'
/api/v1/acquisition/stop停止采集。
请求体:
{}
响应:
{"ok": true}
curl:
curl -s -X POST "http://HOST:8088/api/v1/acquisition/stop" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d "{}"
/api/v1/config读取当前配置。
响应示例:
{
"samplePoints": 16384,
"avgCount": 30000,
"refTemp": 34.3,
"meterPerPoint": 0.4,
"attenEnabled": true,
"attenuations": [
{"channel": 1, "segStart": 0, "segEnd": 1000, "alphaDiff": 0.001, "offsetK": 0.0}
],
"calibrations": [
{"channel": 1, "position": 100, "sensitivity": 0.4, "compTemp": 25.0}
],
"channels": [
{
"channel": 1,
"startPos": 0,
"endPos": 5920,
"zeroMeter": 0,
"measureOffsetM": 0.0,
"meterPerPoint": 0.4,
"refTemp": 34.3,
"enabled": true,
"alias": "通道1"
}
],
"lightSource": {
"mode": 1,
"laserOn": 1,
"current": 40000,
"power": 2500,
"pulseWidth": 10,
"frequency": 10
},
"opticalSwitch": {"enabled": true},
"forwardTempEnabled": false,
"forwardTempUrl": "http://127.0.0.1:8080/api/temperature"
}
字段说明见 第 5 节 配置字段。
/api/v1/config更新配置,支持增量更新(只传需要修改的字段)。
注意:
POST /api/v1/light-source。samplePoints / avgCount 无法热更新,需先停止采集。请求体示例(修改通道与标定):
{
"refTemp": 34.3,
"meterPerPoint": 0.4,
"channels": [
{
"channel": 1,
"startPos": 0,
"endPos": 5920,
"zeroMeter": 0,
"measureOffsetM": 0.0,
"meterPerPoint": 0.4,
"refTemp": 34.3,
"enabled": true,
"alias": "通道1"
}
],
"calibrations": [
{"channel": 1, "position": 100, "sensitivity": 0.4, "compTemp": 25.0}
]
}
响应:
{"ok": true, "message": "配置已保存"}
curl:
curl -s -X POST "http://HOST:8088/api/v1/config" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"samplePoints":16384,"avgCount":30000,"refTemp":34.3}'
/api/v1/reload-config从设备重新加载配置文件。
请求体:
{}
响应:
{"ok": true, "message": "配置已加载"}
curl:
curl -s -X POST "http://HOST:8088/api/v1/reload-config" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d "{}"
/api/v1/optical-switch查询光开关状态。
响应:
{
"ok": true,
"enabled": true,
"connected": true,
"serialPort": "/dev/ttyS1",
"baudRate": 9600,
"currentChannel": 2,
"channelValid": true
}
| 字段 | 说明 |
|---|---|
| enabled | 是否启用多通道光开关 |
| connected | 是否已连接 |
| currentChannel | 当前通道号(0=未知) |
| channelValid | currentChannel 是否有效 |
/api/v1/optical-switch启用或禁用光开关。
请求体:
{
"enabled": true
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| enabled | bool | 是 | true=启用,false=禁用 |
响应:
{
"ok": true,
"enabled": true,
"connected": true,
"currentChannel": 1,
"channelValid": true,
"message": "光开关已启用"
}
curl:
curl -s -X POST "http://HOST:8088/api/v1/optical-switch" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled":true}'
/api/v1/light-source读取光源当前参数。
响应:
{
"ok": true,
"connected": true,
"dataValid": true,
"laserOn": 1,
"mode": 1,
"current": 40000,
"power": 2500,
"pulseWidth": 10,
"frequency": 10,
"readCurrent": 39500,
"readPower": 2480,
"moduleTemp": 34.5
}
| 字段 | 说明 |
|---|---|
| laserOn | 0=关,1=开 |
| mode | 0=ACC,1=APC |
| current | 设置电流 |
| power | 设置功率 |
| pulseWidth | 脉宽 (ns) |
| frequency | 频率 (kHz) |
| readCurrent / readPower / moduleTemp | 读回值(dataValid=false 时可能缺失) |
| dataValid | 是否成功从硬件读回实时值 |
/api/v1/light-source写入光源参数到硬件。
请求体:
{
"laserOn": 1,
"mode": 1,
"current": 40000,
"power": 2500,
"pulseWidth": 10,
"frequency": 10
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| laserOn | int | 否 | 0=关,1=开 |
| mode | int | 否 | 0=ACC,1=APC |
| current | int | 否 | 设置电流 |
| power | int | 否 | 设置功率 |
| pulseWidth | int | 否 | 脉宽 (ns) |
| frequency | int | 否 | 频率 (kHz) |
响应:
{
"ok": true,
"message": "光源参数已写入",
"connected": true,
"dataValid": true,
"laserOn": 1,
"mode": 1,
"current": 40000,
"power": 2500,
"pulseWidth": 10,
"frequency": 10,
"readCurrent": 39500,
"readPower": 2480,
"moduleTemp": 34.5
}
curl:
curl -s -X POST "http://HOST:8088/api/v1/light-source" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"laserOn":1,"mode":1,"current":40000,"power":2500,"pulseWidth":10,"frequency":10}'
/api/v1/alarms读取温度告警配置及当前告警状态。
响应:
{
"ok": true,
"enabled": true,
"channels": [
{"channel": 1, "enabled": true},
{"channel": 2, "enabled": false}
],
"partitions": [
{
"channel": 1,
"partitionId": 1,
"name": "区段A",
"startM": 150.0,
"endM": 4000.0,
"fixedTempEnabled": true,
"fixedTempThreshold": 60.0,
"diffTempEnabled": true,
"diffTempThreshold": 10.0,
"diffTempInterval": 3
}
],
"state": {"active": false}
}
| 字段 | 说明 |
|---|---|
| enabled | 全局是否启用告警 |
| channels[] | 各通道告警开关 |
| partitions[] | 告警分区,见 5.2 告警分区 |
| state.active | 当前是否处于告警状态 |
/api/v1/alarms保存告警配置,支持增量更新。state 字段会被忽略。
请求体示例:
{
"enabled": true,
"channels": [
{"channel": 1, "enabled": true}
],
"partitions": [
{
"channel": 1,
"partitionId": 1,
"name": "区段A",
"startM": 150.0,
"endM": 4000.0,
"fixedTempEnabled": true,
"fixedTempThreshold": 60.0,
"diffTempEnabled": true,
"diffTempThreshold": 10.0,
"diffTempInterval": 3
}
]
}
响应:
{"ok": true, "message": "告警配置已保存"}
curl:
curl -s -X POST "http://HOST:8088/api/v1/alarms" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled":true,"partitions":[{"channel":1,"partitionId":1,"name":"区段A","startM":150,"endM":4000,"fixedTempEnabled":true,"fixedTempThreshold":60,"diffTempEnabled":false,"diffTempThreshold":10,"diffTempInterval":3}]}'
/api/v1/alarms/acknowledge确认恢复告警,清除告警状态;WebSocket 会广播 active: false。
请求体:
{}
响应:
{"ok": true, "message": "告警已恢复"}
curl:
curl -s -X POST "http://HOST:8088/api/v1/alarms/acknowledge" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d "{}"
/api/v1/alarms/mute告警消音(关闭蜂鸣器),告警状态保持不变。
请求体:
{}
响应:
{"ok": true, "message": "告警已消音"}
curl:
curl -s -X POST "http://HOST:8088/api/v1/alarms/mute" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d "{}"
/api/v1/relay-linkage读取继电器联动配置。
响应:
{
"ok": true,
"enabled": true,
"serialPort": "/dev/ttyS0",
"baudRate": 115200,
"connected": true,
"states": [0, 1, 0, 0, 0, 0, 0, 0],
"rules": [
{
"relay": 1,
"alarmType": "火灾",
"channel": 1,
"startM": 0.0,
"endM": 4000.0
}
]
}
| 字段 | 说明 |
|---|---|
| enabled | 是否启用继电器联动 |
| connected | 继电器板是否已连接 |
| states | 8 路继电器状态:0=关,1=开,-1=未知 |
| rules[] | 联动规则列表 |
| rules[].relay | 继电器编号 1–8 |
| rules[].alarmType | 报警类型 |
| rules[].channel | 光纤通道号 |
| rules[].startM / endM | 有效距离区间 (m) |
/api/v1/relay-linkage保存继电器联动配置。connected 字段无需传入。
请求体示例:
{
"enabled": true,
"rules": [
{
"relay": 1,
"alarmType": "火灾",
"channel": 1,
"startM": 0.0,
"endM": 4000.0
}
]
}
响应:
{"ok": true, "message": "继电器配置已保存"}
curl:
curl -s -X POST "http://HOST:8088/api/v1/relay-linkage" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled":true,"rules":[{"relay":1,"alarmType":"火灾","channel":1,"startM":0,"endM":4000}]}'
/api/v1/network/ip查询设备主机 IP。
响应:
{
"ok": true,
"interface": "enp2s0",
"address": "192.168.68.4/24",
"gateway": "",
"available": true
}
| 字段 | 说明 |
|---|---|
| interface | 网口名称 |
| address | IPv4 地址(CIDR 格式) |
| gateway | 网关(可能为空) |
| available | 是否读取成功 |
/api/v1/network/ip修改设备主机 IP。调用成功后 HTTP 立即返回,网络可能短暂中断,需用新 IP 重连。
请求体:
{
"address": "192.168.68.4/24",
"gateway": "192.168.68.1"
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| address | string | 是 | CIDR 格式,如 192.168.68.4/24 |
| gateway | string | 否 | 默认网关;省略则不设置 |
响应:
{
"ok": true,
"message": "网络配置已保存..."
}
curl:
curl -s -X POST "http://HOST:8088/api/v1/network/ip" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"address":"192.168.68.4/24","gateway":"192.168.68.1"}'
ws://HOST:8088/ws/stream?token=TOKEN
或在握手请求头中携带:Authorization: Bearer TOKEN
调用 acquisition/start 且采样成功后推送:
{
"type": "frame",
"channel": 1,
"channelIndex": 0,
"timestamp": "2026-08-20T08:30:15",
"startPos": 0,
"meterPerPoint": 0.4,
"fiberLengthM": 5181.2,
"temperature": [34.1, 34.2],
"asCurve": [120.5, 118.3],
"rawA": [1000, 1002],
"rawB": [800, 798]
}
| 字段 | 说明 |
|---|---|
| channel | 通道编号 |
| channelIndex | 通道在配置数组中的下标 |
| timestamp | 采样时间(ISO8601,无毫秒) |
| startPos | 曲线起始点号 |
| meterPerPoint | 每点距离 (m) |
| fiberLengthM | 光缆长度 (m),失败时为 -1 |
| temperature | 温度数组 ℃ |
| asCurve | AS 曲线 |
| rawA / rawB | Stokes / Anti-Stokes 原始曲线 |
距离换算:
distanceM = (startPos + i - zeroMeter) * meterPerPoint
zeroMeter、meterPerPoint 来自该通道的 channels[] 配置。
触发:
{
"type": "alarm",
"active": true,
"hits": [
{
"channel": 1,
"partitionId": 1,
"name": "区段A",
"distanceM": 320.5,
"temperature": 62.3,
"fixedTemp": true,
"threshold": 60.0
}
]
}
恢复:
{
"type": "alarm",
"active": false,
"hits": []
}
| 字段 | 说明 |
|---|---|
| active | 是否处于告警状态 |
| hits[].channel | 通道号 |
| hits[].partitionId | 分区编号 |
| hits[].name | 分区名称 |
| hits[].distanceM | 告警位置 (m) |
| hits[].temperature | 当前温度 ℃ |
| hits[].fixedTemp | true=定温,false=差温 |
| hits[].threshold | 触发阈值 ℃ |
客户端收到 active: true 时更新 UI;用户确认后调用 POST /api/v1/alarms/acknowledge。
| 字段 | 类型 | 说明 |
|---|---|---|
| channel | int | 通道号 |
| startPos | int | 计算起始点号 |
| endPos | int | 计算结束点号(0=到末尾) |
| zeroMeter | int | 0 米标定对应的点号 |
| measureOffsetM | number | 铠装起点偏移 (m) |
| meterPerPoint | number | 每点距离 (m) |
| refTemp | number | 参考温度 ℃ |
| enabled | bool | 多通道模式下是否参与轮询 |
| alias | string | 通道别名 |
| 字段 | 类型 | 说明 |
|---|---|---|
| channel | int | 所属通道号 |
| partitionId | int | 分区编号 |
| name | string | 分区名称 |
| startM / endM | number | 报警区间 (m) |
| fixedTempEnabled | bool | 是否启用定温报警 |
| fixedTempThreshold | number | 定温阈值 ℃ |
| diffTempEnabled | bool | 是否启用差温报警 |
| diffTempThreshold | number | 差温阈值 ℃ |
| diffTempInterval | int | 差温比较间隔(连续采样次数) |
| 字段 | 说明 |
|---|---|
| samplePoints | 采样点数 |
| avgCount | 平均次数 |
| refTemp | 全局参考温度 ℃ |
| meterPerPoint | 全局每点距离 (m) |
| attenEnabled | 是否启用衰减补偿 |
| attenuations[] | 衰减段:channel, segStart, segEnd, alphaDiff, offsetK |
| calibrations[] | 标定点:channel, position, sensitivity, compTemp |
| forwardTempEnabled | 是否向第三方 URL 转发温度 |
| forwardTempUrl | 转发目标 URL |
HOST="192.168.68.4"
TOKEN="glgyzn-dts-token"
# 1. 健康检查
curl -s "http://${HOST}:8088/api/v1/health" -H "Authorization: Bearer ${TOKEN}"
# 2. 连接
curl -s -X POST "http://${HOST}:8088/api/v1/connect" \
-H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" -d "{}"
# 3. 查询状态
curl -s "http://${HOST}:8088/api/v1/status" -H "Authorization: Bearer ${TOKEN}"
# 4. 开始采集
curl -s -X POST "http://${HOST}:8088/api/v1/acquisition/start" \
-H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" \
-d '{"samplePoints":16384,"avgCount":30000}'
const host = "192.168.68.4";
const token = "glgyzn-dts-token";
const ws = new WebSocket(`ws://${host}:8088/ws/stream?token=${encodeURIComponent(token)}`);
ws.onmessage = (ev) => {
const msg = JSON.parse(ev.data);
if (msg.type === "frame") {
console.log(`通道 ${msg.channel},温度点数 ${msg.temperature.length}`);
} else if (msg.type === "alarm") {
console.log(`告警 active=${msg.active}`, msg.hits);
}
};
import json, urllib.request
host, token = "192.168.68.4", "glgyzn-dts-token"
req = urllib.request.Request(
f"http://{host}:8088/api/v1/config",
headers={"Authorization": f"Bearer {token}"},
)
with urllib.request.urlopen(req) as r:
cfg = json.load(r)
print(cfg["samplePoints"], cfg["channels"])
| 问题 | 说明 |
|---|---|
| 401 unauthorized | Token 不正确或未携带 |
| connect 超时 | 首次连接较慢,增大 HTTP 超时(建议 60–90s) |
| 404 not found | 路径错误或方法不对 |
| 修改 IP 后连不上 | 使用新 IP 重新连接 |
| 停止采集后 reading 仍为 true | acquisition/stop 异步生效,轮询 GET /status 直到 reading=false |
文档版本:2026-08-23