想要用pb制作一個出生醫學證明卡,需要錄入父母的身份證資訊,購買了一家公司的二代身份證讀卡機。現在主要的問題是如何實作pb與此設備的介面問題,以實作刷卡時自動將身份證相關資訊填充到相應位置,請高手指點思路
uj5u.com熱心網友回復:
問硬體開發商要介面,不給就換硬體。uj5u.com熱心網友回復:
硬體開發商都有各種語言的DEMOuj5u.com熱心網友回復:
一般硬體廠商都提供介面的uj5u.com熱心網友回復:
這是我原來做的一個專案用來獲取身份證資訊的。下面是設備商提供的介面說明
1.前言
本應用程式介面(API)用于二代證驗證系統的驗證終端應用系統的開發。
2.系統要求
使用本API的PC機,必須滿足下列條件:
? Windows 98,Windows 2000 Pro,Windows 2000 Server,WinXP
? 至少32兆記憶體(32M RAM or Larger)
? 至少10兆空閑硬碟空間(10M Free Hard Disk Space or Larger)
? 至少一個空閑普通串口或USB口(視用戶需求而定)。
3.API串列
應用函式開發包含下列檔案:
cardapi.lib API函式的VC開發包
cardapi.h API函式宣告
cardapi.dll API函式的動態聯接庫
stdapi.dll cardapi.dll的依賴動態聯接庫
WltRS.dll cardapi.dll的依賴動態聯接庫
序號 函式名 功能描述
1. checkCardReaderValid 檢查讀卡器是否可以正常作業
2. getImagePath 獲取保存照片檔案的路徑
3. getPersonMsg 獲取身份證的基本資訊
4. getNewAddress 獲取更新地址資訊
5. resetCardReader 復位讀卡器
4.API詳細說明
4.1 checkCardReaderValid
檢查讀卡器是否可以正常作業。
char* checkCardReaderValid (int iPort);
引數說明:
int iPort
0為自動檢測
1-16為串口1-16口
1001-1016為USB1-16口
回傳值:字串
第一個字符為’1’,表示讀卡器可以正常作業;
第一個字符為’0’,表示檢測失敗;
第一個字符后緊接檢測成功或失敗的中文描述。
4.2 getImagePath
從card.ini中獲取獲取保存照片檔案的路徑。
char* getImagePath ();
引數說明:無
回傳值:字串
保存照片檔案目錄的路徑。
4.3 getPersonMsg
讀取身份證的基本資訊。
char* getPersonMsg (int iPort);
引數說明:
int iPort
0為自動檢測
1-16為串口1-16口
1001-1016為USB1-16口
回傳值:字串
第一個字符為’1’,表示成功獲取到身份證資訊,其后緊接身份證資訊;
第一個字符為’0’,表示獲取身份證資訊失敗,其后緊接失敗原因的中文描述;
身份證資訊包括:姓名|性別|民族|出生年月(格式為YYYY-MM-DD)|身份證號碼|地址|簽發機構|有效起始時間(YYYY-MM-DD)|有效終止時間(YYYY-MM-DD或長期),資訊項以字符’|’分隔。
4.4 getNewAddress
讀取更新地址資訊。
char* getNewAddress (int iPort);
引數說明:
int iPort
0為自動檢測
1-16為串口1-16口
1001-1016為USB1-16口
回傳值:字串
第一個字符為’1’,表示成功獲取到更新地址資訊,其后緊接地址資訊;
第一個字符為’0’,表示獲取更新地址資訊失敗,其后緊接失敗原因的中文描述;
4.5 resetCardReader
復位讀卡器。當身份證停留在身份證讀卡器的有效閱讀范圍,此時而需要連續讀取身份證資訊或更新地址資訊,則需要在兩次讀取操作之間插入復位操作。
Void resetCardReader (int iPort);
引數說明:
int iPort
0為自動檢測
1-16為串口1-16口
1001-1016為USB1-16口回傳值:無
5.API呼叫說明
5.1 API呼叫順序
請首先呼叫檢測讀卡器介面checkCardReaderValid (),讀卡器介面會自動檢測當前設備所指定的埠。成功后再呼叫讀取身份證資訊介面getPersonMsg()。
5.2 照片說明
照片檔案命名規則是:P+身份證號碼.bmp。
默認的照片保存路徑為當前運行路徑下的bmp子目錄。
也可通過組態檔CARDII.INI指定保存路徑,CARDII.INI放置在當前運行目錄下,內容如下,即照片的保存路徑為d:\CardII\BMP目錄。
[Save]
SavePath=d:\CardII\BMP\
5.3 示例代碼
VC示例代碼:
變數定義:
static HINSTANCE DLLInst = NULL;
函式指標定義:
char* (__stdcall *checkCardReaderValid)(int iPort);
動態載入:
DLLInst = LoadLibrary(“cardapi.dll”);
checkCardReaderValid=(char* (__stdcall *)(int ))GetProcAddress((HMODULE)DLLInst, " checkCardReaderValid ");
使用函式:
ret = checkCardReaderValid(0);
使用后釋放:
if( DLLInst != NULL )
FreeLibrary(DLLInst);
VB示例代碼:
宣告:
Declare Function checkCardReaderValid Lib "cardapi.dll" (ByVal lPort As Long) As String
Declare Function getImagePath Lib "cardapi.dll" () As String
Declare Function getPersonMsg Lib "cardapi.dll" (ByVal iPort As Long) As String
Declare Function getNewAddress Lib "cardapi.dll" (ByVal iPort As Long) As String
Declare Sub resetCardReader Lib "cardapi.dll" (ByVal iPort As Long)
使用:
Dim sRtn As String
…
sRtn = checkCardReaderValid(glPortNo)
uj5u.com熱心網友回復:
要主要是取得政府相關技術部門的技術支持. 因為CPU芯片的加密方式,產家也不清楚uj5u.com熱心網友回復:
一般硬體廠家都有專門介面的uj5u.com熱心網友回復:
廠家都有介面函式的,網上也可以下載到的uj5u.com熱心網友回復:
一般硬體廠家都有專門介面的uj5u.com熱心網友回復:
看demo,根據需求自己再做調整就可以了。uj5u.com熱心網友回復:
這個一般得分是哪個廠家型號的:如下是新中新的函式定義:
//////////////////////////////////////////////////////////////////////////
// SAM埠函式
//
//////////////////////////////////////////////////////////////////////////
function int Syn_SetMaxRFByte ( int iPort, int ucByte,int bIfOpen ) library "SynIDCardAPI.Dll"
function int Syn_GetCOMBaud ( int iPort, ref UnSignedLong puiBaudRate ) library "SynIDCardAPI.Dll"
function int Syn_SetCOMBaud ( int iPort, UnSignedLong uiCurrBaud, UnSignedLong uiSetBaud ) library "SynIDCardAPI.Dll"
function int Syn_OpenPort( int iPort ) library "SynIDCardAPI.Dll"
function int Syn_ClosePort( int iPort ) library "SynIDCardAPI.Dll"
//////////////////////////////////////////////////////////////////////////
// SAM類函式
//
//////////////////////////////////////////////////////////////////////////
function int Syn_ResetSAM ( int iPort, int iIfOpen ) library "SynIDCardAPI.Dll"
function int Syn_GetSAMStatus ( int iPort, int iIfOpen ) library "SynIDCardAPI.Dll"
function int Syn_GetSAMID ( int iPort, ref string pucSAMID, int iIfOpen ) library "SynIDCardAPI.Dll"
function int Syn_GetSAMIDToStr ( int iPort, ref string pcSAMID, int iIfOpen ) library "SynIDCardAPI.Dll"
//////////////////////////////////////////////////////////////////////////
// 身份證卡類函式
//
//////////////////////////////////////////////////////////////////////////
function int Syn_StartFindIDCard ( int iPort , ref string pucIIN, int iIfOpen ) library "SynIDCardAPI.Dll"
function int Syn_SelectIDCard ( int iPort , ref string pucSN, int iIfOpen ) library "SynIDCardAPI.Dll"
function int Syn_ReadBaseMsg (int iPort ,ref string pucCHMsg ,ref int puiCHMsgLen ,ref string pucPHMsg , ref int puiPHMsgLen ,int iIfOpen) library "SynIDCardAPI.Dll"
function int Syn_ReadIINSNDN ( int iPort , ref string pucIINSNDN , int iIfOpen ) library "SynIDCardAPI.Dll"
function int Syn_ReadBaseMsgToFile (int iPort,ref string pcCHMsgFileName,ref int puiCHMsgFileLen,ref string pcPHMsgFileName,ref int puiPHMsgFileLen,int iIfOpen) library "SynIDCardAPI.Dll"
function int Syn_ReadIINSNDNToASCII ( int iPort ,ref string pucIINSNDN , int iIfOpen ) library "SynIDCardAPI.Dll"
function int Syn_ReadNewAppMsg(int iPort , ref string pucAppMsg , ref int puiAppMsgLen , int iIfOpen) library "SynIDCardAPI.Dll"
function int Syn_GetBmp( int iPort , ref string Wlt_File ) library "SynIDCardAPI.Dll"
function int Syn_ReadMsg( int iPort,int iIfOpen,ref tagidcarddata pIDCardData ) library "SynIDCardAPI.Dll"
function int Syn_FindReader() library "SynIDCardAPI.Dll"
//////////////////////////////////////////////////////////////////////////
// 設定附加功能函式
//
//////////////////////////////////////////////////////////////////////////
function int Syn_SetPhotoPath( int iOption , ref string cPhotoPath ) library "SynIDCardAPI.Dll"
function int Syn_SetPhotoType( int iType ) library "SynIDCardAPI.Dll"
function int Syn_SetPhotoName( int iType ) library "SynIDCardAPI.Dll"
function int Syn_SetSexType( int iType ) library "SynIDCardAPI.Dll"
function int Syn_SetNationType( int iType ) library "SynIDCardAPI.Dll"
function int Syn_SetBornType( int iType ) library "SynIDCardAPI.Dll"
function int Syn_SetUserLifeBType( int iType ) library "SynIDCardAPI.Dll"
function int Syn_SetUserLifeEType( int iType ,int iOption) library "SynIDCardAPI.Dll"
結構定義:
global type tagidcarddata from structure
character Name[32]
character Sex[6]
character Nation[20]
character Born[18]
character Address[72]
character IDCardNo[38]
character GrantDept[32]
character UserLifeBegin[18]
character UserLifeEnd[18]
character reserved[38]
character PhotoFileName[255]
end type
身份證讀取代碼:(有多余的代碼,是從開發的軟體里復制出來的)
UnSignedLong uiCurrBaud;
string sMsg;
tagidcarddata m_IDCardData;
String strResult="";
int nRet;
int ifOpen;
string pucIIN="";
string pucSN="";
long ll_start, ll_used;
string ls_name,ls_sex,ls_mz,ls_csrq,ls_zz,ls_photopath,ls_sfzh,ls_file,ls_path,ls_cardclassname,ls_cardclass
string ls_sfzm
blob lb_small
datetime lda_csrq
integer li_file,loops,i,li_sign,li_ws
long flen,new_pos,bytes_read,ll_sfzxy,ll_sfzxy2
ls_cardclassname=st_4.text
select z into :li_ws from system_Setup where flbh='0002' and idx='0030';
if len(sle_2.text) - 2<>li_ws then
messagebox("","會員卡位數必須為"+string(li_ws)+'位')
sle_2.text=''
return 1
end if
if rb_1.checked=true and cbx_1.checked=false and sle_1.enabled=false then
iPort = Syn_FindReader();
ifOpen = 0;
if iPort >0 then
if iPort >1000 then
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 讀卡器連接在USB " + String(iPort) + " 上";
else
Sleep(1)
Syn_GetCOMBaud( iPort ,ref uiCurrBaud);
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 讀卡器連接在COM " + String(iPort) + " 上";
end if
ifOpen = 0;
m_IDCardData.name=space(32) ;
m_IDCardData.Sex=space(6);
m_IDCardData.Nation=space(20);
m_IDCardData.Born=space(18);
m_IDCardData.Address=space(72);
m_IDCardData.IDCardNo=space(38);
m_IDCardData.GrantDept=space(32);
m_IDCardData.UserLifeBegin=space(18);
m_IDCardData.UserLifeEnd=space(18);
m_IDCardData.reserved=space(38);
m_IDCardData.PhotoFileName=space(255);
Syn_SetPhotoName(2);
//ll_start = Cpu();
nRet = Syn_OpenPort( iPort );
if nRet = 0 then
Syn_SetMaxRFByte( iPort , 80, ifOpen);
Syn_StartFindIDCard( iPort,pucIIN,ifOpen );
Syn_SelectIDCard( iPort,pucSN,ifOpen );
m_IDCardData.name="";
m_IDCardData.Sex="";
m_IDCardData.Nation="";
m_IDCardData.Born="";
m_IDCardData.Address="";
m_IDCardData.IDCardNo="";
m_IDCardData.UserLifeBegin="";
m_IDCardData.UserLifeEnd="";
m_IDCardData.GrantDept="";
m_IDCardData.reserved="";
m_IDCardData.PhotoFileName="";
nRet = Syn_ReadMsg( iPort,0,m_IDCardData );
if nRet = 0 then
ll_used = Cpu() - ll_start;
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 讀卡成功,讀卡時間" + String(ll_used) + "ms"
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 姓名:" + m_IDCardData.Name
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 性別:" + m_IDCardData.Sex
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 民族:" + m_IDCardData.Nation
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 出生日期:" + m_IDCardData.Born
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 地址:" + m_IDCardData.Address
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 身份證號:" + m_IDCardData.IDCardNo
sle_1.text=m_IDCardData.IDCardNo
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 有效期開始:" + m_IDCardData.UserLifeBegin
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 有效期結束:" + m_IDCardData.UserLifeEnd
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 發證機關:" + m_IDCardData.GrantDept
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 照片檔案名:" + m_IDCardData.PhotoFileName
//------------------------如果資料庫正常則查出資料寫入會員資料庫中
//-------------------------------------------------------------------------
//-------------------------資料寫入會員資料庫---------------------
ls_name=m_IDCardData.Name
ls_sex=m_IDCardData.Sex
ls_mz=m_IDCardData.Nation
ls_csrq=m_IDCardData.Born
ls_sfzh=m_IDCardData.IDCardNo
ls_zz=m_IDCardData.Address
ls_photopath=m_IDCardData.PhotoFileName
ls_csrq=left(ls_csrq,4)+'-'+mid(ls_csrq,5,2)+'-'+right(ls_csrq,2)
lda_csrq=datetime(date(ls_csrq))
select count(*) into :li_sign from hyxx_Table where sfzbh=:ls_sfzh and zxsign='0';
if li_sign>0 then
messagebox("","此身份證已經注冊,不能重復注冊!")
return 1
end if
select count(*) into :ll_sfzxy from TRFF_APP.QQHR_DRIVINGLICENSE where sfzmhm=:ls_sfzh USING SQLCB;
if cbx_2.checked=false then
if ll_sfzxy<=0 then
messagebox("","非本地駕駛人!")
return 1
end if
end if
select idx into :ls_cardclass from cardclass_Table where namex=:ls_cardclassname;
stru_hy.cardid=is_cardid
stru_hy.sfzbh=ls_sfzh
stru_hy.xm=ls_name
stru_hy.sex=ls_sex
stru_hy.mz=ls_mz
stru_hy.csrq=lda_csrq
stru_hy.zz=ls_zz
stru_hy.cardclass=ls_cardclass
if cbx_2.checked=true then
stru_hy.rysign='1'
else
stru_hy.rysign='0'
end if
// insert into hyxx_Table(cardid,SFZBH,XM,SEX,MZ,CSRQ,ZZ,cardclass)
//VALUES (:is_cardid,:ls_sfzh, :ls_name,:ls_sex,:ls_mz,:lda_csrq,:ls_zz,:ls_cardclass) USING SQLCA;
// if sqlca.sqlcode=0 then
// commit;
// end if
//--------------------存入照片--------------------
setnull(lb_image)
if li_file <> -1 then
setpointer(hourglass!)
ls_file=ls_photopath
ls_path=ls_photopath
flen = filelength(ls_file)
li_file = fileopen(ls_path,streammode!,read!,lockread!)
if flen > 32765 then
if mod(flen,32765)=0 then
loops = flen/32765
else
loops = (flen/32765) + 1
end if
else
loops = 1
end if
new_pos = 1
for i = 1 to loops
bytes_read = fileread(li_file,lb_small)
if i = 1 then
lb_image = lb_small
else
lb_image = lb_image + lb_small
end if
next
fileclose(li_file)
// p_1.setpicture(lb_image)
// updateblob hyxx_Table set photo = :lb_image where sfzbh = :ls_sfzh using sqlca;
// if sqlca.sqlcode = 0 then
// commit;
// else
// rollback;
// messagebox('','存取失敗,請退出后試!',stopsign!)
//
// end if
stru_hy.photo=lb_image
else
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 讀卡失敗,nRet=" + String(nRet)
end if
else
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 打開埠失敗"
end if
else
sMsg = String(Now(), "YYYY-MM-DD hh:mm:ss") + " 沒有找到讀卡器";
end if
st_2.text=smsg
end if
openwithparm(w_hy_sk,stru_hy)
close(parent)
return 1
end if
uj5u.com熱心網友回復:
有DLL調的吧 應該廠家還有例子的轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/48244.html
標籤:API 調用
上一篇:PB 將word檔案中表格匯入
下一篇:SQL中的亂碼問題
