Procházet zdrojové kódy

通过设备影子判断插座是否在线

peng před 1 rokem
rodič
revize
ad16031feb

+ 6 - 1
Controller/SensorGateway/GatewayDeviceController.py

@@ -18,7 +18,7 @@ from django.views.generic.base import View
 from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SCENE_EVENT_DELETE, SUB_DEVICE_TOPIC
 from Ansjer.config import CONFIG_INFO, AWS_IOT_SES_ACCESS_CHINA_ID, AWS_IOT_SES_ACCESS_CHINA_SECRET, \
     AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_FOREIGN_ID, AWS_IOT_SES_ACCESS_FOREIGN_SECRET, \
-    AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA, AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE
 from Ansjer.config import LOGGER
 from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
 from Controller.SensorGateway.SmartSocketController import SmartSocketView
@@ -331,6 +331,11 @@ class GatewayDeviceView(View):
                 iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_FOREIGN_ID,
                                                         AWS_IOT_SES_ACCESS_FOREIGN_SECRET,
                                                         AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA)
+            elif 'eur' == CONFIG_INFO:
+                iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_FOREIGN_ID,
+                                                        AWS_IOT_SES_ACCESS_FOREIGN_SECRET,
+                                                        AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE)
+
             if iot_data_plane:
                 res = iot_data_plane.update_thing_shadow(thing_name, data)
                 LOGGER.info('删除插座更新设备影子状态{}'.format(res))

+ 25 - 0
Controller/SensorGateway/SmartSocketController.py

@@ -19,9 +19,14 @@ from django.http import QueryDict
 from django.views import View
 
 from Model.models import SocketInfo, SocketSchedule, Device_Info, SocketPowerStatistics, SceneLog, FamilyRoomDevice
+from Object.AWS.AWSIoTDataPlaneUtil import AWSIoTDataPlaneService
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
+from Ansjer.config import CONFIG_INFO, AWS_IOT_SES_ACCESS_CHINA_ID, AWS_IOT_SES_ACCESS_CHINA_SECRET, \
+    AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_FOREIGN_ID, AWS_IOT_SES_ACCESS_FOREIGN_SECRET, \
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA, AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE
+
 
 LOGGER = logging.getLogger('info')
 SOCKET_TOPIC_NAME = 'loocam/smart-socket/{}'  # 插座发布消息主题(因设备当前版本只能订阅一个主题)
@@ -859,6 +864,26 @@ class SmartSocketView(View):
         try:
             socket_info_qs = SocketInfo.objects.get(serial_number=serialNumber, type_switch=0)
             device_id = socket_info_qs.device_id
+            # 判断设备是否在线
+            thing_name = 'LC_' + serialNumber
+            if 'test' == CONFIG_INFO or CONFIG_INFO == 'cn':
+                iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_CHINA_ID,
+                                                        AWS_IOT_SES_ACCESS_CHINA_SECRET,
+                                                        AWS_IOT_SES_ACCESS_CHINA_REGION)
+
+            elif 'us' == CONFIG_INFO:
+                iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_FOREIGN_ID,
+                                                        AWS_IOT_SES_ACCESS_FOREIGN_SECRET,
+                                                        AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA)
+            else:
+                iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_FOREIGN_ID,
+                                                        AWS_IOT_SES_ACCESS_FOREIGN_SECRET,
+                                                        AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE)
+            res = iot_data_plane.get_thing_shadow(thing_name)
+            if not res:
+                return response.json(177)
+            if not res['state']['reported']['online']:
+                return response.json(177)
             result = cls.save_socket_switch(device_id, serialNumber, int(status))
             if not result:
                 return response.json(177)

+ 19 - 0
Object/AWS/AWSIoTDataPlaneUtil.py

@@ -45,3 +45,22 @@ class AWSIoTDataPlaneService:
         except Exception as e:
             LOGGER.info('更新设备影子异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return False
+
+    def get_thing_shadow(self, thing_name, shadow_name=None):
+        """
+        获取指定事物的影子
+        @param thing_name: 物品名称
+        @param shadow_name: 自定义影子名称(使用经典影子可不填)
+        @return: 更新状态
+        """
+        try:
+            params = {
+                'thingName': thing_name,
+            }
+            if shadow_name:
+                params['shadowName'] = shadow_name
+            response = self.client.get_thing_shadow(**params)
+            return json.loads(response['payload'].read())
+        except Exception as e:
+            LOGGER.info('获取设备影子异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False