Skip to content

WebSocket 的使用

更新时间:

平台提供 WebSocket 方式订阅消息的功能,可以通过 WebSocket 来订阅设备、规则、告警等相关消息。

建立连接

WebSocket 统一接口为:/api/messaging/{token}token 可通过登录超级设备管理平台获取 。

订阅消息

  1. 生成随机13位数
js
randomNum = Math.random().toFixed(13).slice(-13)
randomNum = Math.random().toFixed(13).slice(-13)
  1. 向 Websocket 发送消息,格式为:
json
{
    "type": "sub",    //固定为 sub
    "topic": "topic", // topic ,见 topic 列表
    "parameter": {},      //参数,不同的订阅请求,支持的参数不同
    "id": "request-id" + randomNum //请求 Id ,服务端在推送消息时,会将此标识一并返回
}
{
    "type": "sub",    //固定为 sub
    "topic": "topic", // topic ,见 topic 列表
    "parameter": {},      //参数,不同的订阅请求,支持的参数不同
    "id": "request-id" + randomNum //请求 Id ,服务端在推送消息时,会将此标识一并返回
}

在取消订阅之前,多次传入相同的id是无效的,不会重复订阅。

取消订阅

向 WebSocket 发送消息,格式为:

json
{
    "type":"unsub",     //固定为 unsub
    "id": "request-id" //与订阅请求 Id 一致
}
{
    "type":"unsub",     //固定为 unsub
    "id": "request-id" //与订阅请求 Id 一致
}

示例

以前端 html 为例,建立连接以及订阅设备属性上报的代码如下:

html
<html>
    <script>
        var url = "wss://console.kaihong.com/api/messaging/{token}";
        var ws = new WebSocket(url);
        ws.onclose = function (e) {
            console.log(e)
        };
        ws.onmessage = function (e) {
            console.log(e.data)
        }
        var json = {
            "type": "sub", // 固定为 sub
            "topic": "/device/{productId}/{deviceId}/message/property/report", // 指定设备属性上报的 topic
            "parameter": {}, // 订阅的参数
            "id": "request-id-" + Math.random().toFixed(13).slice(-13) // 请求 id
        };
        ws.onopen = function (e) {
            console.log("open start");
            console.log(JSON.stringify(json))
            ws.send(JSON.stringify(json))
            console.log("open end")
        }
    </script>
</html>
<html>
    <script>
        var url = "wss://console.kaihong.com/api/messaging/{token}";
        var ws = new WebSocket(url);
        ws.onclose = function (e) {
            console.log(e)
        };
        ws.onmessage = function (e) {
            console.log(e.data)
        }
        var json = {
            "type": "sub", // 固定为 sub
            "topic": "/device/{productId}/{deviceId}/message/property/report", // 指定设备属性上报的 topic
            "parameter": {}, // 订阅的参数
            "id": "request-id-" + Math.random().toFixed(13).slice(-13) // 请求 id
        };
        ws.onopen = function (e) {
            console.log("open start");
            console.log(JSON.stringify(json))
            ws.send(JSON.stringify(json))
            console.log("open end")
        }
    </script>
</html>

若使用http进行私有化部署,则url替换如下:

html
var url = "ws://域名/api/messaging/{token}";
var url = "ws://域名/api/messaging/{token}";
  • url 为 WebSocket 的地址,其中:

    • ip :部署的超级设备管理平台的 IP 地址
    • port:部署的超级设备管理平台前端的端口号
    • token:登录超级设备管理平台获取的 token
  • /device/{productId}/{deviceId}/message/property/report 为订阅指定设备属性上报的 Topic ,其中, productIddeviceId 为设备的产品 Id 和设备 Id 。具体的 topic 列表参见 Topic列表

如果认证失败,会立即返回消息并且断开连接,消息格式如下:

json
{
    "message":"认证失败",
    "type":"authError"
}
{
    "message":"认证失败",
    "type":"authError"
}