def _test_tcp_get_template(self, helper, socket): """ can get empty? """ helper.return_value.test_ping.return_value = True # ping simulated helper.return_value.test_tcp.return_value = 0 # helper tcp ok socket.return_value.recv.side_effect = [ codecs.decode('5050827d08000000d0075fb2cf450100', 'hex'), # tcp CMD_ACK_OK codecs.decode('5050827d15000000d007acf93064160000941d0000941d0000b400be00', 'hex'), # ack ok with size 7572 codecs.decode('5050827d10000000dc05477830641700941d000000000100', 'hex'), #prepare data codecs.decode('5050827d08000000d00745b2cf451b00', 'hex'), # tcp random CMD_ACK_OK TODO: generate proper sequenced response #codecs.decode('5050827d08000000d00745b2cf451b00', 'hex') # tcp random CMD_ACK_OK TODO: generate proper sequenced response ] #begin zk = ZK('192.168.1.201', verbose=True) conn = zk.connect() socket.return_value.send.assert_called_with(codecs.decode('5050827d08000000e80317fc00000000', 'hex')) templates = conn.get_templates() self.assertEqual(len(templates), 6, "incorrect size %s" % len(templates)) #assert one user usu = users[3] self.assertIsInstance(usu.uid, int, "uid should be int() %s" % type(usu.uid)) if sys.version_info >= (3, 0): self.assertIsInstance(usu.user_id, (str, bytes), "user_id should be str() or bytes() %s" % type(usu.user_id)) else: self.assertIsInstance(usu.user_id, (str, unicode), "user_id should be str() or unicode() %s" % type(usu.user_id)) self.assertEqual(usu.uid, 4, "incorrect uid %s" % usu.uid) self.assertEqual(usu.user_id, "831", "incorrect user_id %s" % usu.user_id) self.assertEqual(usu.name, "NN-831", "incorrect uid %s" % usu.name) # generated conn.disconnect()
def test_tcp_get_template_1f(self, helper, socket): """ cchekc correct template 1 fixed""" helper.return_value.test_ping.return_value = True # ping simulated helper.return_value.test_tcp.return_value = 0 # helper tcp ok socket.return_value.recv.side_effect = [ codecs.decode('5050827d08000000d0075fb2cf450100', 'hex'), # tcp CMD_ACK_OK codecs.decode('5050827d10000000dc055558d0983200dc040000f0030000', 'hex'), # tcp PREPARE_DATA 1244 codecs.decode('5050827df8030000dd0500f4000032004d9853533231000004dbda0408050709ced000001cda69010000008406316adb0c0012062900d000aad221001600390caf001cdbb106240031007e033bdb3b00e9067700850083d42b004300c503f40043dbd6037b005000460ea7db5900910f90009f0012d5e7005c00970a5f006ddb930fa1009a00560f86db9d00820e86006f007dd3f400ab00a60fcd01b7dbb00b4b00bd0079083adbc00045035d000600c1df7300cc0039049e00dddb380e8c00da00e30dd8dbdc00220e130027004dd9f500e3009d0a6a00e9db26090001ef00ea03c5dbf0002306', 'hex'), # DATA (tcp 1016, actual 112 +104 codecs.decode('d000380028d83400ff00430f6200fbdba70dfb0002016203c5db0201a5044b00c10132d4de0006019f080a000cdab70541000f01fe0f19db1901c902e600dc0198d839002f01360ed80037dabd04d4003301520104da38014f01a100830196d5f5004b015c0411005cdacd03bc67ab8d162b48ad18f7fec7448e448387afa1a3062b37ca3cf9f53c8087f9150926e03335df1b71aedbd0f2', 'hex'), # raw 128 + 24 codecs.decode('b40da90541168df1551f70fc15b51bf26d7d4501bf12915e6485fd966f0ba2072728987dc1018a12ab105ec7aa003508fef08a49b923f3e85e42edf5ea861bd1600d23151787fc78d522f38431883e809f0e4dd2008ecd8ed97670035acf0c763503f27c37ec76d982806986c6016bf952d01e0673820570a87e1a236005ad817d8734949952bb929d81e5fdbcf99ca0c4886d8c65098c0e9aa6ac81e103c684607951d03b0ce9f0cd785885ad27d4f61bfc5de8bc7411de8d8f5910c518e004e9229304f90f9a891395912680ebc6f4c57fd3fceeb684f7c18ba78107fc2e16073e89f6d6b67fbb', 'hex'), # raw 128 +104 codecs.decode('fb11e2feb3effd0e5391c61da77176359f7e4d8a0ff3090a01204501c76a19af07002b003ac0042300dbab0113c2fa07c56e02cbc32bc10400a1c31349df0008102d2a04c5120c9b8904008f0810fb0404c20f3a6407006fd709fbecfe0400041529f60304fd1931fb0b006ede0c391bc1c0c0460e00a3210b1a34c2ffffc3fd980f04832806404a5bc1940505da86292d0f0056f600f925', 'hex'), # raw 128 +24 codecs.decode('5c43c243ff06c5733a5d85c7080040473f3d31dd01774d8983c4c000778982750b009459d551c426c3c0170900929b17fba3fc780800376135fefbe0ff1100396aed3b3146265ac0c1ffff15c5357232fffdc0fdc03f3bc141914514003f85e738fdfa2441ff5cc0ff45951504ec7ee9c0fac1fc053dc424c0554affc103c5f894f2fd0e00668b06eac1f9b3c3fdc2fd08008388f3ef460a00869e13a56079cf013fb82d22c394c2c619c3c33ac45304c527e19d4d0c008aab1305c0fa1aff6050110083687dc713c396c0c2c1c104c1c6b10f0072b54cc14d83c519c1760e0055b9f8c1f8187486', 'hex'), # raw 128 +104 codecs.decode('750d00797ff0fdee593bc1090086781657267f11004cc137', 'hex'), # raw 24? codecs.decode('5050827df4000000dd0548b10100320038ffc024c2fec4c1c18c05c4fad0013ec54051c2879d00cb56521cc2c204c50fc2e62506008eca1a05fec5250d0072d23dc344c2c45cc10a008bd31a3afefa1a92c0080034e68642c45d0d005bdd376707c08da002008ede24ffc100e405213306002de78637c4de011de846ff98c100', 'hex'), # raw 128-24 (104) +24 codecs.decode('07283b590300fef3f5f800da10f5494b031000071819061035084365650b14900834c0c1c4c104c1c5a302100e1134c1c01045c83c8806110e2185c22edd11082424fec006ff02cb052834c3c073c910d4eb965b3833ff0bc582cce18d876a051106f337f826c00410013d2b05c200ca003f4cfeff03d56454ccc101', 'hex'), # raw 124 codecs.decode('5050827d08000000d007fcf701003200', 'hex'), # tcp CMD_ACK_OK codecs.decode('5050827d08000000d00745b2cf451b00', 'hex'), # tcp random CMD_ACK_OK TODO: generate proper sequenced response ] #begin zk = ZK('192.168.1.201') #, verbose=True) conn = zk.connect() socket.return_value.send.assert_called_with(codecs.decode('5050827d08000000e80317fc00000000', 'hex')) template = conn.get_user_template(14, 1) self.assertEqual(template.size, 1243, "incorrect size %s" % template.size) self.assertEqual(template.mark, b"4d98535332310000...feff03d56454ccc1", "incorrect mark %s" % template.mark) self.assertEqual(template.uid, 14, "incorrect uid %s" % template.uid) conn.disconnect()
def test_tcp_get_users_small_data(self, helper, socket): """ can get empty? """ helper.return_value.test_ping.return_value = True # ping simulated helper.return_value.test_tcp.return_value = 0 # helper tcp ok socket.return_value.recv.side_effect = [ codecs.decode('5050827d08000000d0075fb2cf450100', 'hex'), # tcp CMD_ACK_OK codecs.decode('5050827d64000000d007a3159663130000000000000000000000000000000000070000000000000006000000000000005d020000000000000f0c0000000000000100000000000000b80b000010270000a0860100b20b00000927000043840100000000000000', 'hex'), #sizes codecs.decode('5050827d04020000dd05942c96631500f801000001000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003830380000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003832310000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003833350000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003833310000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003833320000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003836000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000383432000000000000000000000000000000000000000000','hex'), #DATA directly(not ok) codecs.decode('5050827d08000000d00745b2cf451b00', 'hex'), # tcp random CMD_ACK_OK TODO: generate proper sequenced response #codecs.decode('5050827d08000000d00745b2cf451b00', 'hex') # tcp random CMD_ACK_OK TODO: generate proper sequenced response ] #begin zk = ZK('192.168.1.201' ) conn = zk.connect() socket.return_value.send.assert_called_with(codecs.decode('5050827d08000000e80317fc00000000', 'hex')) users = conn.get_users() socket.return_value.send.assert_called_with(codecs.decode('5050827d13000000df053ca6cf4514000109000500000000000000', 'hex')) #get users self.assertEqual(len(users), 7, "incorrect size %s" % len(users)) #assert one user usu = users[3] self.assertIsInstance(usu.uid, int, "uid should be int() %s" % type(usu.uid)) if sys.version_info >= (3, 0): self.assertIsInstance(usu.user_id, (str, bytes), "user_id should be str() or bytes() %s" % type(usu.user_id)) else: self.assertIsInstance(usu.user_id, (str, unicode), "user_id should be str() or unicode() %s" % type(usu.user_id)) self.assertEqual(usu.uid, 4, "incorrect uid %s" % usu.uid) self.assertEqual(usu.user_id, "831", "incorrect user_id %s" % usu.user_id) self.assertEqual(usu.name, "NN-831", "incorrect uid %s" % usu.name) # generated conn.disconnect()
def test_tcp_get_users_broken_data(self, helper, socket): """ test case for K20 """ helper.return_value.test_ping.return_value = True # ping simulated helper.return_value.test_tcp.return_value = 0 # helper tcp ok socket.return_value.recv.side_effect = [ codecs.decode('5050827d08000000d007d7d758200000','hex'), #ACK Ok codecs.decode('5050827d58000000d0074c49582013000000000000000000000000000000000002000000000000000000000000000000000000000000000007000000000000000000000000000000f4010000f401000050c30000f4010000f201000050c30000','hex'),#Sizes codecs.decode('5050827d9c000000dd053c87582015009000000001000000000000000000006366756c616e6f0000000000000000000000000000000000000000000000000000000000003130303030316c70000000000000000000000000000000000200000000000000000000726d656e67616e6f0000000000000000000000000000000000','hex'),#DATA112 codecs.decode('000000000000000000000000323232323232636200000000000000000000000000000000','hex'), #extra data 36 #codecs.decode('','hex'), # codecs.decode('5050827d08000000d00745b2cf451b00', 'hex'), # CMD_ACK_OK for get_users TODO: generate proper sequenced response codecs.decode('5050827d08000000d00745b2cf451b00', 'hex'), # CMD_ACK_OK for free_data TODO: generate proper sequenced response codecs.decode('5050827d08000000d00745b2cf451b00', 'hex'), # CMD_ACK_OK for exit TODO: generate proper sequenced response ] #begin zk = ZK('192.168.1.201') #, verbose=True) conn = zk.connect() socket.return_value.send.assert_called_with(codecs.decode('5050827d08000000e80317fc00000000', 'hex')) users = conn.get_users() #print (users) #debug socket.return_value.send.assert_called_with(codecs.decode('5050827d13000000df05b3cb582014000109000500000000000000', 'hex')) #get users self.assertEqual(len(users), 2, "incorrect size %s" % len(users)) #assert one user usu = users[1] self.assertIsInstance(usu.uid, int, "uid should be int() %s" % type(usu.uid)) if sys.version_info >= (3, 0): self.assertIsInstance(usu.user_id, (str, bytes), "user_id should be str() or bytes() %s" % type(usu.user_id)) else: self.assertIsInstance(usu.user_id, (str, unicode), "user_id should be str() or unicode() %s" % type(usu.user_id)) self.assertEqual(usu.uid, 2, "incorrect uid %s" % usu.uid) self.assertEqual(usu.user_id, "222222cb", "incorrect user_id %s" % usu.user_id) self.assertEqual(usu.name, "rmengano", "incorrect uid %s" % usu.name) # check test case conn.disconnect()
def edit_device_user(uid, name): conn = None zk = ZK('192.168.0.99', port=4370, timeout=5, password=0, force_udp=False, ommit_ping=False) try: conn = zk.connect() # your code here conn.test_voice() print('Enabling device ...') conn.enable_device() print('Enabled ...') conn.set_user(uid=int(uid), name=name, privilege=const.USER_DEFAULT, user_id=uid) users = conn.get_users() print('all user fetched ...') for user in users: # print(user) except Exception as e: print("Process terminate : {}".format(e)) finally: if conn: conn.disconnect()
def bioconnect(bioip, attdate, attdate1): conn = None client = FrappeClient("https://erpmaxdclghana.com", "Administrator", "S3kur1tiGH") bioip = bioip.split(":") zk = ZK(bioip[1], port=4370) try: conn = zk.connect() curdate = datetime.now().date() attendance = conn.get_attendance() for att in attendance: biodate = att.timestamp.date() userid = att.user_id if biodate >= attdate and biodate <= attdate1: biotime = att.timestamp.time() emp = client.get_value("Employee", ["name", "employee_number"], { "biometric_id": userid, "status": "Active" }) if emp: fetch_attendance(client, emp["name"], biodate, biotime) except Exception as e: print e messagebox.showinfo('Error', e)
def connect_download_from_machine(company): conn = None zk = ZK('192.168.1.220', port=4370, timeout=5) device_users = [] try: conn = zk.connect() # Get all users (will return list of User object) users = conn.get_users() for x in users: device_users.append(x) # Get attendances (will return list of Attendance object) attendances_list = conn.get_attendance() if Attendance_Interface.objects.all().exists(): Attendance_Interface.objects.all().delete() for att in attendances_list: att_int = Attendance_Interface( company=company, user_name=[ x.name for x in device_users if x.user_id == att.user_id ][0], user_id=att.user_id, date=pytz.utc.localize(att.timestamp), punch=att.punch, ) att_int.save() except Exception as e: print("Process terminate : {}".format(e)) return "Device Connected Successfully"
def test_connection(ip_address=None, port=None): #frappe.publish_realtime('msgprint', 'Starting long job...') devices = get_devices() for device in devices: print device.ip print device.port if device.ip and device.port: ip_address = device.ip port = device.port conn = None zk = ZK(ip_address, port=int(port), timeout=5, password=0, force_udp=False, ommit_ping=False) print ip_address print port try: conn = zk.connect() return {"conn": "success"} except Exception, e: print "error" finally:
def get_all_attendance_from_device(ip, port=4370, timeout=30, device_id=None, clear_from_device_on_fetch=False): # Sample Attendance Logs [{'punch': 255, 'user_id': '22', 'uid': 12349, 'status': 1, 'timestamp': datetime.datetime(2019, 2, 26, 20, 31, 29)},{'punch': 255, 'user_id': '7', 'uid': 7, 'status': 1, 'timestamp': datetime.datetime(2019, 2, 26, 20, 31, 36)}] zk = ZK(ip, port=port, timeout=timeout) conn = None attendances = [] try: conn = zk.connect() x = conn.disable_device() # device is disabled when fetching data info_logger.info("\t".join((ip, "Device Disable Attempted. Result:", str(x)))) attendances = conn.get_attendance() info_logger.info("\t".join((ip, "Attendances Fetched:", str(len(attendances))))) status.set('{device_id}_push_timestamp', None) status.set('{device_id}_pull_timestamp', str(datetime.datetime.now())) if len(attendances): # keeping a backup before clearing data incase the programs fails. # if everything goes well then this file is removed automatically at the end. dump_file_name = config.LOGS_DIRECTORY+'/' + device_id + "_" + ip.replace('.', '_') + '_last_fetch_dump.json' with open(dump_file_name, 'w+') as f: f.write(json.dumps(list(map(lambda x: x.__dict__, attendances)), default=datetime.datetime.timestamp)) if clear_from_device_on_fetch: x = conn.clear_attendance() info_logger.info("\t".join((ip, "Attendance Clear Attempted. Result:", str(x)))) x = conn.enable_device() info_logger.info("\t".join((ip, "Device Enable Attempted. Result:", str(x)))) except: error_logger.exception(str(ip)+' exception when fetching from device...') raise Exception('Device fetch failed.') finally: if conn: conn.disconnect() return list(map(lambda x: x.__dict__, attendances))
def clear_attendance(self): for info in self: try: machine_ip = info.name zk_port = info.port_no timeout = 30 try: zk = ZK(machine_ip, port=zk_port, timeout=timeout, password=0, force_udp=False, ommit_ping=True) except NameError: raise UserError(_("Please install it with 'pip3 install pyzk'.")) conn = self.device_connect(zk) if conn: conn.enable_device() clear_data = zk.get_attendance() if clear_data: # conn.clear_attendance() self._cr.execute("""delete from zk_machine_attendance""") conn.disconnect() raise UserError(_('Attendance Records Deleted.')) else: raise UserError(_('Unable to clear Attendance log. Are you sure attendance log is not empty.')) else: raise UserError( _('Unable to connect to Attendance Device. Please use Test Connection button to verify.')) except: raise ValidationError( 'Unable to clear Attendance log. Are you sure attendance device is connected & record is not empty.')
def update_log_connect(device_ip): group =[] Dt = datetime.date(datetime.now()) print("-------------------Updating log table ---------------------" + str(Dt)) conn = None zk = ZK(device_ip, port=4370, timeout=100, password=3636, force_udp=False, ommit_ping=False) try: conn = zk.connect() print(conn) conn.disable_device() attendances = conn.get_attendance() print(attendances) users = conn.get_users() user_name = "" for i, att in enumerate(attendances): for user in users: if user.user_id == att.user_id: user_name= user.name dt = str(att.timestamp).split(" ") today = datetime.strptime(dt[0], '%Y-%m-%d').strftime('%Y-%m-%d') #frappe.db.sql("INSERT INTO `tabToday`(name,employee_name, status,docstatus,user_id, date,time) VALUES('"+str(random.randint(1,10000000))+"','"+user_name+"','Present',1,%s, '"+str(today)+"', '"+dt[1]+"') ON DUPLICATE KEY UPDATE employee_name='"+user_name+"', date='"+str(today)+"'",str(att.user_id)) #frappe.db.sql("INSERT INTO `tabLogtable`(name,employee_name, user_id, date, time, status, ip_address, docstatus) VALUES('"+str(random.randint(1,10000000))+"','"+user_name+"','Present', device_ip,1,%s, '"+str(today)+"', '"+dt[1]+"')") frappe.db.sql("INSERT INTO `tabLogtable`(name,employee_name, user_id, date, time, status, ip_address, docstatus) VALUES('"+str(random.randint(1,10000000))+"','"+user_name+"','"+str(att.user_id)+"', '"+str(today)+"','"+dt[1]+"','out', '"+device_ip+"',1)") frappe.db.sql("INSERT INTO `tabEmployee Attendance Log`(name,employee_name, user_id, date, time, status, ip_address, docstatus) VALUES('"+str(random.randint(1,10000000))+"','"+user_name+"','"+str(att.user_id)+"', '"+str(today)+"','"+dt[1]+"','out', '"+device_ip+"',1)") isEmptyAttendance = conn.clear_attendance() # conn.disable_device() #if isEmptyAttendance: # print("-------------------------------------All Attendnace Removed From In Device-----------------------------------") return "get_attendance Status: Success" except Exception as e: return "Error "+ str(e) finally: if conn: conn.disconnect()
def config_settings(self): dlg = dialog() dlg.show() ret = dlg.exec_() if ret == QtWidgets.QDialog.Accepted: ip_address = dlg.ui.ip_address.text() port = dlg.ui.port.text() try: conn = None port = int(port) zk = ZK(ip_address, port=port) conn = zk.connect() if (conn != None): users = conn.get_users() self.thread = Worker(conn) self.thread.start() self.thread.sinout.connect(self.readFinger) return users else: self.show_popup("Error!", "Device not found!", QtWidgets.QMessageBox.Critical) self.close_system() except Exception as e: print(e) self.show_popup("Error!", "Device not found!", QtWidgets.QMessageBox.Critical) self.close_system() else: self.close_system()
def create_product(): data = request.get_json() conn = mysql.connect() cursor = conn.cursor() message = "Không tải được dữ liệu máy chấm công. Kiểm tra lại cài đặt máy chấm công!!" for index in data: value = data.get(index) cond = None zk = ZK(value.get('ip'), int(value.get('port')), 5, int(value.get('password')), False, False) try: cond = zk.connect() cond.disable_device() # print ('Firmware Version: : {}'.format(conn.get_firmware_version())) # users = conn.get_users() attendances = cond.get_attendance() # print("Tong so ban ghi:" + str(len(attendances))) if len(attendances) > 0: add_items(attendances, value.get('id'), value.get('branch_hrm'), cursor, conn) message = "Tải dữ liệu máy chấm công thành công!!" except Exception as e: print("Process terminate : {}".format(e)) finally: if cond: cond.enable_device() cond.disconnect() cursor.close() return make_response(jsonify({"data": None, "message": message}), 200)
def clear_machine_attendance(machine_name=None): if not machine_name: return from zk import ZK conn = None machine_doc = frappe.get_doc("Biometric Machine", machine_name) success = False try: zk = ZK(machine_doc.ip_domain_address, machine_doc.port) conn = zk.connect() conn.clear_attendance() success = True except Exception as e: frappe.throw(e) finally: if conn: conn.disconnect() return success
def update_log(): max_time = frappe.db.sql( "SELECT MAX(date), MAX(out_time) FROM tabAttendance") mlist = list(max_time) return type(list(mlist[0])) #condition = datetime.strptime(maxxx, '%d-%m-%Y,%H:%M:%S') conn = None zk = ZK('10.33.210.20', port=4370, timeout=5, password=3636, force_udp=False, ommit_ping=False) try: conn = zk.connect() conn.disable_device() attendances = conn.get_attendance() insertable = [] # for i, att in enumerate(attendances): # st = att.timestamp # if st > condition: # insertable.append(st) # return insertable except Exception as e: return e finally: if conn: conn.disconnect()
def test_no_ping(self,helper, socket): """ what if ping doesn't response """ helper.return_value.test_ping.return_value = False #no ping simulated #begin zk = ZK('192.168.1.201') helper.assert_called_with('192.168.1.201', 4370) # called correctly self.assertRaisesRegex(ZKNetworkError, "can't reach device", zk.connect)
def get_attendance(): group = [] conn = None zk = ZK('10.33.210.20', port=4370, timeout=100, password=3636, force_udp=False, ommit_ping=False) try: conn = zk.connect() conn.disable_device() attendances = conn.get_attendance() for i, att in enumerate(attendances): dt = str(att.timestamp).split(" ") today = datetime.strptime(dt[0], '%Y-%m-%d').strftime('%d-%m-%Y') user_name = frappe.db.sql( "SELECT employee_name from tabEmployee where emp_id='77'") pname = list(user_name) qname = pname[0] #frappe.db.sql("INSERT INTO tabAttendance(name,employee_name, status,docstatus,uid, date,time,out_time) VALUES('"+str(random.randint(1,10000000))+"','aaaa','Present',1,%s, '"+str(today)+"', '"+dt[1]+"','"+dt[1]+"') ON DUPLICATE KEY UPDATE employee_name='aaaa', out_time='"+dt[1]+"', date='"+str(today)+"'",att.uid) #frappe.db.sql("INSERT INTO tabLogtable(name,uid, date,time) VALUES('"+str(random.randint(1,100000))+"','"+str(att.uid)+"', '"+str(today)+"','"+str(dt[1])+"')") return type(qname) except Exception as e: return "Error " + str(e) # print ("Process terminate : {}".format(e)) finally: if conn: conn.disconnect()
def get_all_attendance_from_device(ip, port=4370, timeout=30, device_id=None, clear_from_device_on_fetch=False): # Sample Attendance Logs [{'punch': 255, 'user_id': '22', 'uid': 12349, 'status': 1, 'timestamp': datetime.datetime(2019, 2, 26, 20, 31, 29)},{'punch': 255, 'user_id': '7', 'uid': 7, 'status': 1, 'timestamp': datetime.datetime(2019, 2, 26, 20, 31, 36)}] zk = ZK(ip, port=port, timeout=timeout) conn = None attendances = [] try: conn = zk.connect() x = conn.disable_device() # device is disabled when fetching data attendances = conn.get_attendance() if len(attendances): # keeping a backup before clearing data incase the programs fails. # if everything goes well then this file is removed automatically at the end. dump_file_name = './' + device_id + "_" + ip.replace( '.', '_') + '_last_fetch_dump.json' with open(dump_file_name, 'w+') as f: f.write( json.dumps(list(map(lambda x: x.__dict__, attendances)), default=datetime.datetime.timestamp)) if clear_from_device_on_fetch: x = conn.clear_attendance() x = conn.enable_device() except: raise Exception('Device fetch failed.') finally: if conn: conn.disconnect() return list(map(lambda x: x.__dict__, attendances))
def test_tcp_get_template_2f(self, helper, socket): """ cchekc correct template 2 fixed""" helper.return_value.test_ping.return_value = True # ping simulated helper.return_value.test_tcp.return_value = 0 # helper tcp ok socket.return_value.recv.side_effect = [ codecs.decode('5050827d08000000d0075fb2cf450100', 'hex'), # tcp CMD_ACK_OK codecs.decode('5050827d10000000dc053b59d0983500f3030000f0030000', 'hex'), # tcp PREPARE_DATA 1011 codecs.decode('5050827df8030000dd056855000035004ab153533231000003f2f10408050709ced000001bf36901000000831f256cf23e00740f4c008900f2f879005500fe0fe3005bf2d30a60005c00a00f32f26600580a2700ad00e3fd98007500800f000082f21a0f68008300300e5bf28d00570930004b00dafd4c009a00dd090900a8f2270f8600ad008a0b1ff2b000480f4400730040fc5400b800430f4400c6f2370ab100ca00f30ecbf2cb002f0f4a001300c7fdaa00e400b50c4300e6f2b706bf00ea00f90668f2f2002e0dad003000b7f7cf00f600350cbe0008f31f0dd0000c017101cbf20f019c01', 'hex'), # DATA (tcp 1016, actual 112 +104 codecs.decode('5e00d4012dfdda001301a408e00019f3400c12002201fc0c4ff2570193096d0092018dfc3c7a62107e85688f818ff39a358ef99acb0fee06d47da2e2116a7c77f102a57bd1890a6a598b5ee2db0a0f64a384b28da105f29ca7eff9a137194560847d1565aa827ffc69705ffa8189f19f1f9ca10abbf2160f791a6e0dd8af0f723e062b6e84000a997780c100f6684b8016188780d7f44d0a', 'hex'), # raw 128 + 24 codecs.decode('5083790fd0fa1a089ef44b807572db9b0900d9795083397a8780ca0161091489ae7b7c134278a6004c00b68bcf80e9f98982509a0e01dbf02e6a441a21138a70ddeaf1f9b16a8f1025f2ceef74f369094b70b2fb3a176bb339f9860f6459f304bb679757b3fca891ba733c4c6444c72032f303131c9705004b3079bc0600a03a89c405fdc03205004b456254c6006fb276c20a00a94343c2fc30779505001b4f862804f27d51faff31c2cd007fa50141c12f1800085a9431c181c4fe83c10674c33275300600245c89fcc0ad07005b5c6b88040503a96267c1830700e9695d30c1c2510a0031ae57', 'hex'), # raw 128 +104 codecs.decode('5fa47a04007c7574510f039e80f0fd3bfefe9d55c3fa01c7841746ff06fa1ff2ee8ea07e787e0689c133c1c3c0c2ffc004c1fcae07005990578c040d03dc9350c0c4376a3a8623f2f29ea2c17c67b0928330726b6a83ff08c582afa8c5c3c3c1c3fec300895f0efdfd2809000bae21be5afd0c001cb68c59c20dc3fefda205004fb8150cfbc1030089bbffc30ef245bc467bc07404c288fd', 'hex'), # raw 128 +24 codecs.decode('0155bd46786445c3c130c0040091c52938c320f305c8a4c1ff7b05c08a63c3c2c1c2c3c13ac1c132c1ffc2c0c0c205c3c336050084c9306ec100b13f352c0700cacdf56b72f611f61a2d1605d5ef41a4fec0f818004c17c63e0dfef9c0fdfffe3b3649a0fac00c004ada856a6464c20b006cf83145c1c032c23d04109804d57617e28f07a0fe3bff3bfbfe0afc2ac0fdc138c01095f91bc543281101cbb0c19758fe9282c3c26270737997c1c0c2c0c204c70be27f0f2084c5fc070913ad1731c2c1c37b0125130c1ba958c049ff4e9bc6529262c1c290c2076ac2ed11e718a9554b068bc730b196', 'hex'), # raw 128 +104 codecs.decode('c2c1c2c1077dfc830210074929c1c910c5af81c0c1ffc2fe', 'hex'), # raw 24? codecs.decode('5050827d0b000000dd054ba201003500a05701', 'hex'), # raw 43-24 (104) codecs.decode('5050827d08000000d007fcf701003200', 'hex'), # tcp CMD_ACK_OK codecs.decode('5050827d08000000d00745b2cf451b00', 'hex'), # tcp random CMD_ACK_OK TODO: generate proper sequenced response ] #begin zk = ZK('192.168.1.201')#, verbose=True) conn = zk.connect() socket.return_value.send.assert_called_with(codecs.decode('5050827d08000000e80317fc00000000', 'hex')) template = conn.get_user_template(14, 1) self.assertEqual(template.size, 1010, "incorrect size %s" % template.size) self.assertEqual(template.mark, b"4ab1535332310000...81c0c1ffc2fea057", "incorrect mark %s" % template.mark) self.assertEqual(template.uid, 14, "incorrect uid %s" % template.uid) conn.disconnect()
def __init__(self, ip, port, timeout=5, password=0, force_udp=False, ommit_ping=False): self.ip = ip self.port = port try: print('Connecting to device .............') self.zk = ZK(self.ip, self.port, timeout, password, force_udp, ommit_ping) self.conn = self.zk.connect() if self.conn.is_connect: print("Sucsseful Connect") #print(" Conn ",self.conn) newtime = datetime.today() print("Today Time ", newtime) self.conn.set_time(newtime) zktime = self.conn.get_time() print("Time in Finger Print ", zktime) # print("Device Name ",self.conn.get_device_name()) # print(" Face Version ",self.conn.get_face_version()) # print (" Get Network", self.conn.get_network_params ()) print("get mac ", self.conn.get_mac()) except: print("Finger Printer Not Connected to initilization Machine....") return False
def check_connection(machine_name=None): if not machine_name: return from zk import ZK machine_doc = frappe.get_doc("Biometric Machine", machine_name) conn = None success = False try: zk = ZK(machine_doc.ip_domain_address, machine_doc.port) conn = zk.connect() if conn: success = True except Exception as e: frappe.throw(e) finally: if conn: conn.disconnect() return success
def save_insert(uid, name, password, card, device_select): print( "-------------------Calling from save user---------------------------") # print(uid) # print(name) # print(password) # print(card) # print(device_select) conn = None zk = ZK(str(device_select), port=4370, timeout=5, password=3636, force_udp=False, ommit_ping=False) try: conn = zk.connect() print(type(int(uid))) conn.set_user(uid=int(uid), name=name, privilege=const.USER_DEFAULT, password=password, group_id='', user_id=uid, card=int(card)) print("-------------------USer Added--------------------------") conn.disable_device() conn.enable_device() except Exception as e: print("Process terminate : {}".format(e)) finally: if conn: conn.disconnect()
def test_tcp_get_size(self, helper, socket): """ can read sizes? """ helper.return_value.test_ping.return_value = True # ping simulated helper.return_value.test_tcp.return_value = 0 # helper tcp ok socket.return_value.recv.side_effect = [ codecs.decode('5050827d08000000d0075fb2cf450100', 'hex'), # tcp CMD_ACK_OK codecs.decode( '5050827d64000000d007a3159663130000000000000000000000000000000000070000000000000006000000000000005d020000000000000f0c0000000000000100000000000000b80b000010270000a0860100b20b00000927000043840100000000000000', 'hex'), #sizes codecs.decode( '5050827d08000000d00745b2cf451b00', 'hex' ), # tcp random CMD_ACK_OK TODO: generate proper sequenced response ] #begin zk = ZK('192.168.1.201') # already tested conn = zk.connect() socket.return_value.send.assert_called_with( codecs.decode('5050827d08000000e80317fc00000000', 'hex')) conn.read_sizes() socket.return_value.send.assert_called_with( codecs.decode('5050827d080000003200fcb9cf450200', 'hex')) conn.disconnect() self.assertEqual(conn.users, 7, "missed user data %s" % conn.users) self.assertEqual(conn.fingers, 6, "missed finger data %s" % conn.fingers) self.assertEqual(conn.records, 605, "missed record data %s" % conn.records) self.assertEqual(conn.users_cap, 10000, "missed user cap %s" % conn.users_cap) self.assertEqual(conn.fingers_cap, 3000, "missed finger cap %s" % conn.fingers_cap) self.assertEqual(conn.rec_cap, 100000, "missed record cap %s" % conn.rec_cap)
def clearAttendence_not_web(self): print "111111111111111111111111" self._updateAttendanceAll_not_web() print "2222222222222222222222" machine_list = self.env['machine.info'].search([]) for x in machine_list.product_ids: if not x.status == "no" and x.status_web == "not_web": ip = x.ip connect = None zk = ZK(ip, port=4370, timeout=10) connect = zk.connect() connect.disable_device() clear_attende = connect.clear_attendance() connect.enable_device() connect.disconnect() # Steps that required for this F*****G machine # Install https://github.com/dnaextrim/python_zklib this library # Install Selenium # Download Gekodriver # Export path of Geckodriver # Install sudo apt-get install xvfb #install sudo pip install pyvirtualdisplay # sudo apt-get install python-pip # sudo pip install git+https://github.com/ehtishamfaisal/zklib.git # sudo pip install pyvirtualdisplay # sudo pip install selenium # sudo apt-get install xvfb
def get_all_device_user(): us = [] conn = None zk = ZK('45.251.231.166', port=4370, timeout=5, password=3636, force_udp=False, ommit_ping=False) try: conn = zk.connect() conn.disable_device() users = conn.get_users() for user in users: privilege = 'User' if user.privilege == const.USER_DEFAULT: privilege = 'Admin' tpl1 = (user.uid, user.name, privilege, user.password, user.group_id, user.user_id) us.append(tpl1) conn.test_voice() conn.enable_device() print(us) return us except Exception as e: print("Process terminate : {}".format(e)) finally: if conn: conn.disconnect()
def createBioUsers_not_web(self): machine_list = self.env['machine.info'].search([]) if not machine_list: machine_list = self.env['machine.info'].create({ 'db': 'data base', }) data_base = machine_list.db print data_base login = machine_list.odooLogin print login odoopwd = machine_list.odooPasswd print odoopwd ip_list = [] for x in machine_list.product_ids: if not x.status == "no" and x.status_web == "not_web": ip = x.ip print ip connect = None zk = ZK(ip, port=4370, timeout=5) self._checkMachine(zk) connect = zk.connect() connect.disable_device() users = connect.get_users() for user in users: machine_id = user.user_id if not str(machine_id) == str(self.card_no.name): continue connect.set_user(uid=int(self.card_no.name), name=str(self.name), privilege=const.USER_DEFAULT, password='******', group_id='', user_id=str(self.card_no.name)) connect.enable_device() connect.disconnect()
def test_connection(self): try: conn = None # create ZK instance zk = ZK(self.ip, port=self.puerto, timeout=5, password=0, force_udp=False, ommit_ping=False) conn = zk.connect() if conn: attendances = conn.get_attendance() if not attendances: conn.disconnect() return self.env['planilla.warning'].info( title='RESPUESTA', message= "NO SE ENCONTRARON ASISTENCIAS PARA ESTE BIOMETRICO") conn.disconnect() return self.env['planilla.warning'].info( title='RESPUESTA', message="CONEXION EXITOSA") except Exception as e: raise UserError("Error in %s: %s" % (self.ip, e)) finally: if conn: conn.disconnect()
def save_to_device(modeladmin, request, queryset): zk = ZK('192.168.8.100', port=4370, timeout=5, password=0, force_udp=False, ommit_ping=False) conn = zk.connect() for q in queryset: print("Q", q.card_No) uid = q.id user_ = str(q.id) print(type(user_)) name = q.firstName + " " + q.lastName cardNO = q.card_No conn.set_user(uid, name=name, privilege='User', password='******', group_id='', user_id=str(uid), card=cardNO) #encode(user_,'utf-8') print(q.firstName) print(q.id)
def test_correct_ping(self, helper): """ what if ping is ok """ helper.return_value.test_ping.return_value = True # ping simulated #begin zk = ZK('192.168.1.201') helper.assert_called_with('192.168.1.201', 4370) # called correctly self.assertRaisesRegexp(ZKNetworkError, "unpack requires", zk.connect) # no data...?
def connection(self, deviceIp, dport = 4370, timeout = 5, password=0, force_udp = False, ommit_ping = False): self.zk = ZK(deviceIp, dport, timeout, password, force_udp, ommit_ping) try: self.conn = self.zk.connect() except Exception as e: return json.dumps({"status": "error", "message": e.args}); return self.conn;