Как отправлять Ethernet-кадры в Java без стека TCP/IP
Мое Java-приложение должно управлять внешним устройством (технология EtherCAT Bus), напрямую подключенным к сетевому интерфейсу моего компьютера (Ubuntu и Windows). Другие сетевые устройства не подключены. Связь осуществляется по стандартным Ethernet-фреймам IEEE 802.3 без стека IP.
Пример для отправки данных:
int etherType = 0x88A4; // the EtherType registered by IEEE
byte[] macBroadcast = new byte[] {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
byte[] macSource = new byte[] ... ; // MAC Address of my network interface card
byte[] buffer = ... // the data to send
device.write(macSource, macBroadcast, etherType, buffer);
Я попробовал JNetPcap, который использует нативную библиотеку pcap. Данный API был в порядке, но были проблемы с многопоточностью при большой нагрузке, что заставило меня отказаться.
netty.io также был кандидатом. Я не уверен, но стек TCP/IP является обязательным. Я прав?
Есть ли другие идеи для связи с низкоуровневыми Ethernet-фреймами? Я бы предпочел чистую библиотеку Java, такую как netty.io, если таковая существует.
Конечно, JNA/JNI тоже вариант. Но я не хочу писать C-код.
Другие альтернативы?
1 ответ
Вот варианты, которые я смог найти:
- jNetPcap - это оболочка libpcap для Java - http://jnetpcap.com/
- Jpcap - это еще одна оболочка libpcap для Java - https://github.com/mgodave/Jpcap
- RockSaw - это библиотека для отправки и получения пакетов IPv4 и IPv6 с использованием "сырых сокетов" - http://www.savarese.org/software/rocksaw/. Из того, что я могу сказать, это довольно ограничено, и не тронут с 2007 года.
- Netutils использует libpcap и libnet - http://code.google.com/p/netutils/
Я также видел комментарии о том, что jNetPcap должен быть потокобезопасным, но на практике это не так; то есть он глючит при использовании с несколькими потоками.