Browse Source

修改AI开关状态通过mqtt通知设备

locky 3 years ago
parent
commit
e698378ebf
1 changed files with 58 additions and 3 deletions
  1. 58 3
      Controller/AiController.py

+ 58 - 3
Controller/AiController.py

@@ -28,6 +28,8 @@ import calendar
 import datetime
 import datetime
 import logging
 import logging
 import sys
 import sys
+
+import requests
 from aliyunsdkcore import client
 from aliyunsdkcore import client
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from boto3.session import Session
 from boto3.session import Session
@@ -44,7 +46,7 @@ from Controller.CheckUserData import DataValid
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel, \
     Unused_Uid_Meal, UIDMainUser, UserModel, PromotionRuleModel, VideoPlaybackTimeModel, CloudLogModel, CouponModel, \
     Unused_Uid_Meal, UIDMainUser, UserModel, PromotionRuleModel, VideoPlaybackTimeModel, CloudLogModel, CouponModel, \
-    AiStoreMeal, AiService, UidSetModel, Ai_Push_Info
+    AiStoreMeal, AiService, UidSetModel, Ai_Push_Info, iotdeviceInfoModel
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.AliPayObject import AliPayObject
 from Object.AliPayObject import AliPayObject
 from Object.AliSmsObject import AliSmsObject
 from Object.AliSmsObject import AliSmsObject
@@ -96,7 +98,7 @@ class AiView(View):
             if operation == 'createpayorder':  # 创建支付订单
             if operation == 'createpayorder':  # 创建支付订单
                 ip = CommonService.get_ip_address(request)
                 ip = CommonService.get_ip_address(request)
                 return self.do_create_pay_order(request_dict, userID, ip, response)
                 return self.do_create_pay_order(request_dict, userID, ip, response)
-            elif operation == 'changeaistatus':  # 修改云存状态,传送两个url,即getsignsts接口和storeplaylist接口
+            elif operation == 'changeaistatus':  # 修改AI开关状态
                 return self.do_change_ai_status(userID, request_dict, response)
                 return self.do_change_ai_status(userID, request_dict, response)
             elif operation == 'commoditylist':  # 修改云存状态,传送两个url,即getsignsts接口和storeplaylist接口
             elif operation == 'commoditylist':  # 修改云存状态,传送两个url,即getsignsts接口和storeplaylist接口
                 return self.do_commodity_list(userID, request_dict, response)
                 return self.do_commodity_list(userID, request_dict, response)
@@ -189,12 +191,18 @@ class AiView(View):
                 uid_set_qs = UidSetModel.objects.create(**qs_data)
                 uid_set_qs = UidSetModel.objects.create(**qs_data)
                 uid_set_id = uid_set_qs.id
                 uid_set_id = uid_set_qs.id
 
 
-
+            topic_name = 'AiServer/{}'.format(uid)
             if status == 0:
             if status == 0:
                 hasAiService.update(**qs_data)
                 hasAiService.update(**qs_data)
                 # UidPushModel.objects.filter(uid_set__uid=uid).delete()
                 # UidPushModel.objects.filter(uid_set__uid=uid).delete()
                 # 状态为0的时候删除redis缓存数据
                 # 状态为0的时候删除redis缓存数据
                 # self.do_delete_redis(uid)
                 # self.do_delete_redis(uid)
+
+                # mqtt通知设备关闭AI识别功能
+                msg = {'AiStatus', 'inactive'},
+                req_success = self.requestPublishMqtt(uid, topic_name, msg)
+                if not req_success:
+                    return response.json(10044)
                 return response.json(0)
                 return response.json(0)
             elif status == 1:
             elif status == 1:
                 hasAiService.update(**qs_data)
                 hasAiService.update(**qs_data)
@@ -243,10 +251,57 @@ class AiView(View):
                 # detectUrl = "{DETECT_PUSH_DOMAIN}AiService/push?etk={etk}&endTime={endTime}". \
                 # detectUrl = "{DETECT_PUSH_DOMAIN}AiService/push?etk={etk}&endTime={endTime}". \
                 #     format(etk=etk, DETECT_PUSH_DOMAIN=SERVER_DOMAIN_SSL, endTime=endTime)
                 #     format(etk=etk, DETECT_PUSH_DOMAIN=SERVER_DOMAIN_SSL, endTime=endTime)
                 aiIdentificationUrl = "{DETECT_PUSH_DOMAIN}AiService/identification".format(DETECT_PUSH_DOMAIN=SERVER_DOMAIN_SSL)
                 aiIdentificationUrl = "{DETECT_PUSH_DOMAIN}AiService/identification".format(DETECT_PUSH_DOMAIN=SERVER_DOMAIN_SSL)
+
+                # mqtt通知设备开启AI识别功能
+                msg = {
+                          'AiStatus', 'active',
+                          'etk', etk,
+                          'endTime', endTime,
+                          'aiIdentificationUrl', aiIdentificationUrl,
+                      },
+                req_success = self.requestPublishMqtt(uid, topic_name, msg)
+                if not req_success:
+                    return response.json(10044)
                 return response.json(0, {'aiIdentificationUrl': aiIdentificationUrl, 'endTime': endTime, 'etk': etk})
                 return response.json(0, {'aiIdentificationUrl': aiIdentificationUrl, 'endTime': endTime, 'etk': etk})
         else:
         else:
             return response.json(14)
             return response.json(14)
 
 
+    def requestPublishMqtt(self, thing_name, topic_name, msg):
+        # 通用发布MQTT主题通知
+        if not all([msg, thing_name, topic_name]):
+            return False
+
+        try:
+            # 获取数据组织将要请求的url
+            iot = iotdeviceInfoModel.objects.filter(
+                thing_name=thing_name).values(
+                'endpoint', 'token_iot_number')
+            if not iot.exists():
+                return False
+            endpoint = iot[0]['endpoint']
+            Token = iot[0]['token_iot_number']
+
+            # 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}
+            msg = eval(msg)
+            r = requests.post(url=url, headers=headers, json=msg, timeout=2)
+            if r.status_code == 200:
+                res = r.json()
+                if res['message'] == 'OK':
+                    return True
+                return False
+            else:
+                return False
+        except Exception as e:
+            return False
 
 
     def do_commodity_list(self, userID, request_dict, response):  # 查询套餐列表
     def do_commodity_list(self, userID, request_dict, response):  # 查询套餐列表
         uid = request_dict.get('uid', None)
         uid = request_dict.get('uid', None)