2017-05-20 1 views
1

Ich bin neu in IoTHub. Ich habe erfolgreich Nachrichten an IOT-Hub (D2C) mit Python gesendet. Das Protokoll, das wir verwendet haben, ist mqtt.We versuchen, Daten aus der Cloud (IOT-Hub) mit Java abrufen, aber nicht in der Lage, einen richtigen Weg zum Empfangen von Nachrichten aus zu finden Die Cloud ... Meine Zweifel sind, ob wir Nachrichten von IOT Hub direkt lesen können oder wir müssen die eingehenden Nachrichten an einen Event-Hub umleiten, um die Nachricht abzurufen.So rufen Sie Daten aus der Cloud (iothub) mit mqtt in Java

Auch habe ich versucht, Nachrichten von iothub in Java beim Senden von Daten gleichzeitig lesen Wolke, aber ich habe den Fehler wie folgt .. (Verlorene Verbindung zum Server. 0 mal wieder anschließen.)

ich diesen Code verwenden zum lesen von Daten aus iothub,

import com.microsoft.azure.sdk.iot.device.DeviceClient; 
import com.microsoft.azure.sdk.iot.device.IotHubMessageResult; 
import com.microsoft.azure.sdk.iot.device.Message; 
import com.microsoft.azure.sdk.iot.device.MessageCallback; 
import com.microsoft.azure.sdk.iot.device.IotHubClientProtocol; 
import com.microsoft.azure.sdk.iot.service.sdk.IotHubServiceClientProtocol; 
import java.io.IOException; 
import java.net.URISyntaxException; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
public class Kafkareception { 

    public static void main(String[] args) throws IOException { 
     try { 
      String connString = "HostName="; 
      IotHubClientProtocol protocol = IotHubClientProtocol.MQTT; 
      DeviceClient client = new DeviceClient(connString, protocol); 

      MessageCallback callback = new AppMessageCallback(); 
      client.setMessageCallback(callback, null); 
      client.open(); 
     } catch (URISyntaxException ex) { 
      Logger.getLogger(Kafkareception.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private static class AppMessageCallback implements MessageCallback { 

     public IotHubMessageResult execute(Message msg, Object context) { 
      System.out.println(new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET) + "Received message from hub: "); 

      return IotHubMessageResult.COMPLETE; 
     } 
    } 
} 

Antwort

0

las ich die Daten aus iothub.We den Code

import java.io.IOException; 
import com.microsoft.azure.eventhubs.*; 
import com.microsoft.azure.servicebus.*; 

import java.nio.charset.Charset; 
import java.time.*; 
import java.util.function.*; 

public class Datafetch { 

    public static void main(String[] args) throws IOException { 
     EventHubClient client0 = receiveMessages("0"); 
     EventHubClient client1 = receiveMessages("1"); 
     System.out.println("Press ENTER to exit."); 
     System.in.read(); 
     try { 
      client0.closeSync(); 
      client1.closeSync(); 
      System.exit(0); 
     } catch (ServiceBusException sbe) { 
      System.exit(1); 
     } 
    } 

private static EventHubClient receiveMessages(final String partitionId) { 

     String connStr = "Endpoint={youreventhubcompatibleendpoint};EntityPath={youreventhubcompatiblename};SharedAccessKeyName=iothubowner;SharedAccessKey={youriothubkey}"; 
     EventHubClient client = null; 
     try { 
      client = EventHubClient.createFromConnectionStringSync(connStr); 
     } catch (Exception e) { 
      System.out.println("Failed to create client: " + e.getMessage()); 
      System.exit(1); 
     } 
     try { 
      client.createReceiver(
        EventHubClient.DEFAULT_CONSUMER_GROUP_NAME, 
        partitionId, 
        Instant.now()).thenAccept(new Consumer<PartitionReceiver>() { 
         public void accept(PartitionReceiver receiver) { 
          System.out.println("** Created receiver on partition " + partitionId); 
          try { 
           while (true) { 
            Iterable<EventData> receivedEvents = receiver.receive(100).get(); 
            System.out.println(receivedEvents); 
            int batchSize = 0; 
            if (receivedEvents != null) { 
             for (EventData receivedEvent : receivedEvents) { 
              System.out.println(String.format("Offset: %s, SeqNo: %s, EnqueueTime: %s", 
                receivedEvent.getSystemProperties().getOffset(), 
                receivedEvent.getSystemProperties().getSequenceNumber(), 
                receivedEvent.getSystemProperties().getEnqueuedTime())); 
              System.out.println(String.format("| Device ID: %s", receivedEvent.getSystemProperties().getClass())); 
              System.out.println(String.format("| Message Payload: %s", new String(receivedEvent.getBody(), 
                Charset.defaultCharset()))); 
              batchSize++; 
             } 
            } 
            System.out.println(String.format("Partition: %s, ReceivedBatch Size: %s", partitionId, batchSize)); 
           } 
          } catch (Exception e) { 
           System.out.println("Failed to receive messages: " + e.getMessage()); 
          } 
         } 
        }); 
     } catch (Exception e) { 
      System.out.println("Failed to create receiver: " + e.getMessage()); 
     } 
     return client; 
    } 
} 
+0

Was macht Ihr Code? –

1

von Ihnen bereitgestellten Informationen, können Sie die Einrichtung zwei aktive Verbindungen von einem Gerät versucht, Azure IoT Hub mit : Die eine ist D2C das Senden von Nachrichten und ist "lesen von Daten aus iothub ". Sie erhalten den Fehler möglicherweise, weil:

IoT Hub unterstützt nur eine aktive MQTT-Verbindung pro Gerät. Jede neue MQTT-Verbindung für die gleiche Geräte-ID bewirkt, dass IoT Hub die bestehende Verbindung löscht.

Ref: Communicate with your IoT hub using the MQTT protocol.

Wenn Sie D2C-Nachrichten empfangen möchten, die an Azure IoT Hub gesendet wurden, können Sie use Event Hub-compatible endpoint(Java). Sie müssen die eingehenden Nachrichten nicht selbst an einen Ereignis-Hub umleiten.

IoT Hub setzt die Nachrichten/Ereignisse Einbau-Endpunkt für Ihre Back-End-Dienste, die von Gerät zu Cloud-Nachrichten von Ihrem Hub empfangen zu lesen. Dieser Endpunkt ist mit Event Hub kompatibel, sodass Sie einen der Mechanismen verwenden können, die der Event Hubs-Dienst zum Lesen von -Nachrichten unterstützt.

Ref: Understand Azure IoT Hub messaging und IoT Hub endpoints.

+0

So kippen wir Daten aus iothub lesen können gleichzeitig, wenn Daten an iothub senden. Die Daten werden also auf eventhub umgeleitet, dann können wir die Daten vom Event-Hub aus über den Event-Hub-Endpunkt lesen. Ist es so? –

+0

Ja, ich habe diesen Link versucht https://docs.microsoft.com/en-us/azure/iot- hub/iot-hub-java-java-getstarted # Empfangs-Gerät-zu-Cloud-Nachrichten bereits. Ich habe null, wenn ich diesen Code Iterable receivedEvents = receiver.receive (100) .get(); –

+0

Können Sie diese D2C-Nachrichten in [Geräte-Explorer] (https://github.com/Azure/azure-iot-sdk-csharp/tree/master/tools/DeviceExplorer#monitor-device-to-cloud-events) erhalten? –

Verwandte Themen