Index: ssts-web/src/main/webapp/disinfectsystem/packing/setPlugInRFID.js =================================================================== diff -u -r34428 -r34431 --- ssts-web/src/main/webapp/disinfectsystem/packing/setPlugInRFID.js (.../setPlugInRFID.js) (revision 34428) +++ ssts-web/src/main/webapp/disinfectsystem/packing/setPlugInRFID.js (.../setPlugInRFID.js) (revision 34431) @@ -1,36 +1,142 @@ var keepReading = true; var reader; var writer; +var port; +var msg1 = '未找到该设备,请配置设备的usbVendorId和usbProductId'; +var msg2 = '设备已连接!'; +var msg3 = '连接失败:串口还没有授权,请先点击【连接RFID设备】按钮!'; +var msg4 = '用户取消选择端口!'; +var msg5 = '端口已打开!'; +var msg6 = '数据写入成功!'; +var msg7 = '数据写入失败,请重新写入!'; +//hex转字符串 +function hextoString(hex) { + var arr = hex.split(""); + var out = ""; + for (var i = 0; i < arr.length / 2; i++) { + var tmp = "0x" + arr[i * 2] + arr[i * 2 + 1] + var charValue = String.fromCharCode(tmp); + out += charValue + } + return out; +}; + +//字符串转hex +function stringtoArr(str) { + var arr = []; + for (var i = 0; i < str.length; i++) { + if (arr.length == 0) { + arr[0] = parseInt(str.charCodeAt(i).toString(10)); + } else { + arr.push(parseInt(str.charCodeAt(i).toString(10))) + } + } + return arr +} + //打开串口并连接 async function openPort(params, callback) { try { - // 获取用户之前授予该网站访问权限的所有串口 - const filters = params.filters; - const ports = await navigator.serial.getPorts(); - var port; - if (ports.length == 1) { - port = ports[0]; - } else { - if (filters) { - for (var i = 0; i < ports.length; i++) { - const { usbProductId, usbVendorId } = ports[i].getInfo(); - if (filters[0].usbProductId == usbProductId && filters[0].usbVendorId == usbVendorId) { - port = ports[i]; - break; + keepReading = true; + var usbVendorId = params.usbVendorId; + var usbProductId = params.usbProductId; + var baudRate = params.baudRate ? params.baudRate : 115200; + var dataBits = params.dataBits ? params.dataBits : 8; + var stopBits = params.stopBits ? params.stopBits : 1; + var parity = params.parity ? params.parity : 'none'; + var getAllData = params.getAllData; + var getAllPort = params.getAllPort; + var barcode = ''; + if (!port) { + if (getAllPort) { + port = await navigator.serial.requestPort(); + var { usbProductId, usbVendorId } = port.getInfo(); + usbVendorId = usbVendorId; + usbProductId = usbProductId; + } else { + if (!usbVendorId || !usbProductId) { + var ports = await navigator.serial.getPorts(); + if (ports.length == 0) { + port = await navigator.serial.requestPort(); + var { usbProductId, usbVendorId } = port.getInfo(); + usbVendorId = usbVendorId; + usbProductId = usbProductId; + } else { + for (var i = 0; i < ports.length; i++) { + var { usbProductId, usbVendorId } = ports[i].getInfo(); + if (usbProductId && usbVendorId) { + port = ports[i]; + usbVendorId = usbVendorId; + usbProductId = usbProductId; + break; + } + } } + } else { + var filters = [ + { usbVendorId: usbVendorId, usbProductId: usbProductId } + ]; + var ports = await navigator.serial.getPorts(); + if (ports.length == 1) { + var { usbProductId, usbVendorId } = ports[0].getInfo(); + if (filters[0].usbProductId == usbProductId && filters[0].usbVendorId == usbVendorId) { + port = ports[0]; + } + if (!port) { + callback(msg1, false, 'msg1'); + return; + } + } else if (ports.length > 1) { + for (var i = 0; i < ports.length; i++) { + var { usbProductId, usbVendorId } = ports[i].getInfo(); + if (filters[0].usbProductId == usbProductId && filters[0].usbVendorId == usbVendorId) { + port = ports[i]; + break; + } + } + if (!port) { + callback(msg1, false, 'msg1'); + return; + } + } else { + port = await navigator.serial.requestPort(); + var { usbProductId, usbVendorId } = port.getInfo(); + usbVendorId = usbVendorId; + usbProductId = usbProductId; + } } - } else { + await port.open({ baudRate: baudRate }, { dataBits: dataBits }, { stopBits: stopBits }, { parity: parity }); + } + + } else { + if (getAllPort) { port = await navigator.serial.requestPort(); + var { usbProductId, usbVendorId } = port.getInfo(); + usbVendorId = usbVendorId; + usbProductId = usbProductId; + } else { + var { usbProductId, usbVendorId } = port.getInfo(); + usbVendorId = usbVendorId; + usbProductId = usbProductId; } } - await port.open({ baudRate: 115200 }, { dataBits: 8 }, { stopBits: 1 }, { parity: 'none' }); - callback('设备已连接!', false); reader = port.readable.getReader(); writer = port.writable.getWriter(); //设置循环查询获取用户区的数据 - await writer.write(params.data); + if (usbVendorId == 6790 && usbProductId == 29987) {//桌面式 F5005-H + var data = new Uint8Array([187, 23, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 41, 13, 10]); + await writer.write(data); + } else if (usbVendorId == 4292 && usbProductId == 60000) {//手提式 A100 + var encoder = new TextEncoder(); + var data = encoder.encode(">x m 1 03 00 09\r\n"); + await writer.write(data); + } else { + callback(msg1, false, 'msg1'); + return; + } while (port.readable && keepReading) { + callback(msg2, false, 'msg2'); try { while (true) { var { value, done } = await reader.read(); @@ -40,11 +146,123 @@ break; } if (value) { - callback(value, true); + var dataString = ""; + if (usbVendorId == 6790 && usbProductId == 29987) {//桌面式 F5005-H + if (value.length > 20) { + for (var i = 0; i < value.length; i++) { + dataString += value[i].toString(16) + } + } else { + var isReturn; + for (var i = 0; i < value.length; i++) { + if (value[0] == 154) { + if (value[2] == 1) { + isReturn = true; + break; + } else if (value[2] == 0) { + isReturn = false; + break; + } + } else if (value[1] == 154) { + if (value[3] == 1) { + isReturn = true; + break; + } else if (value[3] == 0) { + isReturn = false; + break; + } + } + } + if (isReturn == true) { + callback(msg6, false, 'msg6'); + isReturn = ''; + break; + } else if (isReturn == false) { + callback(msg7, false, 'msg7'); + isReturn = ''; + break; + } + } + if (dataString !== '') { + dataString = dataString.toUpperCase(); + if (getAllData) { + var newTid; + if (dataString.indexOf('BB') >= 0) { + var tid; + dataString = dataString.substring(10, dataString.length); + var epc = dataString.substring(0, dataString.indexOf('CE2')); + if (dataString.indexOf('4D') > 0) { + tid = dataString.substring(dataString.indexOf('CE2') + 1, dataString.indexOf('4D') - 2); + } else { + tid = dataString.substring(dataString.indexOf('CE2') + 1, dataString.length - 2); + } + if (tid.length > 10 && dataString.indexOf('E') == 0) { + newTid = tid || '' + } + } + if (dataString.indexOf('4D') > -1 && dataString.indexOf('4646') > -1) { + var newData = hextoString(dataString); + if (newData.indexOf("M") == 0) { + newData = newData.substring(newData.indexOf("M"), newData.indexOf("FF") + 2); + newTid += ',' + newData; + } + } + if (newTid) { + callback(newTid, true); + } + } else { + if (dataString.indexOf('4D') > -1 && dataString.indexOf('4646') > -1) { + var newData = hextoString(dataString); + if (newData.indexOf("M") == 0) { + newData = newData.substring(newData.indexOf("M") + 1, newData.indexOf("FF")); + if (barcode !== newData) { + barcode = newData; + callback(barcode, true); + } + } + } + } + } + } else if (usbVendorId == 4292 && usbProductId == 60000) {//手提式 A100 + var dataString = ""; + if (value.length > 10) { + for (var i = 0; i < value.length; i++) { + if (value[i] !== '' && value[i] !== 13 && value[i] !== 10) { + dataString += String.fromCharCode(value[i]); + } + } + } else if (value.length == 4) { + if (value[0] == 65 && value[1] == 51) {//停止扫描 + barcode = '' + } + } else if (value.length == 5) { + if (value[1] == 65 && value[2] == 51) {//停止扫描 + barcode = '' + } + } + if (dataString !== '' && dataString.indexOf('M') > 0) { + if (getAllData) { + var arr = dataString.split('M'); + var uid = arr[0].split('R')[1]; + var userId = arr[1]; + userId = hextoString(userId); + callback(uid + ',' + userId, true); + } else { + var newData = dataString.substring(dataString.indexOf('M') + 1, dataString.indexOf('4646')); + newData = hextoString(newData); + if (newData.indexOf("M") == 0) { + if (barcode !== newData) { + barcode = newData.substring(1, newData.length); + callback(barcode, true); + } + } + } + } + } } } } catch (error) { - callback('连接失败!', false); + callback('连接失败:' + error, false); } finally { var { value, done } = await reader.read(); if (done) { @@ -53,15 +271,170 @@ return; } if (value) { - dealWithData(value); + var dataString = ""; + if (usbVendorId == 6790 && usbProductId == 29987) {//桌面式 F5005-H + if (value.length > 20) { + for (var i = 0; i < value.length; i++) { + dataString += value[i].toString(16) + } + } else { + var isReturn; + for (var i = 0; i < value.length; i++) { + if (value[0] == 154) { + if (value[2] == 1) { + isReturn = true; + break; + } else if (value[2] == 0) { + isReturn = false; + break; + } + } else if (value[1] == 154) { + if (value[3] == 1) { + isReturn = true; + break; + } else if (value[3] == 0) { + isReturn = false; + break; + } + } + } + if (isReturn == true) { + callback(msg6, false, 'msg6'); + isReturn = ''; + break; + } else if (isReturn == false) { + callback(msg7, false, 'msg7'); + isReturn = ''; + break; + } + } + if (dataString !== '') { + dataString = dataString.toUpperCase(); + if (getAllData) { + var newTid; + if (dataString.indexOf('BB') >= 0) { + var tid; + if (dataString.indexOf('4D') > 0) { + tid = dataString.substring(30, dataString.indexOf('4D') - 2); + } else { + tid = dataString.substring(30, dataString.length - 2); + } + if (tid.length > 10 && tid.indexOf('E') == 0) { + newTid = tid || '' + } + } + if (dataString.indexOf('4D') > -1 && dataString.indexOf('4646') > -1) { + var newData = hextoString(dataString); + if (newData.indexOf("M") == 0) { + newData = newData.substring(newData.indexOf("M"), newData.indexOf("FF") + 2); + callback(newTid + ',' + newData, true); + } + } + } else { + if (dataString.indexOf('4D') > -1 && dataString.indexOf('4646') > -1) { + var newData = hextoString(dataString); + if (newData.indexOf("M") == 0) { + newData = newData.substring(newData.indexOf("M") + 1, newData.indexOf("FF")); + if (barcode !== newData) { + barcode = newData; + callback(barcode, true); + } + } + } + } + } + } else if (usbVendorId == 4292 && usbProductId == 60000) {//手提式 A100 + var dataString = ""; + if (value.length > 10) { + for (var i = 0; i < value.length; i++) { + if (value[i] !== '' && value[i] !== 13 && value[i] !== 10) { + dataString += String.fromCharCode(value[i]); + } + } + } else if (value.length == 4) { + if (value[0] == 65 && value[1] == 51) {//停止扫描 + barcode = '' + } + } else if (value.length == 5) { + if (value[1] == 65 && value[2] == 51) {//停止扫描 + barcode = '' + } + } + if (dataString !== '' && dataString.indexOf('M') > 0) { + var newData = dataString.substring(dataString.indexOf('M') + 1, dataString.indexOf('4646')); + newData = hextoString(newData); + if (newData.indexOf("M") == 0) { + if (barcode !== newData) { + barcode = newData.substring(1, newData.length); + callback(barcode, true); + } + } + } + } } } } } catch (error) { - callback('连接失败:' + error, false); + var errStr = '连接失败:' + error; + if (errStr.indexOf('Must be handling a user gesture to show a permission request') > 0) { + callback(msg3, false, 'msg3'); + } else if (errStr.indexOf('No port selected by the user') > 0) { + callback(msg4, false, 'msg4'); + } else if (errStr.indexOf('The port is already open') > 0) { + callback(msg5, false, 'msg5'); + } } } +async function closeRFID() { + if (keepReading && reader) { + keepReading = false; + reader.cancel(); + reader.releaseLock(); + writer.releaseLock(); + } +} +var isStop = false; +async function stopRFID() { + var { usbProductId, usbVendorId } = port.getInfo(); + if (usbVendorId == 6790 && usbProductId == 29987) {//桌面式 F5005-H + //停止读取标签 + var stop = [187, 24, 0, 24, 13, 10]; + var stopData = new Uint8Array(stop); + await writer.write(stopData); + isStop = true; + } +} + +async function writeRFID(barcode) { + if (!isStop) { + showResult('请先停止读取标签!'); + return; + } + var { usbProductId, usbVendorId } = port.getInfo(); + if (usbVendorId == 6790 && usbProductId == 29987) {//桌面式 F5005-H + var barcodeArr = stringtoArr(barcode); + var addArr = []; + if (barcodeArr.length < 18) { + for (var j = 0; j < 18 - barcodeArr.length; j++) { + addArr.push(0); + } + } + var arr = [187]; + var arr1 = [26, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 9]; + + var resultArr = arr1.concat(barcodeArr).concat(addArr); + var sum = eval(resultArr.join('+')); + var str = sum.toString(16); + var crc = str.substring(str.length - 2); + crc = eval("0x" + crc).toString(10); + var arr2 = [parseInt(crc), 13, 10]; + var newArr = arr.concat(resultArr).concat(arr2); + var data = new Uint8Array(newArr); + await writer.write(data); + } +} + window.addEventListener('beforeunload', function () { if (keepReading && reader) { keepReading = false;