none
关于android app使用azure IoT Hub的问题 RRS feed

  • 问题

  • 从官网下载的android sample demo有build成功(https://github.com/Azure/azure-iot-sdk-java/tree/95f8f4e80b3ec8b6fbbbc8e577e70d00c01e7a64/device/samples),使用 DeviceExplorer进行测试发现android app是可以发送和接受消息。 

    这种情况看起来是android设备和PC利用IoT Hub进行通讯。我想使用两个android app 利用IoT Hub进行通讯。用android sample build的APP发送,另一个接受,这样可以做到么?

    2017年3月2日 5:54

答案

  • Hi,

    正如您所说的, Azure IoT Hub 常规的设备间通讯就是通过服务器的 D2C C2D 来实现消息转发的

    此处使用的服务器用于消息的处理,以及指定转发的设备,据我所知,该服务器是需要开发者自己提供的。


    MSDN 社区技术支持
    如果该回复解决了您的问题,请及时点击“标记为答案”选项,如未解决请选择“取消标记为答案”,这会有利于其他人员来阅读您的帖子。如果您对MSDN 技术支持有任何的建议或意见,请随时联系 MSDNFSF@microsoft.com

    • 已标记为答案 BobbLiu 2017年3月3日 8:19
    2017年3月3日 7:53
    版主

全部回复

  • Hi BobbLiu,

    Azure IoT Hub 提供可靠的 设备到云 以及 云到设备的消息传送,所以您的关于两台Android设备通过 IoT Hub 完成消息传送的需求是可以通过以下 3 步完成:

    1. 第一台 Android 设备向 IoT Hub 发送消息;
    2. IoT Hub 接收消息并同时将所接收的消息发送给第二台 Android 设备;
    3. 第二台 Android 设备接收消息

    参考文档:

    1. Azure IoT 中心入门 (Java) - 提供 设备到云 的消息传送示例
    2. 使用 IoT 中心发送云到设备的消息 (Java) - 提供 云到设备 的消息传送示例
    3. Azure IoT 设备示例(Java) - Android 设备示例

    MSDN 社区技术支持
    如果该回复解决了您的问题,请及时点击“标记为答案”选项,如未解决请选择“取消标记为答案”,这会有利于其他人员来阅读您的帖子。如果您对MSDN 技术支持有任何的建议或意见,请随时联系 MSDNFSF@microsoft.com

    2017年3月2日 7:30
    版主
  • 第一台android设备向IoT Hub发送消息:

    public void SendMessage() throws URISyntaxException, IOException {
            // Comment/uncomment from lines below to use HTTPS or MQTT protocol
    //        IotHubClientProtocol protocol = IotHubClientProtocol.HTTPS;
            IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
    
            DeviceClient client = new DeviceClient(connString, protocol);
    
            try {
                client.open();
            } catch (IOException e1) {
                output("Exception while opening IoTHub connection: " + e1.toString());
            } catch (Exception e2) {
                output("Exception while opening IoTHub connection: " + e2.toString());
            }
    
            for (int i = 0; i < 5; ++i) {
                String msgStr = "Event Message " + Integer.toString(i);
                try {
                    Message msg = new Message(msgStr);
                    msg.setProperty("messageCount", Integer.toString(i));
                    output(msgStr);
                    EventCallback eventCallback = new EventCallback();
                    client.sendEventAsync(msg, eventCallback, i);
                } catch (Exception e) {
                    output("sendEventAsync exception: " + e.toString());
                }
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            client.close();
        }

    接收来自于IoT Hub的消息:

    private void receiveMessage() throws URISyntaxException, IOException {
            // Comment/uncomment from lines below to use HTTPS or MQTT protocol
    //        IotHubClientProtocol protocol = IotHubClientProtocol.HTTPS;
            IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
    
            DeviceClient client = new DeviceClient(connString, protocol);
    
            if (protocol == IotHubClientProtocol.MQTT) {
                MessageCallbackMqtt callback = new MessageCallbackMqtt();
                Counter counter = new Counter(0);
                client.setMessageCallback(callback, counter);
            } else {
                MessageCallback callback = new MessageCallback();
                Counter counter = new Counter(0);
                client.setMessageCallback(callback, counter);
            }
    
            try {
                client.open();
                output("Receive message open success");
            } catch (IOException e1) {
                output("Exception while opening IoTHub connection: " + e1.toString());
            } catch (Exception e2) {
                output("Exception while opening IoTHub connection: " + e2.toString());
            }
    
            try {
               Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            client.close();
            output("Receive message close success");
        }

    请问一下,IoT Hub 接收消息并同时将所接收的消息发送给第二台 Android 设备这个该怎么实现?

    android project中无法使用com.microsoft.azure.iothub-java-client:iothub-java-service-client library, 如果使用这个library会报下面的错误信息:

    Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Runnable

    谢谢!


    • 已编辑 BobbLiu 2017年3月2日 7:51 添加错误信息
    2017年3月2日 7:45
  • Hi BobbLiu,

    > 请问一下,IoT Hub 接收消息并同时将所接收的消息发送给第二台 Android 设备这个该怎么实现?

    根据官网提供的2个示例即可实现该功能

    1. Azure IoT 中心入门 (Java)  - 接收设备到云的消息
    2. 使用 IoT 中心发送云到设备的消息 (Java) - 发送云到设备的消息

    示例1 中接收到的消息,做为 示例2 的发送消息即可。(PC 端实现)

    >android project中无法使用com.microsoft.azure.iothub-java-client:iothub-java-service-client library, 如果使用这个library会报下面的错误信息: Error:Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.lang.Runnable

    Service SDK 是服务器端使用的,Android 端并没有该 SDK

    参考文档 Microsoft Azure IoT SDKs for Java


    MSDN 社区技术支持
    如果该回复解决了您的问题,请及时点击“标记为答案”选项,如未解决请选择“取消标记为答案”,这会有利于其他人员来阅读您的帖子。如果您对MSDN 技术支持有任何的建议或意见,请随时联系 MSDNFSF@microsoft.com


    2017年3月2日 10:07
    版主
  • 也就是说,如果要想实现一个app 到另一个app之间的通讯,就必须有一个服务器,用来部署一个应用程序实现接收D2C的消息并且实现C2D把接收的消息进行转发,是吗?

    如果是这样的话,我想问一下用来部署应用程序的服务器是需要开发者提供还是Azure对于这个有提供相应的设定或者相关的服务?

    谢谢!

    2017年3月3日 0:56
  • Hi,

    正如您所说的, Azure IoT Hub 常规的设备间通讯就是通过服务器的 D2C C2D 来实现消息转发的

    此处使用的服务器用于消息的处理,以及指定转发的设备,据我所知,该服务器是需要开发者自己提供的。


    MSDN 社区技术支持
    如果该回复解决了您的问题,请及时点击“标记为答案”选项,如未解决请选择“取消标记为答案”,这会有利于其他人员来阅读您的帖子。如果您对MSDN 技术支持有任何的建议或意见,请随时联系 MSDNFSF@microsoft.com

    • 已标记为答案 BobbLiu 2017年3月3日 8:19
    2017年3月3日 7:53
    版主
  • Hi,BobbLiu

    可以实现。

    第二个 Android 设备作为“云端”使用(不过这样不是物联网的应用场景了),具体实现方式是第二个Android设备用 Event Hub 读取 IoT Hub 中的 D2C 消息,即第一个 Android 设备发出来的消息。

    Java 的 Event Hub SDK 可以从 https://github.com/Azure/azure-event-hubs-java 找到,连接 Event Hub 使用的 Connection String 就是你的 IoT Hub 中具有读取 D2C 消息权限的 Connection String,比如 iothubowner 或者 service。如果创建 Event Hub 客户端时需要 Event Hub Path,这个 Path 是 messages/events/


    2017年3月24日 8:49