附录
# 附录
以下不是 IoTCenter 产品安装所必须的步骤,给需要使用的人作为参考
# 目录结构
bin:用于存放网关服务运行执行程序、进程、AES 加密工具、各子系统厂家 SDK 文件。
CurveData:用于存放软件接入设备的历史曲线记录文件。
data:用于存放软件后台功能配置文件。
database:用于存放软件初始数据库文件,包括 SQLite 数据库、MySQL 数据库脚本。
dll:用于存放各子系统和设备协议解析的动态库解码器(驱动)文件。
IoTCenterWeb:用于存放 Web 客户端程序和守护程序。
log:用于存放网关程序日志文件。
# 数据库加密工具
# GWEncrypt.dll
用户及数据库密码等敏感信息需加密存储,此加密工具主要用于加密存储配置文件中的数据库密码以及加密数据库中的用户等敏感信息。在加密过程中,目前主要有 3 种加密方式。
使用敢为许可文件对机密数据进行加密,该功能适用于在部署敢为网关的环境下,下同。
使用双重混合加密机制,该方式需要两组密钥,一个 64 位的元密钥+一个 64 位的工作密钥,适用于不同项目间要加密配置文件的需求。
使用简单 AES128 的简单加密,该加密方式由于 AES128 位安全性不高,不推荐使用。
操作步骤
使用敢为许可加密字符串:该通过输入一组足够复杂的密钥,并使用敢为许可文件对该密钥进行加密,适用于需要调用服务端进行隐私数据加密的场景。
该工具运行方式:Windows 环境:
D:\ganwei\iotcenter\bin\GWEncrypt.exeLinux 环境:
/opt/ganwei/iotcenter/dotnet/dotnet /opt/ganwei/iotcenter/bin/GWEncrypt.dll输入命令【1】
再输入待加密字符串
输入回车。
记录提示后的加密字符
升级数据表:该用以实现对默认数据库进行初始化操作。
输入命令【2】
输入 y。
等待升级完成。
指定密钥加密:使用一个AES128位加密算法对字符串进行加密,密钥长度为16位。(不推荐使用)。
生成随机AES密钥:由于加密算法为AES512位,需要64位密码,特提供快速生成随机密钥的功能,该功能用以生成从AES128到AES4096各种不同算法的密钥。操作流程为选择【4】,再选择对应复杂程度的字符串组合。保存AES元密钥:由运维人员制作用于系统本地加密文件中存储的基础元密钥信息。该密钥保存在bin/system/目录下,是用来保护系统关键配置文件的根密钥,确保配置文件安全。
输入命令【5】.
按提示,输入一个 AES512 的密钥,该密钥长度为 64 位。输入完成后,工具自动保存元密钥到本地目录下。
保存AES用户工作密钥:由用户制作第二级密钥保护机制,以便确保关键配置文件安全。该密钥保存在bin/user目录下。参考生成AES元密钥的制作过程。
使用高级AES加密字符串:使用上述两级AES加密机制,对用户输入的足够复杂的字符串进行加密。输入命令【7】。
输入待加密字符串完成加密过程。
# 网关配置文件
# AlarmCenterProperties.xml
网关核心配置文件,位于IoTCenter\data\AlarmCenter中,主要用于配置网关端口、ZMQ消息端口、历史曲线存储、数据库连接存储等。
<AlarmCenterProperties>
<Properties name="AES.Parameter4OldEncrypt">
<IVString value="" />
<Key value="" />
</Properties>
<Properties name="AlarmCenter.Gui.OptionPanels.CurveOptions">
<CurveStoreInDB value="FALSE" /><!--TRUE历史曲线保存在数据库中,FALSE历史曲线保存在文件中-->
<EquipSaveType value="FALSE" /><!--暂不使用-->
<History_CurveStoreTime value="365" /><!--历史曲线保存时间,单位天,过期会自动删除-->
<Hostory_CurveStorePath value="D:\ganwei\IoTCenter\CurveData" /><!--历史曲线保存在文件中时的存储路径-->
<Real_CurveLenth value="300" /><!--暂不使用-->
<Real_FrashTime value="1" /><!--暂不使用-->
<RemoteSite value="false" /><!--暂不使用-->
<RemoteSitePwd value="" /><!--暂不使用-->
<RemoteSiteUser value="" /><!--暂不使用-->
<Compress value="True" /><!--事件记录是否压缩数据,不配置默认采用压缩方式。当采用压缩时,也只有数据长度大于1k才压缩-->
<CurveCompress value="True" /><!--历史曲线是否压缩数据,不配置默认采用压缩方式。当采用压缩时,也只有数据长度大于1k才压缩-->
<CurveCompressType value="Fastest" /><!--历史曲线压缩方式:Fastest时间优先;SmallestSize占用空间优先,不配置默认是Fastest-->
<History_StoreTime value="365" /><!--事件记录保存时间,单位天,过期会自动删除-->
</Properties>
<Properties name="AlarmCenter.Gui.OptionPanels.DatabaseOptions">
<Kingbase.Database value="postgres" /><!--Kingbase人大金仓数据库连接名-->
<Kingbase.IP value="" /><!--Kingbase人大金仓数据库连接IP-->
<Kingbase.PORT value="" /><!--Kingbase人大金仓数据库连接端口-->
<Kingbase.PWD value="" /><!--Kingbase人大金仓数据库连接加密密码-->
<Kingbase.UID value="" /><!--Kingbase人大金仓数据库连接用户ID-->
<Kingbase.Select value="False" /><!--True启用Kingbase人大金仓数据库,False不启用-->
<GaussDB.Database value="GaussDb" /><!--GaussDB高斯数据库连接数据库名-->
<GaussDB.IP value="" /><!--GaussDB高斯数据库连接IP-->
<GaussDB.PORT value="" /><!--GaussDB高斯数据库连接端口-->
<GaussDB.PWD value="" /><!--GaussDB高斯数据库连接加密密码-->
<GaussDB.UID value="" /><!--GaussDB高斯数据库连接用户ID-->
<GaussDB.Select value="False" /><!--True启用GaussDB高斯数据库,False不启用-->
<PostgreSQL.Database value="postgres" /><!--PostgreSQL数据库连接数据库名-->
<PostgreSQL.IP value="" /><!--PostgreSQL数据库连接数据库IP-->
<PostgreSQL.PORT value="5432" /><!--PostgreSQL数据库连接数据库端口-->
<PostgreSQL.PWD value="" /><!--PostgreSQL数据库连接数据库加密密码-->
<PostgreSQL.UID value="postgres" /><!--PostgreSQL数据库连接数据库用户ID-->
<PostgreSQL.Select value="False" /><!--True启用PostgreSQL数据库,False不启用-->
<MySql.Database value="iotcenter" /><!--MySql数据库连接数据库名-->
<MySql.IP value="localhost" /><!--MySql数据库连接数据库IP-->
<MySql.PORT value="" /><!--MySql数据库连接数据库端口-->
<MySql.PWD value="" /><!--MySql数据库连接数据库加密密码-->
<MySql.UID value="ganwei" /><!--MySql数据库连接数据库用户ID-->
<MySql.Select value="False" /><!--True启用MySql数据库,False不启用-->
<SQLite.DefaultPath value="D:\ganwei\IoTCenter\database\Database.db" /><!--Sqlite数据库文件物理绝对路径-->
<SQLite.Select value="True" /><!--True启用Sqlite数据库,False不启用-->
</Properties>
<CoreProperties.UILanguage value="zh-CN" /><!--UI界面语言-->
<DBStoreLimitTime value="10" /><!--数据库保存执行时间告警阈值,单位秒-->
<Properties name="HostServer"><!--GRPC网关服务配置节点-->
<EnableGrpc value="true" /><!--GRPC服务启用-->
<HostIpAddr value="127.0.0.1" /><!--GRPC服务监听网卡地址,默认为回环网卡。有对外网需求是,需修改为实际网卡地址-->
<HttpPort value="4000" /><!--GRPC服务HTTP端口-->
<UnityPort value="" /><!--Unity3D服务RPC监听端口-->
<MQPort value="" /><!--NETMQ消息监听端口-->
<ZMQSubscribeKey value="" /><!--NETMQ消息订阅标识-->
<EnableSSLGen value="false" /><!--GRPC服务HTTPS端口配置时,true自动生成SSL证书,false不生成证书-->
<HttpsPort value="" /><!--GRPC服务HTTPS端口-->
<HttpsCertFile value="" /><!--GRPC服务HTTPS端口配置时,SSL证书相对路径-->
<HttpsPassword value="" /><!--GRPC服务HTTPS端口配置时,SSL证书加密密码-->
<StorageFile value="D:\ganwei\IoTCenter\StorageFile" /><!--统一文件上传接口,数据存储绝对路径-->
<SafetyLevel value="1"/><!--1非安全模式,2安全模式(只加载安装签名验证通过的Web插件)-->
<PluginsPath value="" /><!--Web插件目录,默认值为相对路径IoTCenterWeb/packages-->
<Redis.ConnectString value=""/><!--使用Redis做为服务的缓存提供者,连接字符串-->
<Redis.Password value=""/><!--Redis连接密码-->
<SingleAppStart value="true"/><!--单应用启动-->
</Properties>
<AlarmCenter.Debug value="0" /><!--调试设备号,多个时使用英文逗号隔开-->
<AllowOrigins value="http://127.0.0.1:44380,https://127.0.0.1:44380,http://127.0.0.1:44381" /><!--Web服务Cors访问允许的域名配置-->
<Properties name="WebApi"><!--Web服务配置-->
<ApplicationPartName value="IoTCenter.Web." /><!--暂不使用-->
<CipherAdapterEnable value="False" /><!--基于TSL1.2及以上配置的握手套件算法启用,仅支持macOS系统或OpenSSL版本大于 1.1.1的Linux系统-->
<EnableGatewayCache value="True" /><!--启用网关缓存-->
<ExpiredTime value="525600" /><!--Web登录用户Cookie有效期,单位分钟-->
<FormFileSize value="210763776" /><!--Web上传文件的大小限制,单位字节-->
<GatewayKeepAlive value="10" /><!--Web连接GRPC网关时,健康检查间隔-->
<HttpPort value="44381" /><!--Web监听的HTTP端口-->
<HttpsPort value="44380" /><!--Web监听的HTTPS端口-->
<IpAddress value="0.0.0.0" /><!--Web监听的网卡地址-->
<IsInitMaintainPwd value="False" /><!--Web维护密码是否已被初始化过-->
<MaxGatewayStoreExpire value="10" /><!--Web连接GRPC网关缓存超时事件-->
<RSAAutoGenerate value="False" /><!--True生成Web加密算法RSA密钥对,False不生成-->
<RSAPadding value="" /><!--生成Web加密算法RSA密钥对的填充方式,支持oaep及pkcs1-->
<ShowSystemInfo.ShowPlatformInfo value="True" /><!--Web页面是否返回平台及系统信息-->
<SSLAutoGenerate value="False" /><!--True生成Web监听HTTPS端口的SSL证书-->
<SSLName value="SSL/ssl.pfx" /><!--Web监听HTTPS端口的SSL证书相对路径-->
<SSLPassword value="MjAyNDExMjHCQPsjCQOfeueU+JGdT/gWBx4SXCxcPJLXJMLMNMm33LQHN8EJR0YmKZ8nzqXp7PZas7i9/T9hqIE2lSburhKshaxDPYkMOIS07PCdl7hXem2zkxz1sHpzwGyddYY4Akkg7xMmfPlyU3IFBv+iq04q7ZMbyRaIQbKW1QWnVD+CeOX5XVAeP+RKW8ueJefvH94W/e0H+Cr2LAqWqqQrgEa732AncH6R7qxDZBagM3F4DAfo9ZoGfhjWxtul/TO60dvzr4S0jHPEza9OsYh/ySFRJlsSkTr7izVDtUm7wkIZ/O4atHEE3+vwPRn/5XifnXg5GDhqyYTp9dLigWOSX6i5D97Ra89jiVIY/hdcnEJ+eeWsWaLHALxsyHaJ3PBuCTjDI0mMSPyOnAo7LSkb9KdfyhTdqS/J7Ew8UeVgyFO7ig==" /><!--Web监听HTTPS端口的SSL证书的加密密码-->
<TryConnectTime value="3" /><!--Web重连GRPC网关重试次数-->
<IsManyLoginEnabled value="False" /><!--True:Web用户支持多方登录,False:不支持-->
</Properties>
<Properties name="SMSConfig">
<appid value="" />
<appkey value="" />
<GanweiCloudId value="" />
<IsGanweiCloud value="false" />
<templateid value="" />
</Properties>
</AlarmCenterProperties>
# 守护程序
# restart.sh
网关进程守护程序,位于IoTCenter\IoTCenterWeb\shell中,主要用于Linux操作系统中网关进程异常中断、停止时,自动重启网关进程,保证平台的稳定运行。
restart.sh
Linux中使用方法:
执行 cd 和 ll 命令进入 services 目录,查看当前目录是否存在守护进程;
cd /opt/ganwei/IoTCenter/services/ ll
执行 chmod 777 restart.sh 为守护程序赋予可执行权限,赋予权限后文件名会变绿权限会变更为可执行;
chmod 777 restart.sh ll
执行 nohup ./restart.sh > /dev/null 2>&1 &命令后台进程运行守护程序;
nohup ./restart.sh > /dev/null 2>&1 &
执行 ps -ef|grep restart 命令查看是否网关守护程序是否成功执行;
ps -ef|grep restart
# restartweb. sh
Web进程守护程序,位于IoTCenter\IoTCenterWeb\services中,主要用于Linux操作系统中网关进程异常中断、停止时,自动重启网关进程,保证平台的稳定运行。
file_name:守护程序重启网关进程的日志文件
file_name:
/opt/ganwei/IoTCenter/IoTCenterWeb/shell/web.log
cd 路径
/opt/ganwei/IoTCenter/IoTCenterWeb/publish
Linux中使用方法:
执行 cd 和 ll 命令进入 services 目录,查看当前目录是否存在守护进程;
cd /opt/ganwei/IoTCenter/services/ ll
执行 chmod 777 restartweb.sh 为守护程序赋予可执行权限,赋予权限后文件名会变绿权限会变更为可执行;
chmod 777 restartweb.sh ll
执行 nohup ./restartweb.sh > /dev/null 2>&1 &命令后台进程运行守护程序;
nohup ./restartweb.sh > /dev/null 2>&1 &
执行 ps -ef|grep restartweb 命令查看是否网关守护程序是否成功执行;
ps -ef|grep restartweb
# Docker 容器的离线安装
在可以连接互联网的情况下,可以在线安装 Docker《Linux 下 Docker 安装部署》 (opens new window),当遇到内网服务器没有办法进行在线安装时需要使用离线安装的方法。下面主要介绍离线安装的方法。
# 下载安装包
创建工作文件夹
mkdir /opt/docker
docker 安装包下载地址:https://download.docker.com/linux/static/stable/x86_64/ (opens new window)
进入下载地址,下载相应的版本,比如 18.06.3,将下载好的文件放到/opt/docker 目录下
# 创建系统配置文件
创建文件
使用如下命令创建文件:
vim /opt/docker/docker.service
或者
touch docker.service
文件内容如下:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
点击docker.service下载文件
# 创建安装脚本
安装脚本
使用如下命令创建文件:
vim /opt/docker/install.sh
或者
touch install.sh
文件内容:
#!/bin/sh
echo '解压tar包...'
tar -xvf $1
echo '将docker目录移到/usr/bin目录下...'
cp docker/* /usr/bin/
echo '将docker.service 移到/etc/systemd/system/ 目录...'
cp docker.service /etc/systemd/system/
echo '添加文件权限...'
chmod +x /etc/systemd/system/docker.service
echo '重新加载配置文件...'
systemctl daemon-reload
echo '启动docker...'
systemctl start docker
echo '设置开机自启...'
systemctl enable docker.service
echo 'docker安装成功...'
docker -v
点击install.sh下载文件
# 创建卸载脚本
卸载脚本
使用如下命令创建文件:
vim /opt/docker/uninstall.sh
或者
touch uninstall.sh
文件内容:
#!/bin/sh
echo '删除docker.service...'
rm -f /etc/systemd/system/docker.service
echo '删除docker文件...'
rm -rf /usr/bin/docker*
echo '重新加载配置文件'
systemctl daemon-reload
echo '卸载成功...'
点击uninstall.sh下载文件
# 安装
解压
解压
使用命令:
tar -xf docker-18.06.3-ce.tgz
将 docker 相关命令拷贝到 /usr/bin,方便直接运行命令
cp docker/* /usr/bin/
注册系统服务
将docker注册成系统服
为 docker.service 增加可执行权限
chmod +x /etc/systemd/system/docker.service systemctl daemon-reload
启动 docker
启动docker
systemctl start docker
查看 docker 版本
# 常用命令
查看容器命令:
docker ps
或docker ps -a
进入容器命令:
docker exec -it [容器ID] bash
重启容器命令:
docker stop [容器ID]
查看容器日志:
docker logs [容器ID]
退出容器命令:
exit
查看空间命令:
df -h
查看文件夹占用命令:
du -sh *
查看文件日期:
ls -l
删除文件或文件夹命令:
rm -rf [文件名]
(慎用)编辑文件命令:
vim [文件名]
复制文件命令:
cp -rf 文件名
查看服务器环境:
uname -a
# 部署多网关
当在一台服务器上需要部署多套 IoTCenter 软件时,需要进行多网关部署。
拷贝安装部署的目标文件到新文件夹(不包括运行时)
在修改以下配置后,按照安装步骤进行配置
视频教程
# 网关 appsettings.json 配置
需修改网关端口配置,同时每套软件的网关端口和Web中的网关端口需保持一致:
# 网关 AlarmCenterProperties.xml 配置
历史曲线文件存储路径Hostory_CurveStorePathvalue="D:\ganwei\IoTCenter\CurveData"
Hostory_CurveStorePathvalue="D:\ganwei\IoTCenter\CurveData"
数据库路径SQLite.DefaultPathvalue="D:\ganwei\IoTCenter\database\Database.db"
SQLite.DefaultPathvalue="D:\ganwei\IoTCenter\database\Database.db"
需确保网关端口唯一HttpPort value="4001"
HttpPort value="4001"
ZMQ端口MQSubPort value="15566"
MQSubPort value="15566"
ZMQ 消息端口和地址,"NetMQPort": "5566",
需修改 Web 客户中的网关端口
需修改 Web 客户中的端口"AllowOrigins": [ "http://127.0.0.1:44380","https://127.0.0.1:44380",”http://127.0.0.1:44381 (opens new window)”]
"HttpPort": "44381",
"HttpsPort": "44380",
网关相关配置保持一致: "address": "http://localhost:4001/",
# 服务定义文件
修改两套软件的服务定义文件中关于相关路径配置的部分
windows:修改services\regist.bat
linux:修改 services\regist.sh,IoTCenter.service,IoTCenterWeb.service
# 项目软件迁移部署
视频教程:
项目软件迁移部署操作步骤
找到项目软件关联使用的数据库,然后进行备份操作,最后打包拷贝软件和数据库备份文件;
在“D:\ganwei\IoTCenter\database”路径下找到备份数据库文件进行还原;
如果迁移的服务器已经安装过 IoTCenter 6.0,建议先卸载 IoTCenter 6.0 软件服务,然后再重新安装;
拿到授权文件放到 bin 后,清空base_personnelinfo(人员信息表)、GWUser(登录用户表)、GWRole(角色表)。
重启软件服务和 web 服务,默认登陆用户名密码请联系相关人员获取。
# 切换数据库
视频教程
首先需要在需要连接的数据库中添加一个新的数据库实例。
在配置管理-平台配置中有数据库切换功能,将mysql数据库信息填写在下列输入框中,如果数据库中没有执行初始化脚本,可以勾选新建数据,这样会自动执行初始化脚本,然后点击保存,即可切换成功。
# Linux 开放端口命令总览
Linux开放端口命令
- 开启防火墙:
systemctl start firewalld
- 开放指定端口:
firewall-cmd --zone=public --add-port=44380/tcp --permanent
- 重启防火墙:
firewall-cmd --reload
- 查看指定端口:
netstat -ntulp |grep 3306
- 查看指定端口是否开启:
firewall-cmd --query-port=3306/tcp
- 查看全部已开启端口:
firewall-cmd --zone=public --list-ports
# 视频教程:
# Windows 环境下安装 MySQL
# Linux 环境下在线安装部署 MySQL
# Linux 环境下离线安装部署 MySQL
# MySQL 备份、还原备份、数据批量导入
# IoTCenter6.0 守护程序使用
提示
系统默认用户名及密码请联系相关人员获取
# 账号清单
数据库配置
配置位置:ganwei/IoTCenter/data/AlarmCenter/AlarmCenterProperties.xml
<SQLite.DefaultPath value="/opt/ganwei/IoTCenter/database/Database.db" /><!--Sqlite数据库文件物理绝对路径-->
<SQLite.Select value="True" /> <!--True启用Sqlite数据库,False不启用-->
SQLite 数据库
用户名 | 密码 | 配置建议 |
---|---|---|
无 | 无 | SQLite 数据库位置应与实际数据库位置一致(IoTCenter 软件包自带 SQLite 数据库:database 目录下的 Database.db)。启用数据库为 True,不启用为 False。 |
MySQL 数据库
用户名 | 密码 | 配置建议 |
---|---|---|
任一已创建好的 MySQL 用户 | 经过 GWEncrypt.dll(或 GWEncrypt.exe)加密后的 MySQL 密码 | 连接 MySQL 服务时 IP 建议为内网 IP。 MySQL 连接时的端口号为 MySQL 服务的端口号,默认为 3306。 启用数据库为 True,不启用为 False。 MySQL 连接用户名为任一已创建好的、有数据库权限的用户,不建议使用 root 账号。 |
<MySql.Database value="iotcenter" /><!--MySql数据库连接数据库名-->
<MySql.IP value="localhost" /><!--MySql数据库连接数据库IP-->
<MySql.PORT value="3306" /><!--MySql数据库连接数据库端口-->
<MySql.PWD value="" /><!--MySql数据库连接数据库加密密码-->
<MySql.UID value="root" /><!--MySql数据库连接数据库用户ID-->
<MySql.Select value="False" /><!--True启用MySql数据库,False不启用-->
提示
系统默认用户名及密码请联系相关人员获取
容器化部署账号
虚机部署运行服务的 OS 账号
用户名 | 密码 | 配置建议 |
---|---|---|
ganwei | 无,运行服务的默认账号。 |
容器中运行服务的 OS 账号
用户名 | 密码 | 配置建议 |
---|---|---|
ganweiuser | 无 | 无,用于容器化部署时,运行服务的默认账号。 |
35009(容器 id) mysql | 无,用于容器化部署时,运行服务的默认账号。 |
MySQL 数据库
用户名 | 密码 | 配置建议 |
---|---|---|
iot | 无,用于容器化部署时,使用 MySQL 数据库的默认账号。 | |
root | MySQL 启动时自动生成的账号 | |
mysql.infoschema | 不涉及 | MySQL 内置账号 |
mysql.session | 不涉及 | MySQL 内置账号 |
mysql.sys | 不涉及 | MySQL 内置账号 |
IoTCenter 账号
用户名 | 密码 | 配置建议 |
---|---|---|
built_acc | 无,用于华为智慧园区默认内置的门禁系统访问账号。 |
密钥更新
密钥清单
序号 | 模块名 | 密钥算法实用功能描述 | 密钥存储位置 | 是否更新 |
---|---|---|---|---|
1 | Web 模块 | 对登录的用户口令进行加密传输 | pems 目录下的 private_key.pem 文件 pems 目录下的 public_key.pem 文件 | 无需更新,每次服务启动时将自动生成。 |
2 | Web 模块 | 1、SSL 安全证书的秘钥加密; 2、会话秘钥; 3、使用 AES128 算法对用户个人隐私数据进行加密; 4、对用户登录的密码采用 SHA512+AES128 进行加密; 5、许可维护解密。 | bin 目录下的 AlarmCenter.shd 文件 | 更新 |
3 | GRPC 服务 | 会话秘钥使用 AES512+PDKDF2 加密 | bin 目录下的 System.Tools.Access.Meta.dll 文件 bin 目录下的 System.Tools.Access.Str.dll | 文件更新 |
更新方式
AlarmCenter.shd 更新
更新方式:将新的 AlarmCenter.shd 文件替换至..IoTCenterbin 目录下。
更新时间:一般项目上申请的临时授权为 3 个月,研发及测试人员申请的临时授权文件有效期为 1 年,需根据不同情况进行更新。项目验收后申请的永久授权无需更新。
GRPC 服务会话密钥更新
更新方式:通过平台维护工具 GWEncrypt.dll 来维护(查看 1.2.1 章节)。
# 证书更新
证书清单
序号 | 证书名 | 证书存储位置 | 是否更新 |
---|---|---|---|
1 | Https 证书 | ../IoTCenter/IoTCenterWeb/publish/SSL/ssl.pfx | 更新 |
更新方式
更新方式:将新的 https 证书替换至../IoTCenter/IoTCenterWeb/publish/SSL/目录下即可。
更新时间:通过 https://localhost:44380/访问时,可以查看到 https 证书的详情,可查看有效期,到期前及时更换。
# 自动生成新证书
cd 切换到 IoTCenter/IoTCenterWeb/publish/目录下。
执行赋权命令:chmod +x crf.sh
开启证书自动更新开关。
打开 AlarmCenterProperties.xml 文件,设置 SSLAutoGenerate 为 true。
重启平台,新证书生成成功。
提示
- Linux环境下SSLAutoGenerate默认为TRUE,如需替换指定证书可将该属性值改为False,将新的 https 证书替换至../IoTCenter/IoTCenterWeb/publish/SSL/目录下重启平台即可。
- Windows环境下SSLAutoGenerate默认为False,无法自动生成证书需要按mkcert 生成证书流程进行生成。
# mkcert 生成证书流程
由于某些机制要求,需服务端启用严格的 https 证书,且证书签名需与服务器 ip 匹配,且不支持不安全的 openssl 证书,需使用 mkcert 来制作证书。
IoTCenter 网关 https 证书配置
修改 IoTCenterdataAlarmCenterAlarmCenterProperties.xml 的相关节点。(配置仅供参考,不可直接使用)
<Properties name="HostServer">
<EnableGrpc value="true" />
<HostIpAddr value="127.0.0.1" /> //127.0.0.1仅限于本机访问,外网访问需设置为固定Ip地址,ioc应用场景不建议使用0.0.0.0全网公开端口
<HttpPort value="4000" />
<HttpsPort value="14001" /> //需启用Https端口,默认未启用。
<MQPort value="" />
<MQSubPort value="" />
<HttpsCertFile value="keystore.p12" /> //证书文件名
<HttpsPassword
value="MjAyMjA2MjKq/gXx1s1IEp+U+w5poBQVBHtEmzkf3YleWDy1wcDfBCcz2XyhXgmT4BX6X/GrwMad0M1/fObF9fIaty4acxfGOh+GH/GsjcUKs+vCRiHYSM5WHN7FL"/> //Https证书密码
</Properties>
本地安装 mkcert
点击下载mkcert
初始化
在mkcert.exe
所在目录下运行 mkcert -install
命令以初始化
生成证书
运行命令
mkcert -p12-file keystore.p12 -pkcs12 localhost "localhost" localhost localhost 127.0.0.1 ::1
命令行定义
localhost 替换为服务器的机器(主机)名,windows 和 linux 都可以
127.0.0.1 替换为服务器 IP
举例如下图,所需生成证书命令为:
mkcert -p12-file keystore.p12 -pkcs12 ecs-a26a-0004 "ecs-a26a-0004" ecs-a26a-0004 ecs-a26a-0004 139.159.199.230 ::1
证书验证
将生成后的 keystore.p12 文件放置到服务端 IoTCenterbinssl 目录下。使用 GWEncrypt 工具对 mkcert 密码(默认为changeit
)进行加密,并配置在 HttpsPassword 节点,重启 IoTCenter 网关服务端 GWHost 进程。
本地同步部署证书并运行(双击打开之后,一直默认下一步既可)
若证书可用,通过 https 访问网关端口时,其连接状态将显示为【连接是安全的】
mkcert 默认密码为changeit
,如需修改,可先生成 pem 证书,再用 pem 证书使用固定密码加密生成 p12 证书
# 平台镜像打包
K8S 的部署和docker容器的部署在打包镜像有着许多相似之处。docker容器安装完成后进行平台镜像打包。
注:该教程只提供Linux系统的打包教程,其他平台读者可自行探索。
打包步骤
下载IoTCenter源包。
到下载地址IoTCenter平台下载中心 (opens new window)下载最新版本的IoTCenter软件压缩包。
命令
curl -o IoTCenter.zip https://ganweicloud.obs.cn-north-4.myhuaweicloud.com/%E6%96%87%E6%A1%A3%E7%BD%91%E7%AB%99/IoTCenter%E7%89%88%E6%9C%AC/6.0.3/6.0.3-Linux_x86_64.zip
解压源包。
命令
unzip IoTCenter.zip
创建镜像EntryPoint脚本runGW.sh。
代码
#!/bin/bash umask 027 # start service nohup /opt/ganwei/IoTCenter/IoTCenterWeb/shell/restart.sh >/dev/null 2>&1 & sleep 15 echo "start service finish" tail -f /dev/null
创建打包Dockerfile。
代码
# 基础镜像为微软官方aspnetcore6.0镜像 FROM mcr.microsoft.com/dotnet/nightly/aspnet:6.0 # 初始化时区为中国上海(东八区) ENV TZ="Asia/Shanghai" # 去除apt安装缓存 RUN apt update \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /opt/ganwei/ \ && chmod -R 755 /opt/ganwei COPY IoTCenter /opt/ganwei/IoTCenter COPY runGW.sh /opt/ganwei/ # 修改.sh文件的权限,谨防越权 RUN find /opt/ganwei/IoTCenter/IoTCenterWeb -name *.sh -exec chmod 550 {} \; EXPOSE 44380 WORKDIR /opt/ganwei/ # 启动EntryPoint脚本 CMD sh runGW.sh
部署中也许需要持久化一些文件,如:配置文件AlarmCenterProperties.xml;SQLite数据库文件(使用关系型数据库服务器MySQL等则忽略);插件安装目录packages等。
注意:由于映射目录时,目录文件会自动清除。所以在启动脚本中需做一些前置工作。
- 在启动时需先生成sqlite数据库文件。
DBPATH=/opt/ganwei/IoTCenter/database/Database.db # Linux系统需安装sqlite3包。 if [ ! -f "$DBPATH" ]; then cat /ganwei/config/sqlite.sql | sqlite3 $DBPATH echo "execte initialized sql script" fi
- 由其他备用目录复制配置文件AlarmCenterProperties.xml至运行目录
XMLDIR=/ganwei/data/ cp -rf $XMLDIR/* /opt/ganwei/IoTCenter/data/
- 由其他备用目录原始插件包至运行目录下。
PKGDIR=/ganwei/packages/ cp -rn /opt/ganwei/IoTCenter/IoTCenterWeb/originpackages/* $PKGDIR
最后的启动脚本runGW.sh
#!/bin/bash umask 027 PKGDIR=/ganwei/packages/ XMLDIR=/ganwei/data/ DBPATH=/opt/ganwei/IoTCenter/database/Database.db # create database if [ ! -f "$DBPATH" ]; then cat /ganwei/config/sqlite.sql | sqlite3 $DBPATH echo "execte initialized sql script" fi # copy xml cp -rf $XMLDIR/* /opt/ganwei/IoTCenter/data/ # copy packages cp -rn /opt/ganwei/IoTCenter/IoTCenterWeb/originpackages/* $PKGDIR # start service nohup /opt/ganwei/IoTCenter/IoTCenterWeb/shell/restart.sh >/dev/null 2>&1 & sleep 15 echo "start service finish" tail -f /dev/null
# K8S 部署
docker镜像打包完成后。就可以开始K8S集群容器部署了。部署时需要熟悉使用K8S三个重要的功能ConfigMap,Deployment,PVC。
- ConfigMap:是一种 API 对象,用来将非机密性的数据保存到键值对中
- Deployment:为 Pod 和 ReplicaSet 提供声明式的更新能力
- PVC:持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对集群中的一块存储的请求。
部署步骤
声明储存卷PVC。
yml代码
--- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: iot-volume-pvc namespace: iot spec: accessModes: - ReadWriteOnce resources: requests: storage: 40Gi storageClassName: csi-disk volumeMode: Filesystem
代码解释
该段代码主要功能是向集群申请一块可读写的40GB存储。StorageClass为csi-disk的存储类声明了该动态制备内存的属性,包括制备器(用来决定使用哪个卷插件制备 PV)、回收策略(动态创建的 PV在PVC删除的时,是保留还是一起删除)、参数等。
声明配置ConfigMap。
yml代码
apiVersion: v1 data: AlarmCenter.shd: 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 AlarmCenterProperties.xml: |- <AlarmCenterProperties> <Properties name="AES.Parameter4OldEncrypt"> <IVString value="" /> <Key value="" /> </Properties> <AlarmCenter.Debug value="0" /> <Properties name="AlarmCenter.Gui.OptionPanels.CurveOptions"> <CurveStoreInDB value="FALSE" /> <EquipSaveType value="FALSE" /> <History_CurveStoreTime value="365" /> <Hostory_CurveStorePath value="/ganwei/CurveData" /> <Real_CurveLenth value="300" /> <Real_FrashTime value="1" /> <RemoteSite value="false" /> <RemoteSitePwd value="" /> <RemoteSiteUser value="" /> </Properties> <Properties name="AlarmCenter.Gui.OptionPanels.DatabaseOptions"> <Access.Select value="False" /> <GaussDB.Database value="iotcenter" /> <GaussDB.IP value="" /> <GaussDB.PORT value="" /> <GaussDB.PWD value="" /> <GaussDB.Select value="False" /> <GaussDB.UID value="gaussdb" /> <Kingbase.Database value="postgres" /> <Kingbase.IP value="" /> <Kingbase.PORT value="" /> <Kingbase.PWD value="" /> <Kingbase.Select value="False" /> <Kingbase.UID value="" /> <MySql.Database value="iotcenter" /> <MySql.IP value="" /> <MySql.PORT value="" /> <MySql.PWD value="" /> <MySql.Select value="True" /> <MySql.SSL value="" /> <MySql.UID value="root" /> <PostgreSQL.Database value="postgres" /> <PostgreSQL.IP value="" /> <PostgreSQL.PORT value="5432" /> <PostgreSQL.PWD value="" /> <PostgreSQL.Select value="False" /> <PostgreSQL.UID value="postgres" /> <SQLite.DefaultPath value="/ganwei/database/Database.db" /> <SQLite.Select value="False" /> <SQLServer.Select value="False" /> </Properties> <AllowOrigins value="http://127.0.0.1:44380,https://127.0.0.1:44380,http://127.0.0.1:44381" /> <CoreProperties.UILanguage value="zh-CN" /> <DBStoreLimitTime value="10" /> <Properties name="HostServer"> <EnableGrpc value="true" /> <EnableSSLGen value="false" /> <HostIpAddr value="127.0.0.1" /> <HttpPort value="4000" /> <HttpsCertFile value="" /> <HttpsPassword value="" /> <HttpsPort value="" /> <MQPort value="" /> <PluginsPath value="" /> <Redis.ConnectString value="" /> <Redis.Password value="" /> <SafetyLevel value="2" /> <SingleAppStart value="false" /> <StorageFile value="" /> <UnityPort value="" /> <ZMQSubscribeKey value="" /> </Properties> <Properties name="WebApi"> <ApplicationPartName value="IoTCenter.Web." /> <CipherAdapterEnable value="False" /> <EnableGatewayCache value="True" /> <ExpiredTime value="525600" /> <FormFileSize value="210763776" /> <GatewayKeepAlive value="15" /> <HttpPort value="44383" /> <HttpsPort value="44382" /> <IpAddress value="0.0.0.0" /> <IsInitMaintainPwd value="True" /> <MaxGatewayStoreExpire value="10" /> <RSAAutoGenerate value="False" /> <RSAPadding value="" /> <ShowSystemInfo.ShowPlatformInfo value="True" /> <SSLAutoGenerate value="False" /> <SSLName value="SSL/ssl.pfx" /> <SSLPassword value="MjAyNDAyMTHyyRRuknl4uBnfQ2cELnbgziZziD+qLoUXP+vhP9rmujLmk2PwArsZjajuqDmpZnj5sXOwk9LzzFoKqHSH4N50IoEMA+fLGh/kJjBmMmSy01A0h6UNYDzBXj2qUQfQXXu7XHwdMKvzvca4rHDl43rDLgAFtABenlzRkXp8k0dnAVYf7aeU0k/72mH+3dBjnY8dSet0KjiE4dDz6JSciFi+tWeO1uyNdcRZJj5C0RfSS5KLVgQO+2sJvZFO0NY2vqV0isuljoH2ASLP2eNxCemFU7xZfwvVQsnBY3V59OE3e4eI9DDAAMwNCpOA5C/GUSZ22MQ17iCIBauE4WcSYkveZAFrQUL/3iBikurziBWCOXXSdUxskjsdZXaaMot0ROYe2o1U00IANd0QGEG9wVdQh0TPWs5MG3/nYvTXufqSPw==" /> <TryConnectTime value="3" /> </Properties> </AlarmCenterProperties> sqlite.sql: |- DROP TABLE IF EXISTS "main"."Administrator"; CREATE TABLE "Administrator" ( "Administrator" TEXT NOT NULL, "Telphone" TEXT, "MobileTel" TEXT, "EMail" TEXT, "AckLevel" INTEGER NOT NULL, "Reserve1" TEXT, "Reserve2" TEXT, "Reserve3" TEXT, "photoImage" TEXT, "UserName" TEXT, CONSTRAINT "PK_Administrator" PRIMARY KEY ("Administrator") ); kind: ConfigMap metadata: name: iotcenter-cm namespace: iot
代码解释
该ConfigMap主要存放数据库脚本,AlarmCenterProperties.xml等初始化数据。代替docker的临时初始化目录
声明配置Deployment。
yml代码
apiVersion: apps/v1 kind: Deployment metadata: labels: k8s-app: iotcenter-euler-v1 ganwei-app: iotcenter-euler-v1 name: iotcenter-euler-v1 namespace: iot spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: iotcenter-euler-v1 ganwei-app: iotcenter-euler-v1 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 type: RollingUpdate template: metadata: labels: k8s-app: iotcenter-euler-v1 ganwei-app: iotcenter-euler-v1 spec: nodeSelector: iotServer: iot containers: - env: - name: PATH value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin image: iotcenter:6.1.0 ports: - containerPort: 44380 - containerPort: 44381 imagePullPolicy: IfNotPresent name: iotcenter-euler-container-v1 volumeMounts: - name: cm-iot mountPath: /ganwei/config - name: iot-volume mountPath: /ganwei workingDir: /opt/ganwei restartPolicy: Always volumes: - name: iot-volume persistentVolumeClaim: claimName: iot-volume-pvc - configMap: defaultMode: 420 items: - key: AlarmCenter.shd mode: 420 path: AlarmCenter.shd - key: AlarmCenterProperties.xml mode: 420 path: AlarmCenterProperties.xml - key: sqlite.sql mode: 420 path: sqlite.sql name: iotcenter-cm name: iot-cm-2
代码解释声明一个deploy的template。将configmap挂载至/ganwei/config。volumn挂载至/ganwei。将配置文件的持久化至/ganwei/data。 如果需要提供给局域网访问。还需要添加对外服务Service
```
---
apiVersion: v1
kind: Service
metadata:
name: iotcenter-euler-v1
namespace: iot
spec:
externalTrafficPolicy: Cluster
ports:
- name: https-44380-44380
nodePort: 30380
port: 44380
protocol: TCP
targetPort: 44380
- name: https-44381-44381
nodePort: 30381
port: 44381
protocol: TCP
targetPort: 44381
selector:
k8s-app: iotcenter-euler-v1
ganwei-app: iotcenter-euler-v1
type: NodePort
```
# K8S 下部署 iotcenter
安装包中有 iotcenter 镜像和 mysql 镜像,分为 arm 和 x86,共四个镜像,在 image 文件夹中。InstallTool 包含安装和升级脚本,在 resourceFile 中有相应的 yaml 文件。
Yaml 文件说明
在 resourceFile 文件夹中 iotcenter 和 mysql 两个镜像包的 yaml 文件,其中 mysql-password.yaml 和 mysql-password-arm.yaml 分别对应两个不同架构 cpu 下传入的密码,在执行安装脚本时会自动判断选择传入相应的密码字符串,
一键安装脚本使用方法
首先 cd 到 insatll.sh 的目录,然后按照镜像版本和 nfs 储存地址或者本地储存配置需要传入的参数。
sh install.sh "repoURL="mydockerhub.com:5000/cube-repo-space"|imageTag="6.0.0.1"|namespace="iot"|nfsVip="10.2.0.13"|nfsPath="/var/ganwei/""
需要传入的参数
repoURL=""|imageTag=""|namespace="iot"|nfsVip=""|nfsPath=""
升级脚本需要传入的参数
repoURL=""|imageTag=""|namespace="iot"
nfsPath 参数在后面跟了一个目录
{{nfsPath}}ganwei
{{nfsPath}}mysql
安装和升级脚本说明
安装脚本接收到传入的参数后将在 resourceFile 文件夹中生成对应的 yaml 文件,之后通过对环境的判断,自动选择需要执行的 yaml 文件开始部署,首先会创建 node 和命名空间,之后开始部署 mysql,之后部署 iotcenter。
升级脚本首先通过传入的参数只更新 resourceFile 中文件夹中的 iotcenter-deployment.yaml 文件,最后通过kubectlapply -f
命令更新 yaml 文件,k8s 通过新的 deployment 文件拉取新的镜像,完成更新。本包的脚本未涉及到数据库的版本更新和表的更新。
手动安装方法
在没有执行脚本之前,在 resourceFile 文件夹中只有 yaml.j2 的文件,需要手动安装需要将 resource 文件夹中的 yaml.j2 文件的 j2 去掉,之后按照对照表中将参数补全;
其中 iotcenter-deploymentyaml 文件内 spec.template.spec.containers.image 中传入的参数需要改成
{{repoURL}}iotcenter-euler:{{imageTag}}
或者 ARM 架构下改成
{{repoURL}}iotcenter-euler-aarch64:{{imageTag}}
再将参数手动改入到文件中。
传入参数和 yaml 文件对照表
yaml 文件名 | repoURL | imageTag | namespace | nfsVip | nfsPath |
---|---|---|---|---|---|
iotcenter-deployment.yaml | √ | √ | √ | ||
iotcenter-pv.yaml | √ | √ | |||
mysql-pv.yaml | √ | √ |
修改之后,将对应的镜像导入对应的仓库;
在执行如下命令;
创建 node
kubectl label node minikube iotServer=iot
创建命名空间
kubectl create namespace iot
部署 mysql 数据库
kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-configmap.yaml
kubectl apply -f mysql-password.yaml(ARM架构执mysql-password-arm.yaml)
kubectl apply -f mysql-deployment.yaml
部署 iotcenter
kubectl apply -f iotcenter-pv.yaml
kubectl apply -f iotcenter-pvc.yaml
kubectl apply -f iotcenter-configmap.yaml
kubectl apply -f iotcenter-deployment.yaml
手动升级方法
将 resourceFile 文件夹中的 iotcenter-deployment.yaml 文件中的 spec.template.spec.containers.image 传入的参数需要改成
{{repoURL}}iotcenter-euler:{{imageTag}}
或者 ARM 架构下改成
{{repoURL}}iotcenter-euler-aarch64:{{imageTag}}
,在将新版本的镜像的 imageTag 信息填入到参数中,rupoURL,nfsVip 和 nfsPath,保持不变。
之后执行kubectl apply -f
iotcenter-configmap.yaml 更新资源文件,之后会自动拉取新的镜像,当新的 pod,之后旧 pod 会自行删除。