go语言多线程读取文件(Golang身份证读卡器二次开发)

因需要,使用了一台华视电子CVR-100UC一款身份证读卡器,

需要二次开发,程序语言是golang,

在加载dll初始化,认证上都没有遇到问题

在分别读取身份证字段的时候,遇到了问题

go语言多线程读取文件(Golang身份证读卡器二次开发)(1)

开发文档上的

始终搞不明白

int GetPeopleName(char *strTmp, int *strLen) //得到姓名信息

中char *strTmp, int *strLen的参数怎能传递.

经过一晚上的摸索,算是解决问题了,顺便把解决乱码的问题也解决了

为了不再忘,记录下来,以后备查

go语言多线程读取文件(Golang身份证读卡器二次开发)(2)

重点解决的问题

go语言多线程读取文件(Golang身份证读卡器二次开发)(3)

执行结果

加载dll

func load_dll() (*syscall.DLL, error) { dll, err = syscall.LoadDLL("card/Termb.dll") if err != nil { return nil, err } return dll, nil }

读卡器初始化

func card_init() error { proc, err := dll.FindProc("CVR_InitComm") if err != nil { log.Println(err) return nil } r1, _, _ := proc.Call(uintptr(1001)) switch int(r1) { case 1: break case 0: //设备断开后,关闭连接 _ = close_card(dll) return errors.New("设备重置") case 2: _ = close_card(dll) return errors.New("端口打开失败") case -1: _ = close_card(dll) return errors.New("未知错误") case -2: _ = close_card(dll) return errors.New("动态库加载失败") default: break } return nil }

验证身份证

//验证 func auth_card() error { //验证 proc, err := dll.FindProc("CVR_Authenticate") if err != nil { return err } r1, _, _ := proc.Call() switch int(r1) { case 1: break case 2: return errors.New("寻卡失败") case 3: return errors.New("选卡失败") case 4: return errors.New("未连接读卡器") case 0: return errors.New("动态库未加载") default: break } return nil }

读卡操作

//读卡 func read_card() error { //读取身份证 proc, err := dll.FindProc("CVR_Read_Content") if err != nil { return err } r1, _, _ := proc.Call(uintptr(1)) switch int(r1) { case 1: break case 0: return errors.New("错误,读身份证失败") case 4: return errors.New("错误,身份证读卡器未连接") case 99: return errors.New("动态库未加载") default: break } return nil }

关闭读卡器连接

//关闭 func close_card(dll *syscall.DLL) error { //关闭 proc, err := dll.FindProc("CVR_CloseComm") if err != nil { return err } r1, _, err := proc.Call() //proc := dll.NewProc("CVR_CloseComm") //r1, _, err := proc.Call() if err != nil { return err } switch int(r1) { case 1: break case 0: return errors.New("端口号不合法") case -1: return errors.New("端口已经关闭") case -2: return errors.New("动态库加载失败") default: break } return nil }

main.go

package main import ( "bytes" "github.com/axgle/mahonia" _ "github.com/axgle/mahonia" "github.com/gin-gonic/gin" _ "github.com/gin-gonic/gin" "log" "syscall" "unsafe" ) var ( dll *syscall.DLL err error ) func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) dll, err = load_dll() if err != nil { log.Println(err) return } if err := card_init(); err != nil { log.Println(err) return } if err := auth_card(); err != nil { log.Println(err) return } if err := read_card(); err != nil { log.Println(err) return } //读取身份证 var name = make([]byte, 128) var length = 128 var proc, err = dll.FindProc("GetPeopleName") if err != nil { log.Println(err) return } r1, _, _ := proc.Call(uintptr(unsafe.Pointer(&name[0])), uintptr(unsafe.Pointer(&length))) log.Println(r1) log.Println(string(name)) name = bytes.TrimRight(name, "\x00") decoder := mahonia.NewDecoder("gbk") convertString := decoder.ConvertString(string(name)) log.Println(convertString, len(convertString), []byte(convertString)) /*app := gin.Default() app.Static("/static", "static") app.LoadHTMLGlob("template/*") app.GET("/read", read) if err := app.Run("127.0.0.1:8080"); err != nil { log.Println(err) return }*/ } func read(c *gin.Context) { }

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页