device.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from django.conf import settings
  4. from django.core.paginator import Paginator
  5. import time
  6. import json
  7. import logging
  8. from smartfarming.utils import get_addr_by_lag_lng
  9. from smartfarming.serializers.device_serializers import DeviceSerializers
  10. from smartfarming.models.device import MongoDevice, MongoCBDData, MongoSCDData, MongoXYCBData
  11. from smartfarming.models.weather import MongoQXZ_Base_Info, MongoQXZ_Info_Record, MongoQXZ_Conf
  12. from django.db.models import Q
  13. from smartfarming.qxz import data_deal
  14. logger = logging.getLogger("myapp")
  15. device_type_en = (settings.CONFIG).get("device_type_en")
  16. device_type_zh = (settings.CONFIG).get("device_type_zh")
  17. class CbdScdXyDeviceSaveAPIView(APIView):
  18. permission_classes = []
  19. authentication_classes = []
  20. def post(self, request):
  21. # 测报灯设备及数据入库
  22. data = request.data
  23. topic = data.get("topic")
  24. payload = data.get("payload")
  25. cmd = payload.get("cmd")
  26. topic_msg = topic.split("/")
  27. now = int(time.time())
  28. if topic_msg and len(topic_msg) == 5 and cmd:
  29. device_id = topic_msg[-1]
  30. try:
  31. device_type = topic_msg[2]
  32. device_type_id = device_type_en.get(device_type)
  33. if device_type_id == 2:
  34. model = MongoSCDData
  35. elif device_type_id == 3:
  36. model = MongoCBDData
  37. elif device_type_id == 8:
  38. model = MongoXYCBData
  39. # 在设备信息表中查找是否有数据,如果没有数据则增加
  40. device_name = device_type_zh.get(device_type_id)
  41. device, is_created = MongoDevice.objects.get_or_create(
  42. device_id = device_id,
  43. defaults={
  44. "device_id": device_id,
  45. "device_type_id": device_type_id,
  46. "device_name": device_name,
  47. "addtime": now
  48. }
  49. )
  50. if is_created:
  51. logger.info(f"{device_type} 设备 {device_id} 入库成功")
  52. # 获取数据并更新设备
  53. if cmd == "data":
  54. ext = payload.get("ext")
  55. if ext:
  56. # 增加设备数据
  57. model.objects.create(
  58. device_id = device_id,
  59. device_data = str(ext),
  60. addtime = now
  61. )
  62. lng = ext.get("lng")
  63. lat = ext.get("lat")
  64. dver_num = ext.get("dver")
  65. device.device_status = 1
  66. device.uptime = now
  67. if dver_num:
  68. device.dver_num = dver_num
  69. if lng and lat and dver_num:
  70. device.lng = lng
  71. device.lat = lat
  72. # 根据经纬度获取省市级
  73. is_success, province, city, district = get_addr_by_lag_lng(lat, lng)
  74. if is_success:
  75. # 更新地理位置坐标
  76. device.province = province
  77. device.city = city
  78. device.district = district
  79. device.save()
  80. elif cmd == "offline":
  81. ext = data.get("ext")
  82. if ext:
  83. # 增加设备数据
  84. model.objects.create(
  85. device_id=device_id,
  86. device_data = str(ext),
  87. addtime=now
  88. )
  89. # 更新设备状态
  90. device = MongoDevice.objects.filter(device_id=device_id).first()
  91. device.device_status = 0
  92. device.save()
  93. return Response({"code": 0, "msg": "success"})
  94. except Exception as e:
  95. logger.error(f"测报灯设备 {device_id} 处理上报数据或增加设备失败,错误原因:{e.args}")
  96. return Response({"code": 2, "msg": f"处理测报灯上报数据失败 {device_id}"})
  97. else:
  98. return Response({"code": 2, "msg": "请核对数据结构"})
  99. class QxzDeviceAddAPIViw(APIView):
  100. def post(self, request):
  101. # 气象站上传数据
  102. request_data = request.data
  103. device_id = request_data.get("StationID")
  104. uptime = request_data.get("MonitorTime")
  105. data = request_data.get("data")
  106. if data:
  107. # 30分钟上报一次的数据
  108. conf_data = data_deal(data)
  109. qxz_data = MongoQXZ_Conf()
  110. qxz_data.device_id = 2
  111. qxz_data.e1 = data[1]
  112. qxz_data.e2 = data[2]
  113. qxz_data.e3 = data[3]
  114. qxz_data.e4 = data[4]
  115. qxz_data.e5 = data[5]
  116. qxz_data.e6 = data[6]
  117. qxz_data.e7 = data[7]
  118. qxz_data.e8 = data[8]
  119. qxz_data.e9 = data[9]
  120. qxz_data.e10 = data[10]
  121. qxz_data.e11 = data[11]
  122. qxz_data.e12 = data[12]
  123. qxz_data.e13 = data[13]
  124. qxz_data.e14 = data[14]
  125. qxz_data.e15 = data[15]
  126. qxz_data.e16 = data[16]
  127. qxz_data.e17 = data[17]
  128. qxz_data.e18 = data[18]
  129. qxz_data.e19 = data[19]
  130. qxz_data.e20 = data[20]
  131. qxz_data.e21 = data[21]
  132. qxz_data.e22 = data[22]
  133. qxz_data.e23 = data[23]
  134. qxz_data.e24 = data[24]
  135. qxz_data.e25 = data[25]
  136. qxz_data.e26 = data[26]
  137. qxz_data.e27 = data[27]
  138. qxz_data.e28 = data[28]
  139. qxz_data.e29 = data[29]
  140. qxz_data.e30 = data[30]
  141. class DeviceListAPIView(APIView):
  142. def post(self, request):
  143. # 设备列表
  144. request_data = request.data
  145. device_id = request_data.get("device_id")
  146. device_status = request_data.get("device_status")
  147. search = request_data.get("search")
  148. page_num = int(request_data.get("pagenum")) if request_data.get("pagenum") else 1
  149. page_size = int(request_data.get("pagesize")) if request_data.get("pagesize") else 10
  150. if device_id:
  151. queryset = MongoDevice.objects.filter(device_id=device_id).order_by("-uptime")
  152. elif device_status:
  153. queryset = MongoDevice.objects.filter(device_status=device_status).order_by("-uptime")
  154. elif search:
  155. queryset = MongoDevice.objects.filter(Q(device_name__icontains=search) | Q(device_id__icontains=search))
  156. else:
  157. queryset = MongoDevice.objects.all().order_by("-uptime")
  158. total_obj = queryset.count()
  159. paginator = Paginator(queryset, page_size)
  160. page_obj = paginator.get_page(page_num)
  161. serializers = DeviceSerializers(page_obj, many=True)
  162. return Response({"code": 0, "msg": "success", "data": serializers.data, "count": total_obj})
  163. class DeviceChangeAPIView(APIView):
  164. def post(self, request):
  165. # 修改设备信息
  166. request_data = request.data
  167. device_name = request_data.get("device_name")
  168. device_id = request_data.get("device_id")
  169. lng = request_data.get("lng")
  170. lat = request_data.get("lat")
  171. device = MongoDevice.objects.get(device_id=device_id)
  172. if device_name:
  173. device.device_name = device_name
  174. if lng and lat:
  175. device.lng = lng
  176. device.lat = lat
  177. is_success, province, city, district = get_addr_by_lag_lng(lat, lng)
  178. if is_success:
  179. # 更新地理位置坐标
  180. device.province = province
  181. device.city = city
  182. device.district = district
  183. device.save()
  184. return Response({"code": 0, "msg": "success"})