const {Controller} = require("ee-core"); const Ps = require("ee-core/ps"); const path = require("path"); const PROTOCEL_FLAG = { _reader_cmd_STX: 165, //命令头 _reader_cmd_ETX: 213, //命令尾 } /** * 读写器命令 */ const READER_CMD = { _reader_server_connect: 5, //读写器服务连接 _reader_server_close: 6, //读写器服务断开连接 _reader_cmd_connect: 10, //连接读写器 _reader_cmd_disconnect: 11, // 关闭读写器 _reader_cmd_read_ver: 12, // 读取硬件版本号 _reader_cmd_read_snr: 13, // 读取序列号 _reader_cmd_beep: 14, //读写器鸣响 _reader_cmd_set_baud: 15, //设置串口波特率 _reader_cmd_get_status: 16, //获取大卡座是否有卡 _reader_cmd_write_eeprom: 17, //写eeprom _reader_cmd_read_eeprom: 18, //读eeprom _reader_cmd_set_number: 19, //设置读写器编号 _reader_cmd_get_number: 20, //获取读写编号 _reader_cmd_turn_on: 21, //接触式卡座上电 _reader_cmd_turn_off: 22, //接触式卡座下电 _reader_cmd_rf_reset: 23, //射频头复位 _reader_cmd_select_protocol: 24, //选择协议 _reader_cmd_rf_card: 50, // 寻卡 TypeA _reader_cmd_rf_halt: 51, // 停止卡 TypeA _reader_cmd_rf_card_b: 52, // 寻卡 TypeB _reader_cmd_rf_halt_b: 53, // 停止卡 TypeB _reader_cmd_m_auth_key: 54, //S50/S70校验密码 _reader_cmd_m_write: 55, //s50/s70写数据 _reader_cmd_m_read: 56, //s50/s70读数据 _reader_cmd_m_init_value: 57, //s50/s70初始化值 _reader_cmd_m_read_value: 58, //s50/s70读值 _reader_cmd_m_increment_value: 59, //s50/s70加值 _reader_cmd_m_decrement_value: 60, //s50/s70减值 _reader_cmd_c_cpu_reset: 65, //非接cpu卡复位TypeA _reader_cmd_c_cpu_reset_b: 66, //非接cpu卡复位TypeB _reader_cmd_c_cpu_Transmit: 67, //非接cpu发送指令TypeA/B _reader_cmd_uc_auth_key: 70, //ultralight C 校验密码 _reader_cmd_uev_auth_key: 71, //ultralight EV 校验密码 _reader_cmd_u_read: 72, //读ultralight/C数据 _reader_cmd_u_write: 73, //写ultralight/C数据 _reader_cmd_uc_change_key: 74, //更改ultralight C密码 _reader_cmd_ntag_auth_pwd: 80, //校验ntag密码 _reader_cmd_ntag_read: 81, //读ntag数据 _reader_cmd_ntag_write: 82, //写ntag数据 _reader_cmd_ntag_counter: 83, //读ntag中nfc单向计数器的值 _reader_cmd_ntag_version: 84, //读ntag版本信息 _reader_cmd_ntag_sig: 85, //读取ntag签名信息 _reader_cmd_icode2_set_mode: 100, //设置数据交换模式 _reader_cmd_icode2_inventory: 101, // ICode2卡执行防冲突操作,返回卡的 DSFID 和 UID _reader_cmd_icode2_select: 102, //设置ICode2卡为选择状态. _reader_cmd_icode2_reset_to_ready: 103, //使ICode2卡进入 Ready 状态 _reader_cmd_icode2_to_quiet: 104, //使ICode2卡进入 Quiet 状态 _reader_cmd_icode2_read: 105, //读取ICode2多个块信息 _reader_cmd_icode2_write: 106, //写入ICode2多个块信息 _reader_cmd_icode2_write_afi: 107, //写AFI(应用标识) _reader_cmd_icode2_write_dsfid: 108, //写DSFID(数据存储标识) _reader_cmd_icode2_set_eas: 109, //设置EAS _reader_cmd_icode2_lock: 110, //锁定数据块 _reader_cmd_icode2_lock_afi: 111, //锁定AFI _reader_cmd_icode2_lock_dsfid: 112, //锁定DSFID _reader_cmd_icode2_lock_eas: 113, //锁定EAS _reader_cmd_icode2_get_mulblock_security: 114, //读取ICode2的多个块的安全状态信息 _reader_cmd_icode2_get_sysinfo: 115, //获取ICode2系统信息 _reader_cmd_uhf_inventory: 120, //查找标签 _reader_cmd_uhf_select_mode: 121, //设置选择模式 _reader_cmd_uhf_select: 122, //选择标签 _reader_cmd_uhf_read: 123, //读标签数据存储区 _reader_cmd_uhf_write: 124, //写标签数据存储区 _reader_cmd_uhf_lock_unlock: 125, //锁定或解锁数据存储区 _reader_cmd_uhf_kill: 126, //灭活标签 _reader_cmd_uhf_set_region: 127, //设置读写器工作地区 _reader_cmd_uhf_set_channel: 128, //设置工作信道 _reader_cmd_uhf_get_channel: 129, //获取工作信道 _reader_cmd_uhf_set_hfss: 130, //设置自动跳频 _reader_cmd_uhf_set_papower: 131, //设置发射功率 _reader_cmd_uhf_get_papower: 132, //获取发射功率 _reader_cmd_uhf_set_cw: 133, //设置发射连续载波 _reader_cmd_uhf_set_modem: 134, //设置读写器接收解调器参数 _reader_cmd_uhf_get_modem: 135, //获取读写器接收解调器参数 _reader_cmd_lf_set_datarate: 150, //设置接收频率 _reader_cmd_lf_open_mod: 151, //打开 125KHz 射频信号 _reader_cmd_lf_close_mod: 152, //关闭 125KHz 射频信号 _reader_cmd_t5557_write_free: 153, //向射频卡中写入数据(不加密) _reader_cmd_t5557_write_pwd: 154, //向射频卡中写入数据(加密) _reader_cmd_t5557_read_direct: 155, //读取T5557卡中指定数据页指定数据区的数据 _reader_cmd_t5557_aor: 156, //使用密码唤醒 AOR 模式进行读加密的T5557射频卡 _reader_cmd_t5557_to_id: 157, //将 T5557 卡转换成 ID 卡 _reader_cmd_id_restore_t5557: 158, //将转换成的 ID 卡还原成 T5557 卡 _reader_cmd_em_read: 159, //读取EM4001或兼容 ID 卡数据 _reader_cmd_em4305_write: 160, //向 EM4305 卡指定地址写入数据 _reader_cmd_em4305_read_biphase: 161, //读取 EM4305 卡指定地址的数据 _reader_cmd_em4305_read_manchester: 162, //读取 EM4305 卡指定地址的数据 _reader_cmd_em4305_login: 163, //验证 EM4305 卡密码 _reader_cmd_em4305_protect: 164, //锁定 EM4305 卡指定地址 _reader_cmd_em4305_disable: 165, //休眠 EM4305 卡 _reader_cmd_em4305_set_mode: 166, //设置EM卡类型 _reader_cmd_em4305_to_id: 167, //把 EM4305 格式化成 ID 卡 _reader_cmd_em4305_to_fdxb: 168, //把 EM4305 格式化成 FDX_B 卡 _reader_cmd_cpu_reset: 200, //接触cpu复位 _reader_cmd_cpu_transmit: 201, //接触cpu发送命令 _reader_cmd_cpu_set_baud: 202, //设置接触cpu波特率 _reader_cmd_24c_write: 205, //写24c系列卡片 _reader_cmd_24c_read: 206, //读24c系列卡片 _reader_cmd_45D041_write: 207, //写45D041卡 _reader_cmd_45D041_read: 208, //读45D041卡 _reader_cmd_4442_read: 210, //读SLE4442卡 _reader_cmd_4442_write: 211, //写SLE4442卡 _reader_cmd_4442_verify_sc: 212, //验证SLE4442卡密码 _reader_cmd_4442_change_sc: 213, //更改SLE4442卡密码 _reader_cmd_4442_read_sc: 214, //读SLE4442卡密码 _reader_cmd_4442_read_counter: 215, //读取错误计数 _reader_cmd_4442_read_pro_bit: 216, //读保护位 _reader_cmd_4442_protect: 217, //保护数据 _reader_cmd_4428_read: 220, //读SLE4428卡 _reader_cmd_4428_write: 221, //写SLE4428卡 _reader_cmd_4428_verify_sc: 222, //验证SLE4428卡密码 _reader_cmd_4428_change_sc: 223, //更改SLE4428卡密码 _reader_cmd_4428_read_sc: 224, //读SLE4428卡密码 _reader_cmd_4428_read_counter: 225, //读取错误计数 _reader_cmd_4428_read_pro: 226, //带保护位读 _reader_cmd_4428_write_pro: 227, //写数据并保护 _reader_cmd_4428_protect: 228, //保护数据 _reader_cmd_102_read: 230, //读102卡 _reader_cmd_102_write: 231, //写102卡 _reader_cmd_102_erase: 232, //擦除数据 _reader_cmd_102_verify_sc: 233, //验证用户密码 _reader_cmd_102_change_sc: 234, //更改用户密码 _reader_cmd_102_read_sc: 235, //读取用户密码 _reader_cmd_102_read_sc_counter: 236, //读取用户密码错误计数器 _reader_cmd_102_verify_erase_key: 237, //校验擦除密码 _reader_cmd_102_change_erase_key: 238, //更改擦除密码 _reader_cmd_102_read_erase_key: 239, //读取擦除密码 _reader_cmd_102_read_erase_counter: 240, //读取应用二区擦除计数 _reader_cmd_102_PR_RD_clear: 241, //读写属性控制位清零 _reader_cmd_102_simulate_psnl: 242, //模拟个人化 _reader_cmd_102_psnl: 243, //个人化 _reader_cmd_1604_read: 250, //读1604卡 _reader_cmd_1604_write: 251, //写1604卡 _reader_cmd_1604_erase: 252, //擦除数据 _reader_cmd_1604_verify_sc: 253, //验证密码 _reader_cmd_1604_change_sc: 254, //更改密码 _reader_cmd_1604_read_sc: 255, //读取密码 _reader_cmd_1604_read_sc_counter: 256, //读取密码错误计数 _reader_cmd_1604_verify_erase_key: 257, //验证擦除密码 _reader_cmd_1604_change_erase_key: 258, //更改擦除密码 _reader_cmd_1604_read_erase_key: 259, //读取擦除密码 _reader_cmd_1604_read_erase_key_counter: 260, //读取擦除密码错误计数 _reader_cmd_1604_PR_RD_clear: 261, //读写属性控制位清零 _reader_cmd_1604_simulate_psnl: 262, //模拟个人化 _reader_cmd_1604_psnl: 263, //个人化 _reader_cmd_1608_reset: 270, //复位 _reader_cmd_1608_read_user: 271, //读用户区 _reader_cmd_1608_write_user: 272, //写用户区 _reader_cmd_1608_read_config: 273, //读配置区 _reader_cmd_1608_write_config: 274, //写配置区 _reader_cmd_1608_verify_pwd: 275, //校验密码 _reader_cmd_1608_change_pwd: 276, //更改密码 _reader_cmd_1608_read_pwd: 277, //读密码 _reader_cmd_1608_read_pwd_counter: 278, //读密码错误计数器 _reader_cmd_1608_read_ar: 279, //读AR(用户区访问权限寄存器) _reader_cmd_1608_write_ar: 280, //写AR _reader_cmd_1608_read_fuse: 281, //读熔断标志 _reader_cmd_1608_psnl: 282, //个人化 _reader_cmd_153_reset: 290, //复位 _reader_cmd_153_read_user: 291, //读用户区 _reader_cmd_153_write_user: 292, //写用户区 _reader_cmd_153_read_config: 293, //读配置区 _reader_cmd_153_write_config: 294, //写配置区 _reader_cmd_153_verify_pwd: 295, //校验密码 _reader_cmd_153_change_pwd: 296, //更改密码 _reader_cmd_153_read_pwd: 297, //读密码 _reader_cmd_153_read_pwd_counter: 298, //读密码错误计数器 _reader_cmd_153_read_ar: 299, //读AR(用户区访问权限寄存器) _reader_cmd_153_write_ar: 300, //写AR _reader_cmd_153_read_dcr: 301, //读DCR(设备配置寄存器) _reader_cmd_153_write_dcr: 302, //写DCR _reader_cmd_153_read_fuse: 303, //读熔断标志 _reader_cmd_153_write_fuse: 304, //写熔断标志 _reader_cmd_153_psnl: 305, //个人化 _reader_cmd_mag_read: 500, //读磁条卡数据 _reader_cmd_identity_read: 501, //读身份证信息 _reader_cmd_ssc_read: 502, //读社保卡基本信息 _reader_cmd_hc_read: 503, //读健康卡号 _reader_cmd_bc_read: 504 //读银行卡/信用卡号 } class IcrfController extends Controller{ target =null; socket =null; socketOpen =false; reader = {}; constructor(ctx) { super(ctx); try { this.socket = new WebSocket("ws://localhost:8256/ReaderWebServer/"); this.socket.onopen = this.WSonOpen; this.socket.onmessage = this.WSonMessage; this.socket.onclose = this.WSonClose; this.socket.onerror = this.WSonError; this.target = new EventTarget(); } catch (ex) { console.log(ex) //alert(ex.Message); } } onResult = function() { this.target.addEvent("SocketRet", (ret)=>{ console.log(ret) }); }; WSonOpen(){ this.socketOpen = true; const resultData = { functionId: READER_CMD._reader_server_connect, result: 0, resultData: "" }; if (this.target != null) this.target.fireEvent("SocketRet", resultData); } WSonMessage = function(msg) { var str = msg.data.split('|'); var len = str.length; if (str[0] != PROTOCEL_FLAG._reader_cmd_STX || str[len - 1] != PROTOCEL_FLAG._reader_cmd_ETX) { return; } //设置回调 const resultData = { functionId: parseInt(str[1]), //命令代码 result: parseInt(str[2]), //执行结果代码, 0 成功, 其它失败 resultData: len == 5 ? str[3] : "" //返回结果 }; if (this.target != null){ this.target.fireEvent("SocketRet", resultData); } } WSonClose(){ this.socketOpen = false; } WSonError(){ //服务未启动 } SendCmd = function(readerCmd) { if (true === this.socketOpen) { var len = readerCmd.length; var entryCmd = PROTOCEL_FLAG._reader_cmd_STX + "|"; for (var i = 0; i < len; i++) { entryCmd += readerCmd[i] + "|"; } entryCmd += PROTOCEL_FLAG._reader_cmd_ETX; this.socket.send(entryCmd); } else { // 服务未启动 } }; /** * 将字符串转换成16进制字符 * @param {string} str 要转换的字符串 * @returns {string} 转换后的16进制字符 */ strToHexCharCode = function(str) { if (str === "") return ""; var hexCharCode = []; //hexCharCode.push("0x"); for (var i = 0; i < str.length; i++) { hexCharCode.push((str.charCodeAt(i)).toString(16)); } return hexCharCode.join(""); }; /** * 将16进制字符转换为字符串 * @param {string} hexCharCodeStr 要转换的16进制字符 * @returns {string} 转换后的字符串 */ hexCharCodeToStr = function(hexCharCodeStr) { var trimedStr = hexCharCodeStr.trim(); var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr; var len = rawStr.length; if (len % 2 !== 0) { alert("Illegal Format ASCII Code!"); return ""; } var curCharCode; var resultStr = []; for (var i = 0; i < len; i = i + 2) { curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value resultStr.push(String.fromCharCode(curCharCode)); } return resultStr.join(""); }; /** * 连接串口读写器 * @param {number} port 端口号, 取值 0 ~ 19, 对应端口 COM1 ~ COM20 * @param {number} baud 波特率, 取值 9600 ~ 115200 * @returns {number} 读写器句柄 */ connectSerialPort = function(params) { this.SendCmd([READER_CMD._reader_cmd_connect, CONNECT_MODE._connect_mode_serial_port, params.port, params.baud]); }; } IcrfController.toString = ()=> '[class IcrfController]'; module.exports =IcrfController;