2024-09-27 23:21:58 发布
网友
我有一个Python脚本,它从一个智能插头检索测量数据,这样我就可以在我的rasbperiry Pi上看到它。在
此命令获取数据
send_hs_command("192.168.1.26", 9999, b'{"emeter":{"get_realtime":{}}}')
这就是定义
我的问题是,如果我把智能插头带到别的地方,它就会 一个新的IP地址,这意味着我必须在Python脚本中不断重写它。这不是我的选择。最简单的解决方案是什么?谢谢
我没有圆周率来运行这个。在
如果目标(智能插头)的IP地址是可变的,您可以不使用预先确定的主机名(位于'/etc/hostname')来代替吗?在
'/etc/hostname'
socket库提供了一些方便的函数
socket
你可以先用 gethostbyaddr获取主机名(如果您还没有主机名信息)。 从那时起,您可以使用已知的主机名并使用 create_connection建立连接。在
但是,如果您想使用更动态的东西,我建议使用MAC地址作为密钥。 请注意,运行scapy可能依赖于tcpdump在覆盆子Pi上运行可能会耗尽CPU。 请看下面的片段:
scapy
tcpdump
import socket import time import sys from scapy.all import * def send_hs_command(address, port, cmd): data = b"" tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: tcp_sock.connect((address, port)) tcp_sock.send(encrypt(cmd)) data = tcp_sock.recv(2048) except socket.error: print(time.asctime( time.localtime(time.time()) ), "Socket closed.", file=sys.stderr) finally: tcp_sock.close() print(data) return data def get_ip_from_mac(): # Match ARP requests packet_list = sniff(filter="arp", count=10) # increase number of arp counts for i in packet_list: # Show all ARP requests # print(i[Ether].src, "is broadcasting IP", i[ARP].psrc) if (i[ARP].hwsrc == '00:0c:29:b6:f4:be'): # target MAC address return (True, i[ARP].psrc) return (False, '') def main(): result = get_ip_from_mac() if result[0] == True: print("Succeeded to reach server") send_hs_command(result[1], 22, b'{"emeter":{"get_realtime":{}}}') else: # logic to retry or graciously fail print("Failed to reach server") if __name__== "__main__": main()
我没有圆周率来运行这个。在
如果目标(智能插头)的IP地址是可变的,您可以不使用预先确定的主机名(位于
'/etc/hostname'
)来代替吗?在socket
库提供了一些方便的函数你可以先用 gethostbyaddr获取主机名(如果您还没有主机名信息)。 从那时起,您可以使用已知的主机名并使用 create_connection建立连接。在
但是,如果您想使用更动态的东西,我建议使用MAC地址作为密钥。 请注意,运行
scapy
可能依赖于tcpdump
在覆盆子Pi上运行可能会耗尽CPU。 请看下面的片段:相关问题 更多 >
编程相关推荐