chore: 清理无用 view,初始化 mosqpost 表,存放mqtt数据

This commit is contained in:
xianfx 2024-03-14 23:47:23 +08:00
parent 0af4b65fbb
commit 369fbd4fa4
8 changed files with 142 additions and 126 deletions

View File

@ -1,38 +0,0 @@
import paho.mqtt.client as mqtt
# 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()

View File

@ -1,17 +1,11 @@
from django.contrib import admin
from .models import Mosquito, MosqPost, Org, DeviceInfo, WeatherStationInfo
class MosquitoAdmin(admin.ModelAdmin):
list_display = ('name', 'device_id', 'region')
list_filter = ('name', 'device_id', 'region')
ordering = ('name', 'region')
from .models import MosqPost, Org, DeviceInfo, WeatherStationInfo
class MosqPostAdmin(admin.ModelAdmin):
list_display = ('mosq', 'led', 'energy', 'time')
list_filter = ('mosq', 'time')
ordering = ['time']
list_display = ('device_id', 'count', 'create_time')
list_filter = ('device_id', 'create_time')
ordering = ['create_time']
class DeviceAdmin(admin.ModelAdmin):
@ -32,7 +26,6 @@ class WeatherStationAdmin(admin.ModelAdmin):
ordering = ['device_id']
admin.site.register(Mosquito, MosquitoAdmin)
admin.site.register(MosqPost, MosqPostAdmin)
admin.site.register(DeviceInfo, DeviceAdmin)
admin.site.register(Org, OrgAdmin)

View File

@ -3,21 +3,10 @@ from typing import Optional
from django.db.models import Q, Min, Max
from rest_framework import serializers
from django.core.cache import cache
from mosquito.models import Mosquito, MosqPost, DeviceTempLog, WeatherLog, WeatherStationInfo, DeviceInfo
from mosquito.models import MosqPost, DeviceTempLog, WeatherLog, WeatherStationInfo, DeviceInfo
from smart.api.serializers import SmartPushListSerializer
class MosqListSerializer(serializers.ModelSerializer):
class Meta:
model = Mosquito
fields = [
'name',
'device_id',
'region'
]
class MosqPostListSerializer(serializers.ModelSerializer):
smart_push = SmartPushListSerializer(read_only=True)
region = serializers.SerializerMethodField()
@ -53,12 +42,6 @@ class DeviceTempLogSerializer(serializers.ModelSerializer):
return obj.last_time.strftime('%Y-%m-%d %H:%M:%S')
class DeviceSourceException(Exception):
"""
source should be counter | mosquito
"""
class WeatherLogBaseSerializer(serializers.ModelSerializer):
class Meta:
model = WeatherLog

View File

