远程登录功能主要应用于设备发生故障导致设备不可用时,对设备进行远程运维。本文以C Link SDK中的Demo文件./demos/remote_access_basic_demo.c为例,介绍如何调用Link SDK的API,帮助设备实现远程登录功能。
背景信息
-
远程登录功能的更多信息,请参见概述。
- 远程登录功能基于MQTT接入,开发过程中涉及MQTT接入的代码说明,请参见MQTT接入。
步骤一:初始化
- 添加头文件。
……
……
#include "aiot_ra_api.h"
- 配置底层依赖和日志输出。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
aiot_state_set_logcb(demo_state_logcb);
- 调用aiot_ra_init,创建
RA
客户端实例,并初始化默认参数。 void *ra_handle = aiot_ra_init();
if (ra_handle == NULL) {
printf( "aiot_ra_init failed\n");
return -1;
}
步骤二:配置功能
调用aiot_ra_setopt,配置以下功能。
- 配置功能参数。
注意 配置远程登录功能参数前,
请确保已配置设备认证信息等相关参数。具体操作,请参见MQTT配置连接参数。
- 示例代码:
aiot_ra_setopt(ra_handle, AIOT_RAOPT_MQTT_HANDLE, mqtt_handle);
aiot_ra_setopt(ra_handle, AIOT_RAOPT_NETWORK_CRED, (void *)&cred);
aiot_ra_setopt(ra_handle, AIOT_RAOPT_EVENT_HANDLER, (void *)ra_event_cb);
for(int i = 0; i < sizeof(services) / sizeof(aiot_ra_service_t); i++) {
aiot_ra_setopt(ra_handle, AIOT_RAOPT_ADD_SERVICE, (void *)&services[i]);
}
- 相关参数:
配置项 |
示例 |
说明 |
AIOT_RAOPT_MQTT_HANDLE |
mqtt_handle |
远程登录功能的请求基于MQTT连接,通过该配置项,关联MQTT连接句柄。 |
AIOT_RAOPT_NETWORK_CRED |
cred |
远程登录建立连接时,网络使用的安全凭据。 |
AIOT_RAOPT_EVENT_HANDLER |
ra_event_cb |
Websocket状态发生变更时,触发该回调函数。 |
AIOT_RAOPT_ADD_SERVICE |
services[i] |
配置建立远程登录连接时,设备端本地可支持的服务。 |
- 定义状态监控回调函数。
注意 在编写状态监控回调函数的处理逻辑时,请勿调用耗时较长的阻塞函数。
void ra_event_cb(void *handle, const aiot_ra_event_t *event, void *userdata)
{
switch(event->type)
{
case AIOT_RA_EVT_CONNECT:
printf( "ra_event_cb AIOT_RA_EVT_CONNECT %s \r\n", event->tunnel_id);
/* TODO: 告知Websocket建连成功, 不可在此处调用耗时较长的阻塞函数 */
break;
case AIOT_RA_EVT_DISCONNECT:
printf( "ra_event_cb AIOT_RA_EVT_DISCONNECT %s \r\n", event->tunnel_id);
/* TODO: 告知Websocket掉线, 不可在此处调用耗时较长的阻塞函数 */
break;
case AIOT_RA_EVT_OPEN_WEBSOCKET:
printf( "ra_event_cb AIOT_RA_EVT_OPEN_WEBSOCKET %s \r\n", event->tunnel_id);
/* TODO: 告知RA接收到打开Websocket链接命令, 不可在此处调用耗时较长的阻塞函数 */
break;
case AIOT_RA_EVT_CLOSE_WEBSOCKET:
printf( "ra_event_cb AIOT_RA_EVT_CLOSE_WEBSOCKET %s \r\n", event->tunnel_id);
/* TODO: 告知RA接收到关闭Websocket链接命令, 不可在此处调用耗时较长的阻塞函数 */
break;
}
}
- 定义本地支持的远程服务类型。
说明 默认开启_SSH
服务,否则无法实现远程登录功能。
aiot_ra_service_t services[] = {
{
.type = "_SSH",
.ip = "127.0.0.1",
.port = 22,
},
};
步骤三:开启远程登录通道功能
调用aiot_ra_start,向物联网平台发起请求,以通知物联网平台,设备已具备远程登录功能。
pthread_attr_t attr;
pthread_attr_init(&attr);
if (0 != pthread_create(&g_ra_process_thread, &attr, aiot_ra_start, (void*) ra_handle))
{
printf( "create remote_proxy_thread error!");
return -1;
}
步骤四:打开物联网平台远程登录开关
物联网平台接收通知后,您需打开远程登录开关,通知设备打开连接通道。设备再连接物联网平台的远程通道,建立会话连接、实现消息收发等功能。
打开远程登录开关支持以下两种方式:
步骤五:关闭远程登录通道
调用aiot_ra_stop,关闭远程服务通道。
int i = 60000;
while(1)
{
sleep(1);
/* TODO: 业务逻辑 */
i--;
/*根据业务逻辑需求,设置条件,需要退出线程可以调用aiot_ra_stop*/
if(i == 0)
{
/*退出线程,关闭RA服务*/
aiot_ra_stop(ra_handle);
break;
}
}