utils.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. import json
  2. import hashlib
  3. import time
  4. import traceback
  5. import requests
  6. from requests.auth import HTTPBasicAuth
  7. import asyncio
  8. import pymongo
  9. import pymysql
  10. from urllib import parse
  11. class DeviceInfoUtils(object):
  12. """
  13. 跨平台异步获取设备信息,调用实例化本类中的get_equip_list()
  14. :param d_id: 设备号
  15. :param isfullId:0模糊匹配,1表示完整设备号匹配
  16. :return:列表数据,相同设备号放一起,并且最近更新数据靠前,最近更新数据可认为设备最后所在平台
  17. """
  18. def get_resp(self, url, params):
  19. try:
  20. res = requests.post(url=url,data=params,timeout=10)
  21. res_dict = json.loads(res.content.decode())
  22. except:
  23. res_dict = {}
  24. return res_dict
  25. async def plat_device_info(self, url, data):
  26. # loop = asyncio.new_event_loop()
  27. # asyncio.set_event_loop(loop)
  28. loop = asyncio.get_event_loop()
  29. res = await loop.run_in_executor(None, self.get_resp, url, data)
  30. return res
  31. def get_equip_list(self, d_id, isfullId=0):
  32. bd_url = "http://127.0.0.1:8002/search/equip"
  33. sq_url = "http://172.16.220.3/search/equip"
  34. if isfullId == 1:
  35. data = {"device_id": d_id, "isfullId": "1"}
  36. else:
  37. data = {"device_id": d_id}
  38. loop = asyncio.new_event_loop()
  39. asyncio.set_event_loop(loop)
  40. loop = asyncio.get_event_loop()
  41. bd_task = loop.create_task(self.plat_device_info(bd_url, data))
  42. sq_task = loop.create_task(self.plat_device_info(sq_url, data))
  43. bd_dict = loop.run_until_complete(bd_task)
  44. sq_dict = loop.run_until_complete(sq_task)
  45. loop.close()
  46. bd_data = bd_dict.get("data", [])
  47. sq_data = sq_dict.get("data", [])
  48. data = []
  49. data.extend(bd_data)
  50. data.extend(sq_data)
  51. data = sorted(data, key=lambda e: e.__getitem__('uptime'), reverse=True)
  52. data = sorted(data, key=lambda e: e.__getitem__('device_id'), reverse=True)
  53. return data
  54. class GetDashujuSiqingDeviceInfo(object):
  55. def __init__(self):
  56. # 大数据平台mongo连接
  57. user = parse.quote_plus("root")
  58. passwd = parse.quote_plus("yfkj@6020")
  59. da_shuju = "127.0.0.1"
  60. si_qing = "172.16.220.3"
  61. myclient = pymongo.MongoClient("mongodb://{0}:{1}@{2}:57017/".format(user,passwd, da_shuju))
  62. db = myclient.smartfarming
  63. self.sa_device = db.sa_device
  64. sa_device_type = db.sa_device_type
  65. device_tps = sa_device_type.find({}, {"_id": 0, "id": 1, "type_name": 1})
  66. self.device_tps = {str(i.get("id")): i.get("type_name") for i in list(device_tps)}
  67. # 大数据平台查询用户id与real_name
  68. da_conn = pymysql.connect(
  69. host=da_shuju,
  70. port=61882,
  71. user='root',
  72. password='yfkj@6020',
  73. database='smartfarming'
  74. )
  75. cursor = da_conn.cursor()
  76. cursor.execute("select uid, real_name from sa_device_user")
  77. result = cursor.fetchall()
  78. self.rk = {str(i[0]): i[1] for i in result}
  79. cursor.close()
  80. da_conn.close()
  81. # 四情 mysql 连接
  82. self.conn = pymysql.connect(
  83. host=si_qing,
  84. port=3306,
  85. user='yfwlw',
  86. password='sql_yfkj_6019',
  87. database='yfwlw'
  88. )
  89. si_qing_cursor = self.conn.cursor()
  90. si_qing_cursor.execute("select id, username from AppInfoManage_myuser")
  91. si_result = si_qing_cursor.fetchall()
  92. self.si_rk = {str(i[0]): i[1] for i in si_result}
  93. si_qing_cursor.execute("select type_id, type_name from AppInfoManage_equip_type")
  94. si_device_type = si_qing_cursor.fetchall()
  95. self.si_device_type = {str(i[0]): i[1] for i in si_device_type}
  96. si_qing_cursor.close()
  97. def get_dashuju(self, device_id):
  98. # 大数据查询设备信息
  99. result = self.sa_device.find_one(
  100. {"device_id": device_id},
  101. {
  102. 'device_type_id': 1,
  103. 'salesman_task_number': 1,
  104. 'owner_uid': 1,
  105. 'device_status': 1,
  106. 'province': 1,
  107. 'city': 1,
  108. 'district': 1,
  109. 'uptime': 1,
  110. 'device_id': 1,
  111. 'user_dealer': 1,
  112. '_id': 0
  113. }
  114. )
  115. if not result:
  116. return {}
  117. if result.get("user_dealer"):
  118. result["owner_user"] = self.rk.get(str(result.get("user_dealer")))
  119. elif result.get("owner_uid"):
  120. result["owner_user"] = self.rk.get(str(result.get("owner_uid")))
  121. else:
  122. result["owner_user"] = "未分配"
  123. # 排除指定设备类型状态判断
  124. if result.get("device_type_id") in [11, 13, 19, 20]:
  125. result["status"] = "未知"
  126. else:
  127. if result.get("device_status") == 1:
  128. result["status"] = "在线"
  129. else:
  130. result["status"] = "离线"
  131. result["device_type"] = self.device_tps.get(str(result.get("device_type_id")), "-")
  132. result["plat"] = "大数据平台"
  133. result["order_id"] = result.get("salesman_task_number") if result.get("salesman_task_number") !="0" else "——"
  134. if result.get("province"):
  135. result["location"] = result.get("province") + "," + result.get("city") + "," + result.get("district")
  136. else:
  137. result["location"] = "暂无定位"
  138. return result
  139. def get_siqing(self, device_id):
  140. cursor = self.conn.cursor()
  141. cursor.execute("select equip_id, equip_user_id, equip_type_id, equip_city from AppInfoManage_equip where equip_id = %s", (device_id, ))
  142. cursor_result = cursor.fetchone()
  143. if not cursor_result:
  144. return {}
  145. columns = [desc[0] for desc in cursor.description]
  146. result = dict(zip(columns, cursor_result))
  147. result["plat"] = "四情平台"
  148. if result.get("equip_user_id"):
  149. result["owner_user"] = self.si_rk.get(str(result.get("equip_user_id")))
  150. else:
  151. result["owner_user"] = "未分配"
  152. equip_type_id = result.get("equip_type_id")
  153. if equip_type_id == 0:
  154. status = "未知"
  155. uptime = 0
  156. elif equip_type_id == 2:
  157. cursor.execute("select upl_time, is_online from AppInfoManage_scdstatus where equip_id_id = %s", (device_id, ))
  158. scd_status = cursor.fetchone()
  159. uptime = int((scd_status[0]).timestamp())
  160. status = "在线" if scd_status[1] == "1" else "离线"
  161. elif equip_type_id == 3:
  162. cursor.execute("select upl_time, is_online from AppInfoManage_cbdstatus where equip_id_id = %s", (device_id, ))
  163. scd_status = cursor.fetchone()
  164. uptime = int((scd_status[0]).timestamp())
  165. status = "在线" if scd_status[1] == "1" else "离线"
  166. elif equip_type_id == 4:
  167. cursor.execute("select upl_time, is_online from AppInfoManage_ybqstatus where equip_id_id = %s", (device_id, ))
  168. scd_status = cursor.fetchone()
  169. uptime = int((scd_status[0]).timestamp())
  170. status = "在线" if scd_status[1] == "1" else "离线"
  171. elif equip_type_id == 5:
  172. cursor.execute("select upl_time, is_online from AppInfoManage_qxzstatus_new where equip_id_id = %s", (device_id, ))
  173. scd_status = cursor.fetchone()
  174. uptime = int((scd_status[0]).timestamp())
  175. status = "在线" if scd_status[1] == "1" else "离线"
  176. elif equip_type_id == 6:
  177. cursor.execute("select upl_time, is_online from AppInfoManage_jkdata where equip_id_id = %s", (device_id, ))
  178. scd_status = cursor.fetchone()
  179. uptime = int((scd_status[0]).timestamp())
  180. status = "在线" if scd_status[1] == "1" else "离线"
  181. elif equip_type_id == 7:
  182. cursor.execute("select upl_time, is_online from AppInfoManage_bzystatus where equip_id_id = %s", (device_id, ))
  183. scd_status = cursor.fetchone()
  184. uptime = int((scd_status[0]).timestamp())
  185. status = "在线" if scd_status[1] == "1" else "离线"
  186. elif equip_type_id == 8:
  187. cursor.execute("select upl_time, is_online from AppInfoManage_trapstatus where equip_id_id = %s", (device_id, ))
  188. scd_status = cursor.fetchone()
  189. uptime = int((scd_status[0]).timestamp())
  190. status = "在线" if scd_status[1] == "1" else "离线"
  191. elif equip_type_id == 9:
  192. cursor.execute("select upl_time, is_online from AppInfoManage_tccbstatus where equip_id_id = %s", (device_id, ))
  193. scd_status = cursor.fetchone()
  194. uptime = int((scd_status[0]).timestamp())
  195. status = "在线" if scd_status[1] == "1" else "离线"
  196. elif equip_type_id == 10:
  197. cursor.execute("select upl_time, is_online from AppInfoManage_rtustatus where equip_id_id = %s", (device_id, ))
  198. scd_status = cursor.fetchone()
  199. uptime = int((scd_status[0]).timestamp())
  200. status = "在线" if scd_status[1] == "1" else "离线"
  201. elif equip_type_id == 11:
  202. cursor.execute("select upl_time, is_online from AppInfoManage_wheatstatus where equip_id_id = %s", (device_id, ))
  203. scd_status = cursor.fetchone()
  204. uptime = int((scd_status[0]).timestamp())
  205. status = "在线" if scd_status[1] == "1" else "离线"
  206. elif equip_type_id == 15:
  207. cursor.execute("select upl_time, is_online from AppInfoManage_wheatstatus where equip_id_id = %s", (device_id, ))
  208. scd_status = cursor.fetchone()
  209. uptime = int((scd_status[0]).timestamp())
  210. status = "在线" if scd_status[1] == "1" else "离线"
  211. elif equip_type_id == 16:
  212. cursor.execute("select upl_time, is_online from AppInfoManage_wheatstatus where equip_id_id = %s", (device_id, ))
  213. scd_status = cursor.fetchone()
  214. uptime = int((scd_status[0]).timestamp())
  215. status = "在线" if scd_status[1] == "1" else "离线"
  216. result["uptime"] = uptime
  217. result["status"] = status
  218. result["device_type"] = self.si_device_type.get(str(equip_type_id))
  219. if result.get("equip_city") and result.get("equip_city") != '0':
  220. result["location"] = result.get("equip_city")
  221. else:
  222. result["location"] = "暂无定位"
  223. result["order_id"] = "——"
  224. return result
  225. def get_together(self, device_id):
  226. try:
  227. dashuju = self.get_dashuju(device_id)
  228. siqing = self.get_siqing(device_id)
  229. if dashuju and siqing:
  230. if dashuju.get("uptime") > siqing.get("uptime"):
  231. return dashuju
  232. else:
  233. return siqing
  234. elif dashuju and (not siqing):
  235. return dashuju
  236. elif (not dashuju) and siqing:
  237. return siqing
  238. else:
  239. return {}
  240. except Exception as e:
  241. traceback.print_exc()
  242. class GetSIMInfo(object):
  243. """
  244. 自定义获取SIM卡对应卡商及数据
  245. """
  246. def __init__(self,iccid) -> None:
  247. self.iccid = iccid
  248. self.hz_status = {
  249. 0: "未知",
  250. 1: "测试期",
  251. 2: "沉默期",
  252. 3: "使用中",
  253. 4: "停机",
  254. 5: "停机保号",
  255. 6: "预销号",
  256. 7: "销号"
  257. }
  258. self.qp_status = {
  259. "testing": "测试中",
  260. "inventory": "库存",
  261. "pending-activation": "待激活",
  262. "activation": "已激活",
  263. "deactivation": "已停卡",
  264. "retired": "已销卡"
  265. }
  266. def hz_sim_info(self):
  267. """获取合宙流量卡信息"""
  268. url = "http://sim.brlink.cn/api/open/iotcard/card"
  269. payload = {
  270. 'iccid': self.iccid,
  271. }
  272. appkey = 'iaO2DKgS8KdlnVgU'
  273. appsecret = 'qzKgO4sBdzMrjRwv9H22S9ufepNv8Hl5ehPqkYVD31DCICjyKwqUdj7zihQQKfgx'
  274. auth = HTTPBasicAuth(appkey, appsecret)
  275. try:
  276. res = requests.post(url, json=payload, auth=auth)
  277. data = json.loads(res.text)
  278. except Exception as e:
  279. print(self.iccid,"合宙接口异常",e)
  280. data = {'code': 99999, 'msg': '接口调用异常异常'}
  281. return data
  282. def qp_sim_info(self):
  283. """ 获取企鹏(SIMBOSS)流量卡信息 """
  284. url = "https://api.simboss.com/2.0/device/detail"
  285. current_milli_time = lambda: int(round(time.time() * 1000))
  286. data_1 = "appid=%s&iccid=%s&timestamp=%s%s"%("102420177762",self.iccid,current_milli_time(),"6397d7e6a56589f1d93284e9800493e1")
  287. sign = hashlib.sha256(data_1.encode('utf-8')).hexdigest()
  288. data = {"appid": "102420177762", "iccid": self.iccid, "timestamp":current_milli_time(),"sign":sign}
  289. try:
  290. res = requests.post(url, data=data)
  291. data = json.loads(res.text)
  292. except Exception as e:
  293. print(self.iccid,"SIMBOSS接口异常",e)
  294. data = {'code': 99999, 'msg': '接口调用异常异常'}
  295. return data
  296. def xj_sim_info(self):
  297. # 信金
  298. xj_userid = 137
  299. xj_now = int(time.time())
  300. xj_apikey = "2ae46f82215a187ba22656db9a9848d8"
  301. xj_params = f"userId={xj_userid}&apikey={xj_apikey}&times={xj_now}"
  302. md5 = hashlib.md5()
  303. md5.update(xj_params.encode('utf-8'))
  304. xj_sign = (md5.hexdigest()).upper()
  305. url = f"http://hywx.xjict.com:32040/api/v1/getChaxun?userId={xj_userid}&cardno={self.iccid}&times={xj_now}&sign={xj_sign}"
  306. xj_ret = requests.get(
  307. url,
  308. timeout=(10,30)
  309. )
  310. xj_response = json.loads(xj_ret.text)
  311. xj_code = xj_response.get("code")
  312. if xj_code == 0:
  313. xj_st_dict = {
  314. "0":"未知",
  315. "00":"正常",
  316. "01":"单向停机",
  317. "02":"停机",
  318. "03":"预销号",
  319. "04":"销号/拆机",
  320. "05":"过户",
  321. "06":"休眠",
  322. "07":"待激",
  323. "08":"已停用",
  324. "09":"库存",
  325. "10":"已失效",
  326. "11":"违章停机",
  327. "12":"挂失",
  328. "13":"用户报停",
  329. "14":"测试",
  330. "99":"不存在"
  331. }
  332. xj_data = xj_response.get("data")
  333. autoname = xj_data.get("autoname")
  334. nub = None
  335. nub = 0
  336. if "M" in autoname:
  337. nubs = autoname.split("M")
  338. if nubs:
  339. nub = nubs[0]
  340. if nub and nub.isdigit():
  341. nub = int(nub)
  342. if "G" in autoname:
  343. nubs = autoname.split("G")
  344. if nubs:
  345. nub = nubs[0]
  346. if nub and nub.isdigit():
  347. nub = int(nub) * 1024
  348. return {
  349. "created_at": xj_data.get("shouchong_time"),
  350. "status": xj_st_dict.get(xj_data.get("state")),
  351. "total": nub,
  352. "used": int(xj_data.get("used")/1024) if xj_data.get("used") else 0,
  353. "expire": xj_data.get("expired_at"),
  354. "iccid": self.iccid,
  355. "package": autoname,
  356. "company": "信金",
  357. "code": False
  358. }
  359. else:
  360. return {}
  361. def get_sim_info(self):
  362. hz_data = self.hz_sim_info()
  363. if hz_data["code"] == 0: # 合宙
  364. sim_operators = 1
  365. account_status = self.hz_status[hz_data["data"]["account_status"]]
  366. if hz_data["data"]["active"] == 1:
  367. active_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(hz_data["data"]["active_date"]))
  368. data_plan = str(hz_data["data"]["data_plan"]) + "M"
  369. data_usage = str(hz_data["data"]["data_usage"]) + "M"
  370. data_balance = str(hz_data["data"]["data_balance"]) + "M"
  371. expiry_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(hz_data["data"]["expiry_date"]))
  372. else:
  373. active_date = "未激活"
  374. data_plan = "未激活"
  375. data_usage = "未激活"
  376. data_balance = "未激活"
  377. expiry_date = "未激活"
  378. else:
  379. qp_data = self.qp_sim_info()
  380. if qp_data["code"] == "0":
  381. sim_operators = 2
  382. account_status = self.qp_status[qp_data["data"]["status"]]
  383. active_date = qp_data["data"].get("startDate","")
  384. if active_date:
  385. if qp_data["data"]["useCountAsVolume"] == False:
  386. data_plan = str(qp_data["data"]["totalDataVolume"]) + "M"
  387. data_usage = str(qp_data["data"]["usedDataVolume"]) + "M"
  388. data_balance = str(qp_data["data"]["totalDataVolume"] - qp_data["data"]["usedDataVolume"]) + "M"
  389. else:
  390. data_plan = str(qp_data["data"]["totalDataVolume"] * 1024) + "M"
  391. data_usage = str(qp_data["data"]["usedDataVolume"] * 1024) + "M"
  392. data_balance = str((qp_data["data"]["totalDataVolume"] - qp_data["data"]["usedDataVolume"])*1024) + "M"
  393. expiry_date = qp_data["data"]["expireDate"]
  394. else:
  395. data_plan = "未激活"
  396. data_usage = "未激活"
  397. data_balance = "未激活"
  398. expiry_date = "未激活"
  399. else:
  400. try:
  401. # 增加信金厂商
  402. xj_data = self.xj_sim_info()
  403. if xj_data:
  404. sim_operators = 4
  405. account_status = xj_data.get("status")
  406. active_date = xj_data.get("created_at")
  407. data_plan = str(xj_data.get("total")) + "M"
  408. data_usage = str(xj_data.get("used")) + "M"
  409. data_balance = str(xj_data.get("total") - xj_data.get("used")) + "M"
  410. expiry_date = xj_data.get("expire")
  411. else:
  412. sim_operators = 3
  413. account_status = "未知"
  414. active_date = "未知"
  415. data_plan = "未知"
  416. data_usage = "未知"
  417. data_balance = "未知"
  418. expiry_date = "未知"
  419. except Exception as e:
  420. sim_operators = 3
  421. account_status = "未知"
  422. active_date = "未知"
  423. data_plan = "未知"
  424. data_usage = "未知"
  425. data_balance = "未知"
  426. expiry_date = "未知"
  427. return sim_operators,account_status,active_date,data_plan,data_usage,data_balance,expiry_date
  428. if __name__ == "__main__":
  429. sim_operators,account_status,active_date,data_plan,data_usage,data_balance,expiry_date = GetSIMInfo("898604F81623D0432214").get_sim_info()
  430. print(sim_operators,account_status,active_date,data_plan,data_usage,data_balance,expiry_date)