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

View File

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

View File

@ -1,6 +1,5 @@
from django.urls import path, re_path from django.urls import path, re_path
from .views import ( from .views import (
MosquitoListAPIView,
MosquitoPostListAPIView, MosquitoPostListAPIView,
DeviceTempLogListAPIView, DeviceTempLogListAPIView,
WeatherLogListAPIView, WeatherLogListAPIView,
@ -12,7 +11,6 @@ from .views import (
app_name = 'mosq-api' app_name = 'mosq-api'
urlpatterns = [ urlpatterns = [
path('', MosquitoListAPIView.as_view(), name='list'),
path('post/', MosquitoPostListAPIView.as_view(), name='post'), path('post/', MosquitoPostListAPIView.as_view(), name='post'),
path('temp/', DeviceTempLogListAPIView.as_view(), name='temp-hum'), path('temp/', DeviceTempLogListAPIView.as_view(), name='temp-hum'),
path('weather/', WeatherLogListAPIView.as_view(), name='weather-log'), 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 rest_framework.filters import SearchFilter, OrderingFilter
from django.db.models import Q from django.db.models import Q
from counter.mixins.role import RoleMixin, DeviceListMixin, WeatherStationListMixin 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 ( from .pagination import (
PostLimitOffsetPagination, PostLimitOffsetPagination,
DeviceLogHistoryPagination, DeviceLogHistoryPagination,
@ -30,7 +30,6 @@ from .pagination import (
WeatherStationInfoPagination, WeatherStationInfoPagination,
) )
from .serializers import ( from .serializers import (
MosqListSerializer,
MosqPostListSerializer, MosqPostListSerializer,
DeviceTempLogSerializer, DeviceTempLogSerializer,
WeatherLogSerializer, WeatherLogSerializer,
@ -48,25 +47,6 @@ class DeviceLogPagination(PageNumberPagination):
max_page_size = 1000 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): class MosquitoPostListAPIView(ListAPIView):
serializer_class = MosqPostListSerializer serializer_class = MosqPostListSerializer
permission_classes = [IsAuthenticated, ] 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.db import models
from django.utils.timezone import datetime
from django.contrib.contenttypes.fields import GenericRelation
from smart.models import SmartModule, SmartPush 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): class MosqPost(models.Model):
smart_push = models.ForeignKey(SmartPush, on_delete='PROTECT') device_id = models.CharField(max_length=100, unique=True, verbose_name='设备ID')
mosq = models.ForeignKey(Mosquito, verbose_name='灭蚊灯', on_delete='PROTECT') count = models.PositiveIntegerField(verbose_name="灭蚊数量")
led = models.PositiveIntegerField(verbose_name='灭蚊数') load = models.CharField(max_length=100, blank=True, null=True, verbose_name='负载电压电流功率')
energy = models.PositiveIntegerField(verbose_name='电量') storage_battery = models.CharField(max_length=100, blank=True, null=True, verbose_name='电池电压电流功率')
# signal = models.IntegerField(verbose_name='信号') solar_panels = models.CharField(max_length=100, blank=True, null=True, verbose_name='太阳能电压电流功率')
# coordinate = models.CharField(max_length=100, verbose_name='坐标') ac_power = models.CharField(max_length=100, blank=True, null=True, verbose_name='AC电压电流功率')
time = models.DateTimeField(auto_now=False, auto_now_add=True) 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: class Meta:
verbose_name = '灭蚊数据' verbose_name = '灭蚊灯数据'
verbose_name_plural = 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): class MosqPostStatistic(models.Model):
total = models.PositiveIntegerField(verbose_name='总数') 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()