Skip to content

Instantly share code, notes, and snippets.

@kevinoconnor7
Created November 30, 2012 19:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kevinoconnor7/4177986 to your computer and use it in GitHub Desktop.
Save kevinoconnor7/4177986 to your computer and use it in GitHub Desktop.
MagTek RCS reader
#!/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