iot feeds
- iotwrt 基础库,提供 JSON,网络通讯相关,基于 cJSON 和 mongoose。编译后输出含 ssl 和不含 ssl 支持两个版本的动态库供调用。
- rpc 消息 broker,为本地 iot-rpcd,iot-httpd,iot-agent 提供 mqtt 通讯服务。同时为远程 iot-agent 提供 mqtts 通讯服务。
- rpcd 服务端,南向调用 iot-rpc 实现的 lua 业务脚本,北向为本地 iot-http 和远程 iot-agent 提供服务。
- 实现业务逻辑的 lua 脚本,被 iot-rpcd 调用。
- http(s)服务器,将 iot-rpcd 服务以 http api 方式提供给外部调用。
- 远程 rpc 调用 agent,可供远端调用本地 rpc 接口。
- 远程 rpc 调用 controller,管理连接到本地的 agent。
- 服务发现server 和 client。
- 规则引擎服务,用于简化事件及动作关联逻辑
- uri
/api
- 格式
{
method : "method_name",
param : [] or {}
}
- 格式
{
code : 0 or other,
method : "method_name",
data : [] or {}
}
- 说明:
- 0 表示成功 其他失败
- method [可选,用于回复回调路由]
-
调用 login 方法登录前,必须先调用 challenge 方法获取预登陆 nonce
-
预登陆 nonce 用于防攻击,nonce 是后端生成的 32 位随机字符串
-
nonce 默认 10 秒超时,因此该接口请求成功后应立即请求 login
-
请求
POST http://<host>[:<port>]/api
{
"method": "challenge",
"param": {
"username": "admin"
}
}
- 响应
{
"data": {
"username": "admin",
"nonce": "<nonce>"
},
"method": "challenge",
"code": 0
}
-
前端密码计算方式: password=md5(md5(username:raw_password):nonce)
-
前端计算 password 所用的 nonce 在 challenge 阶段获取
-
成功返回 token,默认五分钟超时,用于鉴权,可用以下两种方法之一传递:
- Cookie: access_token: token
- Header: Authorization: Bearer token
-
请求
POST http://<host>[:<port>]/api
{
"method": "login",
"param": {
"username": "admin",
"password": "{{password}}"
}
}
- 响应
{
"data": {
"token": "<token>",
"username": "admin"
},
"method": "login",
"code": 0
}
- 退出登录调用此接口 以保证后端 token 刷新
POST http://<host>[:<port>]/api
{
"method": "logout"
}
- 框架提供的修改密码接口
POST http://<host>[:<port>]/api
{
"method": "change_password",
"param": {
"username": "admin",
"password": "<password>"
}
}
- upload.html.sample
- -10000: 未登陆
- -10001: 参数错误
- -10002: 服务不可用
- -10003: 接口禁止调用
- -10004: 回复错误
- -10005: 频繁登录
-
当前主要提供 HTTP API 接口,如需要通过 MQTT 协议直接调用业务逻辑,可通过如下方式:
- 和本机 iot-rpcd 通信(调用本机 iot-rpc 实现的业务接口)
1. publish 请求如:'{"method": "method_name", "param" : [] or {} }' 到主题 mg/{app_topic_prefix}/iot-rpcd 2. subscribe 主题 mg/{app_topic_prefix} 用来接收回复, iot-rpcd会将回复publish到主题mg/{app_topic_prefix} 3. 可以通过app_topic_prefix 传递请求id等业务信息,具体参考iot-http和iot-rpcd的主题设计实现 4. 注:{app_topic_prefix}的不要和内置业务主题冲突。
- 和远程 iot-rpcd 通信(调用远端 iot-rpc 实现的业务接口,如在 ac 上直接调用 ap 实现的业务接口)
1. 被控端设备(如ap)的iot-agent使用-u {devid}参数 连接到控制端(如ac) 2. 控制端publish 请求如:'{"method": "method_name", "param" : [] or {} }' 到主题 device/{devid}/rpc/request/{app_topic_prefix}/{reqid} 3. 控制端subscribe 主题 device/+/rpc/response/{app_topic_prefix}/+ 用来接收回复, 被控端iot-agent会将回复publish到主题 device/{devid}/rpc/response/{app_topic_prefix}/{reqid}
- 和 iot-mqtt 通讯(目前支持获取 client 列表)
1. publish请求如:'{"method": "method_name", "param" : [] or {} }' 到主题 mg/{app_topic_prefix}/$iot-mqtt 2. subscribe 主题 mg/{app_topic_prefix} 用来接收回复。 iot-mqtt会将回复publish到主题mg/{app_topic_prefix}
-
某些场景需要 iot-rpcd 将请求或指令直接透传给其他程序处理,可以在 request 中携带 proxy 字段,字段值为接收主题,有该字段时,iot-rpcd 直接将请求体 pub 到指定主题,不再调用 lua 业务逻辑处理,如:
{ "method": "method_name", "proxy": "proxy_topic_name", "param" : [] or {} } 此请求将被iot-rpcd直接通过mqtt协议转发到proxy_topic_name,不再调用iot-rpc.lua处理。
-
订阅 proxy_topic_name 主题的应用将收到:
{ "method": "method_name", "proxy": "proxy_topic_name", "topic": "topic_name", "param" : [] or {} } 应用实现的cgi将业务逻辑要回复给前端的结果publish到主题topic_name
- HTTP API 接口满足立即返回全部结果的场景,某些场景是一次调用,持续多次返回结果的情况,如排障功能调用 ping 命令,需要持续返回 ping 结果给前端,避免前端卡死等待和前端多次请求,可以使用 websocket 的方式,后台主动推送结果给前端。
- uri
/websocket
本机调用
/device/{devid}/websocket
远程调用
{
method : "method_name",
param : [] or {}
}
- 格式
{
code : 0 or other,
method : "method_name",
data : [] or {}
}
- iot-rpc.lua 接收到参数如下【相对于原始请求参数自动增加了 topic 字段,用于发送回复结果】:
{
method : "method_name",
param : [] or {},
topic : "topic_name"
}
- lua 实现的 cgi 将业务逻辑要回复给前端的结果 publish 到主题 topic_name.
- 注:可以在 requset 中增加自定义字段,关联前端业务请求会话,即将 requeset 和 response 进行业务逻辑关联。