Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'JavaFx'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 1 wynik

  1. Zainspirowany artykułem o komunikacji Raspberry Pi z ESP32 z użyciem Mqqt chciałbym pokazać jak korzystając z JavaFx stworzyć prosty panel kontrolny dla urządzenia pracującego z tymże protokołem. JavaFX pozwala tworzyć aplikacje, które wyglądają bardziej nowocześnie, są równie wydajne, a przy tym można zachować dużo większą czytelność kodu. Od Javy w wersji 8 staje się to rekomendowaną biblioteką tworzenia graficznego interfejsu użytkownika[1]. Do przygotowania projektu będziemy potrzebować Eclipse IDE for Java Developers który znajdziemy tutaj https://www.eclipse.org/downloads/packages/ oraz wtyczki e(fx)clipse którą wyszukujemy i instalujemy poprzez Eclipse Marketplace znajdujący się w zakładce Help trzecia pozycja od dołu. Kiedy nasza instalacja zakończy się uruchamiamy ponownie Eclipsa i tworzymy nowy projekt wybierając File >> New >> Projekt… Po przejściu do ostatniego kroku kreatora nasz projekt pokaże się po lewej stronie. Do budowy projektu potrzebujemy jeszcze biblioteki Eclipse Paho którą znajdziemy pod tym odnośnikiem https://www.eclipse.org/downloads/download.php?file=/paho/releases/1.1.0/Java/plugins/org.eclipse.paho.client.mqttv3_1.1.0.jar Po pobraniu biblioteki dodajemy ją do naszego projektu przechodząc do File >> Properties I w zakładce Libraries w podmenu Java Builid Path wybieramy Add External JARs... i wskazujemy plik pobranej biblioteki. Teraz w naszym wygenerowanym projekcje ustawiamy parametry połączenia, kolejno nieprzechowywanie wiadomości pomiędzy ponownymi połączeniami z serwerem MQTT, czas oczekiwania na wiadomość, nazwę użytkownika i jego hasło. Na koniec tworzymy obiekt połączenia podając adres brokera wraz z portem oraz nazwę naszego klienta. MqttConnectOptions connectOptions = new MqttConnectOptions(); connectOptions.setCleanSession(true); connectOptions.setKeepAliveInterval(120); connectOptions.setUserName("tutaj nazwa użytkownika"); connectOptions.setPassword("tutaj hasło".toCharArray()); MqttClient mqttClient = new MqttClient("tcp://tutaj adres serwera:1883", "SimpleMqqt"); W następnym kroku stworzymy lewy panel który będzie wyświetlał stan czujników przykładowo temperaturę oraz obroty wentylatora oraz prawy panel z przyciskami do sterowania przykładowo oświetleniem zewnętrznym oraz oświetleniem wewnętrznym. Label temperatureLabel = new Label("Temperatura"); Label temperatureValue = new Label("0 \u2103"); Label fanLabel = new Label("Praca Wentylatora"); Label fanValue = new Label("0 %"); VBox leftBox = new VBox(temperatureLabel, temperatureValue, fanLabel, fanValue); leftBox.setAlignment(Pos.BASELINE_RIGHT); leftBox.setBackground(new Background(new BackgroundFill(Color.SEASHELL, null, null))); Label light1Label = new Label("Oświetlenie wnętrze"); Button light1Button = new Button("WYŁ"); Label light2Label = new Label("Oświetlenie zewnętrzne"); Button light2Button = new Button("WYŁ"); VBox rightBox = new VBox(light1Label, light1Button, light2Label, light2Button); rightBox.setAlignment(Pos.BASELINE_RIGHT); rightBox.setBackground(new Background(new BackgroundFill(Color.ALICEBLUE, null, null))); Mając już stworzone panele możemy dodać akcje dla przycisków czyli przesłanie wiadomości WŁ jeżeli przycisk na etykietę WYŁ i odwrotnie. Tutaj mam dwie możliwości tworząc obiekt wiadomości lub poprzez konfigurację bezpośrednią przy nadaniu wiadomości podając nazwę tematu, zawartość wiadomości, QoS, czy powinien zachować wiadomość light1Button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { //Wysłanie wiadomości bez tworzenia obiektu try { if (((Button) event.getSource()).getText().equals("WYŁ")) { mqttClient.publish("mqtt/control/light1", "WŁ".getBytes(), 0, false); } else { mqttClient.publish("mqtt/control/light1", "WYŁ".getBytes(), 0, false); } } catch (MqttException e) { e.printStackTrace(); } }}); light2Button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { //Wysłanie wiadomości z wykorzystaniem obiektu try { if (((Button) event.getSource()).getText().equals("WYŁ")) { MqttMessage mqttMessage = new MqttMessage(); mqttMessage.setPayload("WŁ".getBytes()); mqttMessage.setQos(0); mqttClient.publish("mqtt/control/light2",mqttMessage); } else { MqttMessage mqttMessage = new MqttMessage(); mqttMessage.setPayload("WYŁ".getBytes()); mqttMessage.setQos(0); mqttClient.publish("mqtt/control/light2", mqttMessage); } } catch (MqttException e) { e.printStackTrace(); } }}); Możemy sterować oświetleniem ale chcielibyśmy także otrzymywać aktualizację danych z czujników. W tym celu potrzebujemy stworzyć obiekt który pozwoli nam wykonać akcję po otrzymaniu nowej wiadomości. MqttCallback mqttCallback = new MqttCallback() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { if (topic.equals("mqtt/temperature")) { Platform.runLater(new Runnable() { @Override public void run() { temperatureValue.setText(message.toString() + " \u2103"); }}); } else if (topic.equals("mqtt/fan")) { Platform.runLater(new Runnable() { @Override public void run() { fanValue.setText(message.toString() + " %"); }}); } else if (topic.equals("mqtt/state/light1")) { Platform.runLater(new Runnable() { @Override public void run() { light1Button.setText(message.toString()); }}); } else if (topic.equals("mqtt/state/light2")){ Platform.runLater(new Runnable() { @Override public void run() { light2Button.setText(message.toString()); }}); }} @Override public void deliveryComplete(IMqttDeliveryToken arg0) { // TODO Auto-generated method stub } @Override public void connectionLost(Throwable arg0) { // TODO Auto-generated method stub } }; W metodzie messageArrived dodajemy akcje ustawienia wartości temperatury kiedy otrzymamy wiadomość dla tematu mqtt/temperature , tak samo dla pracy wentylatora oraz akcję zmiany etykiety przycisku sterowania oświetleniem kiedy w temacie mqtt/state/light pojawi zmiana jego stanu. Jako że budowa JavaFx nie pozwala bezpośrednio na zmianę wartości elementów musimy skorzystać z konstrukcji Platform.runLater. Tak przygotowany obiekt wskazujemy jako odbiorcę wiadomości w naszym obiekcie połączenia, łączymy się z brokerem za pomocą obiektu z parametrami połączenia oraz obserwujemy wybrane przez nas tematy. mqttClient.setCallback(mqttCallback); mqttClient.connect(connectOptions); mqttClient.subscribe("mqtt/temperature"); mqttClient.subscribe("mqtt/fan"); mqttClient.subscribe("mqtt/state/light1"); mqttClient.subscribe("mqtt/state/light2"); Do głównego okna aplikacji dodajemy poprzednio stworzone panele. BorderPane root = new BorderPane(); root.setLeft(leftBox); root.setCenter(rightBox); Scene scene = new Scene(root, 400, 400); scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.setTitle("Simple Mqqt Control"); primaryStage.show(); Ostatni krok to dodanie akcji zamknięcia połączenia z naszym serwerem, kiedy zamkniemy okno naszej aplikacji. primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent event) { try { mqttClient.disconnect(); mqttClient.close(); } catch (MqttException e) { e.printStackTrace(); } } }); Nasz klient jest gotowy do użycia, jako że jest to tylko przykład nie powala swoim wyglądem. Jest podzielony na sekcję czujników i sekcję kontroli client.zip [1] https://javastart.pl/baza-wiedzy/frameworki/javafx
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.