Bladeren bron

iot_deviceInfo表添加thing_groups字段;物品重新分组,Alexa请求IoT Core下发MQTT消息兼容使用uid

locky 4 jaren geleden
bovenliggende
commit
66ef7bcf6a
2 gewijzigde bestanden met toevoegingen van 34 en 19 verwijderingen
  1. 33 19
      Controller/IotCoreController.py
  2. 1 0
      Model/models.py

+ 33 - 19
Controller/IotCoreController.py

@@ -58,13 +58,13 @@ class IotCoreView(View):
     def create_keys_and_certificate(self, request_dict, response, request):
         uid = request_dict.get('uid', '')
         token = request_dict.get('token', None)
-        uid_code = request_dict.get('uid_code', '')
+        uid_code = request_dict.get('uid_code', None)
         language = request_dict.get('language', None)
         time_stamp = request_dict.get('time_stamp', None)
         device_version = request_dict.get('device_version', None).replace('.', '_')  # 物品组命名不能包含'.'
 
         if not all([token, time_stamp, device_version, language]):
-            return response.json(444, {'param': 'token, time_stamp, device_version, language'})
+            return response.json(444, {'param': 'token, uid_code, time_stamp, device_version, language'})
 
         # token时间戳校验
         token = int(CommonService.decode_data(token))
@@ -101,7 +101,7 @@ class IotCoreView(View):
             if uid != uid_code:
                 return response.json(404)
 
-            serial = ''
+            serial = ''     # iot_deviceInfo表写入serial_number为''
             ThingNameSuffix = uid     # 物品名后缀
             iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=uid)
         # 判断设备是否已注册证书
@@ -122,6 +122,7 @@ class IotCoreView(View):
                                               public_key=res[0]['publicKey'],
                                               private_key=res[0]['privateKey'],
                                               thing_name=res[1]['ThingName'],
+                                              thing_groups=res[1]['thingGroupName'],
                                               token_iot_number=token_iot_number
                                               )
             res = {
@@ -146,13 +147,14 @@ class IotCoreView(View):
 
     def thing_regroup(self, request_dict, response, request):
         # 物品重新分组
+        uid = request_dict.get('uid', '')
         token = request_dict.get('token', None)
+        language = request_dict.get('language', None)
         time_stamp = request_dict.get('time_stamp', None)
-        serial_number = request_dict.get('serial_number', None)
         device_version = request_dict.get('device_version', None)
-        language = request_dict.get('language', None)
-        if not all([serial_number, device_version, language, token, time_stamp]):
-            return response.json(444)
+
+        if not all([token, language, time_stamp, device_version]):
+            return response.json(444, {'param: token, language, time_stamp, device_version'})
 
         # 封装token认证
         token = int(CommonService.decode_data(token))
@@ -161,15 +163,20 @@ class IotCoreView(View):
         distance = now_time - time_stamp
         if token != time_stamp or distance > 60000 or distance < -60000:  # 为了全球化时间控制在一天内
             return response.json(404)
+
         ip = CommonService.get_ip_address(request)
         region_id = Device_Region().get_device_region(ip)
+        iotClient = IOTClient(region_id)
 
-        thingName = 'Ansjer_Device_' + serial_number
+        ThingNameSuffix = uid
+        if not uid:
+            # 使用序列号
+            serial_number = request_dict.get('serial_number', None)
+            if not serial_number:
+                return response.json(444)
+            ThingNameSuffix = serial_number
+        thingName = 'Ansjer_Device_' + ThingNameSuffix
         new_thingGroupName = (device_version + '_' + language).replace('.', '_')  # 物品组命名不能包含'.'
-        # 调试参数
-        # thingName = 'Ansjer_Device_00EBEX'
-        # new_thingGroupName = 'C1Pro_V1_0_1_cn'
-        iotClient = IOTClient(region_id)
 
         try:
             # 获取旧物品组
@@ -194,9 +201,12 @@ class IotCoreView(View):
             iotClient.client.update_thing_groups_for_thing(thingName=thingName
                                                            , thingGroupsToAdd=[new_thingGroupName]
                                                            , thingGroupsToRemove=[old_thingGroupName])
-            # 更新设备版本信息
-            Device_Info.objects.filter(serial_number=serial_number).update(version=device_version)
 
+            # 更新设备版本信息
+            if uid:
+                Device_Info.objects.filter(UID=uid).update(version=device_version)
+            else:
+                Device_Info.objects.filter(serial_number=serial_number).update(version=device_version)
             return response.json(0)
         except Exception as e:
             print(e)
@@ -216,6 +226,7 @@ class IotCoreView(View):
             return response.json(444)
 
     def request_publish_message(self, request_dict, response, request):
+        # Alexa请求IoT Core下发MQTT消息
         UID = request_dict.get('UID', None)
         MSG = request_dict.get('MSG', None)
 
@@ -224,20 +235,23 @@ class IotCoreView(View):
 
         try:
             # 获取检查uid的序列号,如果没有序列号,不使用MQTT下发消息
-            device_info_qs = Device_Info.objects.filter(UID=UID).values('serial_number')
+            device_info_qs = Device_Info.objects.filter(UID=UID).values('UID', 'serial_number')
+            uid = device_info_qs[0]['UID']
             serial_number = device_info_qs[0]['serial_number']
-            if serial_number == '':
-                return response.json(10043)
+            # 如果device_info表的serial_number不为空,物品名为'Ansjer_Device_序列号'
+            ThingNameSuffix = serial_number if serial_number != '' else uid
 
+            thing_name = 'Ansjer_Device_' + ThingNameSuffix
             # 获取数据组织将要请求的url
-            thing_name = 'Ansjer_Device_' + serial_number
             iot = iotdeviceInfoModel.objects.filter(thing_name__contains=thing_name).values('thing_name', 'endpoint',
                                                                                             'token_iot_number')
+            if not iot.exists():
+                return response.json(10043)
             thing_name = iot[0]['thing_name']  # IoT core上的物品名: Ansjer_Device_+序列号+企业编码
             endpoint = iot[0]['endpoint']
             Token = iot[0]['token_iot_number']
             # Token = '297a601b3925e04daab5a60280650e09'
-            topic_name = thing_name + '_rtsp_topic'
+            topic_name = thing_name + '_rtsp_topic'     # MQTT主题
 
             # rtsp://rtsp.zositech.org:8554/ZFdqWldXRFpMTkVaYVZEaEJXRXhUV0RFeE1VRT1B
             # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html

+ 1 - 0
Model/models.py

@@ -1547,6 +1547,7 @@ class iotdeviceInfoModel(models.Model):
     public_key = models.TextField(blank=True, default='', verbose_name=u'公有密钥')
     private_key = models.TextField(blank=True, default='', verbose_name=u'私有密钥')
     thing_name = models.CharField(blank=True, max_length=256, default='', verbose_name=u'IoT Thing Name')
+    thing_groups = models.CharField(blank=True, max_length=256, default='', verbose_name=u'IoT Thing Groups')
     endpoint = models.CharField(blank=True, max_length=256, db_index=True, default='', verbose_name=u'iot端点')
     token_iot_number = models.CharField(blank=True,  db_index=True ,default='', max_length=50, verbose_name='连接iot令牌')
     class Meta: