|
@@ -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
|