CardIssuerClass.h 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /////////////////////////////////////////////////////////////////////////////////
  2. /// Copyright (c) 2012 China Merchants Bank, all rights reserved ///
  3. /// Adapter Interface for Card Issuer. ///
  4. /// ///
  5. /// ///
  6. /////////////////////////////////////////////////////////////////////////////////
  7. #ifndef __CARD_ISSUER_CLASS_H
  8. #define __CARD_ISSUER_CLASS_H
  9. #pragma once
  10. #include "DeviceBaseClass.h"
  11. #include "CardMix.h"
  12. //retain bin and issue hopper state
  13. struct CardIssuerStatus
  14. {
  15. CardStatusEnum eMedia; //state about card
  16. RtBinStatusEnum eRetainBin;
  17. DWORD dwRetainCount; //回收箱容量
  18. IssHopperStatusEnum eIssuerBin[3];//0,1,2 => hopper 1,2,3 需要对1,2,3三个卡箱进行对应赋值
  19. DWORD dwIssuerCount[3]; //发卡箱容量,0,1,2 => 1,2,3
  20. };
  21. struct SAMStatus
  22. {
  23. int isActive;//0:Inactive; 1:acitve
  24. int chosenOfSAM;//the selected sam number:1,2,...
  25. };
  26. const int MAX_WORKING_KEY_SIZE = 64;
  27. const int MAX_CHECK_CODE_SIZE = 16;
  28. const int MAX_TEMP_DATA_SIZE = 64;
  29. //SCI:SplitCardIssuer
  30. struct SCIKeyInfo
  31. {
  32. BYTE key[MAX_WORKING_KEY_SIZE];
  33. DWORD dwSize;
  34. };
  35. struct SCICheckCode
  36. {
  37. BYTE code[MAX_CHECK_CODE_SIZE];
  38. DWORD dwSize;
  39. };
  40. struct SCITempData
  41. {
  42. BYTE data[MAX_TEMP_DATA_SIZE];
  43. DWORD dwSize;
  44. };
  45. enum SCIParamType
  46. {
  47. ParamBeep,
  48. ParamLed,
  49. ParamLevelTime,
  50. };
  51. enum SCILightType
  52. {
  53. SCILight_EjectCard,
  54. SCILight_CMBLogo,
  55. };
  56. enum SCIBluetoothCMD
  57. {
  58. SCIBluetooth_Open, //打开蓝牙
  59. SCIBluetooth_Close, //关闭蓝牙
  60. SCIBluetooth_Hide, //隐藏蓝牙信号
  61. SCIBluetooth_Show, //显示蓝牙信号
  62. };
  63. class CardIssuerClass : public DeviceBaseClass
  64. {
  65. public:
  66. //
  67. // 本接口几乎废弃不用。连接卡机,请使用DevOpenEx替代本接口
  68. // Connect to device and do initialization.
  69. // In case of power off or initialization,if the card is held in CardIssuer,move card
  70. // to Mag read/write position or doing nothing.
  71. // Retract counter will work.
  72. // Make preparations for controlling the device.
  73. // Arguments:
  74. // - dwPort[in] com port number
  75. // - dwBaudRate[in] Baud rate
  76. //
  77. virtual ErrorCodeEnum DevOpen(DWORD dwPort,DWORD dwBaudRate) = 0;
  78. //
  79. // Get card issuer status
  80. //
  81. virtual ErrorCodeEnum GetDevStatus(CardIssuerStatus &devStatus) = 0;
  82. //
  83. // Get device serial number.
  84. // 设备唯一标识,且需贴在设备外壳上
  85. virtual ErrorCodeEnum GetDeviceSN(char *&pDevSN) = 0;
  86. //
  87. // Move card to specified position.
  88. // hopperNo:多卡箱发卡时指定发卡箱号(面对发卡机,从左往右依次是1,2,3,...号卡箱)
  89. // 卡库:卡片从卡库移动到读卡器,eCardPos为CI_MOVECARD_FROM_HOPPER,hopperNo固定传入99
  90. //
  91. virtual ErrorCodeEnum MoveCard(CardPosEnum eCardPos, int hopperNo = 1) = 0;
  92. //
  93. // Set card entry
  94. //
  95. virtual ErrorCodeEnum SetCardInType(CardInEnum eCardIn) = 0;
  96. //
  97. // Read data from magnetic track.
  98. //
  99. virtual ErrorCodeEnum MagRead(MagTracks &magTracks) = 0;
  100. //
  101. // Write data to magnetic track.
  102. //
  103. virtual ErrorCodeEnum MagWrite(MagTracks magTracks,MagWriteModeEnum eWriteMode) = 0;
  104. //
  105. // Set retract counter
  106. //
  107. virtual ErrorCodeEnum SetRetractCounter(DWORD dwCount) = 0;
  108. //
  109. // Set issuer counter
  110. // hopperNo:多卡箱发卡时指定发卡箱号(面对发卡机,从左往右依次是1,2,3,...号卡箱)
  111. //
  112. virtual ErrorCodeEnum SetIssuerCounter(DWORD dwCount,int hopperNo=1) = 0;
  113. //
  114. // Active contact IC card
  115. //
  116. virtual ErrorCodeEnum ActiveICCard() = 0;
  117. //
  118. // Move IC card to contact position
  119. //
  120. virtual ErrorCodeEnum ContactIC() = 0;
  121. //
  122. // Release IC contact
  123. //
  124. virtual ErrorCodeEnum ReleaseIC() = 0;
  125. //
  126. // Warm reset card(IC)
  127. //
  128. virtual ErrorCodeEnum WarmReset() = 0;
  129. //
  130. // APDU:Application Protocol Data Unit
  131. // CmdSend.lpCmd:Command-APDU
  132. // CmdRecv.lpData:Response-APDU
  133. //
  134. virtual ErrorCodeEnum ICCommand(CmdInfo sendBuf,CmdInfo &recvBuf) = 0;
  135. //////////////////SAM 卡操作部分////////////////////
  136. virtual ErrorCodeEnum SAMActive(BYTE vcc=0x30){ return Error_NotImpl; };
  137. virtual ErrorCodeEnum SAMDeactivate(){ return Error_NotImpl; };
  138. virtual ErrorCodeEnum SAMWarmReset(){ return Error_NotImpl; };
  139. virtual ErrorCodeEnum SAMCommand(CmdInfo sendBuf, CmdInfo &recvBuf){ return Error_NotImpl; };
  140. virtual ErrorCodeEnum SAMQueryStatus(SAMStatus &samStatus){ return Error_NotImpl; };
  141. virtual ErrorCodeEnum SAMSelect(const int sn){ return Error_NotImpl; };
  142. virtual ErrorCodeEnum ActiveICCardATR(CmdInfo &atrBuf){return Error_NotImpl;}
  143. ////////////////卡面打印部分(非即时制卡的卡面印刷,即时制卡的卡面打印接口为PrintCardFaceRightNow),部分机型(例如合肥分行大机)有此功能//////////////////
  144. virtual ErrorCodeEnum Print(BYTE *&data, const int dataSize,const int side){ return Error_NotImpl; };
  145. virtual ErrorCodeEnum QueryPrinterStatus(){ return Error_NotImpl;};
  146. ////////////////////////////////////////////////////////////////////////////
  147. ////////非接(IC)部分 start,没有此部分,在接口实现中直接返回Error_NotImpl///////////////
  148. ////////////////////////////////////////////////////////////////////////////
  149. // Active contactless IC card(Type A,B,Mifare)
  150. // The first,second,third activation order decided by fstType,scdType,thdType respectively
  151. // fstType,scdType,thdType can be one of 'A','B','M','0'(30H,no type)
  152. // outType indicates the type of activation result
  153. //
  154. virtual ErrorCodeEnum ActiveContactlessICCard(char fstType, char scdType, char thdType, char &outType) = 0;
  155. //
  156. // Deactivate contact IC card
  157. //
  158. virtual ErrorCodeEnum DeactivateICCard() = 0;
  159. //
  160. // Deactivate contactless IC card
  161. //
  162. virtual ErrorCodeEnum DeactContactlessICCard() = 0;
  163. //
  164. // RF Mifare Classic protocol operation
  165. // Arguments:
  166. // - eFunType:function type as load key,authentication and so on
  167. // - sendBuf:[parameter][data]
  168. // - recvBuf:[status(1byte)][return data]
  169. //
  170. virtual ErrorCodeEnum MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo &recvBuf) = 0;
  171. //
  172. // RF Type A,B command.
  173. // APDU:Application Protocol Data Unit
  174. // Arguments:
  175. // - CmdSend.lpCmd:Command-APDU
  176. // - CmdRecv.lpData:Response-APDU
  177. //
  178. virtual ErrorCodeEnum RFTypeABCommand(CmdInfo sendBuf, CmdInfo &recvBuf) = 0;
  179. ////////非接(IC)部分 end/////////////////////////////////////////////////////////
  180. // 发卡机调用打开设备
  181. // 1. btOpenType:设定通过哪种方式连接设备,由DevOpenType的枚举值组合。usb及蓝牙设备连接可忽略dwPort,dwBaudRate
  182. // 2.通过pDevSN来指定连接对应设备号的蓝牙发卡机(考虑存在多台发卡机的情况)
  183. // 例如通过蓝牙或者usb连接设备,则btOpenType = (DEV_OPEN_TYPE_USB|DEV_OPEN_TYPE_BLUETOOTH)
  184. // 3. btType返回设备实际通过哪种方式相连,返回值参考DevOpenType
  185. // 4.对于大机(柜式可视柜台)dwPort,dwBaudRate传入端口,波特率,btOpenType为DEV_OPEN_TYPE_COM,pDevSN为""
  186. // ,btType返回值表示卡槽数量(例如目前存在单卡槽1,双卡槽2,三卡槽3的机型)
  187. //
  188. virtual ErrorCodeEnum DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType,const char *pDevSN, BYTE &btType) = 0;
  189. /////////////////////////////////////////////////////////////////////////
  190. ///以下是便携式卡机特有API,接口实现中其他机型直接返回Error_NotImpl即可//
  191. /////////////////////////////////////////////////////////////////////////
  192. // 返回值Error_Succeed表示成功,其他值表示失败
  193. // iStatus 0:成功 -1:银行公钥不存在 -2:产生设备密钥故障 -x:其他厂商自定义故障
  194. // Cr1:随机数r1的密文; Cr3:随机数r3的密文,dKey:用银行公钥加密的设备公钥密文
  195. // r1,r3第16字节为数据完整性校验字节,例如r1为B1B2...B15B16,则B16=B1^B2^...^B15
  196. virtual ErrorCodeEnum TransferEnInit(int &iStatus, BYTE *&Cr1, int &lenR1, BYTE *&Cr3, int &lenR3, BYTE *&dKey, int &lenKey) = 0;
  197. // 返回值Error_Succeed表示成功,其他值表示失败
  198. // iStatus 0:成功 -x:厂商自定义故障
  199. // r2第16字节为数据完整性校验字节,例如r2为B1B2...B15B16,则B16=B1^B2^...^B15
  200. virtual ErrorCodeEnum SetR2(int &iStatus, BYTE *pCr2, int lenR2) = 0;
  201. //
  202. // 设置会话密钥
  203. // pWorkingKey:会话密钥,传递16进制的字符形式,例如0x123456FFAB --> "123456FFAB"
  204. virtual ErrorCodeEnum SendWorkingKey(const char *pWorkingKey) = 0;
  205. //安全锁接口部分 begin
  206. virtual ErrorCodeEnum SLLoadKey(const SCIKeyInfo key) = 0;
  207. //case ParamBeep: value:0,close beep;value:1,open beep
  208. //case ParamLed: value:0,close led;value:1,open led
  209. //case ParamLevelTime: value:the duration of level,100ms per unit
  210. // ex. the value 10 means duration time is 1 second
  211. virtual ErrorCodeEnum SLSetParam(SCIParamType eType, int value) = 0;
  212. virtual ErrorCodeEnum SLLock() = 0;
  213. virtual ErrorCodeEnum SLUnLock(const SCICheckCode checkCode, bool bTemp = true) = 0;
  214. virtual ErrorCodeEnum SLGetTempData(SCITempData &ksnData, SCITempData &ramData) = 0;
  215. virtual ErrorCodeEnum SLOpenDoor(const SCITempData data) = 0;
  216. //安全锁接口部分 end
  217. //蓝牙控制部分 start
  218. //蓝牙指令控制,命令参看SCIBluetoothCMD说明
  219. virtual ErrorCodeEnum BluetoothControl(SCIBluetoothCMD eCmd) = 0;
  220. //修改配对密码
  221. virtual ErrorCodeEnum BluetoothModifyKey(unsigned char *key) = 0;
  222. //修改蓝牙设备名称
  223. virtual ErrorCodeEnum BluetoothModifyName(unsigned char *name) = 0;
  224. //获取版本信息
  225. virtual ErrorCodeEnum BluetoothGetVersion(char *&version) = 0;
  226. //获取连接设备名称
  227. virtual ErrorCodeEnum BluetoothGetConnectName(unsigned char *&name) = 0;
  228. //获取连接设备信号强度
  229. virtual ErrorCodeEnum BluetoothGetSignalStrength(unsigned char *&signal) = 0;
  230. //蓝牙控制部分 end
  231. //控制灯光
  232. //eLight:所控制的灯 ;
  233. //bOnOff:true 亮灯;fasle 灭灯
  234. virtual ErrorCodeEnum LightControl(SCILightType eLight, bool bOnOff) = 0;
  235. //以百分比数值返回剩余电量(1-100),例如剩余51%,则bat赋值为51
  236. virtual ErrorCodeEnum QueryBatteryPower(int &bat) = 0;
  237. //oiltest
  238. //virtual ErrorCodeEnum EncryptData(TempData ramData, TempData bdk, TempData curksn, TempData &encryptedData) = 0;
  239. //把卡片从读卡器移动到指定卡槽位
  240. virtual ErrorCodeEnum MoveCardToSlot(int slot){return Error_NotImpl;}
  241. //把卡片从指定卡槽位移动到读卡器
  242. virtual ErrorCodeEnum MoveCardFromSlot(int slot){return Error_NotImpl;}
  243. //读取卡号
  244. //优先从IC卡解析卡号,如果纯磁条卡,则返回磁道解析的卡号
  245. virtual ErrorCodeEnum ReadAccount(CardNo &cardNo){return Error_NotImpl;}
  246. //获取总卡槽数
  247. virtual ErrorCodeEnum GetSlotSum(int &sum){return Error_NotImpl;}
  248. //获取卡槽状态
  249. virtual ErrorCodeEnum QuerySlotsStatus(SlotStatus &slots,const int slot,bool bFull=false){return Error_NotImpl;}
  250. };
  251. #endif //__CARD_ISSUER_CLASS_H