通过UDP接收实时GPS数据

时间:2012-08-16 19:24:44

标签: java gps udp real-time

我正在构建一个实时GPS跟踪系统,它将接收使用UDP从几个Arduino设备发送的GPS数据。到目前为止我有这个代码:

PreparedStatement stmt ...

DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];

while(true){
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    serverSocket.receive(receivePacket);
    String received = new String( receivePacket.getData());
    System.out.println("RECEIVED: " + received);

    stmt.set...
    stmt.execute();
}

1 - 知识更多的人可以告诉我是否有更好的方法吗?我真的不知道JVM如何处理这个问题,但我不喜欢那个无限循环。

2 - 假设我有50个Arduinos发送数据。我需要使用线程或类似的东西吗?

3 - 最好使用每个“连接”的线程(UDP是无连接的),如下面的答案或使用Apache Mina或Netty等框架/库?

3 个答案:

答案 0 :(得分:2)

在这种情况下使用无限循环没有问题。调用receive会一直等到新的数据报传递完毕:

  

此方法将一直阻塞,直到收到数据报。的...

因此,没有浪费CPU功率,它只是等待新数据可用。

如果您有许多客户端或者处理数据包并不是完全无关紧要的,那么您应该启动一个新线程来处理每个客户端,这样接收数据报的主线程就不会被阻塞。可能最好的方法是使用thread pools为您创建线程,同时防止在请求超载您的应用程序时创建太多线程。

我将按以下步骤进行:

  1. 创建用于接收数据报的专用线程。它还可以创建一个线程池来分派处理请求。类似的东西:

    int maxNumberOfThreads = ...; // your choice
    int bufSize = ...; // your choice
    
    ExecutorService exec = Executors.newFixedThreadPool(maxNumberOfThreads);
    DatagramSocket serverSocket = new DatagramSocket(9876);
    
    while (true) {
        // we need to create a new buffer every time because
        // multiple threads will be working with the data
        DatagramPacket receivePacket = 
            new DatagramPacket(new byte[bufSize], bufSize);
        serverSocket.receive(receivePacket);
        exec.submit(new YourTask(receivePacket));
    }
    
  2. 创建处理数据报的类YourTask

    // We don't use return values for anything here, so
    // we just use Object.
    public class YourTask extends Callable<Object> {
        private DatagramPacket received;
    
        public YourTask(DatagramPacket received) {
            this.received = received;
        }
    
        public Object call() {
            // do your processing here
            System.out.println("RECEIVED from " +
                received.getAddress() +
                ": " + new String(received.getData(),
                                  0, received.getLength()));
            return null;
        }
    }
    

答案 1 :(得分:1)

我建议您查看Apache MINA(http://mina.apache.org/),这是一个适用于网络应用程序的优秀框架。使用MINA,您不需要实现循环或担心线程。

答案 2 :(得分:1)

我在你的问题中看到的实际问题是“实时”一词。你那是什么意思?您是否需要高度可预测的(在时间方面)应用程序,它是安全/关键任务吗?如果是这样,使用Java可能会有问题,因为它有很多原因(即垃圾收集器等)不是实时的。然而,有一些实时JVM为http://www.atego.com/products/aonix-perc/。 我喜欢Java,但我想在这种情况下,如果你真的需要一个RT系统,C ++将是一个更好的选择。