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;
|