EquipmentManagerV3.py 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464
  1. import base64
  2. import json
  3. import logging
  4. import re
  5. import threading
  6. import time
  7. import oss2
  8. import requests
  9. from django.db import transaction
  10. from django.db.models import Q
  11. from django.views.generic.base import View
  12. from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY, CONFIG_INFO, CONFIG_US
  13. from Controller.CheckUserData import RandomStr
  14. from Controller.DeviceConfirmRegion import Device_Region
  15. from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
  16. from Controller.UnicomCombo.UnicomComboController import UnicomComboView
  17. from Controller.UnicomCombo.WXTechController import WXTechControllerView
  18. from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
  19. Device_User, iotdeviceInfoModel, UIDCompanySerialModel, UnicomDeviceInfo, CountryModel, \
  20. DeviceCloudPhotoInfo, UidPushModel, ExperienceContextModel, LogModel, UserAudioVideoPush, UIDModel
  21. from Object.RedisObject import RedisObject
  22. from Object.ResponseObject import ResponseObject
  23. from Object.TokenObject import TokenObject
  24. from Service.CommonService import CommonService
  25. from Service.EquipmentInfoService import EquipmentInfoService
  26. from Service.ModelService import ModelService
  27. from Service.UserDeviceService import UserDeviceService
  28. LOGGER = logging.getLogger('info')
  29. class EquipmentManagerV3(View):
  30. def get(self, request, *args, **kwargs):
  31. request.encoding = 'utf-8'
  32. operation = kwargs.get('operation')
  33. return self.validation(request.GET, request, operation)
  34. def post(self, request, *args, **kwargs):
  35. request.encoding = 'utf-8'
  36. operation = kwargs.get('operation')
  37. return self.validation(request.POST, request, operation)
  38. def validation(self, request_dict, request, operation):
  39. response = ResponseObject()
  40. if operation == 'notLoginMainUserDevice':
  41. return self.not_login_do_mainUserDevice(request_dict, response)
  42. elif operation == 'notLoginMainDelDevice':
  43. return self.test_tool_del_device(request_dict, response)
  44. elif operation == 'changeDevicePassword':
  45. return self.change_device_password(request_dict, response)
  46. elif operation == 'modifyChannelName':
  47. return self.do_modify_channel_name(request_dict, response)
  48. elif operation == 'updateLinkedChannel':
  49. return self.update_linked_channel(request_dict, response)
  50. token = request_dict.get('token', None)
  51. tko = TokenObject(token)
  52. if tko.code != 0:
  53. return response.json(tko.code)
  54. response.lang = tko.lang
  55. userID = tko.userID
  56. # 手机端添加设备,查询,修改
  57. if operation == 'add':
  58. return self.do_add(userID, request_dict, response, request)
  59. if operation == 'batchAdd':
  60. return self.do_batch_add(userID, request_dict, response, request)
  61. elif operation == 'query':
  62. return self.do_query(userID, request_dict, response)
  63. elif operation == 'modify':
  64. return self.do_modify(userID, request_dict, response, request)
  65. elif operation == 'fuzzyQuery':
  66. return self.do_fuzzy_query(userID, request_dict, response)
  67. elif operation == 'mainUserDevice':
  68. return self.do_mainUserDevice(request_dict, response, userID)
  69. elif operation == 'getDeviceFeatures':
  70. return self.do_get_device_features(request_dict, response)
  71. elif operation == 'deviceRouse':
  72. return self.device_rouse(request_dict, response)
  73. elif operation == 'saveButtonUser':
  74. return self.save_button_user(request_dict, response)
  75. elif operation == 'getButtonUser':
  76. return self.get_button_user(request_dict, response)
  77. elif operation == 'verifyCode':
  78. return self.verify_code(request_dict, response)
  79. elif operation == 'viewDevicePassword':
  80. return self.view_device_password(request_dict, response)
  81. elif operation == 'editSortOrder':
  82. return self.edit_sort_order(request_dict, response)
  83. else:
  84. return response.json(414)
  85. @classmethod
  86. def device_rouse(cls, request_dict, response):
  87. """
  88. 设备唤醒
  89. """
  90. serial_number = request_dict.get('serialNumber', None)
  91. if not serial_number:
  92. return response.json(444)
  93. try:
  94. # 主题名称
  95. topic_name = f'/wakeup/{serial_number}_0'
  96. # 发布消息内容
  97. msg = {'payload': 'A'}
  98. result = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  99. if not result:
  100. return response.json(10044)
  101. return response.json(0)
  102. except Exception as e:
  103. LOGGER.info('****设备唤醒发布消息异常:{},{}'.format(serial_number, repr(e)))
  104. return response.json(500, repr(e))
  105. def do_add(self, userID, request_dict, response, request):
  106. UID = request_dict.get('UID', None)
  107. NickName = request_dict.get('NickName', None)
  108. View_Account = request_dict.get('View_Account', None)
  109. View_Password = request_dict.get('View_Password', '')
  110. encrypt_pass = View_Password
  111. Type = request_dict.get('Type', None)
  112. ChannelIndex = request_dict.get('ChannelIndex', None)
  113. version = request_dict.get('version', '')
  114. isCheckMainUser = request_dict.get('isCheckMainUser', None)
  115. family_id = request_dict.get('familyId', None)
  116. room_id = request_dict.get('roomId', None)
  117. m_code = request_dict.get('m_code', None)
  118. appBundleId = request_dict.get('appBundleId', None)
  119. app_type = request_dict.get('app_type', None)
  120. push_type = request_dict.get('push_type', None)
  121. token_val = request_dict.get('token_val', None)
  122. jg_token_val = request_dict.get('jg_token_val', '')
  123. lang = request_dict.get('lang', 'en')
  124. tz = request_dict.get('tz', '0')
  125. if not NickName:
  126. NickName = UID[:6]
  127. if not all([UID, NickName, View_Account, Type, ChannelIndex]): # Type和ChannelIndex可能为0
  128. return response.json(444, {'param': 'UID, NickName, View_Account, Type, ChannelIndex'})
  129. if tz == '':
  130. tz = 0
  131. else:
  132. tz = tz.replace("GMT", "")
  133. Type = int(Type)
  134. ChannelIndex = int(ChannelIndex)
  135. re_uid = re.compile(r'^[A-Za-z0-9]{14,20}$')
  136. if not re_uid.match(UID):
  137. return response.json(444, {'param': 'UID'})
  138. device_info_qs = Device_Info.objects.filter(UID=UID, userID_id=userID)
  139. if device_info_qs:
  140. # 判断设备是否已存在
  141. if device_info_qs[0].isExist == 1:
  142. return response.json(174)
  143. else:
  144. device_info_qs.delete()
  145. dvr_type_list = [1, 2, 3, 4, 300, 10001]
  146. View_Password = '' if Type in dvr_type_list else 'admin'
  147. id = CommonService.getUserID(getUser=False)
  148. device_user_qs = Device_User.objects.filter(userID=userID).values('username')
  149. if not device_user_qs.exists():
  150. return response.json(173)
  151. uid_status = UIDModel.objects.filter(uid=UID).values('status').first()
  152. if uid_status and uid_status['status'] == 0:
  153. return response.json(10076)
  154. userName = device_user_qs[0]['username']
  155. main_exist = Device_Info.objects.filter(UID=UID)
  156. main_exist = main_exist.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID', 'vodPrimaryMaster')
  157. vodPrimaryUserID = userID
  158. vodPrimaryMaster = userName
  159. primaryUserID = ''
  160. primaryMaster = ''
  161. isShare = False
  162. is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'primaryUserID',
  163. 'primaryMaster')
  164. if main_exist.exists():
  165. vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
  166. vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
  167. if is_bind.exists():
  168. primaryUserID = is_bind[0]['primaryUserID']
  169. primaryMaster = is_bind[0]['primaryMaster']
  170. isShare = True
  171. isusermain = False
  172. if (vodPrimaryUserID != userID and vodPrimaryUserID != '') or (primaryUserID != userID and primaryUserID != ''):
  173. isusermain = True
  174. # 判断是否有已绑定用户
  175. if isCheckMainUser == '1' and isusermain:
  176. res = {
  177. 'id': id,
  178. 'userID': userID,
  179. 'NickName': NickName,
  180. 'UID': UID,
  181. 'View_Account': View_Account,
  182. 'View_Password': View_Password,
  183. 'ChannelIndex': ChannelIndex,
  184. 'Type': Type,
  185. 'isShare': isShare,
  186. 'primaryUserID': primaryUserID,
  187. 'primaryMaster': primaryMaster,
  188. 'vodPrimaryUserID': vodPrimaryUserID,
  189. 'vodPrimaryMaster': vodPrimaryMaster,
  190. 'data_joined': '',
  191. 'version': version,
  192. 'isVod': 0,
  193. 'isExist': 1,
  194. 'userID__userEmail': ''
  195. }
  196. res['vod'] = [
  197. {
  198. "status": 1,
  199. "channel": ChannelIndex,
  200. "endTime": '',
  201. "bucket__content": '',
  202. "uid": UID
  203. }
  204. ]
  205. res['isMainUserExists'] = 1
  206. LOGGER.info('add设备已绑定其他用户uid:{} type:{} 主:{} Now:{} nickName:{}'
  207. .format(UID, Type, vodPrimaryUserID, userID, NickName))
  208. return response.json(0, res)
  209. # 日志数据
  210. username = CommonService.get_username(userID)
  211. nowTime = int(time.time())
  212. ip = CommonService.get_ip_address(request)
  213. content = json.loads(json.dumps(request_dict))
  214. log = {
  215. 'ip': ip,
  216. 'user_id': 1,
  217. 'status': 200,
  218. 'time': nowTime,
  219. 'content': json.dumps(content),
  220. 'url': 'v3/equipment/add',
  221. 'operation': '{}添加{}成功'.format(username, UID)
  222. }
  223. try:
  224. with transaction.atomic():
  225. # 判断是否有用户绑定
  226. us_qs = UidSetModel.objects.filter(uid=UID)
  227. if us_qs.exists():
  228. us_qs.update(nickname=NickName, device_type=Type)
  229. UidSet_id = us_qs.first().id
  230. else:
  231. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  232. country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
  233. country = country_qs.exists() if country_qs[0]['id'] else 0
  234. region_id = Device_Region().get_device_region(ip)
  235. region_alexa = 'CN' if region_id == 1 else 'ALL'
  236. uid_set_create_dict = {
  237. 'uid': UID,
  238. 'addTime': nowTime,
  239. 'updTime': nowTime,
  240. 'ip': ip,
  241. 'channel': ChannelIndex,
  242. 'nickname': NickName,
  243. 'version': version,
  244. 'region_alexa': region_alexa,
  245. 'device_type': Type,
  246. 'tb_country': country
  247. }
  248. UidSet = UidSetModel.objects.create(**uid_set_create_dict)
  249. UidSet_id = UidSet.id
  250. if all([token_val, m_code, appBundleId, app_type]):
  251. uid_push_qs = UidPushModel.objects.filter(userID_id=userID, m_code=m_code, uid_set__uid=UID)
  252. if uid_push_qs.exists():
  253. uid_push_update_dict = {
  254. 'appBundleId': appBundleId,
  255. 'app_type': app_type,
  256. 'push_type': push_type,
  257. 'token_val': token_val,
  258. 'jg_token_val': jg_token_val,
  259. 'updTime': nowTime,
  260. 'lang': lang,
  261. 'tz': tz
  262. }
  263. uid_push_qs.update(**uid_push_update_dict)
  264. else:
  265. uid_push_create_dict = {
  266. 'uid_set_id': UidSet_id,
  267. 'userID_id': userID,
  268. 'appBundleId': appBundleId,
  269. 'app_type': app_type,
  270. 'push_type': push_type,
  271. 'token_val': token_val,
  272. 'jg_token_val': jg_token_val,
  273. 'm_code': m_code,
  274. 'addTime': nowTime,
  275. 'updTime': nowTime,
  276. 'lang': lang,
  277. 'tz': tz
  278. }
  279. # 绑定设备推送
  280. UidPushModel.objects.create(**uid_push_create_dict)
  281. # 查询uid_channel表有无该uid的数据
  282. uid_channel_set = UidChannelSetModel.objects.filter(uid_id=UidSet_id)
  283. if not uid_channel_set.exists():
  284. # 多通道设备设置通道名
  285. if Type in dvr_type_list:
  286. UidChannelSet_bulk = []
  287. for i in range(1, ChannelIndex + 1):
  288. channel_name = 'Channel ' + str(i) # Channel 1,Channel 2...
  289. UidChannelSet = UidChannelSetModel(uid_id=UidSet_id, channel=i, channel_name=channel_name)
  290. UidChannelSet_bulk.append(UidChannelSet)
  291. UidChannelSetModel.objects.bulk_create(UidChannelSet_bulk)
  292. userDevice = Device_Info(id=id, userID_id=userID, UID=UID, NickName=NickName, View_Account=View_Account,
  293. View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
  294. version=version,
  295. vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
  296. userDevice.save()
  297. # 保存用户推送按钮信息
  298. button_qs = UserAudioVideoPush.objects.filter(uid=UID)
  299. if button_qs.exists():
  300. button_qs.update(buttonUser1=userID, buttonUser2=userID)
  301. else:
  302. UserAudioVideoPush.objects.create(uid=UID, buttonUser1=userID, buttonUser2=userID,
  303. created_time=nowTime, updated_time=nowTime)
  304. # 添加到家庭房间
  305. if family_id:
  306. EquipmentFamilyView.family_room_device_save(family_id, room_id, userDevice.id, Type)
  307. uid_serial_qs = UIDCompanySerialModel.objects.filter(uid__uid=UID)
  308. if uid_serial_qs.exists():
  309. uid_serial = uid_serial_qs[0]
  310. serial_number = uid_serial.company_serial.serial_number + uid_serial.company_serial.company.mark
  311. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  312. vodPrimaryMaster=vodPrimaryMaster,
  313. serial_number=serial_number)
  314. self.unicom_user_info_save(userID, serial_number)
  315. else:
  316. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  317. vodPrimaryMaster=vodPrimaryMaster)
  318. if not us_qs.exists():
  319. us_qs = UidSetModel.objects.filter(uid=UID)
  320. if us_qs.exists() and us_qs[0].is_alexa == 1:
  321. if us_qs[0].channel > 1:
  322. data_list = []
  323. uid_channel_set_qs = UidChannelSetModel.objects.filter(uid_id=us_qs[0].id). \
  324. values('channel', 'channel_name')
  325. if uid_channel_set_qs.exists():
  326. # 多通道设备名为 UidChannelSetModel 的 channel_name
  327. for uid_channel_set in uid_channel_set_qs:
  328. data_list.append(
  329. {'userID': userID, 'UID': UID, 'uid_nick': uid_channel_set['channel_name'],
  330. 'channel': uid_channel_set['channel'], 'password': encrypt_pass})
  331. else:
  332. data_list = [{'userID': userID, 'UID': UID, 'uid_nick': NickName, 'password': encrypt_pass}]
  333. # 请求Alexa服务器更新事件网关
  334. CommonService.update_alexa_events(data_list)
  335. # 记录添加日志
  336. LogModel.objects.create(**log)
  337. except Exception as e:
  338. # 记录添加失败日志
  339. error_msg = 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))
  340. operation = '{}添加{}失败:{}'.format(username, UID, error_msg)
  341. log['operation'] = operation
  342. LogModel.objects.create(**log)
  343. return response.json(10, error_msg)
  344. else:
  345. dvqs = Device_Info.objects.filter(id=id).values('id', 'userID', 'NickName', 'UID',
  346. 'View_Account',
  347. 'View_Password', 'ChannelIndex', 'Type',
  348. 'isShare',
  349. 'primaryUserID', 'primaryMaster',
  350. 'vodPrimaryUserID', 'vodPrimaryMaster',
  351. 'userID__userEmail',
  352. 'data_joined', 'version',
  353. 'isVod', 'isExist', 'isCameraOpenCloud', 'serial_number')
  354. dvql = CommonService.qs_to_list(dvqs)
  355. ubqs = UID_Bucket.objects.filter(uid=UID). \
  356. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  357. res = dvql[0]
  358. res['vod'] = list(ubqs)
  359. iotqs = iotdeviceInfoModel.objects.filter(serial_number=dvql[0]['serial_number'])
  360. if iotqs.exists():
  361. res['iot'] = {
  362. 'endpoint': iotqs[0].endpoint,
  363. 'token_iot_number': iotqs[0].endpoint
  364. }
  365. # 存在序列号返回完整序列号
  366. if res['serial_number']:
  367. res['serial_number'] = CommonService.get_full_serial_number(UID, res['serial_number'], Type)
  368. return response.json(0, res)
  369. @classmethod
  370. def unicom_user_info_save(cls, user_id, serial_number):
  371. """
  372. 保存联通与用户信息绑定
  373. @param user_id: 用户id
  374. @param serial_number: 序列号
  375. @return: True | False
  376. """
  377. try:
  378. # 根据序列号查询联通iccid
  379. unicom_device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number, card_type=0)
  380. if not unicom_device_info_qs.exists():
  381. return False
  382. unicom_device_info_qs.update(user_id=user_id, updated_time=int(time.time()))
  383. LOGGER.info('{}更新4G用户信息成功:{}'.format(serial_number, user_id))
  384. # if unicom_device_info_qs.first().status == 1: # 已测试
  385. # # 领取4G体验套餐
  386. # res = UnicomComboView.user_activate_flow(unicom_device_info_qs[0].iccid)
  387. # logging.info('{}联通领取体验流量:{}'.format(unicom_device_info_qs[0].iccid, res))
  388. # WXTechControllerView.activate_flow_package(serial_number, 'system', user_id)
  389. # if not unicom_device_info_qs[0].user_id:
  390. # # 生成4G免费订单
  391. # UnicomComboView.experience_order_4G(unicom_device_info_qs[0].iccid,
  392. # serial_number, user_id, False)
  393. # UnicomDeviceInfo.objects.filter(iccid=unicom_device_info_qs[0].iccid) \
  394. # .update(user_id=user_id, updated_time=int(time.time()))
  395. return True
  396. except Exception as e:
  397. logging.info('创建体验4G订单异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  398. return False
  399. def do_batch_add(self, userID, request_dict, response, request):
  400. # 批量添加设备
  401. uidContent = request_dict.get('uidContent', None)
  402. family_id = request_dict.get('familyId', None)
  403. room_id = request_dict.get('roomId', None)
  404. if not uidContent:
  405. return response.json(444, {'param': 'uidContent'})
  406. try:
  407. deviceNumber = 0 # 添加成功数量
  408. add_success_flag = False # 添加成功标识
  409. exception_flag = False # 异常标识
  410. exists_flag = False # 已存在标识
  411. uid_content_list = eval(uidContent)
  412. print('uidContent: ', uid_content_list)
  413. re_uid = re.compile(r'^[A-Za-z0-9]{14,20}$')
  414. for uid_content in uid_content_list:
  415. exception_flag = False # 重置异常标识
  416. exists_flag = False # 已存在标识
  417. UID = uid_content['uid']
  418. NickName = uid_content['nickName']
  419. Type = uid_content['type']
  420. ChannelIndex = uid_content['channelIndex']
  421. version = uid_content['version']
  422. isCheckMainUser = uid_content['isCheckMainUser']
  423. View_Account = uid_content['viewAccount']
  424. encryptPassword = uid_content['encryptPassword']
  425. View_Password = self.decode_pwd(encryptPassword)
  426. if not all([UID, NickName, View_Account]): # Type和ChannelIndex可能为0
  427. return response.json(444, {'param': 'UID, NickName, View_Account'})
  428. if not re_uid.match(UID): # 检查uid长度
  429. return response.json(444, {'error uid length': UID})
  430. device_info_qs = Device_Info.objects.filter(UID=UID, userID_id=userID)
  431. if device_info_qs:
  432. # 判断设备是否已存在
  433. if device_info_qs[0].isExist == 1:
  434. exists_res = {UID: 'device already exists!'}
  435. exists_flag = True
  436. continue
  437. else:
  438. device_info_qs.delete()
  439. id = CommonService.getUserID(getUser=False)
  440. device_user_qs = Device_User.objects.filter(userID=userID).values('username')
  441. if not device_user_qs.exists():
  442. return response.json(173)
  443. userName = device_user_qs[0]['username']
  444. main_exist = Device_Info.objects.filter(UID=UID)
  445. main_exist = main_exist.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID', 'vodPrimaryMaster')
  446. vodPrimaryUserID = userID
  447. vodPrimaryMaster = userName
  448. primaryUserID = ''
  449. primaryMaster = ''
  450. isShare = False
  451. is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'primaryUserID',
  452. 'primaryMaster', 'Type')
  453. if main_exist.exists():
  454. vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
  455. vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
  456. if is_bind.exists():
  457. primaryUserID = is_bind[0]['primaryUserID']
  458. primaryMaster = is_bind[0]['primaryMaster']
  459. isShare = True
  460. isusermain = False
  461. if (vodPrimaryUserID != userID and vodPrimaryUserID != '') or (
  462. primaryUserID != userID and primaryUserID != ''):
  463. isusermain = True
  464. # 判断是否有已绑定用户
  465. if isCheckMainUser == 1 and isusermain:
  466. res = {
  467. 'id': id,
  468. 'userID': userID,
  469. 'NickName': NickName,
  470. 'UID': UID,
  471. 'View_Account': View_Account,
  472. 'View_Password': View_Password,
  473. 'ChannelIndex': ChannelIndex,
  474. 'Type': Type,
  475. 'isShare': isShare,
  476. 'primaryUserID': primaryUserID,
  477. 'primaryMaster': primaryMaster,
  478. 'vodPrimaryUserID': vodPrimaryUserID,
  479. 'vodPrimaryMaster': vodPrimaryMaster,
  480. 'data_joined': '',
  481. 'version': version,
  482. 'isVod': 0,
  483. 'isExist': 1,
  484. 'userID__userEmail': ''
  485. }
  486. res['vod'] = [
  487. {
  488. "status": 1,
  489. "channel": ChannelIndex,
  490. "endTime": '',
  491. "bucket__content": '',
  492. "uid": UID
  493. }
  494. ]
  495. res['isMainUserExists'] = 1
  496. continue
  497. # 判断是否有用户绑定
  498. nowTime = int(time.time())
  499. us_qs = UidSetModel.objects.filter(uid=UID)
  500. if us_qs.exists():
  501. us_qs.update(nickname=NickName)
  502. UidSet_id = us_qs.first().id
  503. else:
  504. ip = CommonService.get_ip_address(request)
  505. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  506. country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
  507. country = country_qs.exists() if country_qs[0]['id'] else 0
  508. region_id = Device_Region().get_device_region(ip)
  509. region_alexa = 'CN' if region_id == 1 else 'ALL'
  510. uid_set_create_dict = {
  511. 'uid': UID,
  512. 'addTime': nowTime,
  513. 'updTime': nowTime,
  514. 'ip': CommonService.get_ip_address(request_dict),
  515. 'channel': ChannelIndex,
  516. 'nickname': NickName,
  517. 'version': version,
  518. 'region_alexa': region_alexa,
  519. 'device_type': is_bind[0]['Type'] if is_bind.exists() else int(Type),
  520. 'tb_country': country
  521. }
  522. UidSet = UidSetModel.objects.create(**uid_set_create_dict)
  523. UidSet_id = UidSet.id
  524. # 查询uid_channel表有无该uid的数据
  525. uid_channel_set = UidChannelSetModel.objects.filter(uid_id=UidSet_id)
  526. if not uid_channel_set.exists():
  527. # 多通道设备设置通道名
  528. multi_channel_list = [1, 2, 3, 4, 10001]
  529. if Type in multi_channel_list:
  530. UidChannelSet_bulk = []
  531. for i in range(1, ChannelIndex + 1):
  532. channel_name = 'channel' + str(i) # channel1,channel2...
  533. UidChannelSet = UidChannelSetModel(uid_id=UidSet_id, channel=i, channel_name=channel_name)
  534. UidChannelSet_bulk.append(UidChannelSet)
  535. UidChannelSetModel.objects.bulk_create(UidChannelSet_bulk)
  536. userDevice = Device_Info(id=id, userID_id=userID, UID=UID, NickName=NickName, View_Account=View_Account,
  537. View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
  538. version=version,
  539. vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
  540. userDevice.save()
  541. # 添加到家庭房间
  542. if family_id:
  543. EquipmentFamilyView.family_room_device_save(family_id, room_id, userDevice.id, Type)
  544. uid_serial_qs = UIDCompanySerialModel.objects.filter(uid__uid=UID)
  545. if uid_serial_qs.exists():
  546. uid_serial = uid_serial_qs[0]
  547. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  548. vodPrimaryMaster=vodPrimaryMaster,
  549. serial_number=uid_serial.company_serial.serial_number + uid_serial.company_serial.company.mark)
  550. else:
  551. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  552. vodPrimaryMaster=vodPrimaryMaster)
  553. if not us_qs.exists():
  554. us_qs = UidSetModel.objects.filter(uid=UID)
  555. if us_qs.exists() and us_qs[0].is_alexa == 1:
  556. if us_qs[0].channel > 1:
  557. data_list = []
  558. uid_channel_set_qs = UidChannelSetModel.objects.filter(uid_id=us_qs[0].id). \
  559. values('channel', 'channel_name')
  560. if uid_channel_set_qs.exists():
  561. # 多通道设备名为 UidChannelSetModel 的 channel_name
  562. for uid_channel_set in uid_channel_set_qs:
  563. data_list.append(
  564. {'userID': userID, 'UID': UID, 'uid_nick': uid_channel_set['channel_name'],
  565. 'channel': uid_channel_set['channel'], 'password': encryptPassword})
  566. else:
  567. data_list = [{'userID': userID, 'UID': UID, 'uid_nick': NickName, 'password': encryptPassword}]
  568. # 请求Alexa服务器更新事件网关
  569. CommonService.update_alexa_events(data_list)
  570. dvqs = Device_Info.objects.filter(id=id).values('id', 'userID', 'NickName', 'UID',
  571. 'View_Account',
  572. 'View_Password', 'ChannelIndex', 'Type',
  573. 'isShare',
  574. 'primaryUserID', 'primaryMaster',
  575. 'vodPrimaryUserID', 'vodPrimaryMaster',
  576. 'userID__userEmail',
  577. 'data_joined', 'version',
  578. 'isVod', 'isExist', 'isCameraOpenCloud',
  579. 'serial_number')
  580. dvql = CommonService.qs_to_list(dvqs)
  581. ubqs = UID_Bucket.objects.filter(uid=UID). \
  582. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  583. success_res = dvql[0]
  584. success_res['vod'] = list(ubqs)
  585. iotqs = iotdeviceInfoModel.objects.filter(serial_number=dvql[0]['serial_number'])
  586. if iotqs.exists():
  587. success_res['iot'] = {'endpoint': iotqs[0].endpoint, 'token_iot_number': iotqs[0].endpoint}
  588. deviceNumber += 1
  589. success_res['deviceNumber'] = deviceNumber
  590. add_success_flag = True
  591. except Exception as e:
  592. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  593. print(e)
  594. error_res = repr(e)
  595. exception_flag = True
  596. pass
  597. finally:
  598. if add_success_flag: # 有一台添加成功则返回成功
  599. return response.json(0, success_res)
  600. if exists_flag: # 全部设备已存在
  601. return response.json(174, exists_res)
  602. if exception_flag:
  603. return response.json(500, error_res)
  604. return response.json(0, res)
  605. def do_modify(self, userID, request_dict, response, request):
  606. token = request_dict.get('token', None)
  607. deviceContent = request_dict.get('content', None)
  608. id = request_dict.get('id', None)
  609. if not deviceContent or not id:
  610. return response.json(444, 'content,id')
  611. tko = TokenObject(token)
  612. response.lang = tko.lang
  613. if tko.code != 0:
  614. return response.json(tko.code)
  615. userID = tko.userID
  616. if userID is None:
  617. return response.json(309)
  618. try:
  619. deviceData = eval(deviceContent)
  620. if deviceData.__contains__('userID_id'):
  621. asy = threading.Thread(target=ModelService.update_log,
  622. args=(CommonService.get_ip_address(request), userID, 'modifyV3', deviceData, id))
  623. asy.start()
  624. return response.json(10, '110')
  625. if deviceData.__contains__('UID'):
  626. del deviceData['UID']
  627. dev_info_qs = Device_Info.objects.filter(userID_id=userID, id=id).values('UID')
  628. if not dev_info_qs.exists():
  629. return response.json(173)
  630. view_password = ''
  631. if deviceData.__contains__('View_Password'):
  632. encrypt_pwd = deviceData['View_Password']
  633. view_password = self.decode_pwd(deviceData['View_Password'])
  634. deviceData['View_Password'] = view_password
  635. # 记录修改密码日志
  636. uid = dev_info_qs[0]['UID']
  637. ip = CommonService.get_ip_address(request)
  638. content = json.loads(json.dumps(request_dict))
  639. log = {
  640. 'user_id': 2,
  641. 'status': 200,
  642. 'time': int(time.time()),
  643. 'url': 'v3/equipment/modify',
  644. 'content': json.dumps(content),
  645. 'ip': ip,
  646. 'operation': '{}修改设备密码:{}'.format(uid, view_password),
  647. }
  648. LogModel.objects.create(**log)
  649. # 更新数据
  650. dev_info_qs.update(**deviceData)
  651. except Exception as e:
  652. print(e)
  653. return response.json(177, repr(e))
  654. else:
  655. qs = Device_Info.objects.filter(userID_id=userID, id=id)
  656. res = CommonService.qs_to_dict(qs)
  657. if qs.exists():
  658. uid = qs[0].UID
  659. nickname = qs[0].NickName
  660. # 增加设备影子信息修改昵称 start
  661. us_qs = UidSetModel.objects.filter(uid=uid)
  662. if us_qs.exists():
  663. if deviceData.__contains__('NickName'):
  664. us_qs.update(nickname=nickname)
  665. else:
  666. ip = CommonService.get_ip_address(request)
  667. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  668. country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
  669. country = country_qs.exists() if country_qs[0]['id'] else 0
  670. ChannelIndex = qs[0].ChannelIndex
  671. nowTime = int(time.time())
  672. uid_set_create_dict = {
  673. 'uid': uid,
  674. 'addTime': nowTime,
  675. 'updTime': nowTime,
  676. 'ip': CommonService.get_ip_address(request),
  677. 'channel': ChannelIndex,
  678. 'nickname': nickname,
  679. 'device_type': qs[0].Type,
  680. 'tb_country': country,
  681. }
  682. UidSetModel.objects.create(**uid_set_create_dict)
  683. di_qs = Device_Info.objects.filter(UID=uid)
  684. di_qs.update(NickName=nickname)
  685. if deviceData is not None and deviceData.__contains__('NickName') and us_qs[0].is_alexa == 1:
  686. # 异步请求Alexa服务器更新事件网关
  687. password = encrypt_pwd if deviceData.__contains__('View_Password') else ''
  688. data_list = [{'userID': userID, 'UID': uid, 'uid_nick': nickname, 'password': password}]
  689. # 请求Alexa服务器更新事件网关
  690. CommonService.update_alexa_events(data_list)
  691. return response.json(0, res)
  692. @staticmethod
  693. def do_modify_channel_name(request_dict, response):
  694. """
  695. 修改通道名
  696. @param request_dict:
  697. @param response:
  698. @return:
  699. """
  700. uid = request_dict.get('uid', None)
  701. channel = request_dict.get('channel', None)
  702. channel_name = request_dict.get('channel_name', None)
  703. if not all([uid, channel, channel_name]):
  704. return response.json(444)
  705. try:
  706. # 更新通道名
  707. channel = int(channel) + 1
  708. uid_channel_set_qs = UidChannelSetModel.objects.filter(uid__uid=uid, channel=channel)
  709. if not uid_channel_set_qs.exists():
  710. return response.json(173)
  711. uid_channel_set_qs.update(channel_name=channel_name)
  712. return response.json(0)
  713. except Exception as e:
  714. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  715. @staticmethod
  716. def update_linked_channel(request_dict, response):
  717. """
  718. 更新连接通道
  719. @param request_dict:
  720. @param response:
  721. @return:
  722. """
  723. uid = request_dict.get('uid', None)
  724. linked_channel = request_dict.get('linked_channel', None)
  725. if not all([uid, linked_channel]):
  726. return response.json(444)
  727. try:
  728. UidSetModel.objects.filter(uid=uid).update(linked_channel=linked_channel)
  729. return response.json(0)
  730. except Exception as e:
  731. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  732. def do_query(self, userID, request_dict, response):
  733. """
  734. 首页查询设备列表
  735. @param userID: 用户id
  736. @param request_dict: 请求参数
  737. @param response: 响应结果
  738. """
  739. token = request_dict.get('token', None)
  740. page = request_dict.get('page', None)
  741. line = request_dict.get('line', None)
  742. NickName = request_dict.get('NickName', None)
  743. if not token or not page or not line:
  744. return response.json(444)
  745. page = int(page)
  746. line = int(line)
  747. uid = request_dict.get('uid', None)
  748. tko = TokenObject(token)
  749. response.lang = tko.lang
  750. if page <= 0:
  751. return response.json(0)
  752. if tko.code != 0:
  753. return response.json(tko.code)
  754. userID = tko.userID
  755. UserDeviceService.init_device_sort_order(userID)
  756. group_id = int(request_dict.get('groupId', 0))
  757. # 查询设备列表以及设备uid集合
  758. dv_list, uid_list = UserDeviceService.query_device_list(userID, uid, NickName, page, line, group_id)
  759. ub_qs = UserDeviceService.query_device_uid_bucket(uid_list) # 根据uid集合查询云存套餐
  760. up_qs = UserDeviceService.query_device_preview(uid_list) # 根据uid集合查询设备预览图
  761. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  762. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  763. nowTime = int(time.time())
  764. data = []
  765. uv_dict = UserDeviceService.query_device_channel(uid_list) # 查询设备uid通道配置属性
  766. # 遍历设备列表,查询设备关联数据详情
  767. for p in dv_list:
  768. p['UID'] = p['UID'].replace('\n', '').replace('\r', '')
  769. p_uid = p['UID'].upper()
  770. UserDeviceService.get_sim_by_serial_number(p) # 获取SIM卡属性
  771. p['cloudPhoto'] = self.get_cloud_photo_status(p['UID'])
  772. # 获取云存使用状态
  773. p['vod_use_status'] = self.get_vod_use_status(p_uid, nowTime)
  774. # 获取iot_deviceInfo表的endpoint和token_iot_number
  775. p['iot'] = []
  776. if p['serial_number']: # 存在序列号根据序列号查询
  777. iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(serial_number=p['serial_number'][0:6])
  778. else: # 根据uid查询
  779. iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=p_uid)
  780. if iotdeviceInfo_qs.exists():
  781. iotdeviceInfo = iotdeviceInfo_qs.values('endpoint', 'token_iot_number')
  782. p['iot'].append({
  783. 'endpoint': iotdeviceInfo[0]['endpoint'],
  784. 'token_iot_number': iotdeviceInfo[0]['token_iot_number']
  785. })
  786. p['vod'] = []
  787. for dm in ub_qs:
  788. if p_uid == dm['uid']:
  789. if dm['endTime'] > nowTime:
  790. p['vod'].append(dm)
  791. p['preview'] = []
  792. for up in up_qs:
  793. if p_uid == up['uid']:
  794. obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
  795. img_sign = bucket.sign_url('GET', obj, 300)
  796. p['preview'].append(img_sign)
  797. UserDeviceService.get_uid_info(p, p_uid) # 获取uid初始化信息
  798. if p_uid in uv_dict:
  799. # 获取设备信息DTO
  800. UserDeviceService.get_device_info_dto(p, p_uid, uv_dict, userID)
  801. else:
  802. # 设备版本号
  803. p['uid_version'] = ''
  804. p['ucode'] = ''
  805. p['View_Password'] = self.encrypt_pwd(p['View_Password'])
  806. # 判断设备是否支持4G和查询移动侦测状态
  807. uid_set_qs = UidSetModel.objects.filter(uid=p['UID']).values('detect_status')
  808. if uid_set_qs.exists():
  809. uid_set_qs = uid_set_qs.first()
  810. p['NotificationMode'] = uid_set_qs['detect_status']
  811. data.append(p)
  812. result = data
  813. return response.json(0, result)
  814. @staticmethod
  815. def get_vod_use_status(uid, now_time):
  816. """
  817. 根据UID获取云存使用状态
  818. @param uid: 设备uid
  819. @param now_time: 现在时间戳
  820. @return: 0:未体验;1:使用中;2:已过期
  821. """
  822. experience_context_qs = ExperienceContextModel.objects.filter(uid=uid, experience_type=0)
  823. if not experience_context_qs.exists():
  824. return 0
  825. uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gt=now_time, use_status=1)
  826. if uid_bucket_qs.exists():
  827. return 1
  828. else:
  829. return 2
  830. @staticmethod
  831. def get_cloud_photo_status(uid):
  832. """
  833. 根据UID获取云相册开关状态
  834. @param uid: 设备uid
  835. @return: 0 or 1
  836. """
  837. cloud_photo_qs = DeviceCloudPhotoInfo.objects.filter(uid=uid).values('status')
  838. if not cloud_photo_qs.exists():
  839. return 0
  840. return cloud_photo_qs[0]['status']
  841. def do_fuzzy_query(self, userID, request_dict, response):
  842. fuzzy = request_dict.get('fuzzy', None)
  843. page = request_dict.get('page', None)
  844. line = request_dict.get('line', None)
  845. if not all([page, line]):
  846. return response.json(444)
  847. page = int(page)
  848. line = int(line)
  849. try:
  850. device_qs = Device_Info.objects.filter(userID=userID)
  851. device_qs = device_qs.filter(~Q(isExist=2))
  852. if not device_qs.exists():
  853. return response.json(0, [])
  854. if fuzzy:
  855. device_qs = device_qs.filter(Q(UID__icontains=fuzzy) | Q(NickName__icontains=fuzzy))
  856. device_qs = device_qs.values('id', 'userID', 'NickName', 'UID', 'View_Account',
  857. 'View_Password', 'ChannelIndex', 'Type', 'isShare',
  858. 'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID',
  859. 'vodPrimaryMaster', 'userID__userEmail',
  860. 'version', 'isVod', 'isExist', 'NotificationMode', 'isCameraOpenCloud',
  861. 'serial_number')
  862. dvls = CommonService.qs_to_list(device_qs)
  863. uid_list = []
  864. for dvl in dvls:
  865. uid_list.append(dvl['UID'])
  866. ubqs = UID_Bucket.objects.filter(uid__in=uid_list). \
  867. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  868. upqs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
  869. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  870. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  871. nowTime = int(time.time())
  872. data = []
  873. # 设备拓展信息表
  874. us_qs = UidSetModel.objects.filter(uid__in=uid_list).values('id', 'uid', 'version', 'nickname', 'ucode',
  875. 'detect_status', 'detect_group',
  876. 'detect_interval',
  877. 'region_alexa', 'is_alexa', 'deviceModel',
  878. 'TimeZone', 'TimeStatus', 'SpaceUsable',
  879. 'SpaceSum', 'MirrorType', 'RecordType',
  880. 'OutdoorModel', 'WIFIName', 'isDetector',
  881. 'DetectorRank')
  882. uv_dict = {}
  883. for us in us_qs:
  884. uv_dict[us['uid']] = {
  885. 'version': us['version'],
  886. 'nickname': us['nickname'],
  887. 'ucode': us['ucode'],
  888. 'detect_interval': us['detect_interval'],
  889. 'detect_group': us['detect_group'],
  890. 'detect_status': us['detect_status'],
  891. 'region_alexa': us['region_alexa'],
  892. 'is_alexa': us['is_alexa'],
  893. 'deviceModel': us['deviceModel'],
  894. 'TimeZone': us['TimeZone'],
  895. 'TimeStatus': us['TimeStatus'],
  896. 'SpaceUsable': us['SpaceUsable'],
  897. 'SpaceSum': us['SpaceSum'],
  898. 'MirrorType': us['MirrorType'],
  899. 'RecordType': us['RecordType'],
  900. 'OutdoorModel': us['OutdoorModel'],
  901. 'WIFIName': us['WIFIName'],
  902. 'isDetector': us['isDetector'],
  903. 'DetectorRank': us['DetectorRank']
  904. }
  905. # 从uid_channel里面取出通道配置信息
  906. ucs_qs = UidChannelSetModel.objects.filter(uid__id=us['id']).values()
  907. channels = []
  908. for ucs in ucs_qs:
  909. channel = {
  910. 'channel': ucs['channel'],
  911. 'channel_name': ucs['channel_name'],
  912. 'pir_audio': ucs['pir_audio'],
  913. 'mic_audio': ucs['mic_audio'],
  914. 'battery_status': ucs['battery_status'],
  915. 'battery_level': ucs['battery_level'],
  916. 'sleep_status': ucs['sleep_status'],
  917. 'sleep_time': ucs['sleep_time'],
  918. 'light_night_model': ucs['light_night_model'],
  919. 'light_alarm_type': ucs['light_alarm_type'],
  920. 'light_alarm_level': ucs['light_alarm_level'],
  921. 'light_alarm_man_en': ucs['light_alarm_man_en'],
  922. 'light_alarm_vol': ucs['light_alarm_vol'],
  923. 'light_long_light': ucs['light_long_light']
  924. }
  925. channels.append(channel)
  926. uv_dict[us['uid']]['channels'] = channels
  927. for p in dvls:
  928. # 获取iot_deviceInfo表的endpoint和token_iot_number
  929. p['iot'] = []
  930. if p['serial_number']: # 存在序列号根据序列号查询
  931. # 摄像头设备返回完整序列号
  932. if p['UID'] != p['serial_number']:
  933. p['serial_number'] = CommonService.get_full_serial_number(p['UID'], p['serial_number'],
  934. p['Type'])
  935. iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(serial_number=p['serial_number'][0:6])
  936. else: # 根据uid查询
  937. iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=p['UID'])
  938. if iotdeviceInfo_qs.exists():
  939. iotdeviceInfo = iotdeviceInfo_qs.values('endpoint', 'token_iot_number')
  940. p['iot'].append({
  941. 'endpoint': iotdeviceInfo[0]['endpoint'],
  942. 'token_iot_number': iotdeviceInfo[0]['token_iot_number']
  943. })
  944. p['vod'] = []
  945. for dm in ubqs:
  946. if p['UID'] == dm['uid']:
  947. if dm['endTime'] > nowTime:
  948. p['vod'].append(dm)
  949. p['preview'] = []
  950. for up in upqs:
  951. if p['UID'] == up['uid']:
  952. obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
  953. img_sign = bucket.sign_url('GET', obj, 300)
  954. p['preview'].append(img_sign)
  955. p_uid = p['UID']
  956. if p_uid in uv_dict:
  957. # 设备版本号
  958. p['uid_version'] = uv_dict[p_uid]['version']
  959. p['ucode'] = uv_dict[p_uid]['ucode']
  960. p['detect_interval'] = uv_dict[p_uid]['detect_interval']
  961. p['detect_status'] = uv_dict[p_uid]['detect_status']
  962. p['detect_group'] = uv_dict[p_uid]['detect_group']
  963. p['region_alexa'] = uv_dict[p_uid]['region_alexa']
  964. p['is_alexa'] = uv_dict[p_uid]['is_alexa']
  965. p['deviceModel'] = uv_dict[p_uid]['deviceModel']
  966. p['TimeZone'] = uv_dict[p_uid]['TimeZone']
  967. p['TimeStatus'] = uv_dict[p_uid]['TimeStatus']
  968. p['SpaceUsable'] = uv_dict[p_uid]['SpaceUsable']
  969. p['SpaceSum'] = uv_dict[p_uid]['SpaceSum']
  970. p['MirrorType'] = uv_dict[p_uid]['MirrorType']
  971. p['RecordType'] = uv_dict[p_uid]['RecordType']
  972. p['OutdoorModel'] = uv_dict[p_uid]['OutdoorModel']
  973. p['WIFIName'] = uv_dict[p_uid]['WIFIName']
  974. p['isDetector'] = uv_dict[p_uid]['isDetector']
  975. p['DetectorRank'] = uv_dict[p_uid]['DetectorRank']
  976. p['channels'] = uv_dict[p_uid]['channels']
  977. # 设备昵称 调用影子信息昵称,先阶段不可
  978. if uv_dict[p_uid]['nickname']:
  979. p['NickName'] = uv_dict[p_uid]['nickname']
  980. else:
  981. # 设备版本号
  982. p['uid_version'] = ''
  983. p['ucode'] = ''
  984. data.append(p)
  985. items = []
  986. for index, item in enumerate(data):
  987. if (page - 1) * line <= index:
  988. if index < page * line:
  989. # 加密
  990. item['View_Password'] = self.encrypt_pwd(item['View_Password'])
  991. items.append(item)
  992. return response.json(0, items)
  993. except Exception as e:
  994. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  995. # 加密
  996. def encrypt_pwd(self, userPwd):
  997. for i in range(1, 4):
  998. if i == 1:
  999. userPwd = RandomStr(3, False) + userPwd + RandomStr(3, False)
  1000. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  1001. if i == 2:
  1002. userPwd = RandomStr(2, False) + str(userPwd) + RandomStr(2, False)
  1003. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  1004. if i == 3:
  1005. userPwd = RandomStr(1, False) + str(userPwd) + RandomStr(1, False)
  1006. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  1007. return userPwd
  1008. # 解密
  1009. def decode_pwd(self, password):
  1010. for i in range(1, 4):
  1011. if i == 1:
  1012. # 第一次先解密
  1013. password = base64.b64decode(password)
  1014. password = password.decode('utf-8')
  1015. # 截去第一位,最后一位
  1016. password = password[1:-1]
  1017. if i == 2:
  1018. # 第2次先解密
  1019. password = base64.b64decode(password)
  1020. password = password.decode('utf-8')
  1021. # 去前2位,后2位
  1022. password = password[2:-2]
  1023. if i == 3:
  1024. # 第3次先解密
  1025. password = base64.b64decode(password)
  1026. password = password.decode('utf-8')
  1027. # 去前3位,后3位
  1028. password = password[3:-3]
  1029. return password
  1030. @staticmethod
  1031. def do_mainUserDevice(request_dict, response, user_id):
  1032. """
  1033. 根据UID或序列号获取云存主用户信息
  1034. """
  1035. try:
  1036. UID = request_dict.get('UID')
  1037. serial_number = request_dict.get('serial_number')
  1038. if UID:
  1039. dvq = Device_Info.objects.filter(UID=UID)
  1040. elif serial_number:
  1041. serial_number = serial_number[:9]
  1042. uid = CommonService.get_uid_by_serial_number(serial_number)
  1043. if serial_number == uid: # 没查到绑定对应的UID
  1044. dvq = Device_Info.objects.filter(serial_number=serial_number)
  1045. else: # 根据序列号查到了对应的UID
  1046. dvq = Device_Info.objects.filter(UID=uid)
  1047. else:
  1048. return response.json(444)
  1049. dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
  1050. if not dvq.exists():
  1051. return response.json(0, [])
  1052. qs = Device_User.objects.filter(userID=dvq[0]['vodPrimaryUserID']) \
  1053. .values('userID', 'NickName', 'username', 'userEmail', 'phone')
  1054. if not qs.exists():
  1055. return response.json(0, [])
  1056. nickname = qs[0]['username']
  1057. phone = qs[0]['phone']
  1058. username = qs[0]['username']
  1059. sys_user_id = qs[0]['userID']
  1060. qs = CommonService.qs_to_list(qs)
  1061. if nickname == '':
  1062. qs[0]['NickName'] = username
  1063. if phone == '':
  1064. qs[0]['phone'] = nickname
  1065. # 查询主用户并且返回主用户是否是当前账户标识
  1066. qs[0]['isOwnUser'] = sys_user_id and user_id and sys_user_id == user_id
  1067. return response.json(0, qs)
  1068. except Exception as e:
  1069. LOGGER.info('异常详情,userID:{}, errLine:{}, errMsg:{}'.format(user_id, e.__traceback__.tb_lineno, repr(e)))
  1070. return response.json(500)
  1071. def not_login_do_mainUserDevice(self, request_dict, response):
  1072. UID = request_dict.get('UID')
  1073. token = request_dict.get('token', None)
  1074. time_stamp = request_dict.get('time_stamp', None)
  1075. if not all([token, time_stamp]):
  1076. return response.json(444)
  1077. # 时间戳token校验
  1078. if not CommonService.check_time_stamp_token(token, time_stamp):
  1079. return response.json(13)
  1080. dvq = Device_Info.objects.filter(UID=UID)
  1081. dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
  1082. qs = {}
  1083. if dvq.exists():
  1084. qs = Device_User.objects.filter(userID=dvq[0]['vodPrimaryUserID']).values('userID', 'NickName', 'username',
  1085. 'userEmail', 'phone')
  1086. NickName = qs[0]['NickName']
  1087. phone = qs[0]['phone']
  1088. username = qs[0]['username']
  1089. qs = CommonService.qs_to_list(qs)
  1090. if NickName == '':
  1091. qs[0]['NickName'] = username
  1092. if phone == '':
  1093. qs[0]['phone'] = NickName
  1094. return response.json(0, qs)
  1095. @staticmethod
  1096. def test_tool_del_device(request_dict, response):
  1097. """
  1098. 测试工具删除设备
  1099. @param request_dict: 请求数据
  1100. @request_dict uid: uid
  1101. @request_dict time_stamp: 时间戳
  1102. @request_dict time_stamp_token: 时间戳token
  1103. @param response: 响应
  1104. @return: response
  1105. """
  1106. uid = request_dict.get('uid')
  1107. time_stamp = request_dict.get('time_stamp', None)
  1108. time_stamp_token = request_dict.get('time_stamp_token', None)
  1109. if not all([uid, time_stamp, time_stamp_token]):
  1110. return response.json(444)
  1111. try:
  1112. # 时间戳token校验
  1113. if not CommonService.check_time_stamp_token(time_stamp_token, time_stamp):
  1114. return response.json(13)
  1115. with transaction.atomic():
  1116. Device_Info.objects.filter(UID=uid).delete()
  1117. UidPushModel.objects.filter(uid_set__uid=uid).delete()
  1118. LOGGER.info(f'PC删除设备&删除APP推送token{uid}成功')
  1119. asy = threading.Thread(target=EquipmentManagerV3.async_del_message, args=(uid,))
  1120. asy.start()
  1121. return response.json(0, {'msg': 'Delete the device and delete the push token successfully'})
  1122. except Exception as e:
  1123. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1124. def change_device_password(self, request_dict, response):
  1125. """
  1126. 修改设备密码
  1127. @return:
  1128. """
  1129. uid = request_dict.get('uid', None)
  1130. version = request_dict.get('version', None)
  1131. encrypt_pwd = request_dict.get('encrypt_pwd', None)
  1132. if not all([uid, version, encrypt_pwd]):
  1133. return response.json(444)
  1134. try:
  1135. # 异步请求其他服
  1136. if CONFIG_INFO == CONFIG_US:
  1137. change_pwd_thread = threading.Thread(target=self.change_pwd, args=(request_dict.dict(),))
  1138. change_pwd_thread.start()
  1139. view_password = self.decode_pwd(encrypt_pwd)
  1140. Device_Info.objects.filter(UID=uid).update(View_Password=view_password)
  1141. UidSetModel.objects.filter(uid=uid).update(pwd=view_password)
  1142. content = json.loads(json.dumps(request_dict))
  1143. log = {
  1144. 'user_id': 2,
  1145. 'status': 200,
  1146. 'time': int(time.time()),
  1147. 'url': 'v3/equipment/changeDevicePassword',
  1148. 'content': json.dumps(content),
  1149. 'operation': '{}上报设备密码:{}'.format(uid, view_password),
  1150. }
  1151. LogModel.objects.create(**log)
  1152. return response.json(0)
  1153. except Exception as e:
  1154. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1155. @staticmethod
  1156. def change_pwd(data):
  1157. """
  1158. 请求更新密码线程
  1159. @param data: 请求数据
  1160. """
  1161. orders_domain_name_list = CommonService.get_orders_domain_name_list()
  1162. for domain_name in orders_domain_name_list:
  1163. url = '{}v3/equipment/changeDevicePassword'.format(domain_name)
  1164. requests.post(url=url, data=data, timeout=30)
  1165. def do_get_device_features(self, request_dict, response):
  1166. uid = request_dict.get('uid', None)
  1167. if uid:
  1168. uid = CommonService.decode_data(uid)
  1169. if uid:
  1170. uid_qs = UidSetModel.objects.filter(uid=uid)
  1171. if uid_qs.exists():
  1172. uid_qs = uid_qs.values('is_alexa', 'is_human', 'is_custom_voice', 'double_wifi', 'mobile_4g')
  1173. return response.json(0, uid_qs[0])
  1174. else:
  1175. return response.json(173)
  1176. else:
  1177. return response.json(444)
  1178. else:
  1179. return response.json(444)
  1180. @classmethod
  1181. def async_del_message(cls, uid):
  1182. try:
  1183. # 删除推送消息
  1184. EquipmentInfoService.delete_all_equipment_info(device_uid=uid)
  1185. serial_number = CommonService.get_serial_number_by_uid(uid)
  1186. # 删除iccid用户信息
  1187. iccid_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number)
  1188. if iccid_info_qs:
  1189. iccid_info_qs.update(status=2, updated_time=int(time.time()), user_id='')
  1190. except Exception as e:
  1191. LOGGER.info('EquipmentManagerV3.async_del_message,{},error_line:{}, error_msg:{}'
  1192. .format(uid, e.__traceback__.tb_lineno, repr(e)))
  1193. @staticmethod
  1194. def save_button_user(request_dict, response):
  1195. """
  1196. 设置推送按钮用户
  1197. """
  1198. uid = request_dict.get('uid', None)
  1199. button_user1 = request_dict.get('buttonUser1', None)
  1200. button_user2 = request_dict.get('buttonUser2', None)
  1201. if not uid:
  1202. return response.json(444)
  1203. try:
  1204. now_time = int(time.time())
  1205. if button_user1:
  1206. button_qs = UserAudioVideoPush.objects.filter(uid=uid)
  1207. if button_qs.exists():
  1208. button_qs.update(buttonUser1=button_user1, updated_time=now_time)
  1209. else:
  1210. UserAudioVideoPush.objects.create(uid=uid, buttonUser1=button_user1, created_time=now_time,
  1211. updated_time=now_time)
  1212. if button_user2:
  1213. button_qs = UserAudioVideoPush.objects.filter(uid=uid)
  1214. if button_qs.exists():
  1215. button_qs.update(buttonUser2=button_user2, updated_time=now_time)
  1216. else:
  1217. UserAudioVideoPush.objects.create(uid=uid, buttonUser2=button_user2, created_time=now_time,
  1218. updated_time=now_time)
  1219. return response.json(0)
  1220. except Exception as e:
  1221. return response.json(500, repr(e))
  1222. @staticmethod
  1223. def get_button_user(request_dict, response):
  1224. """
  1225. 获取推送按钮用户
  1226. """
  1227. uid = request_dict.get('uid', None)
  1228. if not uid:
  1229. return response.json(444)
  1230. try:
  1231. device_qs = Device_Info.objects.filter(UID=uid).values('userID', 'userID__NickName', 'noteName')
  1232. button_qs = UserAudioVideoPush.objects.filter(uid=uid).values('buttonUser1', 'buttonUser2')
  1233. res = []
  1234. for item in device_qs:
  1235. noteName = item['noteName'] if item['noteName'] else item['userID__NickName']
  1236. temp_dict = {'userId': item['userID'], 'username': item['userID__NickName'],
  1237. 'noteName': noteName}
  1238. if not button_qs.exists():
  1239. res.append(temp_dict)
  1240. continue
  1241. if item['userID'] == button_qs[0]['buttonUser1']:
  1242. temp_dict['audioVideoButton'] = '1'
  1243. if item['userID'] == button_qs[0]['buttonUser2']:
  1244. temp_dict['audioVideoButton'] = '2'
  1245. if item['userID'] == button_qs[0]['buttonUser1'] and item['userID'] == button_qs[0]['buttonUser2']:
  1246. temp_dict['audioVideoButton'] = '1,2'
  1247. res.append(temp_dict)
  1248. return response.json(0, res)
  1249. except Exception as e:
  1250. return response.json(500, repr(e))
  1251. @staticmethod
  1252. def verify_code(request_dict, response):
  1253. """
  1254. 校验验证码(查看设备密码)
  1255. @param request_dict:
  1256. @param response:
  1257. @return:
  1258. """
  1259. email = request_dict.get('email', None)
  1260. phone = request_dict.get('phone', None)
  1261. uid = request_dict.get('uid', None)
  1262. authcode = request_dict.get('authcode', None)
  1263. if not any([email, phone]):
  1264. return response.json(444)
  1265. if not all([uid, authcode]):
  1266. return response.json(444)
  1267. try:
  1268. authcode = CommonService.decode_data(authcode.strip())
  1269. if authcode is None:
  1270. return response.json(444, 'authcode')
  1271. user_info = email if email is not None else phone
  1272. redis = RedisObject()
  1273. redis_key = '{}_{}_GetDevicePassword'.format(user_info, uid)
  1274. reset_code = redis.get_data(key=redis_key)
  1275. if reset_code is False:
  1276. return response.json(90)
  1277. if authcode != reset_code:
  1278. return response.json(121)
  1279. if not redis.del_data(redis_key):
  1280. return response.json(10, '删除缓存失败')
  1281. return response.json(0)
  1282. except Exception as e:
  1283. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1284. @staticmethod
  1285. def view_device_password(request_dict, response):
  1286. """
  1287. 查看设备密码
  1288. @param request_dict:
  1289. @param response:
  1290. @return:
  1291. """
  1292. uid = request_dict.get('uid', None)
  1293. if not all([uid]):
  1294. return response.json(444)
  1295. try:
  1296. uid_set_qs = UidSetModel.objects.filter(uid=uid).values('pwd')
  1297. if uid_set_qs.exists():
  1298. device_password = uid_set_qs[0]['pwd']
  1299. else:
  1300. device_info_qs = Device_Info.objects.filter(UID=uid).values('View_Password')
  1301. if not device_info_qs.exists():
  1302. return response.json(173)
  1303. device_password = device_info_qs[0]['View_Password']
  1304. device_password = CommonService.encode_data(device_password)
  1305. res = {
  1306. 'device_password': device_password
  1307. }
  1308. return response.json(0, res)
  1309. except Exception as e:
  1310. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1311. @staticmethod
  1312. def edit_sort_order(request_dict, response):
  1313. """
  1314. 修改设备排序
  1315. ids: 选中的设备id列表(单选或多选)
  1316. action: 操作类型(move/top/bottom)
  1317. target_id: 拖动目标id(仅单选拖动时用)
  1318. """
  1319. ids = request_dict.get('ids', None)
  1320. action = request_dict.get('action', None)
  1321. target_id = request_dict.get('target_id', None)
  1322. if not ids or not action:
  1323. return response.json(444, 'ids or action missing')
  1324. try:
  1325. # 查询所有设备,按sort_order排序
  1326. all_devices = list(Device_Info.objects.all().order_by('-sort_order', '-data_joined'))
  1327. id_to_device = {str(d.id): d for d in all_devices}
  1328. # 单选拖动排序
  1329. if action == 'move' and len(ids) == 1 and target_id:
  1330. moving_id = ids[0]
  1331. moving_device = id_to_device.get(str(moving_id))
  1332. target_device = id_to_device.get(str(target_id))
  1333. if not moving_device or not target_device:
  1334. return response.json(173, 'device not found')
  1335. target_index = all_devices.index(target_device)
  1336. all_devices.remove(moving_device)
  1337. all_devices.insert(target_index, moving_device)
  1338. # 勾选框批量置顶/置底
  1339. elif action in ('top', 'bottom'):
  1340. selected_devices = [id_to_device[i] for i in ids if i in id_to_device]
  1341. other_devices = [d for d in all_devices if str(d.id) not in ids]
  1342. if action == 'top':
  1343. all_devices = selected_devices + other_devices
  1344. else:
  1345. all_devices = other_devices + selected_devices
  1346. # 重新赋值sort_order
  1347. for idx, device in enumerate(all_devices):
  1348. device.sort_order = len(all_devices) - idx
  1349. device.save(update_fields=['sort_order'])
  1350. return response.json(0)
  1351. except Exception as e:
  1352. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))