远程登录
您可使用远程登录功能,通过SSH协议的网络服务远程访问设备,在设备远程控制台输入设备的指令,进行调试和定位问题。本文介绍如何使用远程登录功能。
前提条件
使用流程
如下功能时序图,以设备的应用程序demos/tunnel_remote_access_demo.c
为例,介绍设备实现远程登录的使用流程。

步骤1:初始化设备
创建设备句柄,并将设备连接上云。
/* 初始化设备,并将设备连接上云 */ device = demo_device_init(product_key, device_name, device_secret, host, port); if(device == NULL) { printf("demo device connect failed\r\n"); }
设置监听隧道开关的回调函数。
/* 设置隧道开关消息回调 */ aiot_device_ts_set_callback(device, demo_tunnel_switch_callback, NULL);
步骤2:获取隧道登录信息
方式一:在控制台开启远程登录。具体操作,请参见手动开启远程登录。
方式二:设备主动请求远程登录。
/* 主动请求隧道信息 */ aiot_device_tunnel_request(device);
说明
大部分场景下,使用方式一按需开启远程登录进行设备运维。但设备在业务故障导致无法在控制台开启远程登录进行设备运维,设备可以定时主动请求最新的隧道登录信息,将隧道功能运行在独立进程中,保证当业务故障时隧道仍在运行,可以远程登录运维。
步骤3:处理隧道信息
处理隧道信息回调函数,创建隧道句柄并更新建连信息。
/* 设备的安全隧道开关模块回调,处理云端信令 */
static void demo_tunnel_switch_callback(void *device, const aiot_ts_msg_t *ts_msg, void *userdata)
{
aiot_tunnel_connect_param_t params;
....
if(AIOT_TUNNEL_OPERATOPN_OPEN == ts_msg->operation ||
AIOT_TUNNEL_OPERATOPN_UPDATE == ts_msg->operation) {
memset(¶ms, 0, sizeof(params));
params.host = ts_msg->host;
params.port = ts_msg->port;
params.path = ts_msg->path;
params.token = ts_msg->token;
/* 创建并初始化新的隧道 */
tunnel_handle = aiot_tunnel_init(ts_msg->tunnel_id);
/* 配置隧道支持的服务 */
aiot_tunnel_add_proxy_service(tunnel_handle, "_SSH", &ssh_service);
/* 配置隧道状态的回调函数 */
aiot_tunnel_set_event_callback(tunnel_handle, demo_tunnel_event_cb, NULL);
/* 设置隧道的连接参数 */
aiot_tunnel_set_connect_params(tunnel_handle, ¶ms);
/* 回调函数中不能长时间阻塞,在主函数中完成建连 */
}
}
参数说明如下表所示。
参数 | 说明 |
operation | 操作类型:
|
tunnel_id | 隧道的唯一身份ID。 |
host | 隧道连接地址。 |
port | 隧道连接端口。 |
path | 隧道连接路径。 |
token | 隧道鉴权的信息。 |
步骤4:隧道建连
/* 隧道未建连,异步完成隧道建连,在事件回调函数中重置tunnel_status状态 */
aiot_tunnel_connect(tunnel_handle);
步骤5:建立SSH会话
步骤6: 消息收发
登录成功后,您将看到如下远程控制台页面。您可根据设备本身功能对设备进行管理。
重要
登录成功后,若您5分钟内未进行任何操作,则登录连接会被关闭。

步骤7: 关闭远程登录
在控制台关闭远程登录。具体操作,请参见关闭远程登录。
使用如下命令关闭隧道。
/* 该示例只有一个隧道,如果为关闭隧道命令则关闭隧道,如果为打开新隧道,也需要先关闭旧的隧道*/ if(tunnel_handle != NULL) { aiot_tunnel_deinit(&tunnel_handle); tunnel_status = -1; }
步骤8:反初始化设备
/* 断开设备连接,并回收设备资源 */
demo_device_deinit(device);