From df2127e750844c65a839c5627772ee4de431496f Mon Sep 17 00:00:00 2001 From: xyj <10908227994@qq.com> Date: Fri, 15 Dec 2023 10:09:11 +0800 Subject: [PATCH] update --- README.md | 201 +++++++++++++++++++++++++++++++++++++---------------- install.sh | 15 ++-- 2 files changed, 154 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 7611f98..3c9de83 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ # 1. 项目简介 + # 2. 开发环境部署 ## 软件要求 + #### 已经测试过的系统 + - Debian GNU/Linux 12(bookworm) Linux version 5.16.17+ + ## 环境安装 + ``` # 首先,确信你的机器安装了python 3.11.2 $ python --version @@ -34,6 +39,7 @@ Thu Dec 14 15:13:45 CST 2023 # 更新py库 $ pip3 install --upgrade pip ``` + ## 配置wifi ``` @@ -46,14 +52,18 @@ enabled # 连接wifi $ sudo nmcli dev wifi connect password ``` + ## 配置系统静态IP ### 使用nmtui网络界面管理 + `$ sudo nmtui` + - 设置的静态IP地址网段需要和摄像机在同一个网段 - 无需设置网关,即为空。此项解决wifi上网和以太网上网冲突的问题。 - DNS设置为8.8.8.8 - 勾选始终不使用此网络于默认路由 + ## 配置git和pip ``` @@ -68,6 +78,7 @@ $ cd lot_manager # 安装项目依赖 $ 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 lihai_lot_walnutpi_dev_1 ``` + ## 创建mp4文件目录 ``` @@ -102,7 +114,9 @@ $ sudo crontab -e ``` $ python /home/pi/lot_manager/create_db.py ``` + ## 配置supervisor文件 + 1. 安装完supervisor后,会在/etc/supervisor目录下存在supervisord.conf文件和conf.d目录。 ``` @@ -110,12 +124,14 @@ $ cd /etc/supervisor/ $ ls conf.d supervisord.conf supervisord.conf.bak ``` + 2. 需要对supervisord.conf文件进行配置 ``` $ sudo cp supervisord.conf supervisord.conf.bak $ sudo vim supervisord.conf ``` + 3. 配置信息: ``` @@ -160,16 +176,17 @@ priority=1 [include] files = /home/pi/lot_manager/conf/common/*.conf ``` + 上面是已经修改好的配置文件,修改了其中几项: -- [unix_http_server] -chmod改为0777,使得普通用户得以执行。 +- [unix_http_server] + chmod改为0777,使得普通用户得以执行。 - [include] -files = /etc/supervisor/conf.d/*.conf,files是用户定义的配置文件。 + files = /etc/supervisor/conf.d/*.conf,files是用户定义的配置文件。 - [supervisorctl] -添加user=pi,使得普通用户得以执行。 + 添加user=pi,使得普通用户得以执行。 - [program:\_\_mqtt\_\_] -添加mqtt配置信息 + 添加mqtt配置信息 - 修改/etc/supervisor/conf.d的权限,sudo chmod 777 /etc/supervisor/conf.d 4. 设置开启启动supervisor @@ -177,72 +194,77 @@ files = /etc/supervisor/conf.d/*.conf,files是用户定义的配置文件。 ``` $ sudo systemctl enable supervisor ``` + 5. 启动supervisor ``` sudo systemctl start supervisor ``` - # 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 表示supervisor管理的进程配置文件 - - device 设置不同device的配置,包括订阅主题、发布主题、用户名和密码等 - - main 公共配置,包括域名设置、录像上传地址等 + - common 表示supervisor管理的进程配置文件 + - device 设置不同device的配置,包括订阅主题、发布主题、用户名和密码等 + - main 公共配置,包括域名设置、录像上传地址等 ### MQTT的supervisor配置文件 + directory表示执行命令时,首先进入这个文件夹 command表示要执行的命令 user必须是pi autostart表示随开机或supervisor重启时跟着启动 autorestart表示启动失败自动重启3次 + ``` [program:__mqtt__] directory=/home/pi/lot_manager @@ -256,6 +278,7 @@ stopasgroup=True priority=1 ``` + ### 数据上传的supervisor配置文件 ``` @@ -274,8 +297,11 @@ stopsignal=TERM stopasgroup=True ``` + ### 推流的supervisor配置文件 + 注意不要跟随开机或supervisor重启启动 + ``` [program:push_stream] directory=/home/pi/lot_manager/bash @@ -287,7 +313,9 @@ redirect_stderr=true stopsignal=TERM stopasgroup=True ``` + ### 录像的supervisor配置文件 + ``` [program:record] directory=/home/pi/lot_manager/bash @@ -304,6 +332,7 @@ stopsignal=TERM stopasgroup=True ``` + ### 数据保存在本地的supervisor配置文件 ``` @@ -341,7 +370,6 @@ stopsignal=TERM stopasgroup=True ``` - ## 不同设备的配置 ``` @@ -400,6 +428,7 @@ publish_topic=camera_6 username=lihai_lot_land_1 password=123456 ``` + ### 公共配置 ``` @@ -423,7 +452,9 @@ value=123456 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 ``` + 对于ffmpeg的参数设置如下: + - -rtsp_transport_tcp tcp 表示以tcp进行获取流,保证数据完整性 - -re 表示推流设置 - -i 表示输入流,这里是摄像机地址 @@ -435,6 +466,7 @@ device_name=`cat /home/pi/device_name` - rtsp://47.108.186.87:554/live/$device_name表示推流地址 # 6.录像保存设置 + 录像的脚本为record.sh,内容如下: ``` @@ -450,7 +482,9 @@ OUTPUT_FILE="${OUTPUT_DIR}/${CURRENT_TIME}.mp4" # 开始录制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}" ``` + 参数设置如下: + - -rtsp_transport_tcp tcp 表示以tcp进行获取流,保证数据完整性 - -i 表示输入流,这里是摄像机地址 - -c 表示直接复制源流对象,不进行编码 @@ -462,6 +496,7 @@ OUTPUT_FILE="${OUTPUT_DIR}/${CURRENT_TIME}.mp4" - -f mp4是保存为mp4文件 # MQTT程序控制配置,发布消息和订阅消息 + ### 设备的编号配置信息 设备的配置为: @@ -475,20 +510,25 @@ publish_topic=camera_1 username=lihai_lot_land_1 password=123456 ``` + 其中, + - subscribe_topic 表示订阅的主题,只有订阅后才能进行控制 - publish_topic 表示数据发布的主题 - username 表示客户端进行连接的用户名 - password 表示客户端进行连接的密码 ### 控制设备(推流、数据上传、录像等) + 1. 发布的主题 ``` lihai_lot_walnutpi_dev_1 ``` + 2. 发送的消息体payload -example: + example: + ``` { "msg":"exec", @@ -496,10 +536,13 @@ example: "pwd":"123456" } ``` + ### msg类型 + msg表示消息类型,包括: + - push_stream 设备启动推流 - + ``` 发布主题:lihai_lot_walnutpi_dev_1 { @@ -551,6 +594,7 @@ msg表示消息类型,包括: ``` - reload 重启supervisor + ``` 发布主题:lihai_lot_walnutpi_dev_1 订阅:success,error @@ -559,7 +603,9 @@ msg表示消息类型,包括: "pwd":"123456" } ``` + - update 更新git + ``` 发布主题:lihai_lot_walnutpi_dev_1 订阅:success,error @@ -568,7 +614,9 @@ msg表示消息类型,包括: "pwd":"123456" } ``` + - exec 执行linux命令 + ``` 发布主题:lihai_lot_walnutpi_dev_1 订阅:success,error @@ -578,11 +626,48 @@ msg表示消息类型,包括: "pwd":"123456" } ``` + ### data + - data在执行linux命令和获取录像时必须设置。 - 在执行命令时,data则是需要执行的命令,获取录像时,需要指定需要的录像名称 - 订阅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='风向:0~360°') + 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-65535Lux;0-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程序控制的返回结果,设置统一的返回状态码 \ No newline at end of file diff --git a/install.sh b/install.sh index 8ca794e..c3a4b45 100644 --- a/install.sh +++ b/install.sh @@ -5,18 +5,25 @@ sudo apt install supervisor sudo apt install ffmpeg -y sudo timedatectl set-timezone Asia/Shanghai +sudo apt install git git config --global user.name xyj git config --global user.email 1090822794@qq.com git config --global credential.helper store + +cd /home/pi git clone https://gitea.lihaink.cn/xyj/lot_manager.git cd lot_manager pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple -python /home/pi/lot_manager/create_db.py -mkdir /home/pi/mp4 - +sudo cp /etc/supervisor/supervisord.conf /etc/supervisor/supervisord.conf.bak sudo cp conf/example/supervisord.conf /etc/supervisor/supervisord.conf 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 start supervisor \ No newline at end of file +sudo systemctl start supervisor +sleep 60 +supervisorctl reload \ No newline at end of file