2012-06-12 2 views
0

Im, создающий графический интерфейс Java на Netbeans для запуска на компьютере, который будет подключаться к устройству через последовательный порт. Этот GUI должен показывать информацию пользователя, которая будет храниться на другом устройстве. Как текстовый файл или для получения некоторых данных с датчиков устройства. Я только что закончил схему интерфейса, и теперь это сложнее, так как это первый раз, когда речь идет о последовательных портах. Другим устройством является beagleboard. Я немного не уверен, где начать, как я смотрел на этом форуме, но, похоже, ничего не касается моего вопроса. Я предполагаю, что должен установить соединение через порт с устройством и отправить запросы на информацию, как пользователь запрашивает.Java GUI, соединяющийся с последовательным портом

Рекомендации: Должно ли соединение устанавливаться в отдельном классе Java-программы? Gui состоит из основного JFrame и двух вспомогательных, и у меня (план) есть кнопка, чтобы в принципе установить соединение в основном кадре.

Заранее спасибо, Alex

+0

* «Графический пользовательский интерфейс состоит из главного JFrame и двух вспомогательных единиц» * См [Использование нескольких JFrames, хороший/плохой практике?] (Http://stackoverflow.com/a/9554657/ 418556) –

+1

@ Андрю Томпсон: Кто-то там активно учит людей использовать несколько JFrames. Я чувствую себя лососем, плавая вверх по течению, когда вижу, что вы пишете или пишете о одном и только одном JFrame. –

+0

@GilbertLeBlanc * «Когда я вижу, что вы пишете» * О, для меня это копия/вставка из моих «наиболее используемых линий». Не может быть надоело печатать его * каждый раз, когда я его использую. ;) –

ответ

1

Если соединение быть установлены в отдельном классе Java программы?

Да. Один класс java должен быть достаточным для установления соединения, отправки сообщений в beagleboard и получения ответов.

Предполагаю, что я должен установить соединение через порт с устройством и отправить запросы на информацию по запросу пользователя.

Да. Вы должны отформатировать запросы в любом формате, который требуется для бигля.

