diff --git a/README.md b/README.md index b022bca..934899f 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,26 @@ pyzk is an unofficial library of zksoftware the fingerprint attendance machine. # Installation -[![Build Status](https://travis-ci.org/fananimi/pyzk.svg?branch=master)](https://travis-ci.org/fananimi/pyzk) +[![Build Status](https://travis-ci.org/kurenai-ryu/pyzk.svg?branch=master)](https://travis-ci.org/kurenai-ryu/pyzk) -`pip install pyzk` +replace original pyzk, if it was installed +`pip install -U git+https://github.com/kurenai-ryu/pyzk.git` + +or clone and execute: +`python setup.py install` + +or in your project, append the path of this project + +```python +import sys +import os +sys.path.insert(1,os.path.abspath("./pyzk")) +from zk import ZK, const +``` # Documentation -Complete documentation can be found at [Readthedocs](http://pyzk.readthedocs.io/en/latest/ "pyzk's readthedocs") . +Complete documentation of the original project can be found at [Readthedocs](http://pyzk.readthedocs.io/en/latest/ "pyzk's readthedocs") . # Api Usage @@ -207,7 +220,7 @@ optional arguments: -r, --records Get attendance records -u, --updatetime Update Date/Time -l, --live-capture Live Event Capture --o, --open-door Open door + -o, --open-door Open door -D DELETEUSER, --deleteuser DELETEUSER Delete a User (uid) diff --git a/zk/base.py b/zk/base.py index 42363fd..76d6920 100644 --- a/zk/base.py +++ b/zk/base.py @@ -153,14 +153,14 @@ class ZK(object): MODIFIED now, without initial checksum ''' #checksum = 0 always? for calculating - buf = pack('HHHH', command, 0, session_id, reply_id) + command_string + buf = pack('<4H', command, 0, session_id, reply_id) + command_string buf = unpack('8B' + '%sB' % len(command_string), buf) checksum = unpack('H', self.__create_checksum(buf))[0] reply_id += 1 if reply_id >= const.USHRT_MAX: reply_id -= const.USHRT_MAX - buf = pack('HHHH', command, checksum, session_id, reply_id) + buf = pack('<4H', command, checksum, session_id, reply_id) return buf + command_string def __create_checksum(self, p): @@ -212,12 +212,12 @@ class ZK(object): self.__tcp_length = self.__test_tcp_top(self.__tcp_data_recv) if self.__tcp_length == 0: raise ZKNetworkError("TCP Packet invalid") - self.__header = unpack('HHHH', self.__tcp_data_recv[8:16]) + self.__header = unpack('<4H', self.__tcp_data_recv[8:16]) self.__data_recv = self.__tcp_data_recv[8:] # dirty hack else: self.__sock.sendto(buf, self.__address) self.__data_recv = self.__sock.recv(response_size) - self.__header = unpack('HHHH', self.__data_recv[:8]) + self.__header = unpack('<4H', self.__data_recv[:8]) except Exception as e: raise ZKNetworkError(str(e)) @@ -296,7 +296,7 @@ class ZK(object): return d def __decode_timehex(self, timehex): """timehex string of six bytes""" - year, month, day, hour, minute, second = unpack("BBBBBB", timehex) + year, month, day, hour, minute, second = unpack("6B", timehex) year += 2000 d = datetime(year, month, day, hour, minute, second) return d @@ -585,25 +585,25 @@ class ZK(object): cmd_response = self.__send_command(command,b'', response_size) if cmd_response.get('status'): if self.verbose: print(codecs.encode(self.__data,'hex')) - size = len(self.__data) - if size == 80: - fields = unpack('iiiiiiiiiiiiiiiiiiii', self.__data) - else: #92? - fields = unpack('iiiiiiiiiiiiiiiiiiiiiii', self.__data[:92]) #dirty hack! we need more information - self.users = fields[4] - self.fingers = fields[6] - self.records = fields[8] - self.dummy = fields[10] #??? - self.cards = fields[12] - self.fingers_cap = fields[14] - self.users_cap = fields[15] - self.rec_cap = fields[16] - self.fingers_av = fields[17] - self.users_av = fields[18] - self.rec_av = fields[19] - if len(fields) > 20: - self.faces = fields[20] - self.faces_cap = fields[22] + size = len(self.__data) + if len(self.__data) >= 80: + fields = unpack('20i', self.__data[:80]) + self.users = fields[4] + self.fingers = fields[6] + self.records = fields[8] + self.dummy = fields[10] #??? + self.cards = fields[12] + self.fingers_cap = fields[14] + self.users_cap = fields[15] + self.rec_cap = fields[16] + self.fingers_av = fields[17] + self.users_av = fields[18] + self.rec_av = fields[19] + self.__data = self.__data[80:] + if len(self.__data) >= 12: #face info + fields = unpack('3i', self.__data[:12]) #dirty hack! we need more information + self.faces = fields[0] + self.faces_cap = fields[2] return True else: raise ZKErrorResponse("can't read sizes") @@ -979,7 +979,7 @@ class ZK(object): return None recieved = len(data_recv) if self.verbose: print ("recieved {}, size {} rec {}".format(recieved, size, data_recv.encode('hex'))) #todo python3 - tcp_length = unpack('HHI', data_recv[:8])[2] #bytes+8 + tcp_length = unpack('= (bytes + 32): #complete - if response == const.CMD_DATA: - resp = data_recv[16:bytes+16] # no ack? - if self.verbose: print ("resp len", len(resp)) - return resp - else: - if self.verbose: print("broken packet!!!") - return '' #broken - else: # incomplete - data.append(data_recv[16:]) # w/o tcp and header - bytes -= recieved-16 - while bytes>0: #jic - data_recv = self.__sock.recv(bytes) #ideal limit? - recieved = len(data_recv) - data.append(data_recv) # w/o tcp and header - bytes -= recieved - data_recv = self.__sock.recv(16) - response = unpack('HHHH', data_recv[8:16])[0] - if response == const.CMD_ACK_OK: - return b''.join(data) - #data_recv[bytes+16:].encode('hex') #included CMD_ACK_OK - if self.verbose: print("bad response %s" % data_recv) - if self.verbose: print (data) - return '' - #else udp - while True: #limitado por respuesta no por tamaño - data_recv = self.__sock.recv(response_size) - response = unpack('HHHH', data_recv[:8])[0] - if self.verbose: print ("# packet response is: {}".format(response)) - if response == const.CMD_DATA: - data.append(data_recv[8:]) #header turncated - bytes -= 1024 #UDP - elif response == const.CMD_ACK_OK: - break #without problem. - else: - #truncado! continuar? - if self.verbose: print ("broken!") - break - if self.verbose: print ("still needs %s" % bytes) - return b''.join(data) def read_with_buffer(self, command, fct=0 ,ext=0): """ Test read info with buffered command (ZK6: 1503) """