You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Android设备读取Azure IoT Hub的设备到云端遥测数据?

直接让Android读取IoT Hub D2C遥测数据的方案

嘿,我完全懂你现在绕弯路的困扰——用函数转发确实太折腾了,其实咱们直接让Android读取IoT Hub的设备到云(D2C)遥测数据就行!你之前用的DeviceClient是设备端SDK,它的职责是让设备接收云到设备(C2D)消息,根本不是用来读取D2C遥测的。要读D2C遥测,得用服务端SDK或者直接调用IoT Hub的REST API,下面给你两种可行方案:

方案一:使用Azure IoT Hub服务端SDK(推荐)

这个SDK专门用来做IoT Hub的服务端操作,读取遥测是它的核心能力之一,而且兼容Android。

步骤1:添加依赖

在你的Android项目的app/build.gradle里添加服务端SDK依赖(确认用最新兼容版本):

dependencies {
    implementation 'com.microsoft.azure.sdk.iot:iot-service-client:1.30.0'
}

步骤2:获取IoT Hub服务端连接字符串

去Azure门户找到你的IoT Hub,进入「共享访问策略」,选择拥有ServiceConnect权限的策略(比如iothubowner),复制它的连接字符串——注意这是服务端凭证,别硬编码在代码里,存到Android Keystore或者安全配置文件里!

步骤3:实现遥测读取逻辑

下面是简化的代码示例,能直接监听IoT Hub的Events端点:

import com.microsoft.azure.sdk.iot.service.IotHubServiceClient;
import com.microsoft.azure.sdk.iot.service.exceptions.IotHubException;
import com.microsoft.azure.sdk.iot.service.receive.ReceiveOptions;
import com.microsoft.azure.sdk.iot.service.receive.Message;
import com.microsoft.azure.sdk.iot.service.receive.MessageCallback;
import com.microsoft.azure.sdk.iot.service.receive.MessageCallbackResult;

import android.os.Handler;
import android.os.Looper;
import java.io.IOException;

public class TelemetryReceiver {
    private static final String IOT_HUB_SERVICE_CONN_STRING = "你的服务端连接字符串";
    private static final String CONSUMER_GROUP = "$Default"; // 默认消费组,多客户端可自定义

    private IotHubServiceClient serviceClient;
    private final Handler mainHandler = new Handler(Looper.getMainLooper());

    public void startListeningTelemetry() {
        try {
            serviceClient = new IotHubServiceClient(IOT_HUB_SERVICE_CONN_STRING);
            ReceiveOptions receiveOptions = new ReceiveOptions();
            receiveOptions.setReceiveTimeout(10000); // 超时时间设置

            // 遥测消息回调
            MessageCallback callback = (message, context) -> {
                String telemetryData = new String(message.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET);
                
                // 切到主线程更新UI(Android不能在后台线程操作UI)
                mainHandler.post(() -> {
                    // 这里写你的UI更新逻辑,比如显示遥测数据
                    // textView.setText(telemetryData);
                });

                return MessageCallbackResult.COMPLETE;
            };

            // 启动监听指定消费组的遥测
            serviceClient.startReceiveEventAsync(CONSUMER_GROUP, callback, null);
        } catch (IOException | IotHubException e) {
            e.printStackTrace();
        }
    }

    // 记得在页面销毁时停止监听
    public void stopListeningTelemetry() {
        if (serviceClient != null) {
            try {
                serviceClient.stopReceiveEventAsync();
                serviceClient.close();
            } catch (IOException | IotHubException e) {
                e.printStackTrace();
            }
        }
    }
}

方案二:直接调用IoT Hub REST API

如果不想引入SDK,也可以用Android的网络库(比如OkHttp)直接调用IoT Hub的REST API读取遥测。

核心要点

  1. 生成SAS令牌:用服务端连接字符串生成授权用的SAS令牌(可以用Azure提供的工具类,或者自己实现HMAC-SHA256签名逻辑)。
  2. 调用遥测读取端点:https://{你的IoT Hub名称}.azure-devices.net/events/api-version=2021-04-12,请求头带上Authorization: {SAS令牌}。

简化代码示例(用OkHttp)

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import android.os.Handler;
import android.os.Looper;
import java.io.IOException;

public class RestTelemetryReader {
    private static final String IOT_HUB_NAME = "你的IoT Hub名称";
    private static final String SAS_TOKEN = "生成的SAS令牌";
    private final Handler mainHandler = new Handler(Looper.getMainLooper());

    public void fetchTelemetry() {
        OkHttpClient client = new OkHttpClient();
        String url = "https://" + IOT_HUB_NAME + ".azure-devices.net/events/api-version=2021-04-12";

        Request request = new Request.Builder()
                .url(url)
                .header("Authorization", SAS_TOKEN)
                .build();

        client.newCall(request).enqueue(new okhttp3.Callback() {
            @Override
            public void onFailure(okhttp3.Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(okhttp3.Call call, Response response) throws IOException {
                if (response.isSuccessful() && response.body() != null) {
                    String telemetryData = response.body().string();
                    // 切主线程更新UI
                    mainHandler.post(() -> {
                        // 更新UI逻辑
                    });
                }
            }
        });
    }
}

关键注意事项

  • 权限问题:读取D2C遥测需要服务级权限,不能用设备的连接字符串,必须用服务端连接字符串。
  • 安全建议:不要把服务端连接字符串直接打包在Android应用里!最好搭一个中间API服务,Android调用中间服务,中间服务再去IoT Hub读取遥测,避免凭证泄露。
  • 消费组:如果有多个客户端读取遥测,给每个客户端分配独立的消费组,避免互相干扰。

内容的提问来源于stack exchange,提问作者Openzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:46:32