🌐 WebAPI 控制
每个 DaqAbstract 子类自动支持 6 个内置 REST 端点用于远程控制。这些端点由 DAQ 实例内的 HttpServiceOperate 托管。
6个 REST 端点
| 路由 | 方法 | 请求体 | 描述 |
|---|---|---|---|
/api/on |
POST | 无 | 打开设备连接 |
/api/off |
POST | 无 | 关闭设备连接 |
/api/read |
POST | Address JSON |
从设备读取数据 |
/api/write |
POST | WriteModel 字典 JSON |
向设备写入数据 |
/api/getstatus |
POST | 无 | 获取连接状态 |
/api/switchlanguage |
POST | 无 | 切换中/英文语言 |
启动 WebAPI 服务器
使用 WAOnAsync 在指定端口上启动 HTTP 服务器:
var modbus = await ModbusOperate.InstanceAsync(basics);
var wam = new WAModel
{
Port = 6688, // 默认端口(按约定与设备端口匹配)
IpAddress = "127.0.0.1" // 绑定到所有接口("+" = http://+:6688/)
};
var result = await modbus.WAOnAsync(wam);
if (result.Status)
{
Console.WriteLine($"WebAPI started on port {wam.Port}");
}
停止 WebAPI 服务器
var result = await modbus.WAOffAsync();
检查 WebAPI 状态
var status = await modbus.WAStatusAsync();
Console.WriteLine($"WebAPI running: {status.Status}, {status.Message}");
WebAPI 请求示例
通过 HTTP 读取数据
POST /api/read HTTP/1.1
Content-Type: application/json
{
"SN": "8c71f4a7-04eb-4f9c-88d9-849c2f0c3a00",
"AddressArray": [
{
"SN": "TestAddress",
"AddressName": "M100",
"AddressDataType": "Float"
}
],
"CreationTime": "2024-06-05T13:01:24.6245462+08:00"
}
响应:JSON 格式的 OperateResult,包含 Status、Message、RunTime 和 ResultData。
通过 HTTP 写入数据
POST /api/write HTTP/1.1
Content-Type: application/json
{
"M100": {
"Value": 99.1,
"AddressDataType": "Float"
}
}
打开/关闭/状态(无请求体)
curl -X POST http://localhost:6688/api/on
curl -X POST http://localhost:6688/api/getstatus
curl -X POST http://localhost:6688/api/off
工作原理
WAOnAsync 创建一个 HttpServiceOperate 实例并为每个端点路径注册处理程序:
// 在 DaqAbstract.WAOnAsync() 内部
var routes = new List<string>
{
"/api/on",
"/api/off",
"/api/read",
"/api/write",
"/api/getstatus",
"/api/switchlanguage"
};
// 每个路由分发到对应的抽象方法:
// /api/on -> OnAsync()
// /api/read -> ReadAsync(parsedAddress)
// 等等.
HttpServiceOperate.OnDataEventAsync 被连接到路由分发器,该分发器解析请求体,调用相应的抽象方法,并将 OperateResult 写入 HTTP 响应。
安全注意事项
- WebAPI 是可选的 -- 仅在显式调用
WAOnAsync时运行 - 没有内置身份验证;请使用反向代理(nginx、IIS)进行认证
- 默认绑定地址
"+"会在所有网络接口上暴露 API - 对于生产环境,请绑定到
"localhost"并在前面使用安全代理
WARequestExample
获取每个端点的示例请求负载:
var example = await modbus.WARequestExampleAsync();
// example.ResultData 包含所有 6 个端点的格式化 JSON 示例
