Kontrollera en Kwikset Smartcode låsa med en Intel Edison (2 / 6 steg)
Steg 2: Lägga till Kwikset protokoll skript
Nu öppnar ett nytt dokument och namn den kwikset_protocol.py med följande kommando
Vi kwikset_protocol.py
I detta fall jag använt vi, men du kan alltid installera och använda nano eller någon annan textredigerare som du väljer.
Detta är skriptet som innehåller alla kommandon för att kommunicera med din Kwikset lock över UART.
Klistra in följande kod i din fil, spara filen och avsluta din texteditor.
#! / usr/bin/python
# Det här är ett bibliotek för att ge tillgång till Kwikset Smartcode låser via UART
# H/w-gränssnittet är 3.3V 9600 baud 8N1 standard UART
# Detta är mer av en protokoll-kodare/avkodare men
# Du kan hitta mer information på randomwire.biz
från binascii import hexlify, unhexlify
pkt_count = 0
NO_DATA = ''
LOCK_CMD = "e703"
UNLOCK_CMD = "e705"
INIT_CMDS = ('e707', 'e74d', 'e702', 'e70a', 'e718', 'e709', 'e742', 'e70f')
INIT_DATAS = ('','','','','','', '01010101', '15031301471205')
PARSE_LOOKUP = {"e709": "parse_initack", "e727": "parse_lockstatus", "e729": "parse_newlockcode", "e742": "parse_error"}
def generate_packet(cmd,data):
globala pkt_count
pkt_count + = 1
längd = (len(cmd+data)/2) + 2
base_pkt = "% 0.2x%0.2x" % (längd, pkt_count) + cmd + data
pkt = "bd"+base_pkt+calculate_crc(base_pkt)
returnera pkt
def calculate_crc(pkt):
CRC = int("ff",16)
#print "Start crc = %0.2x"%crc
medan len(pkt) > 1:
CRC ^ = int(pkt[0:2],16)
#print "efter byte 0 x %s, CRC = %0.2 x, Len = %d"%(pkt[0:2],crc,len(pkt))
pkt = pkt [2:]
returnera "%0.2x"%crc
def validate_crc(pkt):
om calculate_crc(pkt) == '00':
Return True
annat:
returnera False
def parse_packet(pkt):
om pkt [0:2]! = "bd":
skriva ut "dåliga pakethuvud"
returnera False
om inte validate_crc(pkt[2:]):
skriva ut "Felaktigt paket CRC"
returnera False
om ((len(pkt)/2)-2)! = int(pkt[2:4],16):
skriva ut "dåliga paketlängden"
returnera False
CMD = pkt [6:10]
data = pkt [10:-2]
skriva ut "hittade cmd = %s & data=%s"%(cmd,data)
om cmd i PARSE_LOOKUP:
tolka = globals() [PARSE_LOOKUP [cmd]]
återgå parse(data)
Return True
def parse_initack(data):
om data == "64":
Return True
annat:
returnera False
def parse_lockstatus(data):
code_used = int(data[2:4],16)
status_bits = int(data[4:6],16)
om status_bits & 0x80:
orsaka = "Fjärrkontroll"
Elif status_bits & 0x40:
orsaka = "kod %d Entered"%(code_used)
Elif status_bits & 0x20:
orsaka = "Automatisk låsning"
annat:
orsaka = "Manual/nyckel"
om status_bits & 0x02:
lock_state = "Olåst"
Elif status_bits & 0x01:
lock_state = "Låst"
annat:
lock_state = "Okänd"
avkastning (lock_state, orsak)
def parse_newlockcode(data):
returnera data
def parse_error(data):
returnera data
def generate_init_packet(num):
återgå unhexlify(generate_packet(INIT_CMDS[num],INIT_DATAS[num]))
def generate_lock_packet():
återgå unhexlify(generate_packet(LOCK_CMD,''))
def generate_unlock_packet():
återgå unhexlify(generate_packet(UNLOCK_CMD,''))