main.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import os
  2. import re
  3. import json
  4. import redis
  5. import logging
  6. import asyncio
  7. from flask import Flask, request, render_template
  8. from asyncua import Client
  9. from datetime import datetime
  10. class SubHandler(object):
  11. r = None
  12. pool = None
  13. config = None
  14. def __init__(self):
  15. try:
  16. self.config = get_conf()
  17. redis_conf = self.config['redis_conf']
  18. ip = redis_conf['ip']
  19. self.pool = redis.ConnectionPool(host=ip, password='')
  20. self.r = redis.Redis(connection_pool=self.pool)
  21. except Exception as e:
  22. raise Exception("redis连接错误!")
  23. async def datachange_notification(self, node, val, data):
  24. print("Python: New data change event", node, val)
  25. def event_notification(self, event):
  26. print("Python: New event", event)
  27. app = Flask(__name__)
  28. # route
  29. @app.route("/get/", methods=['GET', 'POST'])
  30. def get():
  31. # 矿名key
  32. sys_key = request.values.get('sys_key')
  33. # 自动化系统key
  34. sys_name = request.values.get('sys_name')
  35. # 参数判断
  36. if sys_key is None or len(sys_key) == 0 or sys_name is None or len(sys_name) == 0:
  37. return "参数错误"
  38. # 获取对应配置
  39. base_conf = get_conf()
  40. # 获取opc服务地址
  41. sys_url = base_conf['sys_conf'][sys_key][sys_name]['opc_server_url']
  42. # 获取配置文件名
  43. sys_file_path = base_conf['sys_conf'][sys_key][sys_name]['path']
  44. sys_file_name = base_conf['sys_conf'][sys_key][sys_name]['file_name']
  45. # 获取点位数组
  46. point_conf = get_conf(sys_file_name, sys_file_path)
  47. try:
  48. # 取到配置
  49. point_base_dic = point_conf['sys_point']
  50. point_arr = []
  51. # 取点位数据
  52. # print(point_base_dic)
  53. for group in point_base_dic:
  54. for item in point_base_dic[group]:
  55. point_arr.append(item['key'])
  56. except Exception as e:
  57. print ("点位获取错误")
  58. raise Exception("点位获取错误!")
  59. # 根据服务地址获取Opc数据
  60. data = asyncio.run(get_opc_data(sys_url, point_arr, 2))
  61. # 显示请求地址IP
  62. # get_request_ip()
  63. for group in point_base_dic:
  64. for item in point_base_dic[group]:
  65. try:
  66. key = item['key']
  67. point_val = data[key]
  68. item['val'] = point_val
  69. finally:
  70. continue
  71. return point_base_dic
  72. def get_conf(file_name="config.json", file_path="./config"):
  73. path = f"{file_path}/{file_name}"
  74. with open(path, "r", encoding="utf-8") as f:
  75. content = json.load(f)
  76. f.close()
  77. return content
  78. async def get_opc_data(sys_url, point_arr, ns=2):
  79. if sys_url is None or point_arr is None:
  80. return
  81. url = sys_url
  82. async with Client(url=url) as client:
  83. handler = SubHandler()
  84. r = handler.r
  85. i = 0
  86. result_arr = {}
  87. print(datetime.now().strftime('Start_time:%Y-%m-%d %H:%M:%S.%f'))
  88. while i < len(point_arr):
  89. node = f"ns={ns};s={point_arr[i]}"
  90. tag = client.get_node(node)
  91. try:
  92. sub = await client.create_subscription(500, handler)
  93. print ("没毛病")
  94. except Exception as e:
  95. print(e.args)
  96. print ("设置监听错误")
  97. raise Exception("设置监听错误!")
  98. value = None
  99. print("获取value")
  100. try:
  101. value = await tag.read_value()
  102. print(value)
  103. # redis值
  104. # r.set(str(node), str(value))
  105. # 获取点位key
  106. arr_key = node.split("=")
  107. result_arr[arr_key[2]] = value
  108. # print(f"tag1 is: {tag} with value {value} ")
  109. i += 1
  110. if i == len(point_arr):
  111. print("Get Data Success")
  112. finally:
  113. print(f"node={node} 点位值获取错误")
  114. i += 1
  115. continue
  116. print(datetime.now().strftime('End_time:%Y-%m-%d %H:%M:%S.%f'))
  117. return result_arr
  118. def get_request_ip():
  119. ip = request.remote_addr
  120. logging.debug(ip)
  121. def api_get_error(msg):
  122. return '{"code":-1, "msg":"' + msg + '"}'
  123. if __name__ == '__main__':
  124. config = get_conf()
  125. port = config['server_port']
  126. app.run(
  127. host='0.0.0.0',
  128. port=config['server_port']
  129. )