DSP 将原始以太网数据包发送到 PC,而不是 PC 捕获这些数据包并发送确认响应。他们正在向MAC发送消息传递到MAC,因此没有IP层。我想每 1 毫秒进行一次实时消息,DSP 每 1 毫秒发送一次消息,但 PC 无法捕获消息并在 1 毫秒内发送回复。捕获和发送数据包需要 15 - 30 毫秒。这个结果对我来说太慢了。我怎样才能使它更快。我正在使用jpcap库和我的操作系统Win XP x32。
捕获代码:
private void captor() {
try {
captor = JpcapCaptor.openDevice(cf.getDevice(), 100, true, 1);
} catch (Exception ex) {
Logger.getLogger(CapturingPacket.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void capturing() {
Packet packet = captor.getPacket();
if (packet != null) {
if (packet.data.length > 0) {
EthernetPacket ethernetPacket = (EthernetPacket) packet.datalink;
String receivedDestMac = Common.byteToMacStringFormat(ethernetPacket.src_mac);
if (definedDestMac.equals(receivedDestMac)) {
captured(packet.data);
}
}
}
}
private class captureRunner implements Runnable {
public void run() {
captor();
while (running) {
capturing();
try {
Thread.sleep(0);
} catch (InterruptedException err) {
}
}
}
}
发送代码:
private void send(byte[] message) {
try {
JpcapSender send = JpcapSender.openDevice(cf.getDevice());
Packet packet = new Packet();
//ethernet frame
EthernetPacket ethernetPacket = new EthernetPacket();
// #dst_mac
ethernetPacket.dst_mac = getDestMac();
// #src_mac
ethernetPacket.src_mac = cf.getDevice().mac_address;
// #frametype
ethernetPacket.frametype = Common.ETHERNET_FRAME_TYPE;
// #data
packet.data = message;
// datalink
packet.datalink = ethernetPacket;
send.sendPacket(packet);
send.close();
} catch (Exception ex) {
Common.showErrorMessage("Send Error");
Logger.getLogger(MessagingPacket.class.getName()).log(Level.SEVERE, null, ex);
}
}
"捕获和发送数据包需要 15 - 30 毫秒" -- 这是正常的。你不能让它变得更快。Windows不是一个实时操作系统。改用微控制器(有更好的选择,如FPGA和ARM,但我没有这方面的经验)。
使用libpcap
过滤器,您可以通过 JPcap 设置该过滤器,而不是 Java 过滤器。这样,甚至不会捕获不匹配的数据包,更不用说导致回调到 JPcap 然后是您的 Java 代码。
还要使用比 100 大得多的缓冲区。