This commit is contained in:
xyj 2023-12-15 10:09:11 +08:00
parent e7768fd180
commit df2127e750
2 changed files with 154 additions and 62 deletions

197
README.md
View File

@ -1,10 +1,15 @@
# 1. 项目简介 # 1. 项目简介
# 2. 开发环境部署 # 2. 开发环境部署
## 软件要求 ## 软件要求
#### 已经测试过的系统 #### 已经测试过的系统
- Debian GNU/Linux 12(bookworm) Linux version 5.16.17+ - Debian GNU/Linux 12(bookworm) Linux version 5.16.17+
## 环境安装 ## 环境安装
``` ```
# 首先,确信你的机器安装了python 3.11.2 # 首先,确信你的机器安装了python 3.11.2
$ python --version $ python --version
@ -34,6 +39,7 @@ Thu Dec 14 15:13:45 CST 2023
# 更新py库 # 更新py库
$ pip3 install --upgrade pip $ pip3 install --upgrade pip
``` ```
## 配置wifi ## 配置wifi
``` ```
@ -46,14 +52,18 @@ enabled
# 连接wifi # 连接wifi
$ sudo nmcli dev wifi connect <SSID> password <PASSWORD> $ sudo nmcli dev wifi connect <SSID> password <PASSWORD>
``` ```
## 配置系统静态IP ## 配置系统静态IP
### 使用nmtui网络界面管理 ### 使用nmtui网络界面管理
`$ sudo nmtui` `$ sudo nmtui`
- 设置的静态IP地址网段需要和摄像机在同一个网段 - 设置的静态IP地址网段需要和摄像机在同一个网段
- 无需设置网关即为空。此项解决wifi上网和以太网上网冲突的问题。 - 无需设置网关即为空。此项解决wifi上网和以太网上网冲突的问题。
- DNS设置为8.8.8.8 - DNS设置为8.8.8.8
- 勾选始终不使用此网络于默认路由 - 勾选始终不使用此网络于默认路由
## 配置git和pip ## 配置git和pip
``` ```
@ -68,6 +78,7 @@ $ cd lot_manager
# 安装项目依赖 # 安装项目依赖
$ pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple $ pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
``` ```
## 创建设备名称(系统唯一标识名称) ## 创建设备名称(系统唯一标识名称)
``` ```
@ -76,6 +87,7 @@ $ cd ~
$ echo 'lihai_lot_walnutpi_dev_1' | tee device_name $ echo 'lihai_lot_walnutpi_dev_1' | tee device_name
lihai_lot_walnutpi_dev_1 lihai_lot_walnutpi_dev_1
``` ```
## 创建mp4文件目录 ## 创建mp4文件目录
``` ```
@ -102,7 +114,9 @@ $ sudo crontab -e
``` ```
$ python /home/pi/lot_manager/create_db.py $ python /home/pi/lot_manager/create_db.py
``` ```
## 配置supervisor文件 ## 配置supervisor文件
1. 安装完supervisor后会在/etc/supervisor目录下存在supervisord.conf文件和conf.d目录。 1. 安装完supervisor后会在/etc/supervisor目录下存在supervisord.conf文件和conf.d目录。
``` ```
@ -110,12 +124,14 @@ $ cd /etc/supervisor/
$ ls $ ls
conf.d supervisord.conf supervisord.conf.bak conf.d supervisord.conf supervisord.conf.bak
``` ```
2. 需要对supervisord.conf文件进行配置 2. 需要对supervisord.conf文件进行配置
``` ```
$ sudo cp supervisord.conf supervisord.conf.bak $ sudo cp supervisord.conf supervisord.conf.bak
$ sudo vim supervisord.conf $ sudo vim supervisord.conf
``` ```
3. 配置信息: 3. 配置信息:
``` ```
@ -160,16 +176,17 @@ priority=1
[include] [include]
files = /home/pi/lot_manager/conf/common/*.conf files = /home/pi/lot_manager/conf/common/*.conf
``` ```
上面是已经修改好的配置文件,修改了其中几项: 上面是已经修改好的配置文件,修改了其中几项:
- [unix_http_server] - [unix_http_server]
chmod改为0777使得普通用户得以执行。 chmod改为0777使得普通用户得以执行。
- [include] - [include]
files = /etc/supervisor/conf.d/*.conffiles是用户定义的配置文件。 files = /etc/supervisor/conf.d/*.conffiles是用户定义的配置文件。
- [supervisorctl] - [supervisorctl]
添加user=pi使得普通用户得以执行。 添加user=pi使得普通用户得以执行。
- [program:\_\_mqtt\_\_] - [program:\_\_mqtt\_\_]
添加mqtt配置信息 添加mqtt配置信息
- 修改/etc/supervisor/conf.d的权限sudo chmod 777 /etc/supervisor/conf.d - 修改/etc/supervisor/conf.d的权限sudo chmod 777 /etc/supervisor/conf.d
4. 设置开启启动supervisor 4. 设置开启启动supervisor
@ -177,72 +194,77 @@ files = /etc/supervisor/conf.d/*.conffiles是用户定义的配置文件。
``` ```
$ sudo systemctl enable supervisor $ sudo systemctl enable supervisor
``` ```
5. 启动supervisor 5. 启动supervisor
``` ```
sudo systemctl start supervisor sudo systemctl start supervisor
``` ```
# 3. 项目结构 # 3. 项目结构
- lot_manager
- bash
- cron_delete_mp4.sh 定时删除录像脚本
- modify_device_name.sh 修改设备唯一名称脚本
- record.sh 录像脚本
- start_data_upload.sh 开启数据上传脚本
- start_push_stream.sh 启动推流脚本
- stop_data_upload.sh 停止数据上传脚本
- stop_push_stream.sh 停止推流脚本
- stream.sh 推流命令脚本
- conf
- common
- data_upload.conf 数据上传配置
- mqtt.conf mqtt配置
- push_stream.conf 推流配置
- record.conf 录像配置
- sensor_to_local.conf 数据保存在本地
- sensor_to_server.conf 数据发布到mq服务器
- device
- device.conf 不同设备的配置
- example
- cron_for_32G.conf 对于32G卡的定时任务配置
- cron_for_64G.conf 对于64G卡的定时任务配置
- supervisord.conf 配置supervisor文件
- main
- common.conf 公共配置
- tmp
- device_name 需要修改的设备名称
- zhanguan
- topic.conf 展馆的特殊设备
- db/ 本地数据库管理
- MQTT.py
- data_upload.py 数据上传程序
- api.py 本地数据库api
- config.py 读取各种配置文件
- create_db.py 创建数据库程序
- delete_lot_3_days.py 删除数据库中早于3天的数据
- delete_than20G.py 当录像超过20G直接删除直到小于20G
- sensor_to_local.py 数据保存在本地
- sensor_to_server.py 数据发布到服务器
- tool.py 工具
- git_push.sh 推送git脚本
- git_update.sh 更新git脚本
- install.sh 安装依赖脚本
# 4.参数配置 - lot_manager
- bash
- cron_delete_mp4.sh 定时删除录像脚本
- modify_device_name.sh 修改设备唯一名称脚本
- record.sh 录像脚本
- start_data_upload.sh 开启数据上传脚本
- start_push_stream.sh 启动推流脚本
- stop_data_upload.sh 停止数据上传脚本
- stop_push_stream.sh 停止推流脚本
- stream.sh 推流命令脚本
- conf
- common
- data_upload.conf 数据上传配置
- mqtt.conf mqtt配置
- push_stream.conf 推流配置
- record.conf 录像配置
- sensor_to_local.conf 数据保存在本地
- sensor_to_server.conf 数据发布到mq服务器
- device
- device.conf 不同设备的配置
- example
- cron_for_32G.conf 对于32G卡的定时任务配置
- cron_for_64G.conf 对于64G卡的定时任务配置
- supervisord.conf 配置supervisor文件
- main
- common.conf 公共配置
- tmp
- device_name 需要修改的设备名称
- zhanguan
- topic.conf 展馆的特殊设备
- db/ 本地数据库管理
- MQTT.py
- data_upload.py 数据上传程序
- api.py 本地数据库api
- config.py 读取各种配置文件
- create_db.py 创建数据库程序
- delete_lot_3_days.py 删除数据库中早于3天的数据
- delete_than20G.py 当录像超过20G直接删除直到小于20G
- sensor_to_local.py 数据保存在本地
- sensor_to_server.py 数据发布到服务器
- tool.py 工具
- git_push.sh 推送git脚本
- git_update.sh 更新git脚本
- install.sh 安装依赖脚本
# 4.supervisor参数配置
配置文件都在conf文件夹下。主要是common、main和device文件夹。 配置文件都在conf文件夹下。主要是common、main和device文件夹。
- conf - conf
- common 表示supervisor管理的进程配置文件 - common 表示supervisor管理的进程配置文件
- device 设置不同device的配置包括订阅主题、发布主题、用户名和密码等 - device 设置不同device的配置包括订阅主题、发布主题、用户名和密码等
- main 公共配置,包括域名设置、录像上传地址等 - main 公共配置,包括域名设置、录像上传地址等
### MQTT的supervisor配置文件 ### MQTT的supervisor配置文件
directory表示执行命令时首先进入这个文件夹 directory表示执行命令时首先进入这个文件夹
command表示要执行的命令 command表示要执行的命令
user必须是pi user必须是pi
autostart表示随开机或supervisor重启时跟着启动 autostart表示随开机或supervisor重启时跟着启动
autorestart表示启动失败自动重启3次 autorestart表示启动失败自动重启3次
``` ```
[program:__mqtt__] [program:__mqtt__]
directory=/home/pi/lot_manager directory=/home/pi/lot_manager
@ -256,6 +278,7 @@ stopasgroup=True
priority=1 priority=1
``` ```
### 数据上传的supervisor配置文件 ### 数据上传的supervisor配置文件
``` ```
@ -274,8 +297,11 @@ stopsignal=TERM
stopasgroup=True stopasgroup=True
``` ```
### 推流的supervisor配置文件 ### 推流的supervisor配置文件
注意不要跟随开机或supervisor重启启动 注意不要跟随开机或supervisor重启启动
``` ```
[program:push_stream] [program:push_stream]
directory=/home/pi/lot_manager/bash directory=/home/pi/lot_manager/bash
@ -287,7 +313,9 @@ redirect_stderr=true
stopsignal=TERM stopsignal=TERM
stopasgroup=True stopasgroup=True
``` ```
### 录像的supervisor配置文件 ### 录像的supervisor配置文件
``` ```
[program:record] [program:record]
directory=/home/pi/lot_manager/bash directory=/home/pi/lot_manager/bash
@ -304,6 +332,7 @@ stopsignal=TERM
stopasgroup=True stopasgroup=True
``` ```
### 数据保存在本地的supervisor配置文件 ### 数据保存在本地的supervisor配置文件
``` ```
@ -341,7 +370,6 @@ stopsignal=TERM
stopasgroup=True stopasgroup=True
``` ```
## 不同设备的配置 ## 不同设备的配置
``` ```
@ -400,6 +428,7 @@ publish_topic=camera_6
username=lihai_lot_land_1 username=lihai_lot_land_1
password=123456 password=123456
``` ```
### 公共配置 ### 公共配置
``` ```
@ -423,7 +452,9 @@ value=123456
device_name=`cat /home/pi/device_name` device_name=`cat /home/pi/device_name`
/usr/bin/ffmpeg -rtsp_transport tcp -re -i rtsp://admin:123456@192.168.0.123:554/mpeg4 -c copy -preset fast -r 20 -flvflags no_duration_filesize -f rtsp -rtsp_transport tcp rtsp://47.108.186.87:554/live/$device_name /usr/bin/ffmpeg -rtsp_transport tcp -re -i rtsp://admin:123456@192.168.0.123:554/mpeg4 -c copy -preset fast -r 20 -flvflags no_duration_filesize -f rtsp -rtsp_transport tcp rtsp://47.108.186.87:554/live/$device_name
``` ```
对于ffmpeg的参数设置如下 对于ffmpeg的参数设置如下
- -rtsp_transport_tcp tcp 表示以tcp进行获取流保证数据完整性 - -rtsp_transport_tcp tcp 表示以tcp进行获取流保证数据完整性
- -re 表示推流设置 - -re 表示推流设置
- -i 表示输入流,这里是摄像机地址 - -i 表示输入流,这里是摄像机地址
@ -435,6 +466,7 @@ device_name=`cat /home/pi/device_name`
- rtsp://47.108.186.87:554/live/$device_name表示推流地址 - rtsp://47.108.186.87:554/live/$device_name表示推流地址
# 6.录像保存设置 # 6.录像保存设置
录像的脚本为record.sh内容如下 录像的脚本为record.sh内容如下
``` ```
@ -450,7 +482,9 @@ OUTPUT_FILE="${OUTPUT_DIR}/${CURRENT_TIME}.mp4"
# 开始录制RTSP流 # 开始录制RTSP流
/usr/bin/ffmpeg -rtsp_transport tcp -i "${RTSP_URL}" -c copy -c:a aac -s 1920x1080 -r 15 -crf 35 -t "${RECORD_DURATION}" -f mp4 "${OUTPUT_FILE}" /usr/bin/ffmpeg -rtsp_transport tcp -i "${RTSP_URL}" -c copy -c:a aac -s 1920x1080 -r 15 -crf 35 -t "${RECORD_DURATION}" -f mp4 "${OUTPUT_FILE}"
``` ```
参数设置如下: 参数设置如下:
- -rtsp_transport_tcp tcp 表示以tcp进行获取流保证数据完整性 - -rtsp_transport_tcp tcp 表示以tcp进行获取流保证数据完整性
- -i 表示输入流,这里是摄像机地址 - -i 表示输入流,这里是摄像机地址
- -c 表示直接复制源流对象,不进行编码 - -c 表示直接复制源流对象,不进行编码
@ -462,6 +496,7 @@ OUTPUT_FILE="${OUTPUT_DIR}/${CURRENT_TIME}.mp4"
- -f mp4是保存为mp4文件 - -f mp4是保存为mp4文件
# MQTT程序控制配置发布消息和订阅消息 # MQTT程序控制配置发布消息和订阅消息
### 设备的编号配置信息 ### 设备的编号配置信息
设备的配置为: 设备的配置为:
@ -475,20 +510,25 @@ publish_topic=camera_1
username=lihai_lot_land_1 username=lihai_lot_land_1
password=123456 password=123456
``` ```
其中, 其中,
- subscribe_topic 表示订阅的主题,只有订阅后才能进行控制 - subscribe_topic 表示订阅的主题,只有订阅后才能进行控制
- publish_topic 表示数据发布的主题 - publish_topic 表示数据发布的主题
- username 表示客户端进行连接的用户名 - username 表示客户端进行连接的用户名
- password 表示客户端进行连接的密码 - password 表示客户端进行连接的密码
### 控制设备(推流、数据上传、录像等) ### 控制设备(推流、数据上传、录像等)
1. 发布的主题 1. 发布的主题
``` ```
lihai_lot_walnutpi_dev_1 lihai_lot_walnutpi_dev_1
``` ```
2. 发送的消息体payload 2. 发送的消息体payload
example: example:
``` ```
{ {
"msg":"exec", "msg":"exec",
@ -496,8 +536,11 @@ example:
"pwd":"123456" "pwd":"123456"
} }
``` ```
### msg类型 ### msg类型
msg表示消息类型包括 msg表示消息类型包括
- push_stream 设备启动推流 - push_stream 设备启动推流
``` ```
@ -551,6 +594,7 @@ msg表示消息类型包括
``` ```
- reload 重启supervisor - reload 重启supervisor
``` ```
发布主题lihai_lot_walnutpi_dev_1 发布主题lihai_lot_walnutpi_dev_1
订阅success,error 订阅success,error
@ -559,7 +603,9 @@ msg表示消息类型包括
"pwd":"123456" "pwd":"123456"
} }
``` ```
- update 更新git - update 更新git
``` ```
发布主题lihai_lot_walnutpi_dev_1 发布主题lihai_lot_walnutpi_dev_1
订阅success,error 订阅success,error
@ -568,7 +614,9 @@ msg表示消息类型包括
"pwd":"123456" "pwd":"123456"
} }
``` ```
- exec 执行linux命令 - exec 执行linux命令
``` ```
发布主题lihai_lot_walnutpi_dev_1 发布主题lihai_lot_walnutpi_dev_1
订阅success,error 订阅success,error
@ -578,11 +626,48 @@ msg表示消息类型包括
"pwd":"123456" "pwd":"123456"
} }
``` ```
### data ### data
- data在执行linux命令和获取录像时必须设置。 - data在执行linux命令和获取录像时必须设置。
- 在执行命令时data则是需要执行的命令获取录像时需要指定需要的录像名称 - 在执行命令时data则是需要执行的命令获取录像时需要指定需要的录像名称
- 订阅success和error主题可以查看错误消息和命令执行结果 - 订阅success和error主题可以查看错误消息和命令执行结果
# 本地数据库字段设置
```
class LOT_DATA(BaseModel):
create_time: int = Field(None, description='创建时间(时间戳) ')
wind_speed: float = Field(None, description='风速:(0到30)m/s ')
wind_direction: float = Field(None, description='风向:0360°')
ambient_temperature: float = Field(None, description='环境温度:℃')
ambient_humidity: float = Field(None, description='环境湿度:%RH')
carbon_dioxide: float = Field(None, description='二氧化碳0~5000ppm')
ambient_air_pressure: float = Field(None, description='环境气压0~120KPa')
rainfall: float = Field(None, description='雨量mm')
ambient_lighting: float = Field(None, description='环境光照0-65535Lux0-20万Lux')
soil_temperature: float = Field(None, description='土壤温度:-40~80℃')
soil_moisture: float = Field(None, description='土壤湿度0-100%RH')
soil_conductivity: float = Field(None, description='土壤电导率0-20000μS/cm')
soil_PH: float = Field(None, description='土壤PH:3~9PH')
soil_potassium_phosphate_nitrogen: float = Field(None, description='土壤磷酸钾氮的标准值在140-225mg/kg')
soil_potassium_phosphate_phosphorus: float = Field(None, description='土壤磷酸钾磷的标准值在57-100mg/kg,')
soil_potassium_phosphate_potassium: float = Field(None, description='土壤磷酸钾钾的标准值在106-150mg/kg')
```
### 本地数据库存放位置
```
# 存放的路径
KB_ROOT_PATH = "/home/pi/"
# 数据库名称
DB_ROOT_PATH = os.path.join(KB_ROOT_PATH, "lot_data.db")
# 连接URI
SQLALCHEMY_DATABASE_URI = f"sqlite:///{DB_ROOT_PATH}"
```
# 技术路线图 # 技术路线图
- [ x ] 数据上传
- [x] 数据上传
- [x] 摄像机推流
- [ ] MQTT程序控制的返回结果设置统一的返回状态码 - [ ] MQTT程序控制的返回结果设置统一的返回状态码

View File

@ -5,18 +5,25 @@ sudo apt install supervisor
sudo apt install ffmpeg -y sudo apt install ffmpeg -y
sudo timedatectl set-timezone Asia/Shanghai sudo timedatectl set-timezone Asia/Shanghai
sudo apt install git
git config --global user.name xyj git config --global user.name xyj
git config --global user.email 1090822794@qq.com git config --global user.email 1090822794@qq.com
git config --global credential.helper store git config --global credential.helper store
cd /home/pi
git clone https://gitea.lihaink.cn/xyj/lot_manager.git git clone https://gitea.lihaink.cn/xyj/lot_manager.git
cd lot_manager cd lot_manager
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python /home/pi/lot_manager/create_db.py sudo cp /etc/supervisor/supervisord.conf /etc/supervisor/supervisord.conf.bak
mkdir /home/pi/mp4
sudo cp conf/example/supervisord.conf /etc/supervisor/supervisord.conf sudo cp conf/example/supervisord.conf /etc/supervisor/supervisord.conf
sudo chmod 777 /etc/supervisor/conf.d sudo chmod 777 /etc/supervisor/conf.d
python /home/pi/lot_manager/create_db.py
mkdir /home/pi/mp4
cd /home/pi
echo 'lihai_lot_walnutpi_dev_1' | tee device_name
sudo systemctl enable supervisor sudo systemctl enable supervisor
sudo systemctl start supervisor sudo systemctl start supervisor
sleep 60
supervisorctl reload