utils.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import json
  2. import hashlib
  3. import time
  4. import requests
  5. from requests.auth import HTTPBasicAuth
  6. import asyncio
  7. class DeviceInfoUtils(object):
  8. """
  9. 跨平台异步获取设备信息,调用实例化本类中的get_equip_list()
  10. :param d_id: 设备号
  11. :param isfullId:0模糊匹配,1表示完整设备号匹配
  12. :return:列表数据,相同设备号放一起,并且最近更新数据靠前,最近更新数据可认为设备最后所在平台
  13. """
  14. def get_resp(self, url, params):
  15. try:
  16. res = requests.post(url=url,data=params,timeout=10)
  17. res_dict = json.loads(res.content.decode())
  18. except:
  19. res_dict = {}
  20. return res_dict
  21. async def plat_device_info(self, url, data):
  22. # loop = asyncio.new_event_loop()
  23. # asyncio.set_event_loop(loop)
  24. loop = asyncio.get_event_loop()
  25. res = await loop.run_in_executor(None, self.get_resp, url, data)
  26. return res
  27. def get_equip_list(self, d_id, isfullId=0):
  28. bd_url = "http://127.0.0.1:8002/search/equip"
  29. sq_url = "http://172.16.220.3/search/equip"
  30. if isfullId == 1:
  31. data = {"device_id": d_id, "isfullId": "1"}
  32. else:
  33. data = {"device_id": d_id}
  34. loop = asyncio.new_event_loop()
  35. asyncio.set_event_loop(loop)
  36. loop = asyncio.get_event_loop()
  37. bd_task = loop.create_task(self.plat_device_info(bd_url, data))
  38. sq_task = loop.create_task(self.plat_device_info(sq_url, data))
  39. bd_dict = loop.run_until_complete(bd_task)
  40. sq_dict = loop.run_until_complete(sq_task)
  41. loop.close()
  42. bd_data = bd_dict.get("data", [])
  43. sq_data = sq_dict.get("data", [])
  44. data = []
  45. data.extend(bd_data)
  46. data.extend(sq_data)
  47. data = sorted(data, key=lambda e: e.__getitem__('uptime'), reverse=True)
  48. data = sorted(data, key=lambda e: e.__getitem__('device_id'), reverse=True)
  49. return data
  50. class GetSIMInfo(object):
  51. """
  52. 自定义获取SIM卡对应卡商及数据
  53. """
  54. def __init__(self,iccid) -> None:
  55. self.iccid = iccid
  56. self.hz_status = {
  57. 0: "未知",
  58. 1: "测试期",
  59. 2: "沉默期",
  60. 3: "使用中",
  61. 4: "停机",
  62. 5: "停机保号",
  63. 6: "预销号",
  64. 7: "销号"
  65. }
  66. self.qp_status = {
  67. "testing": "测试中",
  68. "inventory": "库存",
  69. "pending-activation": "待激活",
  70. "activation": "已激活",
  71. "deactivation": "已停卡",
  72. "retired": "已销卡"
  73. }
  74. def hz_sim_info(self):
  75. """获取合宙流量卡信息"""
  76. url = "http://sim.brlink.cn/api/open/iotcard/card"
  77. payload = {
  78. 'iccid': self.iccid,
  79. }
  80. appkey = 'iaO2DKgS8KdlnVgU'
  81. appsecret = 'qzKgO4sBdzMrjRwv9H22S9ufepNv8Hl5ehPqkYVD31DCICjyKwqUdj7zihQQKfgx'
  82. auth = HTTPBasicAuth(appkey, appsecret)
  83. try:
  84. res = requests.post(url, json=payload, auth=auth)
  85. data = json.loads(res.text)
  86. except Exception as e:
  87. print(self.iccid,"合宙接口异常",e)
  88. data = {'code': 99999, 'msg': '接口调用异常异常'}
  89. return data
  90. def qp_sim_info(self):
  91. """ 获取企鹏(SIMBOSS)流量卡信息 """
  92. url = "https://api.simboss.com/2.0/device/detail"
  93. current_milli_time = lambda: int(round(time.time() * 1000))
  94. data_1 = "appid=%s&iccid=%s&timestamp=%s%s"%("102420177762",self.iccid,current_milli_time(),"6397d7e6a56589f1d93284e9800493e1")
  95. sign = hashlib.sha256(data_1.encode('utf-8')).hexdigest()
  96. data = {"appid": "102420177762", "iccid": self.iccid, "timestamp":current_milli_time(),"sign":sign}
  97. try:
  98. res = requests.post(url, data=data)
  99. data = json.loads(res.text)
  100. except Exception as e:
  101. print(self.iccid,"SIMBOSS接口异常",e)
  102. data = {'code': 99999, 'msg': '接口调用异常异常'}
  103. return data
  104. def get_sim_info(self):
  105. hz_data = self.hz_sim_info()
  106. if hz_data["code"] == 0: # 合宙
  107. sim_operators = 1
  108. account_status = self.hz_status[hz_data["data"]["account_status"]]
  109. if hz_data["data"]["active"] == 1:
  110. active_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(hz_data["data"]["active_date"]))
  111. data_plan = str(hz_data["data"]["data_plan"]) + "M"
  112. data_usage = str(hz_data["data"]["data_usage"]) + "M"
  113. data_balance = str(hz_data["data"]["data_balance"]) + "M"
  114. expiry_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(hz_data["data"]["expiry_date"]))
  115. else:
  116. active_date = "未激活"
  117. data_plan = "未激活"
  118. data_usage = "未激活"
  119. data_balance = "未激活"
  120. expiry_date = "未激活"
  121. else:
  122. qp_data = self.qp_sim_info()
  123. if qp_data["code"] == "0":
  124. sim_operators = 2
  125. account_status = self.qp_status[qp_data["data"]["status"]]
  126. active_date = qp_data["data"].get("startDate","")
  127. if active_date:
  128. if qp_data["data"]["useCountAsVolume"] == False:
  129. data_plan = str(qp_data["data"]["totalDataVolume"]) + "M"
  130. data_usage = str(qp_data["data"]["usedDataVolume"]) + "M"
  131. data_balance = str(qp_data["data"]["totalDataVolume"] - qp_data["data"]["usedDataVolume"]) + "M"
  132. else:
  133. data_plan = str(qp_data["data"]["totalDataVolume"] * 1024) + "M"
  134. data_usage = str(qp_data["data"]["usedDataVolume"] * 1024) + "M"
  135. data_balance = str((qp_data["data"]["totalDataVolume"] - qp_data["data"]["usedDataVolume"])*1024) + "M"
  136. expiry_date = qp_data["data"]["expireDate"]
  137. else:
  138. data_plan = "未激活"
  139. data_usage = "未激活"
  140. data_balance = "未激活"
  141. expiry_date = "未激活"
  142. else:
  143. sim_operators = 3
  144. account_status = "未知"
  145. active_date = "未知"
  146. data_plan = "未知"
  147. data_usage = "未知"
  148. data_balance = "未知"
  149. expiry_date = "未知"
  150. return sim_operators,account_status,active_date,data_plan,data_usage,data_balance,expiry_date