瀏覽代碼

alexa语音控制智能插座

peng 2 年之前
父節點
當前提交
f35c06416d
共有 3 個文件被更改,包括 166 次插入40 次删除
  1. 1 0
      azoauth/urls.py
  2. 142 36
      controller/index.py
  3. 23 4
      model/models.py

+ 1 - 0
azoauth/urls.py

@@ -28,6 +28,7 @@ urlpatterns = [
     path('oa2/token', index.oa2TokenView.as_view()),
     path('oa2/rtspStart', index.oa2RtspStartView.as_view()),
     path('oa2/discoverydevice', index.oa2DiscoveryDevice.as_view()),
+    path('oa2/discoveryswitch', index.oa2DiscoverySwitch.as_view()),
     # 新增停流
     path('oa2/stoprtsp', index.testRunSendStop),
     # 新增设备推流测试

+ 142 - 36
controller/index.py

@@ -24,12 +24,13 @@ from urllib.parse import urlencode
 import subprocess
 import uuid
 # from gevent.pool import Pool
-from model.models import UserModel, UidRtspModel, AlexaAuthModel, UserCountModel
+from model.models import UserModel, UidRtspModel, AlexaAuthModel, UserCountModel, SwitchModel
 from object.ResponseObject import ResponseObject
 from object.tkObject import tkObject
 from service.CommonService import CommonService
 from object.RedisObject import RedisObject
 from azoauth.config import *
+from datetime import datetime
 
 
 class authView(TemplateView):
@@ -149,7 +150,7 @@ class loginHandleView(TemplateView):
             user_qs.update(code=code, updTime=nowTime)
         else:
             UserModel.objects.create(userID=userID, code=code, addTime=nowTime, updTime=nowTime)
-            year_month = str(time.strftime('%Y%m', time.localtime(nowTime)))    # 获取当前年月
+            year_month = str(time.strftime('%Y%m', time.localtime(nowTime)))  # 获取当前年月
             user_count_qs = UserCountModel.objects.filter(skill_name=skill_name, year_month=year_month).values('amount')
             if not user_count_qs.exists():
                 UserCountModel.objects.create(skill_name=skill_name, year_month=year_month, amount=1)
@@ -288,7 +289,7 @@ class oa2RtspStartView(TemplateView):
         command = "./pushtool {UID} {PWD} {MSG} 1 {channel}".format(UID=UID, PWD=PWD, MSG=MSG, channel=channel)
         # 请求MQTT发布消息
         url = '{}/iot/requestPublishMessage'.format(SERVER_PREFIX)
-        requests_data = {'UID': UID, 'rtsp': MSG, 'enable': '1'}   # 1: 开始推流,0: 停止推流; channel: 推流通道
+        requests_data = {'UID': UID, 'rtsp': MSG, 'enable': '1'}  # 1: 开始推流,0: 停止推流; channel: 推流通道
         r = requests.post(url, requests_data)
         if r.status_code == 200:
             res = r.json()
@@ -308,12 +309,12 @@ class oa2RtspStartView(TemplateView):
                     self.runSendRtspMsg(logger, region, command)
             else:
                 self.runSendRtspMsg(logger, region, command)
-        else:   # 使用pushtool通知设备推流
+        else:  # 使用pushtool通知设备推流
             self.runSendRtspMsg(logger, region, command)
 
         # 拉流地址
         rtsp_uri = '{}://{}:443/{}'.format(RTSP_PREFIX, RESP_SERVER_DOMAIN, stream_name)
-        stop_time = int(time.time()) + 2*60
+        stop_time = int(time.time()) + 2 * 60
         expirationTime = time.strftime('%Y-%m-%dT%H:%MZ', time.localtime(stop_time))
 
         res_json = {
@@ -364,7 +365,7 @@ class oa2RtspStartView(TemplateView):
                     communicate(timeout=2)
                 logger.info('back: {}'.format(str(back[0].decode()) + str(back[1].decode())))
             except Exception as e:
-                self.runSendRtspMsg(logger, 'CN', command)  #调用失败时尝试用国内的发送
+                self.runSendRtspMsg(logger, 'CN', command)  # 调用失败时尝试用国内的发送
                 logger.info('调用pushtool异常: {}'.format(repr(e)))
 
     def runSendStop(self, UID, PWD, MSG):
@@ -409,7 +410,7 @@ class oa2DiscoveryDevice(TemplateView):
         userID = user.userID
         logger.info('userID: {}'.format(userID))
 
-        #更新事件网关接口
+        # 更新事件网关接口
         alexAuth = AlexaAuthModel.objects.filter(token=access_token).order_by('-addTime')
         if alexAuth.exists():
             auth_res = alexAuth.values()
@@ -442,7 +443,7 @@ class oa2DiscoveryDevice(TemplateView):
         res_json = res.json()
         logger.info('正式服务器响应: {}'.format(res_json))
 
-        test_flag = False   # 用来区分测试服务器,后面删掉
+        test_flag = False  # 用来区分测试服务器,后面删掉
         # 添加测试服务器测试
         if res_json['result_code'] != 0:
             auth_request_url = '{}/oalexa/discoveryuid'.format(SERVER_PREFIX_TEST)
@@ -508,14 +509,116 @@ class oa2DiscoveryDevice(TemplateView):
         logger.info('搜索设备返回值: {}'.format(res_json))
         return JsonResponse(res_json, safe=False)
 
-#新增
+
+class oa2DiscoverySwitch(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        # 增加对code和client_id的校验代码,返回access_token和refresh_token
+        skill_name = request_dict.get("skill_name", 'loocam')
+        access_token = request_dict.get("access_token", None)
+
+        logger = logging.getLogger('django')
+        logger.info('--------{} 开始搜索设备--------'.format(skill_name))
+
+        user_qs = UserModel.objects.filter(access_token=access_token)
+        if not user_qs.exists():
+            return JsonResponse({'错误': '用户数据不存在'})
+
+        response = ResObject()
+        user = user_qs.first()
+        userID = user.userID
+        logger.info('userID: {}'.format(userID))
+
+        # 更新事件网关接口
+        alexAuth = AlexaAuthModel.objects.filter(token=access_token).order_by('-addTime')
+        if alexAuth.exists():
+            auth_res = alexAuth.values()
+            event_access_token = auth_res[0]['access_token']
+            event_refresh_token = auth_res[0]['refresh_token']
+            event_token = auth_res[0]['token']
+            event_expiresTime = auth_res[0]['expiresTime']
+            event_addTime = auth_res[0]['addTime']
+            event_updTime = auth_res[0]['updTime']
+            event_alexa_region = auth_res[0]['alexa_region']
+            AlexaAuthModel.objects.filter(userID=userID).delete()
+            alexAuth.delete()
+            logger.info('update_event_access_token')
+            logger.info(event_token)
+            AlexaAuthModel.objects.create(
+                userID=userID,
+                access_token=event_access_token,
+                refresh_token=event_refresh_token,
+                token=event_token,
+                expiresTime=event_expiresTime,
+                addTime=event_addTime,
+                updTime=event_updTime,
+                alexa_region=event_alexa_region,
+                skill_name=skill_name,
+            )
+
+        auth_request_url = '{}/oalexa/discoveryswitch'.format(SERVER_PREFIX)
+        requests_data = {'sid': 'admin', 'sst': 'admin', 'alexa_user_id': userID}
+        res = requests.post(url=auth_request_url, data=requests_data)
+        res_json = res.json()
+        logger.info('正式服务器响应: {}'.format(res_json))
+
+        test_flag = False  # 用来区分测试服务器,后面删掉
+        # 添加测试服务器测试
+        if res_json['result_code'] != 0:
+            auth_request_url = '{}/oalexa/discoveryswitch'.format(SERVER_PREFIX_TEST)
+            res = requests.post(url=auth_request_url, data=requests_data)
+            res_json = res.json()
+            test_flag = True
+
+        logger.info('请求服务器url: {}'.format(auth_request_url))
+        logger.info('服务器响应: {}'.format(res_json))
+
+        if res_json['result_code'] != 0:
+            return response.json(0, res={'msg': 'error'})
+
+        switch_list = res_json['result']['switch_list']
+        now_time = int(time.time())
+        res_json = []
+        for switch in switch_list:
+            serial_number = switch['serial_number']
+            nick = switch['nick']
+            region = 'EU' if switch['region'] == 'EU' else 'EN'
+            switch_info_qs = SwitchModel.objects.filter(serial_number=serial_number, userID=userID)
+            if switch_info_qs.exists():
+                switch_info_qs.update(nick=nick, region=region, updTime=now_time)
+            else:
+                SwitchModel.objects.create(serial_number=serial_number, nick=nick, region=region, addTime=now_time,
+                                           updTime=now_time, userID=userID)
+            ur_data = {
+                'endpointId': serial_number,
+                'friendlyName': nick,
+                'manufacturerName': skill_name,
+                'description': 'Camera connected via {}'.format(skill_name),
+                'modelName': 'P1425-LE',
+                'manufacturerId': 'zosi-ACCC8E5E7513',
+            }
+            res_json.append(ur_data)
+        logger.info('搜索设备返回值: {}'.format(res_json))
+        return JsonResponse(res_json, safe=False)
+
+
+# 新增
 def testRunSendStop(request):
     request.encoding = 'utf-8'
     if request.method == 'GET':
         request_dict = request.GET
-    UID=request_dict.get('UID', None)
-    PWD=request_dict.get('PWD', None)
-    MSG=request_dict.get('MSG', None)
+    UID = request_dict.get('UID', None)
+    PWD = request_dict.get('PWD', None)
+    MSG = request_dict.get('MSG', None)
     command = "./pushtool {UID} {PWD} {MSG} 0".format(UID=UID, PWD=PWD, MSG=MSG)
     print('command=>{command}'.format(command=command))
     try:
@@ -528,45 +631,46 @@ def testRunSendStop(request):
         print("back1----", back[1].decode())  # back是一个元祖,可以通过元祖取值的方式获取结果
         return JsonResponse({'msg': 'stop Stream', 'code': 0})
 
-from datetime import datetime
+
 def testRunStream(request):
     request.encoding = 'utf-8'
     if request.method == 'GET':
         request_dict = request.GET
-    UID=request_dict.get('UID', None)
-    PWD=request_dict.get('PWD', None)
-    MSG=request_dict.get('MSG', None)
-    time1=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
+    UID = request_dict.get('UID', None)
+    PWD = request_dict.get('PWD', None)
+    MSG = request_dict.get('MSG', None)
+    time1 = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
     command = "./pushtool {UID} {PWD} {MSG} 1".format(UID=UID, PWD=PWD, MSG=MSG)
     print('command=>{command}'.format(command=command))
     try:
         back = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE). \
             communicate(timeout=10)
-        time2=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
+        time2 = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
         # print("时间:%s"%datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
     except Exception as e:
         return repr(e)
     else:
         print("back0----", back[0].decode())  # 注意需要进行解码操作,默认输出的是字节
         print("back1----", back[1].decode())  # back是一个元祖,可以通过元祖取值的方式获取结果
-        #return str(back[0].decode()) + str(back[1].decode())
-        return JsonResponse({'msg': "star is %s"%time1+",end is %s"%time2, 'code': 0})
+        # return str(back[0].decode()) + str(back[1].decode())
+        return JsonResponse({'msg': "star is %s" % time1 + ",end is %s" % time2, 'code': 0})
         # return JsonResponse({'msg': "run stream", 'code': 0})
 
 
-#测试是否正常接口
+# 测试是否正常接口
 def test(request):
     return JsonResponse({'msg': 'Server running normal', 'code': 0})
 
-#test接口
+
+# test接口
 def loadBalancingServer(request):
     try:
         res1 = requests.get('http://rtsp.zositech.com:10008/api/v1/players', timeout=5)
     except Exception as e:
         res1 = -1
 
-    time1=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
-    print("时间1:%s"%time1)
+    time1 = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
+    print("时间1:%s" % time1)
     # ---------压测接口demo------------
     redisObj = RedisObject(db=1)
     key1 = 'rtsp.zositech.com'
@@ -575,7 +679,7 @@ def loadBalancingServer(request):
     redis_data2 = redisObj.get_data(key2)
     if redis_data1 and redis_data2:
         print("进缓存")
-        mm=min(redis_data1,redis_data2)
+        mm = min(redis_data1, redis_data2)
         if redis_data1 == mm and redis_data1 != -1:
             RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN']
         elif redis_data2 == mm and redis_data2 != -1:
@@ -599,7 +703,7 @@ def loadBalancingServer(request):
     #         RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN']
     #     else:
     #         RESP_SERVER_DOMAIN = RESP_SERVER_DOMAIN_DATA['EN1']
-    return JsonResponse({'msg': 'The number of people online is :%s'%res1, 'code': 0})
+    return JsonResponse({'msg': 'The number of people online is :%s' % res1, 'code': 0})
 
 
 class powerController(TemplateView):
@@ -614,24 +718,26 @@ class powerController(TemplateView):
         return self.power_controller(request_dict)
 
     def power_controller(self, request_dict):
-        uid = request_dict.get('uid', '')
+        serial_number = request_dict.get('serial_number', '')
         access_token = request_dict.get('access_token', '')
-        skill_name = request_dict.get('skill_name', 'zosi smart')
+        skill_name = request_dict.get('skill_name', 'loocam')
         power_controller = request_dict.get('power_controller', '')
 
+        if not all([serial_number, access_token, skill_name]):
+            return JsonResponse({'result_code': '500', '错误': '缺少参数'})
         user_qs = UserModel.objects.filter(access_token=access_token)
         if not user_qs.exists():
-            return JsonResponse({'result_code': '500' , '错误': '用户数据不存在'})
-
-        ur_qs = UidRtspModel.objects.filter(uid=uid).values('uid', 'nick', 'rtsp_url', 'password', 'region')
-        if not ur_qs.exists():
-            return JsonResponse({'result_code': '500', '错误': 'uid数据不存在'})
+            return JsonResponse({'result_code': '500', '错误': '用户数据不存在'})
+        userID = user_qs.first().userID
+        switch_qs = SwitchModel.objects.filter(serial_number=serial_number, userID=userID).values('nick', 'region')
+        if not switch_qs.exists():
+            return JsonResponse({'result_code': '500', '错误': 'serial_number数据不存在'})
 
         logger = logging.getLogger('django')
-        logger.info('{} 唤醒设备 {}'.format(skill_name, uid))
+        logger.info('{} 唤醒设备 {}'.format(skill_name, serial_number))
         # 请求MQTT发布消息
-        url = '{}/iot/requestPublishMessage'.format(SERVER_PREFIX_TEST)    # 测试服务器
-        requests_data = {'UID': uid, 'MSG': power_controller}   # TurnOn, TurnOff
+        url = '{}/api/loocam/open/socket/alexa-socket-switch'.format(SERVER_PREFIX_TEST)  # 测试服务器
+        requests_data = {'serial_number': serial_number, 'power_controller': power_controller}  # TurnOn, TurnOff
         r = requests.post(url, requests_data)
         if r.status_code != 200:
             return JsonResponse({'result_code': '500', '错误': '请求响应异常'})

+ 23 - 4
model/models.py

@@ -10,7 +10,8 @@ class UserModel(models.Model):
     code = models.CharField(max_length=32, unique=True, default='', verbose_name='授权码')
     access_token = models.CharField(max_length=64, unique=False, default='', verbose_name='访问令牌')
     refresh_token = models.CharField(max_length=64, unique=False, default='', verbose_name='刷新令牌')
-    uid_rtsp = models.ManyToManyField(to='UidRtspModel', blank=True, verbose_name=u'用户关联uid_rtsp表', db_table='user_uid_rtsp')
+    uid_rtsp = models.ManyToManyField(to='UidRtspModel', blank=True, verbose_name=u'用户关联uid_rtsp表',
+                                      db_table='user_uid_rtsp')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
 
@@ -41,7 +42,7 @@ class UserCountModel(models.Model):
 class UidRtspModel(models.Model):
     id = models.AutoField(primary_key=True)
     nick = models.CharField(max_length=32, verbose_name=u'设备昵称', default='')
-    uid = models.CharField(max_length=20, verbose_name=u'设备UID', default='',unique=True)
+    uid = models.CharField(max_length=20, verbose_name=u'设备UID', default='', unique=True)
     password = models.CharField(max_length=32, verbose_name=u'设备密码', default='')
     rtsp_url = models.CharField(max_length=128, verbose_name='rtsp流地址', default='')
     region = models.CharField(max_length=8, verbose_name='区域', default='CN')
@@ -57,17 +58,35 @@ class UidRtspModel(models.Model):
         return self.id
 
 
+class SwitchModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    nick = models.CharField(max_length=32, verbose_name=u'设备昵称', default='')
+    serial_number = models.CharField(max_length=20, verbose_name=u'设备序列号', default='', unique=True)
+    userID = models.CharField(blank=True, max_length=32, verbose_name=u'用户ID', unique=True)
+    region = models.CharField(max_length=8, verbose_name='区域', default='EN')
+    addTime = models.IntegerField(verbose_name='添加时间', default=0)
+    updTime = models.IntegerField(verbose_name='更新时间', default=0)
+
+    class Meta:
+        ordering = ('-addTime',)
+        verbose_name = '智能插座表'
+        db_table = 'switch_info'
+
+    def __str__(self):
+        return self.id
+
+
 class AlexaAuthModel(models.Model):
     id = models.AutoField(primary_key=True)
     skill_name = models.CharField(max_length=32, default='', verbose_name=u'skill名称')
-    userID = models.CharField(blank=True, max_length=32,verbose_name=u'用户ID', default='', unique=False)
+    userID = models.CharField(blank=True, max_length=32, verbose_name=u'用户ID', default='', unique=False)
     access_token = models.CharField(max_length=150, unique=False, default='', verbose_name='访问令牌')
     refresh_token = models.CharField(max_length=150, unique=False, default='', verbose_name='刷新令牌')
     token = models.CharField(max_length=150, unique=False, default='', verbose_name='区分用户token')
     expiresTime = models.IntegerField(verbose_name='过期时间', default=0)
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
-    alexa_region = models.CharField(max_length=8,verbose_name='alexa区域',default=0)
+    alexa_region = models.CharField(max_length=8, verbose_name='alexa区域', default=0)
 
     class Meta:
         ordering = ('-addTime',)