有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
低功耗设备使用低功耗保活模块使设备在主控断电或深度睡眠后自主维持保活连接。

功能介绍

本模块提供设备进入低功耗保活的前置工作,通过调用该模块会使设备发起和保活服务器的保活连接,建立保活链路。通过将成功建立的链路以及唤醒和维持心跳所需的数据传递给应用层,以便于应用层进行其他处理。

流程

进入保活

调用进入低功耗保活接口 > 生成唤醒数据和心跳数据和认证请求 > 返回保活数据到应用层 > 建立保活链路 > 进行硬件处理进行保活。

唤醒(无 SDK 软件参与,硬件保活模块完成)

远端下发唤醒指令(eg:监控) > 服务器发送唤醒码 > 硬件保活模块 > 输出唤醒信号 > 唤醒主控。

接口参考

低功耗保活模块提供以下接口:
iv_get_keep_alive_info:获取保活通路相关数据(保活链路、唤醒数据、心跳数据).

iv_get_keep_alive_info

接口描述 获取保活通路数据。
int iv_ka_get_keep_alive_info(struct iv_keep_alive_info_s* pkeep_alive_info);
参数说明
参数名称
类型
描述
输入/输出
pkeep_alive_info
struct iv_keep_alive_info_s*
保活通路相关信息。
输出
返回值
返回值
描述/处理
IV_ERR_NONE
成功。
IV_ERR_KA_NO_SERVER_FOUND
失败,检查设备上线,网络顺畅。
IV_ERR_KA_MSG_BUFF_TOO_SMALL
失败,检查传入 buff 是否过小。

数据结构

低功耗保活模块提供以下数据结构
iv_keep_alive_info_s:低功耗保活通路相关信息数据结构体。

iv_keep_alive_info_s

接口描述
复制低功耗保活通路所需的相关信息数据集合。
typedef struct iv_keep_alive_info_s{
unsigned int server_cnt;
iv_ka_server_addr_s server_list[KA_SERV_MAX_CNT];
unsigned char auth_msg[KA_SERV_MAX_CNT][128];
unsigned int auth_msg_len[KA_SERV_MAX_CNT];
unsigned char heart_beat_msg[KA_SERV_MAX_CNT][16];
unsigned int heart_beat_msg_len[KA_SERV_MAX_CNT];
unsigned char wake_up_msg[KA_SERV_MAX_CNT][16];
unsigned int wake_up_msg_len[KA_SERV_MAX_CNT];
}iv_keep_alive_info_s;
参数说明
成员名称
描述
取值
server_cnt
可用的保活服务器数量
[0,KA_SERV_MAX_CNT)
iv_ka_server_addr_s
可用的保活服务器地址端口信息
-
auth_msg
需要和服务器建立保活通路的认证数据
无限制
auth_msg_len
需要和服务器建立保活通路的认证数据的长度
无限制
heart_beat_msg
需要设置到保活硬件维持心跳的数据
无限制
heart_beat_msg_len
需要设置到保活硬件维持心跳的数据长度
无限制
wake_up_msg
需要设置到保活硬件的唤醒消息。使其收到该消息时能够生成唤醒信号
无限制
wake_up_msg_len
需要设置到保活硬件的唤醒消息长度
无限制

示例代码

static struct iv_keep_alive_info_s g_keep_alive_info;
int ka_go_low_power_keep_alive(void)
{
struct iv_keep_alive_info_s* pkeep_alive_info = &g_keep_alive_ctx.info;
int ret = 0;
memset(&g_keep_alive_ctx,0,sizeof(g_keep_alive_ctx));
for(int i = 0;i<KA_SERV_MAX_CNT;i++)
{
pkeep_alive_info->auth_msg_len[i] = sizeof(pkeep_alive_info->auth_msg[i]);
pkeep_alive_info->heart_beat_msg_len[i] = sizeof(pkeep_alive_info->heart_beat_msg[i]);
pkeep_alive_info->wake_up_msg_len[i] = sizeof(pkeep_alive_info->wake_up_msg[i]);
}
if((ret = iv_ka_get_keep_alive_info(pkeep_alive_info)) != IV_ERR_NONE)
{
GDB_INFO("get keep alive info fail:%d\\n",ret);
return -1;
}
filter_keep_alive_server(&g_keep_alive_ctx);
ka_set_keep_alive_switch_hi1131(&g_keep_alive_ctx,true);//set keep alive data and set wifi modeule suspend
return 0;
}

int ka_exit_low_power_keep_alive(void)
{
ka_set_keep_alive_switch_hi1131(NULL,false);
for(int i = 0;i < g_keep_alive_ctx.info.server_cnt;i++)
{
if(g_keep_alive_ctx.socket[i] > SOCK_INVALID)
{
close(g_keep_alive_ctx.socket[i]);
g_keep_alive_ctx.socket[i] = SOCK_INVALID;
}
}
return 0;
}

///////////////////////////////////keep alvie test module/////////////////////////////////////////////////////
int ka_low_power_keep_alive_test(void)
{
#ifdef __HuaweiLite__
static int cnt = 0;
if(cnt++ == 1)
{
ka_go_low_power_keep_alive();
}
else if(cnt >= 5)
{
ka_exit_low_power_keep_alive();
cnt = 0;
}
#endif
return 0;
}