feat: mqtt 入库
This commit is contained in:
parent
369fbd4fa4
commit
22630c02be
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 2.2.4 on 2024-03-23 14:50
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mosquito', '0026_auto_20240314_1545'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='mosqpost',
|
||||
name='device_id',
|
||||
field=models.CharField(max_length=100, verbose_name='设备ID'),
|
||||
),
|
||||
]
|
|
@ -3,7 +3,7 @@ from smart.models import SmartModule, SmartPush
|
|||
|
||||
|
||||
class MosqPost(models.Model):
|
||||
device_id = models.CharField(max_length=100, unique=True, verbose_name='设备ID')
|
||||
device_id = models.CharField(max_length=100, verbose_name='设备ID')
|
||||
count = models.PositiveIntegerField(verbose_name="灭蚊数量")
|
||||
load = models.CharField(max_length=100, blank=True, null=True, verbose_name='负载电压电流功率')
|
||||
storage_battery = models.CharField(max_length=100, blank=True, null=True, verbose_name='电池电压电流功率')
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
import paho.mqtt.client as mqtt
|
||||
from mosquito.models import LO
|
||||
|
||||
# MQTT 配置
|
||||
MQTT_BROKER = "8.217.112.255"
|
||||
MQTT_PORT = 1883
|
||||
|
||||
|
||||
# 当我们从MQTT服务器接收到消息时调用此函数
|
||||
def on_message(client, userdata, message):
|
||||
# 提取消息的主题
|
||||
topic = message.topic
|
||||
print(f"Message received on topic: {topic}")
|
||||
|
||||
# 从主题中解析 device_id
|
||||
# 假定主题格式为: "solarmosquitolamp/devices/{device_id}/data" 或 "state"
|
||||
topic_parts = topic.split('/')
|
||||
device_id = topic_parts[2]
|
||||
|
||||
# 将消息打印到控制台(或处理数据,例如存入数据库)
|
||||
print(f"Device ID: {device_id}")
|
||||
payload = message.payload.decode('utf-8')
|
||||
print(f"Message Payload: {payload}")
|
||||
|
||||
# 根据device_id和payload处理数据库的记录...
|
||||
|
||||
|
||||
# 初始化MQTT客户端
|
||||
client = mqtt.Client()
|
||||
client.on_message = on_message
|
||||
|
||||
client.connect(MQTT_BROKER, MQTT_PORT, 60)
|
||||
|
||||
# 订阅所有设备的主题
|
||||
client.subscribe("solarmosquitolamp/devices/+/data")
|
||||
client.subscribe("solarmosquitolamp/devices/+/state")
|
||||
|
||||
# 开始MQTT客户端
|
||||
client.loop_forever()
|
|
@ -0,0 +1,97 @@
|
|||
import json
|
||||
import os
|
||||
import django
|
||||
from typing import Dict
|
||||
from enum import Enum
|
||||
import paho.mqtt.client as mqtt
|
||||
|
||||
|
||||
pwd = os.path.dirname(os.path.realpath(__file__))
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mosqkiller.settings")
|
||||
django.setup()
|
||||
|
||||
from mosquito.models import MosqPost, DeviceInfo
|
||||
|
||||
# MQTT 配置
|
||||
MQTT_BROKER = "8.217.112.255"
|
||||
MQTT_PORT = 1883
|
||||
DATA_TOPIC = 'solarmosquitolamp/devices/+/data'
|
||||
STATE_TOPIC = 'solarmosquitolamp/devices/+/state'
|
||||
|
||||
|
||||
class PowerType(Enum):
|
||||
Load = 'Load'
|
||||
StorageBattery = 'StorageBattery'
|
||||
SolarPanels = 'SolarPanels'
|
||||
ACPower = 'AC Power'
|
||||
DCPower = 'DC Power'
|
||||
|
||||
|
||||
# 当我们从MQTT服务器接收到消息时调用此函数
|
||||
def on_message(client, userdata, message):
|
||||
# 提取消息的主题
|
||||
topic = message.topic
|
||||
print(f"Message received on topic: {topic}")
|
||||
|
||||
# 从主题中解析 device_id
|
||||
topic_parts = topic.split('/')
|
||||
device_id = topic_parts[2]
|
||||
|
||||
# 将消息打印到控制台(或处理数据,例如存入数据库)
|
||||
print(f"Device: {device_id} update & create post")
|
||||
payload = message.payload.decode('utf-8')
|
||||
# print(f"Message Payload: {payload}")
|
||||
|
||||
# update and create
|
||||
post_data = json.loads(payload)
|
||||
update_device_info(device_id, post_data=post_data)
|
||||
create_mosq_post(device_id, post_data=post_data)
|
||||
|
||||
|
||||
def update_device_info(device_id: str, post_data: Dict):
|
||||
device = DeviceInfo.objects.filter(device_id=device_id).first()
|
||||
if device:
|
||||
device.load = to_string(post_data, power_type=PowerType.Load)
|
||||
device.storage_battery = to_string(post_data, power_type=PowerType.StorageBattery)
|
||||
device.solar_panels = to_string(post_data, power_type=PowerType.SolarPanels)
|
||||
device.ac_power = to_string(post_data, power_type=PowerType.ACPower)
|
||||
device.dc_power = to_string(post_data, power_type=PowerType.DCPower)
|
||||
device.save()
|
||||
|
||||
|
||||
def create_mosq_post(device_id: str, post_data: Dict):
|
||||
load = to_string(post_data, power_type=PowerType.Load)
|
||||
storage_battery = to_string(post_data, power_type=PowerType.StorageBattery)
|
||||
solar_panels = to_string(post_data, power_type=PowerType.SolarPanels)
|
||||
ac_power = to_string(post_data, power_type=PowerType.ACPower)
|
||||
dc_power = to_string(post_data, power_type=PowerType.DCPower)
|
||||
count = post_data['count']
|
||||
MosqPost.objects.create(device_id=device_id,
|
||||
count=count,
|
||||
load=load,
|
||||
storage_battery=storage_battery,
|
||||
solar_panels=solar_panels,
|
||||
ac_power=ac_power,
|
||||
dc_power=dc_power)
|
||||
|
||||
|
||||
def to_string(post_data: Dict, power_type: PowerType) -> str:
|
||||
_type = power_type.value
|
||||
load_v = post_data[_type]['voltage']
|
||||
load_c = post_data[_type]['current']
|
||||
load_p = post_data[_type]['power']
|
||||
return ",".join([str(load_v), str(load_c), str(load_p)])
|
||||
|
||||
|
||||
# 初始化MQTT客户端
|
||||
client = mqtt.Client()
|
||||
client.on_message = on_message
|
||||
|
||||
client.connect(MQTT_BROKER, MQTT_PORT, 60)
|
||||
|
||||
# 订阅所有设备的主题
|
||||
client.subscribe(DATA_TOPIC)
|
||||
# client.subscribe(STATE_TOPIC)
|
||||
|
||||
# 开始MQTT客户端
|
||||
client.loop_forever()
|
Loading…
Reference in New Issue