概述

本文简单介绍一些核心源码和编译系统简介,帮助开发者更快熟悉设计思路,便于定制开发。

注意:

  1. 本文仅介绍运维通道设备端远程访问的源码,数据通道的源码介绍,请参考 阿里云物联网套件对外文档 .

目录结构介绍

dependencies

本目录仅包含了远程访问需要依赖的第三方库的指定版本源码包,openssl 和 nopoll ,开发者可以使用提供的第三方库自行交叉编译,也可以使用两个第三方库官网的最新版本(可能存在接口兼容性问题)。

image.png

board

本目录主要是包含了一些常用类型设备的预先编译好的第三方库,目前包含了比如alios/armv7/centos/macos等操作系统/CPU架构的第三方库和头文件。编译框架会基于用户给出的board信息,去查找指定board目录的第三方库以完成编译。每个board子目录,都必须符合规范。

image.png

以centos为例,其子目录的内容如下:

image.png

注意:

  1. 如果用户需要支持新的board类型,可以自行新建board子目录,但是目录结构必须符合上图的要求。
  2. board/xxx/incude 放的是nopoll/openssl头文件的内容。
  3. board/xxx/lib 放的是nopoll/openssl库文件的内容。
  4. 用户可以参考 script/support_centos.sh 一键完成第三方的交叉编译和board目录生成。

docs

本目录存放的是一些说明文档,包括一键编译arm版本和手动一步一步编译arm版本两个文件,这两个文件符合markdown语法,建议用户在github上直接打开查看。

image.png

在github上查看效果如下:

image.png

script

本目录主要是提供了一些脚本,方便用户使用,具体内容如下:
image.png

  1. auto_run.sh: 针对x86 linux和macos的一键按照脚本,在3分钟快速体验文档中使用。
  2. compile_openssl.sh: 提供交叉编译openssl的基本流程。
  3. support_alios.sh: 在阿里云ECS上一键构建第三方库的脚本。
  4. support_armv7.sh: 基于通用的arm linux toolchain构建第三方库的脚本。
  5. support_centos.sh: 在centos linux上一键构建第三方库的脚本。
  6. support_demo_board.sh: 官方样例,用户可以参考本脚本完成MIPS/PPC或其它平台的移植。
  7. support_macos.s: h在MacOS上一键构建第三方库的脚本。

src

本目录里放了远程访问设备的所有源码,目录结构如下:

image.png

各个子目录的功能如下:

  • utility

主要是一些通用的工具库,比如hashtable, json解析器, log等。

  • connectivity

封装websocket网路通讯库,让开发者尽可能少的了解到开源库的使用,降低使用门槛。

  • core

这里是远程运维的核心源码,主要完成了云端通讯协议的封装和解析,Session生命周期管理,配置信息管理等功能。

具体每个源文件的用途:

  1. config_manager.c: 配置管理模块,主要用来读取 remote_terminal.json 这个配置文件。注意,当前不支持配置热更新,修改配置文件后,需要重启进程后才能完成配置更新。
  2. net_protocol.c: 封装了与云端的网络通讯报文,比如握手报文,响应报文及签名计算等。
  3. session_mgr.c: 会话管理模块,本软件对本地服务(remote_terminal.json 配置文件中的service_ip和service_port指定的服务)的每一次TCP连接,都计作一次会话。本模块负责管理会话的生命周期。
  4. remote_terminal.c: 核心业务模块,完成配置的读取,云端的连接管理和消息路由。

性能优化介绍

支持更多会话

默认情况下,我们支持最多 32 个会话。比如我们通过浏览器SSH登录到设备上,最多能支持32个窗口同时打开完成登录,如果需要支持更多并发登录,开发者可以修改以下文件:

  1. src/core/session_mgr.h 4 行:
  2. #define DEFAULT_SESSION_COUNT 32
  3. 可以把后面的 32 改成其它更大的数字,重新编译即可。

提高消息流转效率

默认情况下,我们与云端的消息流转使用了 8k 的buffer,如果每次消息过大,可能需要更多的IO操作,开发者可以自行修改buffer大小,降低IO次数,提供消息流转效率,这样将会让报文响应更快。修改文件如下:

src/core/remote_terminal.c 的 第 358 行:

#define DEFAULT_MSG_BUFFER_LEN 8*DEFAULT_MSG_HDR_LEN

注意,DEFAULT_MSG_BUFFER_LEN 这个长度,最长不能超过 50k,否者会出现异常。

编译系统介绍

前提条件

  • 第三方库和头文件

开发者必须在board下面新建/复用一个子目录(比如centos/macos/armv7等)来存放这些第三方库的头文件和动态库文件,子目录的格式必须符合上一章节中描述的规范。

变量传递及编译

我们支持两种方式供开发者传递诸如CC/CFLAGS/LDFLAGS之类的变量。

环境变量方式

变量名和值以=号相连形成一组变量值,每组变量以空格相连后,直接加上make就可以在顶层目录执行编译了。

CC=gcc CFLAGS="-I./" make

命令行方式

与环境变量方式类似,变量名和值以=号相连形成一组变量值,每组变量以空格相连。只不过make之后跟上这些

make CC=gcc CFLAGS="-I./"

生成物介绍

  • RemoteTerminalDaemon

这个是远程运维的主程序,需要拷贝到设备上运行。运行方式是:

./RemoteTerminalDaemon {YourProductKey} {YourDeviceName} {YourDeviceSecret}

说明 请将 {YourProductKey} {YourDeviceName} {YourDeviceSecret}替换为已在本地保存的网关设备的设备证书信息。

例如,网关设备证书信息为ProductKey:a1**gs、DeviceName:gateway、DeviceSecret:2Px**H1S,则执行的实际命令如下: ./RemoteTerminalDaemon a1**gs gateway 2Px**H1S


注意:

  1. 实际运行时需要将 remote_terminal.json 和 root.pem 两个文件拷贝到 RemoteTerminalDaemon 的同级目录下。
  2. 如果设备上没有openssl/nopoll这两个库,开发者还需要将这两个库拷贝到系统lib目录,比如/usr/lib或/lib下。
  3. 不同的设备,SSH服务监听的端口可能不一样,开发者可能还需要修改配置文件,配置文件的具体修改方法,请参考: 配置文件章节
  4. 开发者在自测阶段,也可以通过在配置文件中指定三元组,这样就不用每次都通过命令行传递了。