| | |
| | | const {Controller} = require("ee-core"); |
| | | const Ps = require("ee-core/ps"); |
| | | const path = require("path"); |
| | | const Services = require('ee-core/services') |
| | | const {params} = require("debug"); |
| | | |
| | | 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 //读银行卡/信用卡号 |
| | | |
| | | } |
| | | var CONNECT_MODE = { |
| | | _connect_mode_usb: 0, //usb连接,只能连接一台 |
| | | _connect_mode_usb_number: 1, //usb编号连接,可以连接多台 |
| | | _connect_mode_serial_port: 2, //串口连接 |
| | | _connect_mode_net: 3, // 网络连接 |
| | | _connect_mode_bluetooth: 4 //蓝牙连接 |
| | | } |
| | | 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 |
| | | * @param {params.number} params.port 端口号, 取值 0 ~ 19, 对应端口 COM1 ~ COM20 |
| | | * @param {params.number} params.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]); |
| | | connectSerialPort(params) { |
| | | return Services.get('icrf').connectSerialPort(params.port,params.baud); |
| | | }; |
| | | |
| | | /** |
| | | * 连接USB读写器 |
| | | * @param params |
| | | * @returns {*} |
| | | */ |
| | | connectUsb(params) { |
| | | return Services.get('icrf').connectUsb(params.number); |
| | | }; |
| | | |
| | | /** |
| | | * 断开读写器 |
| | | * @returns {(function(*, *, ...[*]): {msg: string, code: *})|*} |
| | | */ |
| | | connectExit(){ |
| | | return Services.get('icrf').connectExit(); |
| | | }; |
| | | |
| | | /** |
| | | * 鸣响 |
| | | * @param number 次数 |
| | | */ |
| | | connectBeep(number = 1){ |
| | | Services.get('icrf').beep(); |
| | | } |
| | | /** |
| | | * 开启定时寻卡任务 |
| | | */ |
| | | doJobByPool(){ |
| | | return Services.get('icrf').doJobByPool(); |
| | | } |
| | | |
| | | /** |
| | | * 关闭定时寻卡任务 |
| | | * @returns {*} |
| | | */ |
| | | unJobByPool(){ |
| | | return Services.get('icrf').unJobByPool(); |
| | | } |
| | | /** |
| | | * 寻卡 |
| | | */ |
| | | connectRfCard(){ |
| | | return Services.get('icrf').connectRfCard(); |
| | | } |
| | | |
| | | /** |
| | | * 校验密码 |
| | | */ |
| | | connectRfAuthenticationKey(){ |
| | | return Services.get('icrf').connectRfAuthenticationKey(); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 读数据 |
| | | */ |
| | | connectRfRead(params){ |
| | | let connectRfAuthenticationKey1 = Services.get('icrf').connectRfAuthenticationKey(params.addr); |
| | | return Services.get('icrf').connectRfRead(params.addr); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 写数据 |
| | | * @param params.data 写入的数据 |
| | | * @param params.addr 写入的区域 3,7,11,15,19密码片区严禁使用 |
| | | */ |
| | | connectRfWrite(params){ |
| | | let connectRfAuthenticationKey1 = Services.get('icrf').connectRfAuthenticationKey(params.addr); |
| | | console.log(connectRfAuthenticationKey1) |
| | | return Services.get('icrf').connectRfWrite(params.data,params.addr); |
| | | } |
| | | |
| | | /** |
| | | * 终止卡(完成所有操作) |
| | | */ |
| | | |
| | | connectRfHalt(){ |
| | | return Services.get('icrf').connectRfHalt(); |
| | | } |
| | | |
| | | } |
| | | |
| | | IcrfController.toString = ()=> '[class IcrfController]'; |