CardIssuerClass.h 12 KB

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