15815213711
2025-04-24 16c179b122eb8c69d31b0fab66c5e29b9c332b8d
electron/controller/icrf.js
@@ -1,345 +1,103 @@
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 = {};
class IcrfController extends Controller {
    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]';
module.exports =IcrfController;
IcrfController.toString = () => '[class IcrfController]';
module.exports = IcrfController;