2025-11-14 15:44:41 +08:00
2025-11-14 15:44:41 +08:00
2025-11-12 23:26:47 +08:00
2025-04-18 15:02:26 +08:00
fix
2025-05-07 15:01:34 +08:00
fix
2025-04-21 17:13:24 +08:00
2025-04-18 15:02:26 +08:00
fix
2025-09-17 16:01:58 +08:00
2025-11-14 15:44:41 +08:00
2025-09-23 11:07:18 +08:00
run
2025-04-18 17:38:04 +08:00

ws_channel 模块 API 文档与交互逻辑

注意websocket的数据格式为: text

一、模块概述

ws_channel 是基于 Erlang + Cowboy WebSocket 实现的 MQTT 相关交互模块,主要用于服务注册、主题订阅、指标数据上报、事件发送及消息广播等功能,通过 WebSocket 协议实现客户端与服务端的实时双向通信。

三、核心 API 方法

客户端通过发送 JSON 格式文本消息 与服务端交互,消息格式遵循 JSON-RPC 风格(包含 idmethodparams 字段)。

1. 服务注册register

功能

注册服务并建立客户端与服务进程的关联,是后续操作(订阅、上报数据等)的前提。

请求格式

{
  "id": <整数,请求唯一标识>,
  "method": "register",
  "params": {
    "service_id": <二进制,服务唯一标识,必填>,
    "meta_data": <映射,服务元数据,可选>,
    "container_name": <二进制,容器名称,可选>
  }
}

响应格式

  • 成功响应:
    {
      "id": <与请求id一致>,
      "result": "ok"
    }
    
  • 失败处理:服务端直接关闭连接(因 attach_channel 失败)

2. 主题订阅subscribe

功能

订阅指定主题,后续可接收该主题的广播消息。

请求格式

{
  "id": <整数,请求唯一标识>,
  "method": "subscribe",
  "params": {
    "topic": <二进制,订阅的主题名称,必填>
  }
}

响应格式

  • 成功响应:
    {
      "id": <与请求id一致>,
      "result": "ok"
    }
    
  • 失败响应:
    {
      "id": <与请求id一致>,
      "error": {
        "code": -1,
        "message": "错误描述"
      }
    }
    

处理逻辑

通过 efka_subscription:subscribe(Topic, self()) 完成订阅,订阅成功后客户端会收到该主题的广播消息。

3. 指标数据上报metric_data

功能

向服务进程上报设备指标数据。

请求格式

{
  "method": "metric_data",
  "params": {
    "route_key": <二进制,路由键,必填>,
    "metric": <指标数据,必填>
  }
}

响应处理

服务端接收后无返回消息(处理逻辑:efka_service:metric_data(ServicePid, DeviceUUID, RouteKey, Metric)

五、基础交互协议

  1. Ping/Pong 心跳

    • 客户端发送 ping 消息
    • 服务端回复 pong 消息,维持连接
  2. 未知消息处理

    • 客户端发送未定义格式的消息时,服务端记录错误并关闭连接

七、典型交互流程

  1. 客户端发起 WebSocket 连接
  2. 客户端发送 register 请求完成注册
  3. 客户端发送 subscribe 请求订阅目标主题
  4. 客户端通过 metric_data 上报指标数据 / 通过 event 发送事件
  5. 服务端向客户端推送已订阅主题的消息(publish 方法)
  6. 连接关闭(主动断开或异常终止)
Description
基于erlang的efka实现
Readme Pixar 4 MiB
Languages
Erlang 99.8%
Shell 0.2%