主题
4.5 调用示例
完整可运行的对接示例。所有请求都是 POST /web,body 是带 cmd 的 JSON,认证靠 body 里的 username/password(详见 4.1)。
没有登录接口、没有 Token
服务器不提供 /api/login,也不使用 Bearer Token。每个请求自带账号密码即可。
4.5.1 curl
bash
# 读取两个数据点
curl -X POST http://192.168.1.100/web \
-H "Content-Type: application/json" \
-d '{
"cmd": "get_real",
"username": "linpan",
"password": "你的密码",
"project": "main",
"data": ["车间1/1号机/温度", "车间1/1号机/湿度"]
}'
# 写入一个数据点(远程启停设备)
curl -X POST http://192.168.1.100/web \
-H "Content-Type: application/json" \
-d '{
"cmd": "set_real",
"username": "linpan",
"password": "你的密码",
"project": "main",
"data": [{"name":"车间1/1号机/启停","value":"1"}]
}'4.5.2 Python
python
import requests
URL = "http://192.168.1.100/web" # 公网请用 https://
AUTH = {"username": "linpan", "password": "你的密码"}
def call(cmd, **kw):
r = requests.post(URL, json={"cmd": cmd, **AUTH, **kw}, timeout=10)
r.raise_for_status()
data = r.json()
if data.get("cmdreq") != "ok": # 业务成功要看 cmdreq,不是 HTTP 状态码
raise RuntimeError(f"{cmd} 失败: {data.get('cmdreq')}")
return data
# 读
res = call("get_real", project="main",
data=["车间1/1号机/温度", "车间1/1号机/湿度"])
for p in res["data"]:
print(p["name"], p["value"])
# 写(远程控制)
call("set_real", project="main",
data=[{"name": "车间1/1号机/启停", "value": "1"}])
# 直读 PLC 寄存器:D0 起 7 个,16 位整数
res = call("plc_data_read", id="11315751", reg="D0", type=1, length=7)
print(res["data"])4.5.3 Node.js
javascript
const URL = 'http://192.168.1.100/web' // 公网请用 https://
const AUTH = { username: 'linpan', password: '你的密码' }
async function call(cmd, extra = {}) {
const resp = await fetch(URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ cmd, ...AUTH, ...extra }),
})
const data = await resp.json()
if (data.cmdreq !== 'ok') throw new Error(`${cmd} 失败: ${data.cmdreq}`)
return data
}
// 读
const res = await call('get_real', {
project: 'main',
data: ['车间1/1号机/温度'],
})
console.log(res.data)
// 写
await call('set_real', {
project: 'main',
data: [{ name: '车间1/1号机/启停', value: '1' }],
})4.5.4 常见对接场景
MES / ERP 定时抓取产量
python
# 每分钟拉一次关键数据点,写入自己的数据库
res = call("get_real", project="main",
data=["产线1/产量", "产线1/良品数", "产线1/OEE"])
save_to_my_db(res["data"])后台程序下发批次配方
python
# 把一批设定值一次性写下去
call("set_real", project="main", client="MES", data=[
{"name": "产线1/温度设定", "value": "180"},
{"name": "产线1/速度设定", "value": "45"},
{"name": "产线1/批次号", "value": "B20260814"},
])看板系统定时刷新
python
# 不知道有哪些点时先列出来,再挑需要的
lst = call("get_real_list", project="main", limit=200, offset=0)4.5.5 对接要点
- 判断成功看
cmdreq == "ok",不要只看 HTTP 200 - 值都是字符串,数值比较前需先转换类型
- 高频刷新(秒级)应改用 WebSocket 或 MQTT,不要循环轮询 HTTP
- 给对接程序单独开子账号,公网必须走 HTTPS