Răsfoiți Sursa

优化Alexa请求MQTT通知设备推流代码

locky 3 ani în urmă
părinte
comite
b423f8854a
2 a modificat fișierele cu 16 adăugiri și 42 ștergeri
  1. 9 41
      Controller/IotCoreController.py
  2. 7 1
      Service/CommonService.py

+ 9 - 41
Controller/IotCoreController.py

@@ -42,7 +42,7 @@ class IotCoreView(View):
         if operation == 'createKeysAndCertificate':
             return self.create_keys_and_certificate(request_dict, response, request)
         elif operation == 'requestPublishMessage':
-            return self.request_publish_message(request_dict, response, request)
+            return self.request_publish_message(request_dict, response)
         elif operation == 'getS3PullKey':
             return self.get_s3_pull_key(request_dict, response, request)
         elif operation == 'thingRegroup':
@@ -244,8 +244,9 @@ class IotCoreView(View):
         else:
             return response.json(444)
 
-    def request_publish_message(self, request_dict, response, request):
-        # Alexa请求IoT Core下发MQTT消息通知设备开始或停止推流,或唤醒设备
+    # Alexa请求IoT Core下发MQTT消息通知设备开始或停止推流,或唤醒设备
+    @staticmethod
+    def request_publish_message(request_dict, response):
         UID = request_dict.get('UID', None)
         rtsp = request_dict.get('rtsp', None)
         enable = request_dict.get('enable', '1')
@@ -253,51 +254,18 @@ class IotCoreView(View):
             return response.json(444)
 
         try:
-            # 获取设备的物品名后缀
-            device_info_qs = Device_Info.objects.filter(UID=UID).values('UID', 'serial_number')
-            if not device_info_qs.exists():
-                return response.json(10043)
-            uid = device_info_qs[0]['UID']
-            serial_number = device_info_qs[0]['serial_number']
-            # 如果device_info表的serial_number不为空,物品名为'Ansjer_Device_序列号'
-            thing_name_suffix = serial_number if serial_number != '' else uid
-            # 获取数据组织将要请求的url
-            iot = iotdeviceInfoModel.objects.filter(thing_name__contains=thing_name_suffix).values('thing_name',
-                                                                                                   'endpoint',
-                                                                                                   'token_iot_number')
-            if not iot.exists():
-                return response.json(10043)
-            thing_name = iot[0]['thing_name'][14:]  # IoT core上的物品名: Ansjer_Device_ + 序列号+企业编码/uid
-            endpoint = iot[0]['endpoint']
-            Token = iot[0]['token_iot_number']
-            # Token = '297a601b3925e04daab5a60280650e09'
-            topic_name = 'ansjer/generic/' + thing_name  # MQTT主题名
-
-            # 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)
-            authorizer_name = 'Ansjer_Iot_Auth'
-            signature = CommonService.rsa_sign(Token)  # Token签名
-            headers = {'x-amz-customauthorizer-name': authorizer_name, 'Token': Token,
-                       'x-amz-customauthorizer-signature': signature}
-            params = OrderedDict(
+            thing_name = CommonService.query_serial_with_uid(UID)   # 存在序列号则为使用序列号作为物品名
+            topic_name = 'ansjer/generic/{}'.format(thing_name)
+            msg = OrderedDict(
                 [
                     ('alexaRtspCommand', rtsp),
                     ('enable', int(enable)),
                 ]
             )
-            r = requests.post(url=url, headers=headers, json=params, timeout=2)
-            if r.status_code == 200:
-                res = r.json()
-                if res['message'] == 'OK':
-                    return response.json(0)
-                return response.json(10044)
-            else:
-                # print('发布失败')
+            if not CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg):
                 return response.json(10044)
+            return response.json(0)
         except Exception as e:
-            # print(e)
             return response.json(500, repr(e))
 
     def get_s3_pull_key(self, request_dict, response, request):

+ 7 - 1
Service/CommonService.py

@@ -476,7 +476,13 @@ class CommonService:
 
     @staticmethod
     def req_publish_mqtt_msg(thing_name, topic_name, msg):
-        # 通用发布MQTT消息函数
+        """
+        通用发布MQTT消息函数
+        @param thing_name: 物品名
+        @param topic_name: 主题名
+        @param msg: 消息内容
+        @return: boolean
+        """
         if not all([thing_name, topic_name, msg]):
             return False