在向ARM板部署软件时, 每次都是相同的操作,唯一不同就是修改对应的IP地址与端口号。以前OCNT的规模比较小,只是3-5块少量的ARM板,目前OCNT的规模升级到20左右的ARM板,一旦ARM板上程序有变化,部署将会变得十分麻烦,需要将ARM板拔下,接到电脑上,一遍遍的重复烧写后,再接到平台上,过程十分繁琐,拔线再接线增加了硬件接线错误的几率(毕竟要重新接20个板子)。同时,由于烧写与配置需要一点点嵌入式知识,烧写工作目前只能由下位机软件维护者进行,这样是不太稳妥的。基于以上的原因,OCNT平台就迫切需要一个能够自动化部署、向上封装烧写细节的工具。
总之,完成此工具的哲学就是:
DRY(Don't Repeat Yourself)!讨厌一切重复的工作,自动化一切可以自动化的部分,让机器做这类它擅长的工作!
- 文件上传:通过ftp将指定文件上传到ARM板上
- 远程控制:通过telnet远程登录到ARM板后发送命令进行控制
- 操作记录:文件上传与远程控制的每一步都有成功与否的反馈,具体的交互情况也会写入指定log中
- 动态配置:所有可变的配置全部从json格式的配置文件读取,因此可根据不同需要修改配置文件,无需重编译软件
- 启动脚本生成:启动脚本一般是修改成不同IP地址,其他都相同,根据输入,可生成期望的启动脚本
- 面向对象设计:用C语言也可以将面向对象设计做的很优雅
- 使用测试驱动开发:每次迭代一小点,验证,重构
- 灵活的设计:将配置文档化,消除不必要的硬编码;使用回调让各个模块解耦;使用状态机处理流程
- 不怕从头造轮子:通过造轮子的过程锻炼编程,掌握对应知识,再通过看别人高大上的轮子来反思自己的不足,学习别人的精华
- Ftp Uploader:Ftp上传模块,封装文件上传操作
- Telnet Commander:Telnet控制模块,封装Telnet命令操作,基于libtelnet库
- Logger:交互记录模块,负责记录交互情况,供出错时检查
- Deployer:顶层模块,负责读取与检查配置文件,根据配置文件中目标板部署期望的文件
- DList:双向链表模块
- cJSON:Json解析生成的第三方库
- libtelnet:Telnet的第三方库,这里用于协商部分
./deployer [config]
根据需要修改配置文件即可。如果不指定配置文件,则默认的配置文件为./deployer.conf。
Json格式配置文件解析如下:
ftp
:Ftp相关配置username
:Ftp用户名password
:Ftp密码
telnet
:Telnet相关配置username
:Telnet用户名password
:Telnet密码command file
:远程控制命令文件
deploy targets
:目标ARM板IP地址的列表deploy files
:部署文件列表
需要注意的是:
- 没有密码时也需要保留password键值对,值填空字符出
""
- 远程控制命令文件不是脚本,不支持注释,只是命令的集合,一行代表一条命令,命令的执行顺序与命令在文件中的前后顺序一致
deployer_config_json.h
头文件定义配置文件中键值对的“键”,以及默认的配置文件名称- 配置文件可以通过
tools
下的config_json_generator.c
生成