Pārlūkot izejas kodu

完善设备获取智能场景数据接口

locky 3 gadi atpakaļ
vecāks
revīzija
3a056f3472

+ 13 - 6
Controller/SensorGateway/SmartSceneController.py

@@ -12,7 +12,7 @@ from django.db import transaction
 from django.db.models import F, Q, Count
 from django.views import View
 
-from Ansjer.config import SMART_SCENE_TOPIC_NAME, GET_SCENE_TOPIC_NAME
+from Ansjer.config import SMART_SCENE_TOPIC_NAME
 from Model.models import FamilyRoomDevice, GatewaySubDevice, FamilyRoom, SmartScene, EffectiveTime, Device_Info, \
     SceneLog
 from Object.ResponseObject import ResponseObject
@@ -671,7 +671,7 @@ class SmartSceneView(View):
             if device_id:
                 serial_number = Device_Info.objects.filter(id=device_id).values('serial_number')[0]['serial_number']
             else:
-                serial_number = GatewaySubDevice.objects.filter(id=smart_scene_qs[0]['sub_device_id']).\
+                serial_number = GatewaySubDevice.objects.filter(id=smart_scene_qs[0]['sub_device_id']). \
                     values('device__serial_number')[0]['device__serial_number']
             topic_name = SMART_SCENE_TOPIC_NAME.format(serial_number)
             with transaction.atomic():
@@ -802,17 +802,24 @@ class SmartSceneView(View):
             return response.json(444, {'error param': 'serial_number'})
 
         try:
-            device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('userID_id')
+            device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('id')
             if not device_info_qs.exists():
                 return response.json(173)
-            smart_scene_qs = SmartScene.objects.filter(user_id=device_info_qs[0]['userID_id']).values('device_data')
+            device_id = device_info_qs[0]['id']
+            sub_device_id_list = GatewaySubDevice.objects.filter(device_id=device_id).values_list('id', flat=True)
+            if sub_device_id_list:
+                smart_scene_qs = SmartScene.objects.filter(
+                    Q(device_id=device_id) | Q(sub_device_id__in=sub_device_id_list))
+            else:
+                smart_scene_qs = SmartScene.objects.filter(device_id=device_id)
             if not smart_scene_qs.exists():
                 return response.json(173)
 
-            topic_name = GET_SCENE_TOPIC_NAME.format(serial_number)
+            smart_scene_qs = smart_scene_qs.values('device_data')
+            topic_name = SMART_SCENE_TOPIC_NAME.format(serial_number)
             for smart_scene in smart_scene_qs:
                 msg = eval(smart_scene['device_data'])
-                success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
+                success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg, 0)
                 try:
                     assert success
                 except AssertionError:

+ 3 - 2
Service/CommonService.py

@@ -477,12 +477,13 @@ class CommonService:
             return False
 
     @staticmethod
-    def req_publish_mqtt_msg(identification_code, topic_name, msg):
+    def req_publish_mqtt_msg(identification_code, topic_name, msg, qos=1):
         """
         通用发布MQTT消息函数
         @param identification_code: 标识码
         @param topic_name: 主题名
         @param msg: 消息内容
+        @param qos: mqtt qos等级
         @return: boolean
         """
         if not all([identification_code, topic_name]):
@@ -506,7 +507,7 @@ class CommonService:
             # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
             # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
             # post请求url发布MQTT消息
-            url = 'https://{}/topics/{}'.format(endpoint, topic_name)
+            url = 'https://{}/topics/{}?qos={}'.format(endpoint, topic_name, qos)
             authorizer_name = 'Ansjer_Iot_Auth'
             signature = CommonService.rsa_sign(Token)  # Token签名
             headers = {