У меня нет Пи для запуска.
Если 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()