Created
November 30, 2012 19:32
-
-
Save kevinoconnor7/4177986 to your computer and use it in GitHub Desktop.
MagTek RCS reader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# MagTek MSR100 Mini Swipe Card Reader | |
# Written By: Jeffrey Ness | |
# | |
# Some Thanks need to go out to | |
# http://www.micahcarrick.com/credit-card-reader-pyusb.html | |
# for helping me get on the right track | |
import usb.core | |
import usb.util | |
import atexit | |
import math | |
import time | |
import json | |
import LCDDriver | |
import httplib, urllib | |
from re import findall | |
from datetime import datetime | |
# MagTek Device MSR100 Mini Swipe | |
vendorid = 0x0801 | |
productid = 0x0001 | |
# Define our Character Map per Reference Manual | |
# http://www.magtek.com/documentation/public/99875206-17.01.pdf | |
chrMap = { | |
4: 'a', | |
5: 'b', | |
6: 'c', | |
7: 'd', | |
8: 'e', | |
9: 'f', | |
10: 'g', | |
11: 'h', | |
12: 'i', | |
13: 'j', | |
14: 'k', | |
15: 'l', | |
16: 'm', | |
17: 'n', | |
18: 'o', | |
19: 'p', | |
20: 'q', | |
21: 'r', | |
22: 's', | |
23: 't', | |
24: 'u', | |
25: 'v', | |
26: 'w', | |
27: 'x', | |
28: 'y', | |
29: 'z', | |
30: '1', | |
31: '2', | |
32: '3', | |
33: '4', | |
34: '5', | |
35: '6', | |
36: '7', | |
37: '8', | |
38: '9', | |
39: '0', | |
40: 'KEY_ENTER', | |
41: 'KEY_ESCAPE', | |
42: 'KEY_BACKSPACE', | |
43: 'KEY_TAB', | |
44: ' ', | |
45: '-', | |
46: '=', | |
47: '[', | |
48: ']', | |
49: '\\', | |
51: ';', | |
52: '\'', | |
53: '`', | |
54: ',', | |
55: '.', | |
56: '/', | |
57: 'KEY_CAPSLOCK' | |
} | |
shiftchrMap = { | |
4: 'A', | |
5: 'B', | |
6: 'C', | |
7: 'D', | |
8: 'E', | |
9: 'F', | |
10: 'G', | |
11: 'H', | |
12: 'I', | |
13: 'J', | |
14: 'K', | |
15: 'L', | |
16: 'M', | |
17: 'N', | |
18: 'O', | |
19: 'P', | |
20: 'Q', | |
21: 'R', | |
22: 'S', | |
23: 'T', | |
24: 'U', | |
25: 'V', | |
26: 'W', | |
27: 'X', | |
28: 'Y', | |
29: 'Z', | |
30: '!', | |
31: '@', | |
32: '#', | |
33: '$', | |
34: '%', | |
35: '^', | |
36: '&', | |
37: '*', | |
38: '(', | |
39: ')', | |
40: 'KEY_ENTER', | |
41: 'KEY_ESCAPE', | |
42: 'KEY_BACKSPACE', | |
43: 'KEY_TAB', | |
44: ' ', | |
45: '_', | |
46: '+', | |
47: '{', | |
48: '}', | |
49: '|', | |
51: ':', | |
52: '"', | |
53: '~', | |
54: '<', | |
55: '>', | |
56: '?', | |
57: 'KEY_CAPSLOCK' | |
} | |
# exit function | |
def goodbye(): | |
screen.ClearScreen() | |
screen.WriteLine("Error! Contact", 1, 1) | |
screen.WriteLine("Union Sysadmins", 2, 1) | |
# find the LCDScreen and initilize it | |
screen = LCDDriver.LCDDriver('/dev/ttyUSB0') | |
if screen is False: | |
raise Exception('Could not find LCD Screen') | |
screen.ClearScreen() | |
screen.WriteLine("Starting up...",1,2) | |
# find our device by id | |
device = usb.core.find(idVendor=vendorid, idProduct=productid) | |
if device is None: | |
raise Exception('Could not find USB Card Reader') | |
# remove device from kernel, this should stop | |
# reader from printing to screen and remove /dev/input | |
if device.is_kernel_driver_active(0): | |
try: | |
device.detach_kernel_driver(0) | |
except usb.core.USBError as e: | |
raise Exception("Could not detatch kernel driver: %s" % str(e)) | |
atexit.register(goodbye) | |
# load our devices configuration | |
try: | |
device.set_configuration() | |
device.reset() | |
except usb.core.USBError as e: | |
raise Exception("Could not set configuration: %s" % str(e)) | |
# get device endpoint information | |
endpoint = device[0][(0,0)][0] | |
def cleardevice(): | |
'''Clear the devices memory''' | |
while True: | |
try: | |
results = device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize) | |
except usb.core.USBError as e: | |
if e.args[1] == 'Operation timed out' : | |
break # timeout and swiped means we are done | |
def swipeme(): | |
'''Swipe function''' | |
swiped = False | |
display = False | |
datalist = [] | |
cleardevice() | |
screen.ClearScreen() | |
screen.WriteLine("Please swipe",1,1) | |
screen.WriteLine("your card now",2,1) | |
# print 'Please swipe your card now:' | |
while True: | |
try: | |
results = device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize) | |
datalist.append(results) | |
swiped = True | |
except usb.core.USBError as e: | |
if e.args[1] == 'Operation timed out' and swiped: | |
break # timeout and swiped means we are done | |
if swiped is True and display is False: | |
display = True | |
screen.ClearScreen() | |
screen.WriteLine("Processing...",1,1) | |
screen.WriteLine("Please wait...",2,1) | |
# create a list of 8 bit bytes and remove | |
# empty bytes | |
ndata = [] | |
for d in datalist: | |
if d.tolist() != [0, 0, 0, 0, 0, 0, 0, 0]: | |
ndata.append(d.tolist()) | |
# parse over our bytes and create string to final return | |
sdata = '' | |
for n in ndata: | |
# handle non shifted letters | |
if n[2] in chrMap and n[0] == 0: | |
sdata += chrMap[n[2]] | |
# handle shifted letters | |
elif n[2] in shiftchrMap and n[0] == 2: | |
sdata += shiftchrMap[n[2]] | |
return sdata | |
# run first swipe | |
while 1: | |
sdata = swipeme() | |
# A format type of E is a error | |
while sdata[1] == 'E': | |
screen.ClearScreen() | |
screen.WriteLine("Error!",1,1) | |
time.sleep(2) | |
# print 'Failed to read card..' | |
sdata = swipeme() | |
params = urllib.urlencode({'rawdata': sdata}) | |
headers = {"Content-type": "application/x-www-form-urlencoded", | |
"Accept": "text/plain"} | |
try: | |
conn = httplib.HTTPConnection("files.kevin-oconnor.com") | |
conn.request("POST", "/json.php", params, headers) | |
response = conn.getresponse() | |
except Exception as e: | |
screen.ClearScreen() | |
screen.WriteLine("Error!",1,1) | |
time.sleep(2) | |
continue | |
try: | |
data = json.loads(response.read()) | |
except Exception as e: | |
screen.ClearScreen() | |
screen.WriteLine("Error!",1,1) | |
time.sleep(2) | |
continue | |
conn.close() | |
print data | |
screen.ClearScreen() | |
screen.WriteLine("Hi " + data['user']['rcs'] + "!", 1, 1) | |
punch_type = "In" | |
if data['punch']['type'] == 1: | |
punch_type = "Out" | |
screen.WriteLine(punch_type + ' at ' + time.strftime("%H:%M:%S", datetime.fromtimestamp(data['punch']['date']).timetuple()), 2, 1) | |
time.sleep(5) | |
# print raw string always | |
# print '\nRaw String: %s\n' % sdata |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment