Files
arcs/arcs-sdk/components/lisa_websocket/lisa_websocket.h
2026-08-13 16:50:52 +08:00

235 lines
7.0 KiB
C
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file lisa_websocket.h
* @brief LISA SDK 的 WebSocket 客户端 API
*
* 此文件提供 LISA SDK 的 WebSocket 客户端接口,
* 支持安全和非安全的 WebSocket 连接,采用事件驱动架构和异步数据处理。
*/
#ifndef __LISA_WEBSOCKET__
#define __LISA_WEBSOCKET__
#include <string.h>
#include <stdint.h>
#include "lisa_err.h"
/**
* @brief 单元测试的测试结果常量
*
* 这些常量定义了单元测试的可能结果。
*/
#define LISA_TEST_PASS (int32_t)(1) /**< 测试通过 */
#define LISA_TEST_FAILED (int32_t)(0) /**< 测试失败 */
/**
* @brief 单元测试结果类型
*
* 单元测试结果的类型别名,表示成功或失败。
*/
typedef int32_t unit_test_result_t;
/**
* @brief WebSocket 操作结果代码
*
* WebSocket 操作可能的返回值枚举。
*/
typedef enum {
LISA_WS_OK = 0, /**< 操作成功完成 */
LISA_WS_COMMON_ERR, /**< 发生一般错误 */
LISA_WS_DISCONNECT, /**< WebSocket 连接断开 */
} lisa_ws_err_e;
/**
* @brief WebSocket 事件类型
*
* WebSocket 连接生命周期中可能触发的事件类型枚举。
*/
typedef enum {
LISA_WS_ON_ERROR, /**< 发生错误事件 */
LISA_WS_ON_HEADER, /**< 收到头部信息(可能发生多次) */
LISA_WS_ON_CONNECTED, /**< 连接建立成功 */
LISA_WS_ON_CONNECTING, /**< 连接进行中 */
LISA_WS_ON_DISCONNECTED, /**< 连接终止 */
} lisa_ws_event_e;
/**
* @brief WebSocket 事件结构
*
* 包含 WebSocket 事件信息的结构。
*/
typedef struct {
lisa_ws_event_e what; /**< 发生的事件类型 */
void *user; /**< 传递给回调函数的用户定义数据 */
} lisa_ws_event_t;
/**
* @brief WebSocket 数据类型
*
* 支持的 WebSocket 数据传输类型枚举。
*/
typedef enum {
LISA_WS_TEXT, /**< 文本数据UTF-8 编码) */
LISA_WS_BIN, /**< 二进制数据 */
} lisa_ws_data_type_e;
/**
* @brief WebSocket 数据结构
*
* 包含从服务器接收的 WebSocket 数据的结构。
*/
typedef struct {
lisa_ws_data_type_e type; /**< 数据类型 */
const void *buf; /**< 数据缓冲区指针 */
uint32_t len; /**< 数据长度(字节) */
void *user; /**< 传递给回调函数的用户定义数据 */
} lisa_ws_data_t;
/**
* @brief WebSocket 连接请求配置
*
* 包含建立 WebSocket 连接所需的所有参数的结构。
*/
typedef struct {
uint8_t *scheme; /**< 连接方案:"ws" 用于非安全连接,"wss" 用于安全连接 */
uint8_t *host; /**< 服务器主机名或 IP 地址 */
uint8_t *path; /**< 服务器路径(例如:"/websocket" */
uint8_t *port; /**< 服务器端口号 */
uint32_t timeout; /**< 连接超时时间(毫秒) */
const char *extra_header; /**< 握手期间发送的额外 HTTP 头部 */
void *user; /**< 传递给事件回调函数的用户定义数据 */
void (*on_event)(lisa_ws_event_t *event); /**< WebSocket 事件的回调函数 */
void (*on_data)(lisa_ws_data_t *data); /**< 接收数据的回调函数 */
} lisa_ws_request_t;
/**
* @brief URL 信息结构
*
* 包含解析后的 WebSocket URL 组件的结构。
*/
typedef struct {
uint8_t scheme[16]; /**< 连接方案:"ws" 或 "wss" */
uint8_t host[512]; /**< 服务器主机名或 IP 地址 */
uint8_t path[1024]; /**< 服务器路径 */
uint8_t port[16]; /**< 服务器端口号 */
} url_info_t;
/**
* @brief WebSocket 实例句柄
*
* 表示 WebSocket 连接实例的不透明结构。
*/
typedef struct lisa_ws lisa_ws_t;
/**
* @brief 初始化 WebSocket 实例
*
* 使用提供的配置创建并初始化新的 WebSocket 实例。
* 如果 req 为 NULL将使用默认配置。
*
* @param req WebSocket 请求配置结构体指针(可以为 NULL
* @return 新的 WebSocket 实例指针,失败时返回 NULL
*/
lisa_ws_t *lisa_ws_init(lisa_ws_request_t *req);
/**
* @brief 创建使用默认配置的新 WebSocket 实例
*
* 便利函数,创建使用默认设置的新 WebSocket 实例。
*
* @return 新的 WebSocket 实例指针,失败时返回 NULL
*/
static inline lisa_ws_t *lisa_ws_new()
{
return lisa_ws_init(NULL);
}
/**
* @brief 连接到 WebSocket 服务器
*
* 建立到配置中指定的服务器的 WebSocket 连接。
*
* @param ins WebSocket 实例指针
* @return 成功时返回 LISA_WS_OK失败时返回错误代码
*/
lisa_ws_err_e lisa_ws_connect(lisa_ws_t *ins);
/**
* @brief 从 WebSocket 服务器断开连接
*
* 优雅地关闭 WebSocket 连接并释放连接资源。
*
* @param ins WebSocket 实例指针
* @return 成功时返回 LISA_WS_OK失败时返回错误代码
*/
lisa_ws_err_e lisa_ws_disconnect(lisa_ws_t *ins);
/**
* @brief 发送文本数据
*
* 向 WebSocket 服务器发送文本消息UTF-8 编码)。
*
* @param ins WebSocket 实例指针
* @param text 要发送的文本消息(以 null 结尾的 UTF-8 字符串)
* @return 成功时返回 LISA_WS_OK失败时返回错误代码
*/
lisa_ws_err_e lisa_ws_send_text(lisa_ws_t *ins, const uint8_t *text);
/**
* @brief 发送二进制数据
*
* 向 WebSocket 服务器发送二进制数据。
*
* @param ins WebSocket 实例指针
* @param buf 二进制数据缓冲区指针
* @param len 数据长度(字节)
* @return 成功时返回 LISA_WS_OK失败时返回错误代码
*/
lisa_ws_err_e lisa_ws_send_binary(lisa_ws_t *ins, const void *buf, uint32_t len);
/**
* @brief 清理 WebSocket 实例
*
* 释放与 WebSocket 实例关联的所有资源并关闭任何活动连接。
*
* @param ins WebSocket 实例指针
* @return 成功时返回 LISA_WS_OK失败时返回错误代码
*/
lisa_ws_err_e lisa_ws_cleanup(lisa_ws_t *ins);
/**
* @brief 删除 WebSocket 实例
*
* 便利函数,清理并删除 WebSocket 实例。
*
* @param ins WebSocket 实例指针
* @return 成功时返回 LISA_WS_OK失败时返回错误代码
*/
static inline lisa_ws_err_e lisa_ws_delete(lisa_ws_t *ins)
{
return lisa_ws_cleanup(ins);
}
/**
* @brief 获取 WebSocket 配置
*
* 检索 WebSocket 实例的当前配置。
*
* @param ws WebSocket 实例指针
* @param req 用于接收配置的结构体指针
* @return 成功时返回 LISA_WS_OK失败时返回错误代码
*/
lisa_ws_err_e lisa_ws_cfg_get(lisa_ws_t *ws, lisa_ws_request_t *req);
/**
* @brief 设置 WebSocket 配置
*
* 更新 WebSocket 实例的配置。
*
* @param ws WebSocket 实例指针
* @param req 新配置结构体指针
* @return 成功时返回 LISA_WS_OK失败时返回错误代码
*/
lisa_ws_err_e lisa_ws_cfg_set(lisa_ws_t *ws, lisa_ws_request_t *req);
#endif //__LISA_WEBSOCKET__