Skip to content

Instantly share code, notes, and snippets.

@mjg59
Created June 22, 2016 07:33
Show Gist options
  • Save mjg59/3446f9265c2643b550e9e4db0d1bfce1 to your computer and use it in GitHub Desktop.
Save mjg59/3446f9265c2643b550e9e4db0d1bfce1 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
import os
import socket
def encode_packet(data):
output = bytearray()
for i in range(0, len(data)):
tmpoutput = bytearray([0, data[i]])
output.extend(tmpoutput)
return output
def get_mac(address, ping=False):
if ping:
os.system("ping >/dev/null -c 1 -W 1 " + address)
with open("/proc/net/arp", "r") as f:
for line in f:
data = line.split()
if data[0] == address:
return data[3]
return None
def generate_packet(address, mcmd, scmd):
mac = get_mac(address)
if mac == None:
mac = get_mac(address, ping=True)
macdata = mac.split(":")
payload = bytearray([0x00, 0x00, 0x09, 0xaa, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, int(macdata[0], 16), int(macdata[1], 16), int(macdata[2], 16), int(macdata[3], 16), int(macdata[4], 16), int(macdata[5], 16), 0x00, 0x00, mcmd, scmd])
packet = bytearray([0x00, 0x31, 0x11])
encodedpayload = encode_packet(payload)
packet.extend(encodedpayload)
checksum = 0
for i in range(1, len(packet)):
checksum += packet[i]
checksum = checksum & 0xff
packet.append(checksum)
packet.append(0xff)
return packet
def on(address):
packet = generate_packet(address, 1, 1)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(packet, (address, 1025))
def off(address):
packet = generate_packet(address, 1, 2)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(packet, (address, 1025))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment