我正在尝试制作一个 python 代码,该代码将自动检测罗德和施瓦茨示波器的 IP 地址或使用以太网连接连接到我的笔记本电脑的任何测试设备。
我工作场所的 R&S 示波器的 IP 地址始终以相同的两个数字 169.254.XX 开头,但诀窍是示波器的 IP 地址仅在我使用其 IP 地址访问示波器时出现在 arp -a 报告中我的浏览器。之后 IP 出现在 arp 报告中,但之前没有 IP 地址。
因此,我编写了以下代码,认为它可以工作,但由于在浏览器的 URL 栏中键入 IP 地址之前未显示 IP 地址,因此它不起作用。我的目标是通过单击计算机上的一个按钮来确定示波器的 IP 地址,而不是点击示波器的触摸屏来找出设备的 IP 地址。
import tkinter as tk
import time
import threading
import queue
import subprocess
root = tk.Tk()
root.title("SCPI test")
canvas1 = tk.Canvas(root, width=200, height=140, bg='lightsteelblue2', relief='raised')
canvas1.pack()
q1 = queue.Queue()
q2 = queue.Queue()
def auto_detect_ip(num1, num2, num3, num4):
ping_list = []
ping_ok_list = []
t1 = time.time()
for i in range(num1, num2, -1):
for j in range(num3, num4, -1):
temp = "169.254." + str(i) + "." + str(j)
# temp = "192.168.1.1"
try:
p = subprocess.run(["ping", "-n", "1", temp], stdout=subprocess.PIPE, timeout=float(timeout_value))
# p = subprocess.run(["ping", "-n", "1", temp], stdout=subprocess.PIPE, timeout=0.006)
return_code = p.returncode
print("return_code :", return_code)
if return_code == 0:
print("ip_address :", temp)
ping_ok_list.append(temp)
break
except subprocess.TimeoutExpired:
pass
time.sleep(0.00001)
else:
continue
break
len_list_ping = len(ping_list)
print("len_list_ping :", len_list_ping)
print("ping_ok_list :", ping_ok_list)
t2 = time.time()
print("time :", t2 - t1)
if num4 == 0:
q1.put(ping_ok_list)
else:
q2.put(ping_ok_list)
def launch_thread():
print("scan running")
thread_1 = threading.Thread(target=auto_detect_ip, args=(254, 0, 128, 0))
thread_2 = threading.Thread(target=auto_detect_ip, args=(254, 0, 254, 128))
thread_1.setDaemon(True)
thread_2.setDaemon(True)
thread_1.start()
thread_2.start()
def found_rs_scope():
launch_thread()
ping_ok_list = q1.get() + q2.get
print("IP_list :", ping_ok_list)
我的解决方案是扫描每个 IP 地址以查找范围一,但由于在通过浏览器访问范围之前,IP 没有出现在提示中的 arp -a 中。所以在扫描过程中没有匹配,也没有找到 IP。我认为这应该是可行的,但我只是不知道该怎么做。此外,我希望能够在不需要管理员权限的情况下找到范围的 IP 地址。