Seite 1 von 1

ARP / Termux / MAC adressen /

Verfasst: Freitag 2. September 2016, 14:21
von bastler123
Hallo, ich bin auf der Suche nach etwas Hilfe, was python angeht:

Kurze Vorgeschichte: Python läuft auf einem Android-Tablet über Termux,
ich möchte die ARP-Pakete der Amazon-Dash-Buttons abfangen um damit ein Event der Tasker-App zu starten.


Online habe ich jetzt einige Schnipsel gefunden, bzw hat mir ein User im Android-Forum geholfen, jedoch wollte ich nun zu den Python-experten gehen, wenn's ums zusammenfügen geht ^^
evt ums vereinfachen

auf dem Tablet läuft jetzt Python 3

Box 1 - Das amerikanische Original, welche die ARP-Pakete abfängt
Box 2 - Die Ping variante,

Könnt ihr mir helfen das zusammenzufügen ?
sodass er zwar nach ARP/der MAC adresse sucht, aber dann den Tasker-befehl ausführt ? ^^

Vielen Dank

Grüße !

Code: Alles auswählen

import socket
import struct
import binascii
import time
import json
import urllib2
import datetime

# Use your own IFTTT key, not this fake one
ifttt_key = 'fakekey'
# the number of seconds after a dash button is pressed that it will not trigger another event
# the reason is that dash buttons may try to send ARP onto the network during several seconds
# before giving up
trigger_timeout = 5

# Replace these fake MAC addresses and nicknames with your own
# the nickname of the dash buttons is what will be used as the event name
# when triggering the IFTTT maker channel, e.g. https://maker.ifttt.com/trigger/<nickname>/with/key/<ifttt_key>
macs = {
    '747500000001' : 'dash_gerber',
    '747500000002' : 'dash_elements1',
    '747500000003' : 'dash_elements2',
    '747500000004' : 'dash_cottonelle',
    '747500000005' : 'dash_huggies'
}

# for recording the last time the event was triggered to avoid multiple events fired
# for one press on the dash button
trigger_time = {}

# Trigger a IFTTT URL where the event is the same as the strings in macs (e.g. dash_gerber)
# Body includes JSON with timestamp values.
def trigger_url_generic(trigger):
    data = '{ "value1" : "' + time.strftime("%Y-%m-%d") + '", "value2" : "' + time.strftime("%H:%M") + '" }'
    req = urllib2.Request( 'https://maker.ifttt.com/trigger/'+trigger+'/with/key/'+ifttt_key , data, {'Content-Type': 'application/json'})
    f = urllib2.urlopen(req)
    response = f.read()
    f.close()
    return response

def record_trigger(trigger):
    print 'triggering '+ trigger +' event, response: ' + trigger_url_generic(trigger)

def is_within_secs(last_time, diff):
    return (datetime.datetime.now() - last_time).total_seconds() < (diff +1)

# check if event has triggered within the timeout already
def has_already_triggered(trigger):
    global trigger_time
    
    if trigger in trigger_time:
        if (is_within_secs(trigger_time[trigger], trigger_timeout)):
            return True

    trigger_time[trigger] = datetime.datetime.now()
    return False



rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003))

while True:
    packet = rawSocket.recvfrom(2048)
    ethernet_header = packet[0][0:14]
    ethernet_detailed = struct.unpack("!6s6s2s", ethernet_header)
    # skip non-ARP packets
    ethertype = ethernet_detailed[2]
    if ethertype != '\x08\x06':
        continue
    arp_header = packet[0][14:42]
    arp_detailed = struct.unpack("2s2s1s1s2s6s4s6s4s", arp_header)
    source_mac = binascii.hexlify(arp_detailed[5])
    source_ip = socket.inet_ntoa(arp_detailed[6])
    dest_ip = socket.inet_ntoa(arp_detailed[8])
    if source_mac in macs:
        
        if has_already_triggered(macs[source_mac]):
            print "Culled duplicate trigger " + macs[source_mac]
        else:
            record_trigger(macs[source_mac])

    elif source_ip == '0.0.0.0':
        print "Unknown dash button detected with MAC " + source_mac

Code: Alles auswählen

# hier ip adressen der anderen geräte (feste ip's für die geräte im router festlegen)
ips = {
    '192.168.178.25' : 'Mein PC',
    '192.168.178.26' : 'Handy X',
    '192.168.178.45' : 'PC Y',
    '192.168.178.76' : 'Tablet Z'
}

def starttask(taskname):
    cmd = subprocess.getstatusoutput("am broadcast -a net.dinglisch.android.tasker.ACTION_TASK -e task_name "+taskname)
    if cmd[0] != 0:
        # show error code
        print(cmd[0])

rawSocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)

while True:
    packet = rawSocket.recvfrom(2048)
    pingfrom = packet[1][0]
    if pingfrom in ips:
        # do something
        curtime = time.strftime("%H-%M-%S", time.localtime())
        print( "ping von %s um %s" %(ips[pingfrom],curtime) )
        starttask("PlayRadio")