lot_manager/sensor_to_server.py

260 lines
12 KiB
Python
Raw Permalink Normal View History

2023-12-05 16:21:08 +08:00
import json
2023-12-26 17:48:05 +08:00
import subprocess
2023-12-05 16:21:08 +08:00
import threading
import time
import serial
import paho.mqtt.client as mqtt
2023-12-07 17:29:58 +08:00
from api import add
2023-12-07 17:12:11 +08:00
from db.models.lot_data_model import LOT_DATA
2023-12-11 16:46:03 +08:00
2023-12-14 09:26:35 +08:00
from config import broker, port, subscribe_topic, publish_topic, username, password, zhanguan_device_name
2023-12-05 16:21:08 +08:00
2023-12-11 14:11:12 +08:00
def get_data():
2023-12-05 18:35:06 +08:00
temp_send = '06 03 01 F4 00 02 85 B2 ' # 温湿度查询指令
co2_send = '06 03 01 F7 00 02 75 B2 ' # 二氧化碳查询指令
pressure_send = '06 03 01 F9 00 02 14 71 ' # 气压查询指令
sun_send = '06 03 01 FA 00 02 E4 71 ' # 光照查询指令
soil_send = '02 03 00 00 00 04 44 3A' # 土壤查询指令
danlinjia_send = '02 03 00 04 00 03 44 39' # 氮磷钾查询指令
rainfall_send = '03 03 00 00 00 01 85 E8' # 雨量查询指令
windspeed_send = '04 03 00 00 00 02 C4 5E' # 风速查询指令
winddirection_send = '05 03 00 00 00 02 C5 8F' # 风向查询指令
# 发送的数据转为2进制b'\x01\x03\x00\x00\x00\x02\xc4\x0b'
temp_send = bytes.fromhex(temp_send)
co2_send = bytes.fromhex(co2_send)
pressure_send = bytes.fromhex(pressure_send)
sun_send = bytes.fromhex(sun_send)
soil_send = bytes.fromhex(soil_send)
danlinjia_send = bytes.fromhex(danlinjia_send)
rainfall_send = bytes.fromhex(rainfall_send)
windspeed_send = bytes.fromhex(windspeed_send)
winddirection_send = bytes.fromhex(winddirection_send)
2023-12-05 16:21:08 +08:00
while True:
2023-12-07 09:27:37 +08:00
try:
2023-12-09 14:48:37 +08:00
ser = serial.Serial("/dev/ttyS2", 9600)
2023-12-07 09:27:37 +08:00
# if ser.is_open:
ser.write(temp_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
tempbuffer_data = ser.in_waiting
if tempbuffer_data:
# 返回的数据为2进制b'\x01\x03\x04\x01\x08\x022\xfa\xb8'
return_data = ser.read(tempbuffer_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
# 对返回的数据进行解析,获取温度和湿度数据
2023-12-13 17:32:27 +08:00
airhumi_data = int(return_data_hex[6:10], 16) / 10
airtemp_data = int(return_data_hex[10:14], 16) / 10
2023-12-07 09:27:37 +08:00
time.sleep(5)
ser.write(co2_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
co2buffer_data = ser.in_waiting
if co2buffer_data:
return_data = ser.read(co2buffer_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
# 对返回的数据进行解析,获取温度和湿度数据
co2_data = int(return_data_hex[6:10], 16)
time.sleep(5)
ser.write(pressure_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
pressurebuffer_data = ser.in_waiting
if pressurebuffer_data:
# 返回的数据为2进制b'\x01\x03\x04\x01\x08\x022\xfa\xb8'
return_data = ser.read(pressurebuffer_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
# 对返回的数据进行解析,获取温度和湿度数据
pressure_data = int(return_data_hex[6:10], 16) / 10
time.sleep(5)
ser.write(sun_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
sunbuffer_data = ser.in_waiting
if sunbuffer_data:
# 返回的数据为2进制b'\x01\x03\x04\x01\x08\x022\xfa\xb8'
return_data = ser.read(sunbuffer_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
sun_data = int(return_data_hex[6:14], 16)
time.sleep(5)
# print('send soil directives')
ser.write(soil_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
soilbuffer_data = ser.in_waiting
# print(buffer_data, 'buffer_data')
if soilbuffer_data:
# 返回的数据为2进制b'\x01\x03\x04\x01\x08\x022\xfa\xb8'
return_data = ser.read(soilbuffer_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
# 对返回的数据进行解析,获取温度和湿度数据
humidity_data = int(return_data_hex[6:10], 16) / 10
temperature_data = int(return_data_hex[10:14], 16) / 10
electrical_data = int(return_data_hex[14:18], 16) / 10
PH_data = int(return_data_hex[18:22], 16) / 10
time.sleep(5)
# print('send danlinjia directives')
ser.write(danlinjia_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
danlinjiabuffer_data = ser.in_waiting
# print(buffer_data, 'buffer_data')
if danlinjiabuffer_data:
# 返回的数据为2进制b'\x01\x03\x04\x01\x08\x022\xfa\xb8'
return_data = ser.read(danlinjiabuffer_data)
# print('返回的数据2进制:', return_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
# # 对返回的数据进行解析,获取温度和湿度数据
dan_data = int(return_data_hex[6:10], 16) / 10
lin_data = int(return_data_hex[10:14], 16) / 10
jia_data = int(return_data_hex[14:18], 16) / 10
time.sleep(5)
# print('send rainfall directives')
ser.write(rainfall_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
rainfallbuffer_data = ser.in_waiting
# print(buffer_data, 'buffer_data')
if rainfallbuffer_data:
# 返回的数据为2进制b'\x01\x03\x04\x01\x08\x022\xfa\xb8'
return_data = ser.read(rainfallbuffer_data)
# print('返回的数据2进制:', return_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
# print('返回的数据转换为16进制:', return_data_hex)
# # 对返回的数据进行解析,获取温度和湿度数据
# print("当前雨量值为:", int(return_data_hex[6:10], 16)/10)#单位mm
rainfall_data = int(return_data_hex[6:10], 16) / 10
time.sleep(5)
ser.write(windspeed_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
windspeedbuffer_data = ser.in_waiting
# print(buffer_data, 'buffer_data')
if windspeedbuffer_data:
# 返回的数据为2进制b'\x01\x03\x04\x01\x08\x022\xfa\xb8'
return_data = ser.read(windspeedbuffer_data)
# print('返回的数据2进制:', return_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
# print('返回的数据转换为16进制:', return_data_hex)
# print("当前风速为:", int(return_data_hex[6:10], 16)/10)#单位mm
speedwind_data = int(return_data_hex[6:10], 16) / 10
time.sleep(5)
# print('send winddirection directives')
ser.write(winddirection_send)
time.sleep(1)
# 获取返回的缓冲data,获取的是buffer_data的长度 9
winddirectionbuffer_data = ser.in_waiting
# print(buffer_data, 'buffer_data')
if winddirectionbuffer_data:
# 返回的数据为2进制b'\x01\x03\x04\x01\x08\x022\xfa\xb8'
return_data = ser.read(winddirectionbuffer_data)
# print('返回的数据2进制:', return_data)
# 二进制转换为16进制010304010802307b79
return_data_hex = str(return_data.hex())
2023-12-13 17:56:15 +08:00
# print('返回的数据转换为16进制:', return_data_hex)
2023-12-13 17:32:27 +08:00
# print("当前风向为:", int(return_data_hex[10:14], 16) ) #单位mm
2023-12-13 18:33:55 +08:00
# 6号设备是8方位
2023-12-14 09:26:35 +08:00
if subscribe_topic == zhanguan_device_name:
2023-12-14 10:48:29 +08:00
winddirection_data = int(return_data_hex[6:10], 16)
2023-12-13 17:56:15 +08:00
else:
winddirection_data = int(return_data_hex[6:10], 16) / 10
2023-12-07 09:27:37 +08:00
time.sleep(5)
# print('{"name":"%d","name1":"%d"}', 123,456)
# data = [{'ngvhgv': airtemp_data}, {'nvjgvjvj':airhumi_data}]
data = {'ambient_temperature': airtemp_data,
'ambient_humidity': airhumi_data,
'carbon_dioxide': co2_data,
'ambient_air_pressure': pressure_data,
'ambient_lighting': sun_data,
'soil_moisture': humidity_data,
'soil_temperature': temperature_data,
'soil_conductivity': electrical_data,
'soil_PH': PH_data,
'soil_potassium_phosphate_nitrogen': dan_data,
'soil_potassium_phosphate_phosphorus': lin_data,
'soil_potassium_phosphate_potassium': jia_data,
'rainfall': rainfall_data,
'wind_speed': speedwind_data,
'wind_direction': winddirection_data,
2023-12-11 16:46:03 +08:00
'create_time': int(time.time())
2023-12-07 09:27:37 +08:00
}
t2 = LOT_DATA(**data)
2023-12-11 16:46:03 +08:00
client.publish(publish_topic, payload=json.dumps(data, ensure_ascii=False), qos=0)
2023-12-07 09:27:37 +08:00
add(t2)
2024-01-05 16:49:13 +08:00
# 运行一次就把这个程序关掉
2024-01-06 17:02:22 +08:00
subprocess.Popen(
["/usr/bin/bash /home/pi/lot_manager/conf/example/bash/stop_dataupload_internal_one_hour.sh"],
shell=True)
2023-12-07 09:27:37 +08:00
except Exception as e:
2023-12-11 18:18:52 +08:00
# print(e)
2023-12-07 09:27:37 +08:00
pass
2023-12-05 16:21:08 +08:00
2023-12-09 16:09:42 +08:00
def p():
2023-12-09 15:16:51 +08:00
while True:
2024-01-06 17:06:57 +08:00
time.sleep(10)
2023-12-09 15:41:05 +08:00
try:
data = {'ambient_temperature': 1,
'ambient_humidity': 1,
'carbon_dioxide': 1,
'ambient_air_pressure': 1,
'ambient_lighting': 1,
'soil_moisture': 1,
'soil_temperature': 1,
'soil_conductivity': 1,
'soil_PH': 1,
'soil_potassium_phosphate_nitrogen': 1,
'soil_potassium_phosphate_phosphorus': 1,
'soil_potassium_phosphate_potassium': 1,
'rainfall': 1,
'wind_speed': 1,
'wind_direction': 1,
2023-12-11 16:46:03 +08:00
'create_time': int(time.time())
2023-12-09 15:41:05 +08:00
}
t2 = LOT_DATA(**data)
2023-12-11 16:46:03 +08:00
client.publish(publish_topic, payload=json.dumps(data, ensure_ascii=False), qos=0)
2023-12-09 15:41:05 +08:00
add(t2)
2024-01-05 16:49:13 +08:00
# 运行一次就把这个程序关掉
2024-01-06 17:02:22 +08:00
subprocess.Popen(
["/usr/bin/bash /home/pi/lot_manager/conf/example/bash/stop_dataupload_internal_one_hour.sh"],
shell=True)
2023-12-09 16:04:38 +08:00
except Exception as e:
2023-12-11 18:18:52 +08:00
# print(e)
2023-12-09 15:41:05 +08:00
pass
2023-12-09 15:16:51 +08:00
2023-12-05 16:21:08 +08:00
def on_connect(client, userdata, flags, rc):
2023-12-09 16:09:42 +08:00
if rc == 0:
2024-01-05 17:11:31 +08:00
if subscribe_topic == zhanguan_device_name:
# 测试
threading.Thread(target=p).start()
else:
# 正式环境
threading.Thread(target=get_data).start()
2023-12-05 16:21:08 +08:00
if __name__ == '__main__':
2023-12-12 10:09:40 +08:00
# print(broker, port, subscribe_topic, publish_topic, username, password)
2023-12-11 15:16:16 +08:00
# 千万不要指定client_id 不然死翘翘!!!
client = mqtt.Client()
client.username_pw_set(username, password)
2023-12-05 16:21:08 +08:00
# Specify callback function
client.on_connect = on_connect
# Establish a connection
2023-12-11 15:16:16 +08:00
client.connect(broker, port)
2023-12-26 17:48:05 +08:00
client.loop_forever()