@ -1,6 +1,5 @@
from django.urls import path, re_path
from .views import (
MosquitoListAPIView,
MosquitoPostListAPIView,
DeviceTempLogListAPIView,
WeatherLogListAPIView,
@ -12,7 +11,6 @@ from .views import (
app_name = 'mosq-api'
urlpatterns = [
path('', MosquitoListAPIView.as_view(), name='list'),
path('post/', MosquitoPostListAPIView.as_view(), name='post'),
path('temp/', DeviceTempLogListAPIView.as_view(), name='temp-hum'),
path('weather/', WeatherLogListAPIView.as_view(), name='weather-log'),

View File

@ -21,7 +21,7 @@ from rest_framework.permissions import IsAuthenticated
from rest_framework.filters import SearchFilter, OrderingFilter
from django.db.models import Q
from counter.mixins.role import RoleMixin, DeviceListMixin, WeatherStationListMixin
from ..models import Mosquito, MosqPost, DeviceTempLog, WeatherLog, WeatherStationInfo, DeviceInfo
from ..models import MosqPost, DeviceTempLog, WeatherLog, WeatherStationInfo, DeviceInfo
from .pagination import (
PostLimitOffsetPagination,
DeviceLogHistoryPagination,
@ -30,7 +30,6 @@ from .pagination import (
WeatherStationInfoPagination,
)
from .serializers import (
MosqListSerializer,
MosqPostListSerializer,
DeviceTempLogSerializer,
WeatherLogSerializer,
@ -48,25 +47,6 @@ class DeviceLogPagination(PageNumberPagination):
max_page_size = 1000
class MosquitoListAPIView(ListAPIView):
serializer_class = MosqListSerializer
permission_classes = [IsAuthenticated]
filter_backends = [SearchFilter, OrderingFilter]
pagination_class = PostLimitOffsetPagination
search_fields = ['name', 'device_id', 'region']
def get_queryset(self, *args, **kwargs):
queryset_list = Mosquito.objects.all()
query = self.request.GET.get('q')
if query:
queryset_list = queryset_list.filter(
Q(name__icontains=query) |
Q(device_id__icontains=query) |
Q(region__icontains=query)
).distinct()
return queryset_list
class MosquitoPostListAPIView(ListAPIView):
serializer_class = MosqPostListSerializer
permission_classes = [IsAuthenticated, ]

View File

@ -0,0 +1,87 @@
# Generated by Django 2.2.4 on 2024-03-14 15:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mosquito', '0025_auto_20240306_1531'),
]
operations = [
migrations.AlterModelOptions(
name='mosqpost',
options={'verbose_name': '灭蚊灯数据', 'verbose_name_plural': '灭蚊灯数据'},
),
migrations.RemoveField(
model_name='mosqpost',
name='energy',
),
migrations.RemoveField(
model_name='mosqpost',
name='led',
),
migrations.RemoveField(
model_name='mosqpost',
name='mosq',
),
migrations.RemoveField(
model_name='mosqpost',
name='smart_push',
),
migrations.RemoveField(
model_name='mosqpost',
name='time',
),
migrations.AddField(
model_name='mosqpost',
name='ac_power',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='AC电压电流功率'),
),
migrations.AddField(
model_name='mosqpost',
name='count',
field=models.PositiveIntegerField(default=0, verbose_name='灭蚊数量'),
preserve_default=False,
),
migrations.AddField(
model_name='mosqpost',
name='create_time',
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间'),
),
migrations.AddField(
model_name='mosqpost',
name='dc_power',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='DC电压电流功率'),
),
migrations.AddField(
model_name='mosqpost',
name='device_id',
field=models.CharField(default='', max_length=100, unique=True, verbose_name='设备ID'),
preserve_default=False,
),
migrations.AddField(
model_name='mosqpost',
name='load',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='负载电压电流功率'),
),
migrations.AddField(
model_name='mosqpost',
name='solar_panels',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='太阳能电压电流功率'),
),
migrations.AddField(
model_name='mosqpost',
name='storage_battery',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='电池电压电流功率'),
),
migrations.AddField(
model_name='mosqpost',
name='update_time',
field=models.DateTimeField(auto_now=True, null=True, verbose_name='更新时间'),
),
migrations.DeleteModel(
name='Mosquito',
),
]

View File

@ -1,48 +1,22 @@
from django.db import models
from django.utils.timezone import datetime
from django.contrib.contenttypes.fields import GenericRelation
from smart.models import SmartModule, SmartPush
class Mosquito(models.Model):
name = models.CharField(max_length=100, verbose_name='设备名称')
device_id = models.CharField(max_length=100, verbose_name='设备ID')
region = models.CharField(max_length=50, verbose_name='区域')
smart_module = GenericRelation(SmartModule)
class Meta:
verbose_name = '灭蚊灯'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
def get_absolute_url(self):
pass
def get_api_url(self):
pass
class MosqPost(models.Model):
smart_push = models.ForeignKey(SmartPush, on_delete='PROTECT')
mosq = models.ForeignKey(Mosquito, verbose_name='灭蚊灯', on_delete='PROTECT')
led = models.PositiveIntegerField(verbose_name='灭蚊数')
energy = models.PositiveIntegerField(verbose_name='电量')
# signal = models.IntegerField(verbose_name='信号')
# coordinate = models.CharField(max_length=100, verbose_name='坐标')
time = models.DateTimeField(auto_now=False, auto_now_add=True)
device_id = models.CharField(max_length=100, unique=True, 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='电池电压电流功率')
solar_panels = models.CharField(max_length=100, blank=True, null=True, verbose_name='太阳能电压电流功率')
ac_power = models.CharField(max_length=100, blank=True, null=True, verbose_name='AC电压电流功率')
dc_power = models.CharField(max_length=100, blank=True, null=True, verbose_name='DC电压电流功率')
create_time = models.DateTimeField(auto_now_add=True, blank=True, null=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name='更新时间')
class Meta:
verbose_name = '灭蚊数据'
verbose_name = '灭蚊灯数据'
verbose_name_plural = verbose_name
def __str__(self):
return '{0}: {1}'.format(self.mosq.name, self.led)
def get_api_url(self):
pass
class MosqPostStatistic(models.Model):
total = models.PositiveIntegerField(verbose_name='总数')

39
apps/mosquito/mqtt.py Normal file
View File

@ -0,0 +1,39 @@
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()