python - idr210读卡
准备好SDK中的以下DLL:Sdtapi.dll,SavePhoto.dll,Dewlt.dll,后面两个dll用于解码图片。
调用ReadBaseMsg方法后,会在本地目录生成photo.bmp头像文件。
以下是简单调用
import ctypes
fields = ['name', 'gender', 'folk', 'birthday', 'address', 'code', 'agency', 'expire_start', 'expire_end']
dll_path = 'Sdtapi.dll'
sdtapi = ctypes.WinDLL(dll_path)
ret1 = sdtapi.InitComm(1001)
if ret1 != 1:
print('initComm Error')
ret2 = sdtapi.Authenticate()
if ret2 != 1:
print('getCard Error')
msg = ctypes.create_string_buffer(b'\x00'*256)
ret3 = sdtapi.ReadBaseMsg(msg, None)
ret4 = dict(zip(fields, list(filter(None, msg.raw.decode('gbk').strip().split('\x00')))))
print(ret4)
sdtapi.CloseComm()
下面是写了个简单类
import ctypes, sqlite3, time, os
class IDR210:
def __init__(self):
try:
self.sdtapi = ctypes.WinDLL("./Sdtapi.dll")
if not self.sdtapi.InitComm(1001):
print("初始化串口失败")
# 数据库连接
self.conn = sqlite3.connect("./idr210.db")
self.cursor = self.conn.cursor()
self.cursor.execute("""
CREATE TABLE IF NOT EXISTS idr210 (
ID INTEGER PRIMARY KEY ASC AUTOINCREMENT
UNIQUE
NOT NULL,
Time TEXT,
Name TEXT,
Gender TEXT,
Folk TEXT,
Birthday TEXT,
Address TEXT,
Code TEXT,
Agency TEXT,
ExpireStart TEXT,
ExpireEnd TEXT
);
""")
self.conn.commit()
# 头像保存路径创建
self.photo_dir1 = "./photo/all"
if not os.path.isdir(self.photo_dir1):
os.makedirs(self.photo_dir1)
self.photo_dir2 = f"./photo/{time.strftime('%Y%m%d')}"
if not os.path.isdir(self.photo_dir2):
os.makedirs(self.photo_dir2)
except Exception as e:
print(e)
def ReadBaseMsg(self):
fields = ['name', 'gender', 'folk', 'birthday', 'address', 'code', 'agency', 'expire_start', 'expire_end', 'photo']
msg = ctypes.create_string_buffer(b'\x00'*256)
if self.sdtapi.ReadBaseMsg(msg, None):
ret = dict(zip(fields, list(filter(None,msg.raw.decode("gbk").strip().split("\x00")))))
with open("./photo.bmp", "rb") as f:
ret["photo"] = f.read()
self.cursor.execute(f"INSERT INTO idr210 VALUES(NULL,'{time.strftime('%Y%m%d%H%M%S')}','{ret['name']}','{ret['gender']}','{ret['folk']}','{ret['birthday']}','{ret['address']}','{ret['code']}','{ret['agency']}','{ret['expire_start']}','{ret['expire_end']}')")
self.conn.commit()
with open(f"{self.photo_dir1}/{ret['code']}.bmp", "wb") as f:
f.write(ret["photo"])
with open(f"{self.photo_dir2}/{ret['name']}-{ret['code']}.bmp", "wb") as f:
f.write(ret["photo"])
return ret
else:
return {}
if __name__ == "__main__":
idr = IDR210()
while True:
while not idr.sdtapi.Authenticate():
time.sleep(0.5)
ret = idr.ReadBaseMsg()
if ret:
del ret["photo"]
for key in ret:
print(f"{key}: {ret[key]}")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了