Jump to content
🌟 NOTIFICATION/Benachrichtigung: Welcome to our New Store! - shelly.com 🌟 ×

Einen beliebigen String per Broadcast senden.


Peter Heydt

Recommended Posts

Gibt es eine Möglichkeit einen x-beliebigen Textstring aus einem Shelly
auf eine Broadcast Adresse xxx.xxx.xxx.255 und angegebenem Port zu schicken?

Ich habe ein Steuerungssystem das komplett mit vielen Aktoren und Sensoren über udp Broadcasting läuft.
Es befindet sich in einem anderen IP Bereich als das Shelly-Netzwerk.
Es wird nicht per MQTT gesteuert!

Ich möchte nun Aktoren in diesem Steuerungssystem über Shellys ansteuern.
Das ganze Broadcasting muss aber nicht mitgelesen werden.

Kann man das ggf. über Shelly-Script machen?
Für eine qualifizierte Antwort wäre ich sehr dankbar!

 

Link to comment
Share on other sites

Falls ich dich richtig verstanden habe, willst du ein UDP DatagramPacket an eine IP-Adresse senden, ein Aktor der die Nachricht versteht soll dann eine Aktion durchführen.

Wenn das so ist, dann würde ich, naiverweise so vorgehen.

Shelly Geräte können mit Hilfe von Webhooks URLs aufrufen. Also würde ich einen einfachen Webserver (alsGateway/Proxy) schreiben der diese URLs entgegennimmt und dann entsprechende Daten an eine IP Adresse über UDP sofort versendet.

Soweit ich weiss, man könnte auch nginx dafür konfigurieren, aber der Konfigurationsärger lohnt sich kaum, denn so ein Webserver ist zügig implementiert. Mit java, python oder Go sind es "nur ein Paar" Zeilen code.

import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.nio.charset.StandardCharsets;

public class HttpToUdpForwarder {

    public static void main(String[] args) throws IOException {
        // Create an HTTP server listening on port 8080
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/forward", new HttpHandler() {
            @Override
            public void handle(HttpExchange exchange) throws IOException {
                if ("POST".equals(exchange.getRequestMethod())) {
                    // Read the request body
                    byte[] requestBody = exchange.getRequestBody().readAllBytes();
                    String requestData = new String(requestBody, StandardCharsets.UTF_8);

                    // Forward the request data to the UDP server
                    forwardToUdpServer(requestData, "127.0.0.1", 9999);

                    // Send a response back to the client
                    String response = "Request forwarded to UDP server";
                    exchange.sendResponseHeaders(200, response.getBytes().length);
                    OutputStream os = exchange.getResponseBody();
                    os.write(response.getBytes());
                    os.close();
                } else {
                    exchange.sendResponseHeaders(405, -1); // Method Not Allowed
                }
            }
        });

        // Start the server
        server.setExecutor(null);
        server.start();
        System.out.println("HTTP server started on port 8080");
    }

    private static void forwardToUdpServer(String data, String udpHost, int udpPort) {
        try (DatagramSocket socket = new DatagramSocket()) {
            byte[] buffer = data.getBytes(StandardCharsets.UTF_8);
            InetSocketAddress address = new InetSocketAddress(udpHost, udpPort);
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address);
            socket.send(packet);
            System.out.println("Data forwarded to UDP server: " + data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

Edited by shellymelly
Link to comment
Share on other sites

  • 4 weeks later...

Hallo shellymelly,

danke für die Antwort und für das Snippet.
Ja du hattest richtig verstanden, ich habe ein System mit einigen Arduino's die alle gemeinsam auf ein UDP Broadcast hören.
Das Modul das mit der Nachricht etwas anfangen kann reagiert dann darauf.

An die Möglichkeit mit einem zwischengeschalteten "Übersetzer" hatte ich auch schon gedacht.
Es wäre halt schön gewesen, wenn ich so ein "Telegramm" direkt aus dem Shelly hätte schicken können.
Trotzdem vielen Dank.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Erstelle neue...