7.3.4 软件部署
鉴于本项目使用了多个平台相互配合,不再使用传统的服务器/客户端模型进行解释,这里按照部署在服务器和部署在客户端(树莓派)进行分类,这样有利于陈述和理解。
1.客户端(树莓派)部署介绍
根据图7.7,我们看到需要部署在客户端上的功能主要有:
(1)网络重连监控
著者将网络状态重新定义为已联网(用3标志)、未联网(用1标志)和重新联网(用2标志),根据字面意思重新联网就是在之前网络是断开的,下一瞬间连接到网络,这一概念包含开机联网、网络重连等。在这里如何判断网络是否连接显得比较重要,所以必须选择一个高可靠的、7×24小时运行的网站进行测试,这样自然而然地想到了我们的百度,它的宕机率极低,而且有服务器集群在处理请求,即使其中一台宕机,也不会影响系统的稳定,所以,在程序中测试www.baidu.com 是否有响应来确定网络是否联通。
(2)反向代理端口请求
在7.3.1节中已经介绍了随机生成反向代理端口,此处不再赘述。
(3)TTS
在7.3.1节中已经介绍了TTS(Text To Speech),此处不再赘述。
(4)按摩命令解析与执行
在7.3.1节中已经介绍了数据转发,此处不再赘述。
2.服务器部署介绍(https://www.daowen.com)
(1)网站部署
网站部署主要可以分为后台部署和前端部署。后台部署特指网站所需要的后台资源,前端部署也是网站所需要的前端资源,比如js、css、html等。
前端部署:前面讲到网站是用Angular框架进行开发的,在完成一系列的开发调试之后,如果按照之前开发环境中的配置进行部署的话极为麻烦,更重要的是不得不为Angular在服务器上安装node,并且在服务器上安装一系列的node模块,这样不仅仅会导致服务器环境繁杂而且这种执行方法运行效率极低。好消息是我们在一个版本开发完成之后可以“ng build-prod-aot”命令生成“dist”文件夹,这个文件夹下面的内容直接放在服务器的网站根目录下就可以完成前端部署。
后台部署:网站后台我采用了基于Python的flask进行开发,选择它的原因主要有轻量、易学以及著者正在学习Python,借着这次机会多熟悉一个开发框架。这里的部署就显得稍微简单一点,因为著者采用的是安装ubuntu16.04的服务器,它自带Python2.7,所以只要在部署的时候安装所用到的库即可。当然后台还有很大一部分是数据库的操作,我选用的是MySQL数据库,在服务器中安装相应的软件即可。
(2)端口分发
在7.3.1节中已经介绍了随机生成反向代理端口,此处不再赘述。
(3)命令分发
在7.3.1节中已经介绍了数据转发,此处不再赘述。
(4)任务管理
当项目接近完成的时候,著者发现手工启动一次环境居然用了五分多钟,这是绝对不能容忍的,这些启动环境的操作是机械化的,就是重复地执行命令,这种工作交给机器执行是再适合不过了。所以著者选择了使用shell进行自启动,根据7.3.2节和7.3.3节得知启动环境这种操作只有在树莓派和服务器上进行,好在两者都是Linux系统,意味着只需要写一套代码就可以实现全部自动启动和管理,大大地提升了执行效率,但是在启动的过程中还是要注意一下客户机和服务器的区别,因为服务器和客户机需要执行的进程是不一样的。
为了尽可能地减少在系统中的改动,著者设定了一个启动入口文件,然后只需要将这一个文件的执行加入系统的开机启动项即可。在这个文件里,著者给树莓派启动网络状态监控、命令转发功能以及主程序,给服务器启动网站后台、端口分发和命令分发功能。不仅如此,可以清楚地发现本系统不管服务端还是客户端都包含有很多的C/C++文件,这些文件都需要经过编译、链接和装载才能运行,著者也将这些过程用脚本进行了管理,使得在构建的时候只需要执行一条指令就可以实现整个工程的构建和运行。
在项目运行的过程中,著者发现这样的任务管理一旦某个程序出现问题没法查看到它的控制台输出,所以著者又在前面的基础上把启动入口文件放在screen中执行,同时将系统启动项里面的执行启动入口文件更换为执行screen文件。这样在系统出现故障之后可以通过screen-r参数来查看控制台输出,有效地提高了发现问题的效率。