UNPKG

modbus-connect

Version:

Modbus RTU over Web Serial and Node.js SerialPort

83 lines (68 loc) 2.78 kB
// 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 }