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]}")
posted @   wstong  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示