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