go语言多线程读取文件(Golang身份证读卡器二次开发)
因需要,使用了一台华视电子CVR-100UC一款身份证读卡器,
需要二次开发,程序语言是golang,
在加载dll初始化,认证上都没有遇到问题
在分别读取身份证字段的时候,遇到了问题
开发文档上的
始终搞不明白
int GetPeopleName(char *strTmp, int *strLen) //得到姓名信息
中char *strTmp, int *strLen的参数怎能传递.
经过一晚上的摸索,算是解决问题了,顺便把解决乱码的问题也解决了
为了不再忘,记录下来,以后备查
重点解决的问题
执行结果
加载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