p.s. Фото желаемого результата (+сам скрипт) ниже. Спасибо.
from pysnmp.entity.rfc3413.oneliner import cmdgen import tkinter as tk def get_data_from_sensor(ip): cmdGen = cmdgen.CommandGenerator() errorIndication, errorStatus, errorIndex, \ varBindTable = cmdgen.CommandGenerator().bulkCmd( cmdgen.CommunityData('test-agent', 'community'), cmdgen.UdpTransportTarget((ip, 161)), 0, 25, ('1.3.6.1.4.1.41927.2.15.2.6'), # Температура ('1.3.6.1.4.1.41927.2.15.2.7'), # Вольтаж ('1.3.6.1.4.1.41927.2.15.2.1'), # Входящий оптический сигнал ('1.3.6.1.4.1.41927.2.15.1.4'), # Время работы ) if errorIndication: return errorIndication else: if errorStatus: return'%s at %s' % ( errorStatus.prettyPrint(), errorIndex and varBindTable[-1][int(errorIndex) - 1] or '?' ) else: data = [] for varBindTableRow in varBindTable: for name, val in varBindTableRow: data.append('%s = %s' % (name.prettyPrint(), val.prettyPrint())) return '\n'.join(data) def on_click(): ip = sv.get() text = get_data_from_sensor(ip) text_area.insert(1.0, text) root = tk.Tk() sv = tk.StringVar() lbl = tk.Label(text='введите ip').pack() entry = tk.Entry(textvariable=sv, width=50) entry.pack() btn = tk.Button(text='получить данные', command=on_click) btn.pack() text_area = tk.Text(width=50, height=10) text_area.pack() root.mainloop()
xam1816Знали бы вы, как выручили. На форуме отблагодарил, но вопрос еще в том, как сделать, что бы вместо OID типа
попробуйте
SNMPv2-SMI::enterprises.41927.2.15.2.6.0
translates = { "SNMPv2-SMI::enterprises.41927.2.15.2.6.0": "Сигнал оптический", "SNMPv2-SMI::enterprises.41927.2.15.1.4.0": "Сигнал атаке", } # потом преобразуете по нему значения data.append('%s = %s' % (translates.get(name.prettyPrint()), val.prettyPrint())) # или более современно data.append(f"{translates.get(name.prettyPrint())} = {val.prettyPrint()}")
ZerGСпасибо за внимание. Будет время обязательно попробую
Создаете словарь типа
from pysnmp.entity.rfc3413.oneliner import cmdgen from datetime import datetime import tkinter as tk def get_data_from_sensor(ip): cmdGen = cmdgen.CommandGenerator() errorIndication, errorStatus, errorIndex, \ varBindTable = cmdgen.CommandGenerator().bulkCmd( cmdgen.CommunityData('test-agent', 'public'), cmdgen.UdpTransportTarget((ip, 161)), 0, 25, ('1.3.6.1.4.1.41927.2.15.2.6'), # Температура ('1.3.6.1.4.1.41927.2.15.2.7'), # Вольтаж ('1.3.6.1.4.1.41927.2.15.2.1'), # Входящий оптический сигнал ('1.3.6.1.4.1.41927.2.15.1.4'), # Время работы ) if errorIndication: return errorIndication else: if errorStatus: return'%s at %s' % ( errorStatus.prettyPrint(), errorIndex and varBindTable[-1][int(errorIndex) - 1] or '?' ) else: out = {} dictData = {'SNMPv2-SMI::enterprises.41927.2.15.2.6.0': 'Температура', 'SNMPv2-SMI::enterprises.41927.2.15.2.7.0': 'Вольтаж', 'SNMPv2-SMI::enterprises.41927.2.15.2.1.0': 'Входящий оптический сигнал', 'SNMPv2-SMI::enterprises.41927.2.15.1.4.0': 'Время работы' } for varBindTableRow in varBindTable: for name, val in varBindTableRow: out.update({dictData[name.prettyPrint()]: val.prettyPrint()}) return out def format_data(data): out = '' for k, v in data.items(): if k == 'Время работы': out += f'{k} = {datetime.fromtimestamp(v).strftime("%H:%M:%S")}\n' else: out += f'{k} = {v}\n' return out def on_click(): ip = sv.get() data = get_data_from_sensor(ip) text = format_data(data) text_area.insert(1.0, text) root = tk.Tk() sv = tk.StringVar() lbl = tk.Label(text='IP ОП FORO').pack() entry = tk.Entry(textvariable=sv, width=60) entry.pack() btn = tk.Button(text='получить данные', command=on_click) btn.pack() text_area = tk.Text(width=60, height=5) text_area.pack() root.mainloop()
xam1816Ход мыслей вроде более менее понятен) Только код срабатывает без каких либо изменений.
return out
'Время работы' != 'время работы'
d = {"Время работы": 1, "время работы": 2} for key, value in d.items(): if key == "Время работы": print(f"{key}:{value} is matched.") else: print(f"{key}:{value} is NOT matched.")
Stepan89да, там “время работы” с большой буквы нужно сделать, исправил
Только код срабатывает без каких либо изменений.
if k == 'Время работы': out += f'{k} = {datetime.fromtimestamp(v).strftime("%H:%M:%S")}\n'