概述
本文简单介绍一些核心源码和编译系统简介,帮助开发者更快熟悉设计思路,便于定制开发。
注意:
- 本文仅介绍运维通道设备端远程访问的源码,数据通道的源码介绍,请参考 阿里云物联网套件对外文档 .
目录结构介绍
dependencies
本目录仅包含了远程访问需要依赖的第三方库的指定版本源码包,openssl 和 nopoll ,开发者可以使用提供的第三方库自行交叉编译,也可以使用两个第三方库官网的最新版本(可能存在接口兼容性问题)。
board
本目录主要是包含了一些常用类型设备的预先编译好的第三方库,目前包含了比如alios/armv7/centos/macos等操作系统/CPU架构的第三方库和头文件。编译框架会基于用户给出的board信息,去查找指定board目录的第三方库以完成编译。每个board子目录,都必须符合规范。
以centos为例,其子目录的内容如下:
注意:
- 如果用户需要支持新的board类型,可以自行新建board子目录,但是目录结构必须符合上图的要求。
- board/xxx/incude 放的是nopoll/openssl头文件的内容。
- board/xxx/lib 放的是nopoll/openssl库文件的内容。
- 用户可以参考 script/support_centos.sh 一键完成第三方的交叉编译和board目录生成。
docs
本目录存放的是一些说明文档,包括一键编译arm版本和手动一步一步编译arm版本两个文件,这两个文件符合markdown语法,建议用户在github上直接打开查看。
在github上查看效果如下:
script
本目录主要是提供了一些脚本,方便用户使用,具体内容如下:
- auto_run.sh: 针对x86 linux和macos的一键按照脚本,在3分钟快速体验文档中使用。
- compile_openssl.sh: 提供交叉编译openssl的基本流程。
- support_alios.sh: 在阿里云ECS上一键构建第三方库的脚本。
- support_armv7.sh: 基于通用的arm linux toolchain构建第三方库的脚本。
- support_centos.sh: 在centos linux上一键构建第三方库的脚本。
- support_demo_board.sh: 官方样例,用户可以参考本脚本完成MIPS/PPC或其它平台的移植。
- support_macos.s: h在MacOS上一键构建第三方库的脚本。
src
本目录里放了远程访问设备的所有源码,目录结构如下:
各个子目录的功能如下:
- utility
主要是一些通用的工具库,比如hashtable, json解析器, log等。
- connectivity
封装websocket网路通讯库,让开发者尽可能少的了解到开源库的使用,降低使用门槛。
- core
这里是远程运维的核心源码,主要完成了云端通讯协议的封装和解析,Session生命周期管理,配置信息管理等功能。
具体每个源文件的用途:
- config_manager.c: 配置管理模块,主要用来读取 remote_terminal.json 这个配置文件。注意,当前不支持配置热更新,修改配置文件后,需要重启进程后才能完成配置更新。
- net_protocol.c: 封装了与云端的网络通讯报文,比如握手报文,响应报文及签名计算等。
- session_mgr.c: 会话管理模块,本软件对本地服务(remote_terminal.json 配置文件中的service_ip和service_port指定的服务)的每一次TCP连接,都计作一次会话。本模块负责管理会话的生命周期。
- remote_terminal.c: 核心业务模块,完成配置的读取,云端的连接管理和消息路由。
性能优化介绍
支持更多会话
默认情况下,我们支持最多 32 个会话。比如我们通过浏览器SSH登录到设备上,最多能支持32个窗口同时打开完成登录,如果需要支持更多并发登录,开发者可以修改以下文件:
src/core/session_mgr.h 的 第 4 行:
#define DEFAULT_SESSION_COUNT 32
可以把后面的 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
注意:
- 实际运行时需要将 remote_terminal.json 和 root.pem 两个文件拷贝到 RemoteTerminalDaemon 的同级目录下。
- 如果设备上没有openssl/nopoll这两个库,开发者还需要将这两个库拷贝到系统lib目录,比如/usr/lib或/lib下。
- 不同的设备,SSH服务监听的端口可能不一样,开发者可能还需要修改配置文件,配置文件的具体修改方法,请参考: 配置文件章节。
- 开发者在自测阶段,也可以通过在配置文件中指定三元组,这样就不用每次都通过命令行传递了。