From 369fbd4fa48e2327aff79ac1becbf13bdadabebd Mon Sep 17 00:00:00 2001 From: xianfx Date: Thu, 14 Mar 2024 23:47:23 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=B8=85=E7=90=86=E6=97=A0=E7=94=A8?= =?UTF-8?q?=20view=EF=BC=8C=E5=88=9D=E5=A7=8B=E5=8C=96=20mosqpost=20?= =?UTF-8?q?=E8=A1=A8=EF=BC=8C=E5=AD=98=E6=94=BEmqtt=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/counter/tests.py | 38 -------- apps/mosquito/admin.py | 15 +--- apps/mosquito/api/serializers.py | 19 +--- apps/mosquito/api/urls.py | 2 - apps/mosquito/api/views.py | 22 +---- .../migrations/0026_auto_20240314_1545.py | 87 +++++++++++++++++++ apps/mosquito/models.py | 46 +++------- apps/mosquito/mqtt.py | 39 +++++++++ 8 files changed, 142 insertions(+), 126 deletions(-) create mode 100644 apps/mosquito/migrations/0026_auto_20240314_1545.py create mode 100644 apps/mosquito/mqtt.py diff --git a/apps/counter/tests.py b/apps/counter/tests.py index 2d03cd6..e69de29 100644 --- a/apps/counter/tests.py +++ b/apps/counter/tests.py @@ -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() diff --git a/apps/mosquito/admin.py b/apps/mosquito/admin.py index 855c316..76ad903 100644 --- a/apps/mosquito/admin.py +++ b/apps/mosquito/admin.py @@ -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) diff --git a/apps/mosquito/api/serializers.py b/apps/mosquito/api/serializers.py index 84e84f4..1d3a8ea 100644 --- a/apps/mosquito/api/serializers.py +++ b/apps/mosquito/api/serializers.py @@ -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 diff --git a/apps/mosquito/api/urls.py b/apps/mosquito/api/urls.py index 0ba5f7c..22694f0 100644 --- a/apps/mosquito/api/urls.py +++ b/apps/mosquito/api/urls.py @@ -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'), diff --git a/apps/mosquito/api/views.py b/apps/mosquito/api/views.py index ffcd65d..a68e142 100644 --- a/apps/mosquito/api/views.py +++ b/apps/mosquito/api/views.py @@ -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, ] diff --git a/apps/mosquito/migrations/0026_auto_20240314_1545.py b/apps/mosquito/migrations/0026_auto_20240314_1545.py new file mode 100644 index 0000000..3dd6eae --- /dev/null +++ b/apps/mosquito/migrations/0026_auto_20240314_1545.py @@ -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', + ), + ] diff --git a/apps/mosquito/models.py b/apps/mosquito/models.py index 6dc5c98..51ec200 100644 --- a/apps/mosquito/models.py +++ b/apps/mosquito/models.py @@ -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='总数') diff --git a/apps/mosquito/mqtt.py b/apps/mosquito/mqtt.py new file mode 100644 index 0000000..e40dc57 --- /dev/null +++ b/apps/mosquito/mqtt.py @@ -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()