feat: mosq 定时任务,更新设备 location

This commit is contained in:
fxxian 2024-03-03 14:20:26 +08:00
parent 0060d4c8c8
commit 58d456d3a7
3 changed files with 38 additions and 16 deletions

View File

@ -2,7 +2,6 @@ from typing import Optional
from rest_framework import serializers from rest_framework import serializers
from counter.models import DeviceCount, DeviceInfo from counter.models import DeviceCount, DeviceInfo
from mosquito.models import DeviceInfo as MosquitoDeviceInfo from mosquito.models import DeviceInfo as MosquitoDeviceInfo
from geopy.geocoders import Nominatim
class DeviceInfoMobileSerializer(serializers.ModelSerializer): class DeviceInfoMobileSerializer(serializers.ModelSerializer):
@ -25,7 +24,6 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.latest = None self.latest = None
self.cur_device = None self.cur_device = None
self.geolocator = Nominatim(user_agent="geoapiExercises")
def get_device_name(self, obj) -> Optional[str]: def get_device_name(self, obj) -> Optional[str]:
qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id) qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id)
@ -45,12 +43,5 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
return [lon, lat] return [lon, lat]
return None return None
# TODO: 作为定时任务 def get_location(self, obj):
# def get_location(self, obj): return obj.location
# if self.cur_device:
# lon, lat = [self.cur_device.longitude, self.cur_device.latitude]
# if lon and lat:
# location = self.geolocator.reverse("{},{}".format(lat, lon))
# address = location.raw['address']
# return address
# return None

View File

@ -1,6 +1,7 @@
import time as std_time
import pytz import pytz
import requests
from functools import reduce from functools import reduce
# from collections import OrderedDict
from datetime import datetime, time, timedelta from datetime import datetime, time, timedelta
from django.db.models import Max from django.db.models import Max
from celery import task from celery import task
@ -144,14 +145,42 @@ def update_daily_statistic():
return _date_list return _date_list
def get_location(lon: int, lat: int) -> str:
key = 'f9fc42eb1a45f311beeb832740f67b0f'
url = 'https://restapi.amap.com/v3/geocode/regeo?output=json&location={},{}&key={}'.format(lon, lat, key)
resp = requests.get(url)
if resp.status_code != 200:
return ''
data = resp.json()
if data['status'] == '1' and data['info'] == 'OK':
address = data['regeocode']['formatted_address']
# address == []
if isinstance(address, list):
return ''
return address
else:
return ''
@task() @task()
def update_latest_statistic(): def update_mosql_device_location():
pass """
更新 mosquito DeviceInfo location 字段
高德逆地理编码配额5000/并发30/
"""
device_list = DeviceInfo.objects.all()
for device in device_list:
if device.longitude and device.latitude:
location = get_location(device.longitude, device.latitude)
std_time.sleep(0.1)
device.location = location
device.save()
@task() @task()
def update_mosq_device_info(): def update_mosq_device_info():
""" 更新mosquito的DeviceInfo表""" """ 更新 mosquito DeviceInfo """
counter_devices = CounterDeviceInfor.objects.values_list('device_id', flat=True) counter_devices = CounterDeviceInfor.objects.values_list('device_id', flat=True)
mosq_devices = DeviceInfo.objects.values_list('device_id', flat=True) mosq_devices = DeviceInfo.objects.values_list('device_id', flat=True)
s1 = set(counter_devices) s1 = set(counter_devices)
@ -183,4 +212,4 @@ if __name__ == '__main__':
# a, b = get_daily_statistic() # a, b = get_daily_statistic()
# print(a, b) # print(a, b)
# update_mosq_device_info() # update_mosq_device_info()
update_daily_statistic() update_mosql_device_location()

View File

@ -26,3 +26,5 @@ six==1.11.0
sqlparse==0.3.0 sqlparse==0.3.0
vine==1.1.4 vine==1.1.4
paho-mqtt==1.6.1 paho-mqtt==1.6.1
requests~=2.31.0