如果地址发生更改,如何将设备的IP地址合并到Python脚本中

2024-09-27 23:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python脚本,它从一个智能插头检索测量数据,这样我就可以在我的rasbperiry Pi上看到它。在

此命令获取数据

send_hs_command("192.168.1.26", 9999, b'{"emeter":{"get_realtime":{}}}')

这就是定义

^{2}$

我的问题是,如果我把智能插头带到别的地方,它就会 一个新的IP地址,这意味着我必须在Python脚本中不断重写它。这不是我的选择。最简单的解决方案是什么?谢谢


Tags: 数据命令脚本sendget定义智能地方
1条回答
网友
1楼 · 发布于 2024-09-27 23:21:58

我没有圆周率来运行这个。在

如果目标(智能插头)的IP地址是可变的,您可以不使用预先确定的主机名(位于'/etc/hostname')来代替吗?在

socket库提供了一些方便的函数

你可以先用 gethostbyaddr获取主机名(如果您还没有主机名信息)。 从那时起,您可以使用已知的主机名并使用 create_connection建立连接。在

但是,如果您想使用更动态的东西,我建议使用MAC地址作为密钥。 请注意,运行scapy可能依赖于tcpdump在覆盆子Pi上运行可能会耗尽CPU。 请看下面的片段:

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()

相关问题 更多 >

    热门问题