Как включить IP-адрес устройства в скрипт Python, если адрес меняется - PullRequest
0 голосов
/ 06 мая 2019

У меня есть скрипт Python, который извлекает измеренные данные из смарт-плагина, чтобы я мог визуализировать их на своем Rasbperry Pi.

Эта команда получает данные

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

, и это определение

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

Моя проблема в том, что если я возьму Smart Plug где-то еще, он будет иметьновый IP-адрес, что означает, что я должен продолжать переписывать его на своем скрипте Python.Это не вариант для меня.Что было бы самым простым решением?Спасибо

1 Ответ

0 голосов
/ 06 мая 2019

У меня нет Пи для запуска.

Если IP-адрес цели (Smart Plug) является переменным, вы не можете вместо этого использовать предварительно определенное имя хоста (расположенное в '/etc/hostname')?

библиотека socket предоставляет несколько удобных функций;

Вы можете сначала использовать gethostbyaddr , чтобы получить имя хоста, если у вас еще нет информации об имени хоста. Затем с этого момента вы можете использовать известное имя хоста и использовать create_connection для установления соединения.

Однако, если вы хотите использовать что-то более динамичное; Я бы предложил использовать MAC-адрес в качестве ключа. Обратите внимание, что запуск scapy, который, возможно, зависит от tcpdump на Raspberry Pi, может привести к исчерпанию ресурсов процессора. Пожалуйста, взгляните на следующий фрагмент:

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