Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Socket UDP - Elaborare stringa in ingresso

    Save a tutti, sono un pò neofita in java, mi sto acculturando e facendo ricerche varie, ma non riesco a venirne a capo:
    Ho un sistema di automazione che mi invia ogni 10 secondi delle stringhe UDP, ove sono contenuti dei valori dai quali riesco a sapere se una luce è accesa o spenta.
    Sto usando Eclipse, ho creato un socket UDP di ascolto, riesco a ricevere la stringa, ove l'ho tradotta anche in HEX (esadecimale), ma ora non riesco a capire come estapolare i valori


    codice:
    //Importo i package necessari
    import java.net.*;
    import java.io.*;
    public class ServerUDP {
    public void start() throws IOException {
     
         //Attivo la Socket sul Server in ascolto sulla porta 7777
         DatagramSocket serverSocket = new DatagramSocket(7777);
         byte[] buffer = new byte[2000];
         DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
     
         //Informazioni sul Server in ascolto
         InetAddress indirizzo = serverSocket.getLocalAddress();
         String server = indirizzo.getHostAddress();
         int port = serverSocket.getLocalPort();
         System.out.println("In ascolto Server UDP: "+ server + " porta: " + port);
     
         //Ciclo infinito per ascolto dei Client
         while (true) {
     
           //Messaggio ricevuto dal Client
           serverSocket.receive(packet);
           String ricevuto = new String( packet.getData(), 0, packet.getLength());
           for (int x = 0; x < 28; x++) {
           System.out.print(Integer.toHexString(buffer[x] & 0xFF)+" ");
           }
           System.out.print("\n" + ricevuto);
           System.out.print("\n");
         }
    }
       public static void main (String[] args) throws IOException {
         ServerUDP udpServer = new ServerUDP();
         udpServer.start();
       }

    Ho come risultato:
    In ascolto Server UDP: 0.0.0.0 porta: 7777
    72 4d 64 64 72 76 0 2 52 0 10 0 0 f4 0 0 0 0 17 1 1 6 0 0 0 0 0 0

    la stringa ricevuto mi da come risultato solo le lettere tranne i numeri, sarà qualche problema di formattazione?
    io ho necessità di estrarre "f4" che poi devo convertire in decimale, e i valori degl'ultimi 8 byte, ossia 1,6,0,0,0,0,0,0; ognuno di questi avrei necessità di convertirli in codice binario.

    Grazie per l'aiuto

    Gerardo
    Ultima modifica di LeleFT; 30-09-2014 a 16:41 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gesatecnico Visualizza il messaggio
    codice:
           String ricevuto = new String( packet.getData(), 0, packet.getLength());
    Ho come risultato:
    In ascolto Server UDP: 0.0.0.0 porta: 7777
    72 4d 64 64 72 76 0 2 52 0 10 0 0 f4 0 0 0 0 17 1 1 6 0 0 0 0 0 0

    la stringa ricevuto mi da come risultato solo le lettere tranne i numeri, sarà qualche problema di formattazione?
    Da quanto posso vedere, dalla sequenza di valori hex, non risulta essere completamente una stringa di testo "puro". Ci sono nulli in mezzo, valori 1, 6, ecc...
    Non sarebbe quindi da trattare interamente come stringa come hai fatto tu con il costruttore di String.

    Parli di un "sistema di automazione", che cosa è di preciso? Usa un suo protocollo di comunicazione? quale è? A me quella sequenza di byte non dice assolutamente nulla. Quindi si tratta principalmente di verificare se c'è della documentazione ufficiale che descrive il protocollo. Senza specifiche e documentazione potrei solo prendere quei valori e giocarli al lotto .....

    Quote Originariamente inviata da gesatecnico Visualizza il messaggio
    ognuno di questi avrei necessità di convertirli in codice binario.
    Un byte è "binario". Se vuoi la rappresentazione del valore in stringa in base 2, se hai visto toHexString(), probabilmente hai anche visto toBinaryString().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Praticamente è un sistema di automazione di luci, ha un suo protocollo UDP per scambio informazioni, in particolare la stringa che ricevo riguarda gli stati delle luci.
    Per la stringa che ricevo, quel valore f4 sta ad indicare l'indirizzo dell'apparato in campo (tradotto in decimale 244), ne ho 10 in campo, tutti con numerazione diversa;
    mentre invece gli ultimi 8 byte mi stanno ad indicare gli stati però con questa particolarità:
    esempio: 1,6,0,0,0,0,0,0
    il primo byte sta ad indicare gli stati delle uscite dell'apparato dalla n. 1 alla 8
    il secondo byte dalla 9 a 16
    il terzo byte dalla 17 a 24
    il quarto byte dalla 25 alla 32
    e il quinto byte dall 33 alla 40
    il 6,7,8 non usati.
    In base al numero che mi da in HEX, convertito in codice binario, per esempio
    I°byte
    1(hex)=00000001 (binario) mi dice che solo l'uscita 1 è attiva;
    II°byte
    6(hex)=00000110 (binario) mi dice che solo le uscite 10 e 11 sono attive
    alla fine della risposta, in pratica dovrei creare con java un listato in un file xml, ove vado ad aggiornare continuamente gli stati delle luci, che a sua volta riporto in un'applicazione Openremote.

    Come mi consigli di andare avanti?
    Grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gesatecnico Visualizza il messaggio
    Come mi consigli di andare avanti?
    Innanzitutto non tentare la conversione in String. Non ha molto senso vista la sequenza di byte, non è una sequenza di caratteri in senso completo.
    Hai l'array di byte, puoi prendere direttamente quelli che ti servono. Se un dato che ti aspetti è ad un indice fisso, noto, meglio ancora.
    Se hai bisogno di fornire in output la rappresentazione in binario di un byte, allora come ho detto c'è toBinaryString. Se ti serve invece testare i singoli bit dei byte, non c'è bisogno della rappresentazione in String. Basta usare gli operatori bitwise (una "AND" in questo caso).

    Per quanto riguarda la generazione di un XML, da Java si può fare in svariati modi, usando tecniche e librerie differenti. Bisogna vedere cosa conosci, cosa puoi usare e come è il formato (la struttura) del XML.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    OK, grazie per il consiglio, con che metodo mi consigli di ricavare i dati dagli array di byte?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gesatecnico Visualizza il messaggio
    OK, grazie per il consiglio, con che metodo mi consigli di ricavare i dati dagli array di byte?
    Se si tratta di un "bit set" (ovvero N byte di cui consideri i singoli bit come dei flag a sé stanti), ci sono diverse possibilità. Esiste la classe java.util.BitSet che da Java 7 è anche facile da creare partendo da un byte[] (prima di Java 7, no, non c'era questa possibilità). Altrimenti c'è sempre la strada fai-da-te: dato l'offset in bit, ricavi l'offset del byte e la maschera del bit usando gli operatori di shift e bitwise di Java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se si tratta di un "bit set" (ovvero N byte di cui consideri i singoli bit come dei flag a sé stanti), ci sono diverse possibilità. Esiste la classe java.util.BitSet che da Java 7 è anche facile da creare partendo da un byte[] (prima di Java 7, no, non c'era questa possibilità). Altrimenti c'è sempre la strada fai-da-te: dato l'offset in bit, ricavi l'offset del byte e la maschera del bit usando gli operatori di shift e bitwise di Java.
    Andrea scusami per l'ignoranza, ma non riuscito a capire in che modo usare la classe bitset per estrapolare i dati che mi occorrono, cioè come dire dammi il byte n. 14, e gli ultimi 8.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gesatecnico Visualizza il messaggio
    cioè come dire dammi il byte n. 14, e gli ultimi 8.
    Ma prendere singoli byte dall'array non è certo un problema ... la sintassi la conosci già (non credo devo spiegarla, giusto?), è array[indice] , sapendo anche che indice è 0-based.

    Se invece vuoi gestire un bit-set, per esempio, dato un array:

    byte[] arr = { 0, 0, 1, 6, 0, 0 };

    Se a te serve "vedere" come un bit-set i due byte agli indici 2 e 3 che ho segnato in rosso, allora da Java 7 puoi fare:

    BitSet bitSet = BitSet.valueOf(Arrays.copyOfRange(arr, 2, 4));

    oppure

    BitSet bitSet = BitSet.valueOf(ByteBuffer.wrap(arr, 2, 2));

    La principale differenza è che copyOfRange crea un nuovo array mentre wrap di ByteBuffer incapsula l'array e ne permette l'accesso "attraverso" ByteBuffer.

    Poi:

    codice:
    System.out.println(bitSet.get(0));    // true
    System.out.println(bitSet.get(9));    // true
    System.out.println(bitSet.get(10));    // true

    I 3 true stampati sono relativi ai 3 bit a '1' che ci sono nel bit-set { 1, 6 }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Scusami, ma in quel momento non conoscevo la sintassi..
    Alla fine sono riuscito ad avere i risultati di tutti gli Stati che mi interessavano.
    Ora vorrei creare un xml trasportandoci tutti i dati ricavati, però non so come fare, cosa mi consigli?
    Inoltre se al XML gli invio i dati ogni 10 secondi, lui aggiorna le voci automaticamente?
    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.