GatewayDeviceController.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : GatewayDeviceController.py
  4. @Time : 2022/6/6 13:50
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import datetime
  10. import threading
  11. import time
  12. import requests
  13. from django.db import transaction
  14. from django.db.models import Q
  15. from django.views.generic.base import View
  16. from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SCENE_EVENT_DELETE, SUB_DEVICE_TOPIC
  17. from Ansjer.config import CONFIG_INFO, AWS_IOT_SES_ACCESS_CHINA_ID, AWS_IOT_SES_ACCESS_CHINA_SECRET, \
  18. AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_FOREIGN_ID, AWS_IOT_SES_ACCESS_FOREIGN_SECRET, \
  19. AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
  20. from Ansjer.config import LOGGER
  21. from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
  22. from Controller.SensorGateway.SmartSocketController import SmartSocketView
  23. from Model.models import FamilyRoomDevice, FamilyRoom, GatewaySubDevice, Device_Info, UserFamily, FamilyMember, \
  24. UidSetModel, iotdeviceInfoModel, SmartScene, SceneLog, SocketInfo, SocketPowerStatistics, SocketSchedule, \
  25. CountryModel
  26. from Object.AWS.AWSIoTDataPlaneUtil import AWSIoTDataPlaneService
  27. from Object.RedisObject import RedisObject
  28. from Object.ResponseObject import ResponseObject
  29. from Object.TokenObject import TokenObject
  30. from Service.CommonService import CommonService
  31. from Service.ModelService import ModelService
  32. class GatewayDeviceView(View):
  33. def get(self, request, *args, **kwargs):
  34. request.encoding = 'utf-8'
  35. operation = kwargs.get('operation')
  36. return self.validation(request.GET, request, operation)
  37. def post(self, request, *args, **kwargs):
  38. request.encoding = 'utf-8'
  39. operation = kwargs.get('operation')
  40. return self.validation(request.POST, request, operation)
  41. def validation(self, request_dict, request, operation):
  42. if operation == 'bind-serial-user':
  43. response = ResponseObject()
  44. return self.bind_serial_user(request_dict, response)
  45. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  46. lang = request_dict.get('lang', None)
  47. response = ResponseObject(lang) if lang else ResponseObject(token.lang)
  48. if token.code != 0:
  49. return response.json(token.code)
  50. user_id = token.userID
  51. # 网关设备
  52. if operation == 'list':
  53. return self.gateway_device_list(request_dict, response)
  54. elif operation == 'del':
  55. return self.gateway_device_del(user_id, request_dict, response)
  56. elif operation == 'update':
  57. return self.gateway_device_update(user_id, request_dict, response)
  58. elif operation == 'my/family/list':
  59. return self.my_family_list(user_id, response)
  60. elif operation == 'location-setting':
  61. return self.device_location_setting(user_id, request_dict, response)
  62. elif operation == 'get-serial-user':
  63. return self.get_serial_user(user_id, request_dict, response)
  64. @classmethod
  65. def device_location_setting(cls, user_id, request_dict, response):
  66. """
  67. 网关位置迁移
  68. @param user_id: 用户id
  69. @param request_dict: 请求参数字典
  70. @param response: 响应对象
  71. @return: []
  72. """
  73. device_id = request_dict.get('deviceId', None)
  74. family_id = request_dict.get('familyId', None)
  75. room_id = request_dict.get('roomId', None)
  76. if not all([device_id, family_id]):
  77. return response.json(444)
  78. family_id = int(family_id)
  79. permission = EquipmentFamilyView.get_member_permission_details(user_id, family_id)
  80. if not permission or permission == '003':
  81. return response.json(404)
  82. try:
  83. with transaction.atomic():
  84. family_room_device_qs = FamilyRoomDevice.objects.filter(device_id=device_id, family_id=family_id)
  85. if family_room_device_qs.exists():
  86. family_room_device_qs = family_room_device_qs.filter(sub_device=0)
  87. if family_room_device_qs.exists() and room_id:
  88. family_room_device_qs.update(room_id=int(room_id))
  89. else:
  90. user_family_qs = UserFamily.objects.filter(id=family_id)
  91. if not user_family_qs:
  92. return response.json(173)
  93. family_room_device_qs = FamilyRoomDevice.objects.filter(device_id=device_id)
  94. if family_room_device_qs.exists():
  95. param_data = {'family_id': family_id, 'room_id': 0}
  96. if room_id:
  97. param_data['room_id'] = room_id
  98. family_room_device_qs.update(**param_data)
  99. return response.json(0)
  100. except Exception as e:
  101. print(e)
  102. return response.json(177, repr(e))
  103. @classmethod
  104. def gateway_device_update(cls, user_id, request_dict, response):
  105. """
  106. 网关设备修改名称
  107. @param user_id:
  108. @param request_dict:
  109. @param response:
  110. @return:
  111. """
  112. device_name = request_dict.get('deviceName')
  113. device_id = request_dict.get('deviceId')
  114. if not all([device_name, device_id]):
  115. return response.json(444)
  116. device_info_qs = Device_Info.objects.filter(userID_id=user_id, id=device_id)
  117. if device_info_qs.exists():
  118. device_info_qs.update(NickName=device_name)
  119. uid_set_qs = UidSetModel.objects.filter(uid=device_info_qs[0].UID)
  120. if uid_set_qs.exists():
  121. uid_set_qs.update(nickname=device_name)
  122. if device_info_qs[0].Type == 201:
  123. device_info_qs = device_info_qs.values('userID__region_country', 'serial_number')
  124. region = device_info_qs[0]['userID__region_country']
  125. cls.update_socket(serial_number=device_info_qs[0]['serial_number'], device_name=device_name,
  126. user_id=user_id, region=region)
  127. return response.json(0)
  128. @classmethod
  129. def my_family_list(cls, user_id, response):
  130. """
  131. 我的家庭列表
  132. @param user_id:
  133. @param response:
  134. @return:
  135. """
  136. user_family_qs = UserFamily.objects.filter(user_id=user_id).values()
  137. family_list = []
  138. if user_family_qs.exists():
  139. family_member_qs = FamilyMember.objects.filter(user_id=user_id, identity=1) \
  140. .order_by('sort').values('identity', 'family_id', 'family__name', 'permission_id', 'permission__no',
  141. 'family__location', 'user__username', 'user__userIconUrl')
  142. items = EquipmentFamilyView.family_info_list(family_member_qs)
  143. return response.json(0, items)
  144. return response.json(0, family_list)
  145. @classmethod
  146. def gateway_device_del(cls, user_id, request_dict, response):
  147. """
  148. 网关设备删除或删除子设备
  149. @param user_id:
  150. @param request_dict:
  151. @param response:
  152. @return:
  153. """
  154. LOGGER.info('开始删除设备:{}'.format(request_dict))
  155. device_id = request_dict.get('deviceId')
  156. family_id = request_dict.get('familyId')
  157. # 1 删除网关 否则删除子设备
  158. sub_ids = request_dict.get('subIds')
  159. if not family_id:
  160. return response.json(444)
  161. permission = EquipmentFamilyView.get_member_permission_details(user_id, family_id)
  162. if not permission or permission == '003':
  163. return response.json(404)
  164. try:
  165. with transaction.atomic():
  166. if device_id:
  167. device_qs = Device_Info.objects.filter(id=device_id)
  168. if device_qs.exists():
  169. serial_number = device_qs.first().serial_number
  170. FamilyRoomDevice.objects.filter(device_id=device_id).delete()
  171. UidSetModel.objects.filter(uid=device_qs.first().UID).delete()
  172. socket_info_qs = SocketInfo.objects.filter(device_id=device_id)
  173. if socket_info_qs.exists():
  174. # 设备在不在线, 都发布重置
  175. cls.reset_device(serial_number)
  176. socket_info_qs.delete()
  177. SocketPowerStatistics.objects.filter(device_id=device_id).delete()
  178. SocketSchedule.objects.filter(device_id=device_id).delete()
  179. SceneLog.objects.filter(device_id=serial_number).delete()
  180. SmartSocketView.delete_alexa_socket(serial_number)
  181. # 重置设备
  182. topic_name = SUB_DEVICE_TOPIC.format(serial_number)
  183. msg = {
  184. 'zigbee': 'recover',
  185. }
  186. success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  187. LOGGER.info('删除重置设备结果:{}'.format(success))
  188. try:
  189. assert success
  190. except AssertionError:
  191. return response.json(10044)
  192. time.sleep(0.3)
  193. # 如果有子设备,删除子设备和关联的场景数据
  194. gateway_qs = GatewaySubDevice.objects.filter(device_id=device_id)
  195. if gateway_qs.exists():
  196. sub_id_list = gateway_qs.values_list('id', flat=True)
  197. smart_scene_qs = SmartScene.objects.filter(
  198. Q(device_id=device_id) | Q(sub_device_id__in=sub_id_list))
  199. # 下发删除设备消息
  200. ieee_addr_list = gateway_qs.values_list('ieee_addr', flat=True)
  201. for ieee_addr in ieee_addr_list:
  202. # 删除设备
  203. msg = {
  204. 'zigbee': 'delete',
  205. 'ieee': ieee_addr
  206. }
  207. success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  208. try:
  209. assert success
  210. except AssertionError:
  211. return response.json(10044)
  212. time.sleep(0.3)
  213. else:
  214. smart_scene_qs = SmartScene.objects.filter(device_id=device_id)
  215. if smart_scene_qs.exists():
  216. # 通知设备删除场景id
  217. smart_scene_info = smart_scene_qs.values('id')
  218. serial_number = device_qs.first().serial_number
  219. topic_name = SMART_SCENE_TOPIC.format(serial_number)
  220. for smart_scene in smart_scene_info:
  221. msg = {
  222. 'scene_event': SCENE_EVENT_DELETE,
  223. 'scene_id': int(smart_scene['id'])
  224. }
  225. success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  226. try:
  227. assert success
  228. except AssertionError:
  229. return response.json(10044)
  230. time.sleep(0.3)
  231. smart_scene_qs.delete()
  232. gateway_qs.delete() # 删除子设备
  233. SceneLog.objects.filter(device_id=device_id).delete()
  234. device_qs.delete()
  235. # 异步删除推送消息
  236. asy = threading.Thread(target=ModelService.del_eq_info, args=(user_id, serial_number))
  237. asy.start()
  238. elif sub_ids:
  239. sub_id_list = list(map(int, sub_ids.split(',')))
  240. FamilyRoomDevice.objects.filter(sub_device__in=sub_id_list).delete()
  241. # 查询网关序列号,确定MQTT主题
  242. sub_device_qs = GatewaySubDevice.objects.filter(id=sub_id_list[0]). \
  243. values('device__serial_number')
  244. assert sub_device_qs.exists()
  245. serial_number = sub_device_qs[0]['device__serial_number']
  246. # 下发删除设备消息
  247. gateway_sub_device_qs = GatewaySubDevice.objects.filter(id__in=sub_id_list)
  248. ieee_addr_list = gateway_sub_device_qs.values_list('ieee_addr', flat=True)
  249. topic_name = SUB_DEVICE_TOPIC.format(serial_number)
  250. for ieee_addr in ieee_addr_list:
  251. # 删除设备
  252. msg = {
  253. 'zigbee': 'delete',
  254. 'ieee': ieee_addr
  255. }
  256. success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  257. try:
  258. assert success
  259. except AssertionError:
  260. return response.json(10044)
  261. time.sleep(0.3)
  262. # 删除场景,下发MQTT通知设备
  263. smart_scene_qs = SmartScene.objects.filter(sub_device_id__in=sub_id_list)
  264. if smart_scene_qs.exists():
  265. topic_name = SMART_SCENE_TOPIC.format(serial_number)
  266. smart_scene_info = smart_scene_qs.values('id')
  267. for smart_scene in smart_scene_info:
  268. # 通知设备删除场景id
  269. msg = {
  270. 'scene_event': SCENE_EVENT_DELETE,
  271. 'scene_id': int(smart_scene['id'])
  272. }
  273. success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  274. try:
  275. assert success
  276. except AssertionError:
  277. return response.json(10044)
  278. time.sleep(0.3)
  279. smart_scene_qs.delete()
  280. gateway_sub_device_qs.delete()
  281. SceneLog.objects.filter(sub_device_id__in=sub_id_list).delete()
  282. # 异步删除推送消息
  283. asy = threading.Thread(target=ModelService.del_eq_info, args=(user_id, serial_number))
  284. asy.start()
  285. return response.json(0)
  286. except Exception as e:
  287. return response.json(177, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  288. @staticmethod
  289. def reset_device(serial_number):
  290. """
  291. 下发消息到设备
  292. """
  293. try:
  294. # 更新影子为离线状态
  295. data = {
  296. "state": {"reported": {"online": 0}}
  297. }
  298. iot_data_plane = None
  299. thing_name = 'LC_' + serial_number
  300. if 'test' == CONFIG_INFO or CONFIG_INFO == 'cn':
  301. iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_CHINA_ID,
  302. AWS_IOT_SES_ACCESS_CHINA_SECRET,
  303. AWS_IOT_SES_ACCESS_CHINA_REGION)
  304. elif 'us' == CONFIG_INFO:
  305. iot_data_plane = AWSIoTDataPlaneService(AWS_IOT_SES_ACCESS_FOREIGN_ID,
  306. AWS_IOT_SES_ACCESS_FOREIGN_SECRET,
  307. AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA)
  308. if iot_data_plane:
  309. res = iot_data_plane.update_thing_shadow(thing_name, data)
  310. LOGGER.info('删除插座更新设备影子状态{}'.format(res))
  311. # 下发设备进行重置
  312. SOCKET_TOPIC_NAME = 'loocam/smart-socket/{}' # 插座发布消息主题(因设备当前版本只能订阅一个主题)
  313. topic_name = SOCKET_TOPIC_NAME.format(serial_number)
  314. # 发布消息内容,重置设备
  315. msg = {'type': 6, 'data': {'device_reset': 1}}
  316. result = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  317. LOGGER.info('重置{}智能插座设备,发布MQTT消息结果{}'.format(serial_number, result))
  318. return True
  319. except Exception as e:
  320. LOGGER.info('插座删除下发更改影子异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  321. return False
  322. @classmethod
  323. def gateway_device_list(cls, request_dict, response):
  324. """
  325. 网关设备列表
  326. @param request_dict:
  327. @param response:
  328. @return:
  329. """
  330. device_id = request_dict.get('deviceId', None)
  331. if not device_id:
  332. return response.json(444)
  333. device_qs = FamilyRoomDevice.objects.filter(device_id=device_id, sub_device=0)
  334. if not device_qs.exists():
  335. return response.json(173)
  336. try:
  337. device_qs = device_qs.values('family_id', 'device_id', 'room_id', 'device__Type', 'device__NickName',
  338. 'device__UID',
  339. 'device__serial_number')
  340. device_qs = device_qs.first()
  341. room_id = device_qs['room_id']
  342. family_id = device_qs['family_id']
  343. gateway_room_name = ''
  344. if room_id:
  345. room_qs = FamilyRoom.objects.filter(id=room_id)
  346. gateway_room_name = room_qs.first().name if room_qs.exists() else ''
  347. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  348. serial_number=device_qs['device__serial_number'][0:6])
  349. iot_data = {}
  350. if iot_device_info_qs.exists():
  351. iot_device_Info = iot_device_info_qs.values('endpoint', 'token_iot_number')
  352. iot_data = {
  353. 'endpoint': iot_device_Info[0]['endpoint'],
  354. 'token_iot_number': iot_device_Info[0]['token_iot_number']
  355. }
  356. gateway = {
  357. 'deviceId': device_qs['device_id'],
  358. 'deviceType': device_qs['device__Type'],
  359. 'deviceNickName': device_qs['device__NickName'],
  360. 'UID': device_qs['device__UID'],
  361. 'serialNumber': device_qs['device__serial_number'],
  362. 'roomName': gateway_room_name,
  363. 'iot': iot_data,
  364. 'roomId': room_id,
  365. 'familyId': family_id,
  366. 'power': 0,
  367. 'electricity': 0,
  368. 'countDownTime': 0,
  369. 'socketStatus': False,
  370. 'online': False,
  371. 'accumulatedTime': 0,
  372. 'start': False,
  373. }
  374. if device_qs['device__Type'] == 201:
  375. socket_info_qs = SocketInfo.objects.filter(device_id=device_id).values('online', 'type_switch',
  376. 'status',
  377. 'count_down_time', 'start')
  378. if not socket_info_qs.exists():
  379. return response.json(173)
  380. socket_data = cls.smart_socket(device_id, socket_info_qs)
  381. gateway = {key: socket_data.get(key, gateway[key]) for key in gateway.keys()}
  382. family_device_qs = FamilyRoomDevice.objects.filter(device_id=device_id)
  383. family_device_qs = family_device_qs.filter(~Q(sub_device=0)).order_by('-created_time')
  384. sub_device = []
  385. sub_id_list = []
  386. if family_device_qs.exists():
  387. family_device_qs = family_device_qs.values()
  388. for item in family_device_qs:
  389. sub_id = item['sub_device']
  390. sub_id_list.append(sub_id)
  391. gateway_sub_qs = GatewaySubDevice.objects.filter(device_id=device_id, id=sub_id).values(
  392. 'id', 'device_type', 'nickname', 'status', 'created_time', 'ieee_addr')
  393. if not gateway_sub_qs.exists():
  394. continue
  395. room_id = item['room_id']
  396. room_qs = FamilyRoom.objects.filter(id=room_id)
  397. gateway_room_name = room_qs.first().name if room_qs.exists() else ''
  398. gateway_sub_qs = gateway_sub_qs.first()
  399. sub_device.append({
  400. 'gatewaySubId': gateway_sub_qs['id'],
  401. 'nickName': gateway_sub_qs['nickname'],
  402. 'deviceType': gateway_sub_qs['device_type'],
  403. 'status': gateway_sub_qs['status'],
  404. 'createdTime': gateway_sub_qs['created_time'],
  405. 'roomName': gateway_room_name,
  406. 'roomId': room_qs.first().id if room_qs.exists() else 0,
  407. 'ieeeAddr': gateway_sub_qs['ieee_addr'],
  408. 'familyId': family_id,
  409. })
  410. scene_count = SmartScene.objects.filter(Q(device_id=device_id) | Q(sub_device_id__in=sub_id_list)).count()
  411. res = {'gateway': gateway, 'sub_device': sub_device, 'sub_device_count': len(sub_device),
  412. 'scene_count': scene_count}
  413. return response.json(0, res)
  414. except Exception as e:
  415. print(e.args)
  416. return response.json(500)
  417. @classmethod
  418. def smart_socket(cls, device_id, socket_info_qs):
  419. """
  420. 查詢插座信息
  421. """
  422. nowTime = int(time.time())
  423. today = datetime.date.today()
  424. # 今天开始时间
  425. today_start_time = int(time.mktime(time.strptime(str(today), '%Y-%m-%d')))
  426. data = {
  427. 'power': 0,
  428. 'electricity': 0,
  429. 'countDownTime': 0,
  430. 'accumulatedTime': 0,
  431. 'socketStatus': False,
  432. 'online': False,
  433. 'start': False,
  434. }
  435. # 插座信息
  436. socket_info_qs = socket_info_qs.filter(device_id=device_id).values('online', 'type_switch',
  437. 'status', 'count_down_time', 'start')
  438. type_switch_list = [type_switch[v] for type_switch in socket_info_qs.values('type_switch') for v in type_switch]
  439. # 判断开关类型 0:总开关,1:倒计时开关
  440. if len(type_switch_list) == 2:
  441. socket_info_qs = socket_info_qs.filter(type_switch=1)
  442. else:
  443. socket_info_qs = socket_info_qs.filter(type_switch=0)
  444. # 插座信息
  445. data['socketStatus'] = socket_info_qs[0]['status']
  446. data['start'] = socket_info_qs[0]['start']
  447. data['online'] = socket_info_qs[0]['online']
  448. data['countDownTime'] = socket_info_qs[0]['count_down_time'] if socket_info_qs[0][
  449. 'count_down_time'] else 0
  450. # 当前设备电量信息
  451. socket_power_qs = SocketPowerStatistics.objects.filter(device_id=device_id, created_time__gte=today_start_time,
  452. created_time__lt=nowTime).values('accumulated_time',
  453. 'power',
  454. 'created_time',
  455. 'electricity'). \
  456. order_by('-created_time')
  457. if not socket_power_qs.exists():
  458. return data
  459. data['power'] = round(socket_power_qs[0]['power'], 1)
  460. data['electricity'] = round(socket_power_qs[0]['electricity'], 1)
  461. data['accumulatedTime'] = socket_power_qs[0]['accumulated_time']
  462. return data
  463. @staticmethod
  464. def bind_serial_user(request_dict, response):
  465. """
  466. 绑定序列号和用户id
  467. @param request_dict: 请求参数字典
  468. @request_dict user_id: 用户id
  469. @request_dict serial_number: 序列号
  470. @param response: 响应对象
  471. @return:
  472. """
  473. user_id = request_dict.get('user_id')
  474. serial_number = request_dict.get('serial_number')
  475. if not all([user_id, serial_number]):
  476. return response.json(444)
  477. try:
  478. now_time = int(time.time())
  479. LOGGER.info('用户{}的设备{}上传序列号时间:{}'.format(user_id, serial_number, now_time))
  480. redis_obj = RedisObject()
  481. result = redis_obj.set_data(user_id, serial_number, 300)
  482. if not result:
  483. return response.json(178)
  484. return response.json(0)
  485. except Exception as e:
  486. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  487. @staticmethod
  488. def get_serial_user(user_id, request_dict, response):
  489. """
  490. 获取用户id绑定网关序列号
  491. @param user_id: 用户id
  492. @param request_dict: 请求参数字典
  493. @param response: 响应对象
  494. @return:
  495. """
  496. try:
  497. now_time = int(time.time())
  498. redis_obj = RedisObject()
  499. serial_number = redis_obj.get_data(user_id)
  500. LOGGER.info('用户{}的设备{}获取序列号时间:{}'.format(user_id, serial_number, now_time))
  501. if not serial_number:
  502. return response.json(173)
  503. return response.json(0, {'serialNumber': serial_number})
  504. except Exception as e:
  505. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  506. @classmethod
  507. def update_socket(cls, serial_number, device_name, user_id, region):
  508. url = 'https://www.zositech.xyz/deviceStatus/addOrUpdateSwitch'
  509. try:
  510. country_qs = CountryModel.objects.filter(id=region).values('region__continent_code')
  511. data = {
  512. 'nick_name': device_name,
  513. 'serial_number': serial_number,
  514. 'user_id': user_id,
  515. 'region': country_qs[0]['region__continent_code'] if country_qs.exists() else 'EN'
  516. }
  517. requests.post(url=url, data=data, timeout=5)
  518. except Exception as e:
  519. print(repr(e))
  520. #
  521. # ___====-_ _-====___
  522. # _--^^^#####// \\#####^^^--_
  523. # _-^##########// ( ) \\##########^-_
  524. # -############// |\^^/| \\############-
  525. # _/############// (@::@) \\############\_
  526. # /#############(( \\// ))#############\
  527. # -###############\\ (oo) //###############-
  528. # -#################\\ / VV \ //#################-
  529. # -###################\\/ \//###################-
  530. # _#/|##########/\######( /\ )######/\##########|\#_
  531. # |/ |#/\#/\#/\/ \#/\##\ | | /##/\#/ \/\#/\#/\#| \|
  532. # ` |/ V V ` V \#\| | | |/#/ V ' V V \| '
  533. # ` ` ` ` / | | | | \ ' ' ' '
  534. # ( | | | | )
  535. # __\ | | | | /__
  536. # (vvv(VVV)(VVV)vvv)
  537. # 神兽保佑
  538. # 代码无BUG!
  539. #