modbus-connect
Version:
Modbus RTU over Web Serial and Node.js SerialPort
83 lines (68 loc) • 2.78 kB
JavaScript
// utils/getSerialPorts.js
async function getSerialPorts(transport, option = {}) {
if (transport === 'node') {
const { SerialPort } = await import('serialport');
const ports = await SerialPort.list();
const { vendorId } = option;
if (vendorId !== undefined) {
return ports
.filter(port => port.vendorId?.toLowerCase() === vendorId.toLowerCase())
.map(port => ({
path: port.path,
vendorId: port.vendorId?.toLowerCase(),
productId: port.productId?.toLowerCase(),
serialNumber: port.serialNumber,
port
}));
}
return ports
.filter(port => port.vendorId !== undefined)
.map(port => ({
path: port.path,
vendorId: port.vendorId?.toLowerCase(),
productId: port.productId?.toLowerCase(),
serialNumber: port.serialNumber,
port
}));
}
if (transport === 'web') {
if (!navigator?.serial) {
throw new Error('Web Serial API is not supported in this environment');
}
const { vendorId, requestNewPort = false } = option;
let ports = [];
if (requestNewPort) {
try {
const newPort = await navigator.serial.requestPort({
filters: vendorId ? [{ usbVendorId: parseInt(vendorId, 16) }] : []
});
ports.push(newPort);
} catch (err) {
console.warn('User cancelled port request or it failed:', err);
return [];
}
} else {
ports = await navigator.serial.getPorts();
}
const results = [];
for (const port of ports) {
const { usbVendorId, usbProductId } = port.getInfo();
// Игнорируем порты без vendorId
if (usbVendorId === undefined) continue;
const hexVendorId = usbVendorId.toString(16).padStart(4, '0').toLowerCase();
const hexProductId = usbProductId?.toString(16).padStart(4, '0').toLowerCase();
// Фильтрация по переданному vendorId
if (vendorId && hexVendorId !== vendorId.toLowerCase()) {
continue;
}
results.push({
port,
vendorId: hexVendorId,
productId: hexProductId
});
}
return results;
}
throw new Error(`Unknown transport type: ${transport}`);
}
module.exports = { getSerialPorts }