Вот класс, который я собрал, чтобы убедиться, что один экземпляр Java-приложения запущен. Вы изменили бы это для своих сообщений.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class ApplicationInstanceManager { 

    private static final boolean DEBUG = false; 

    private static ApplicationInstanceListener subListener; 

    /** Randomly chosen, but static, high socket number */ 
    public static final int SINGLE_INSTANCE_NETWORK_SOCKET = 44331; 

    /** Must end with newline */ 
    public static final String SINGLE_INSTANCE_SHARED_KEY = "$$RabidNewInstance$$\n"; 

    /** 
    * Registers this instance of the application. 
    * 
    * @return true if first instance, false if not. 
    */ 
    public static boolean registerInstance() { 
     // returnValueOnError should be true if lenient (allows app to run on 
     // network error) or false if strict. 
     boolean returnValueOnError = true; 
     // try to open network socket 
     // if success, listen to socket for new instance message, return true 
     // if unable to open, connect to existing and send new instance message, 
     // return false 
     try { 
      final ServerSocket socket = new ServerSocket(
        SINGLE_INSTANCE_NETWORK_SOCKET, 10, InetAddress 
          .getLocalHost()); 
      if (DEBUG) 
       System.out.println("Listening for application instances on socket " 
        + SINGLE_INSTANCE_NETWORK_SOCKET); 
      Thread instanceListenerThread = new InstanceListenerThread(socket); 
      instanceListenerThread.start(); 
      // listen 
     } catch (UnknownHostException e) { 
      EclipseLogging.logError(RabidPlugin.getDefault(), 
        RabidPlugin.PLUGIN_ID, e); 
      return returnValueOnError; 
     } catch (IOException e) { 
      return portTaken(returnValueOnError, e); 

     } 
     return true; 
    } 

    private static boolean portTaken(boolean returnValueOnError, IOException e) { 
     if (DEBUG) 
      System.out.println("Port is already taken. " 
        + "Notifying first instance."); 
     try { 
      Socket clientSocket = new Socket(InetAddress.getLocalHost(), 
        SINGLE_INSTANCE_NETWORK_SOCKET); 
      OutputStream out = clientSocket.getOutputStream(); 
      out.write(SINGLE_INSTANCE_SHARED_KEY.getBytes()); 
      out.close(); 
      clientSocket.close(); 
      System.out.println("Successfully notified first instance."); 
      return false; 
     } catch (UnknownHostException e1) { 
      EclipseLogging.logError(RabidPlugin.getDefault(), 
        RabidPlugin.PLUGIN_ID, e); 
      return returnValueOnError; 
     } catch (IOException e1) { 
      EclipseLogging 
        .logError(
          RabidPlugin.getDefault(), 
          RabidPlugin.PLUGIN_ID, 
          "Error connecting to local port for single instance notification", 
          e); 
      return returnValueOnError; 
     } 
    } 

    public static void setApplicationInstanceListener(
      ApplicationInstanceListener listener) { 
     subListener = listener; 
    } 

    private static void fireNewInstance() { 
     if (subListener != null) { 
      subListener.newInstanceCreated(); 
     } 
    } 

    public static void main(String[] args) { 
     if (!ApplicationInstanceManager.registerInstance()) { 
      // instance already running. 
      System.out.println("Another instance of this application " + 
        "is already running. Exiting."); 
      System.exit(0); 
     } 
     ApplicationInstanceManager 
       .setApplicationInstanceListener(new ApplicationInstanceListener() { 
        public void newInstanceCreated() { 
         System.out.println("New instance detected..."); 
         // this is where your handler code goes... 
        } 
       }); 
    } 

    public static class InstanceListenerThread extends Thread { 

     private ServerSocket socket; 

     public InstanceListenerThread(ServerSocket socket) { 
      this.socket = socket; 
     } 

     @Override 
     public void run() { 
      boolean socketClosed = false; 
      while (!socketClosed) { 
       if (socket.isClosed()) { 
        socketClosed = true; 
       } else { 
        try { 
         Socket client = socket.accept(); 
         BufferedReader in = new BufferedReader(
           new InputStreamReader(client.getInputStream())); 
         String message = in.readLine(); 
         if (SINGLE_INSTANCE_SHARED_KEY.trim().equals(
           message.trim())) { 
          if (DEBUG) 
           System.out.println("Shared key matched - " 
             + "new application instance found"); 
          fireNewInstance(); 
         } 
         in.close(); 
         client.close(); 
        } catch (IOException e) { 
         socketClosed = true; 
        } 
       } 
      } 
     } 
    } 
} 
+0

Спасибо, мне нужно будет изучить и посмотреть, работает ли вообще с помощью сокетов, в основном я видел людей, рекомендующих использовать javax.comm или клон RXTX. И похоже, что мне также придется заглянуть в несколько JFrames ... – alex91

+0

Теперь, когда я успел использовать код и начать понимать, что вы собрали, у меня есть дополнительные вопросы. частный статический ApplicationInstanceListener subListener; Это будет другой класс в проекте, который будет ждать, пока экземпляр будет создан? и еще одна вещь: EclipseLogging, откуда это взялось? Это какой-то файл журнала для хранения ошибок? Заранее спасибо, Alex – alex91

+0

@ alex91: EclipseLogging является частью плагина Eclipse, который я написал специально для отображения и регистрации ошибок плагина Eclipse. ApplicationInstanceListener - это слушатель, который я создал с помощью одного метода newInstanceCreated().Фактический код слушателя, который я написал, является частью другого класса приложения Eclipse для приложения, чтобы заставить текущее окно Eclipse в фокусе. Очевидно, ваш код слушателя будет другим. –

Смежные вопросы