文档首页/ 设备接入 IoTDA/ 用户指南/ 消息通信/ 自定义Topic通信/ $oc开头自定义Topic通信使用说明
更新时间:2024-08-21 GMT+08:00

$oc开头自定义Topic通信使用说明

使用流程&操作步骤

图1 $oc开头自定义topic通信

  1. 创建产品:访问设备接入服务,单击“管理控制台”进入设备接入控制台。选择您的实例,单击实例卡片进入。参考创建产品流程。
  2. 设定$oc开头自定义Topic。在产品详情页中创建一个自定义Topic,Topic前缀固定为:$oc/devices/{device_id}/user/。

    1. 选择MQTT协议类产品,在产品详情页中,选择Topic管理 > 自定义Topic,单击“新增自定义Topic”。
      图2 Topic管理-自定义Topic
    2. 在弹出的页面中,选择设备操作权限,填写Topic名称。
      图3 Topic管理-新增自定义Topic
      表1 页面参数说明

      参数名称

      描述

      Topic名称

      Topic的前缀已经规定好,固定为:$oc/devices/{device_id}/user/,其中{device_id}为标识符变量,实际发布和订阅过程中需要替换为实际的设备ID。用户自定义Topic的格式必须以“/”进行分层。

      长度限制为1-64位,只允许输入数字、大小写字母、下划线、斜杠符。其中,斜杠符不能连续。

      说明:

      自定义Topic不支持自定义变量,例如$oc/devices/{device_id}/user/setting/{type},其中的{type}为自定义变量,当前不支持这种使用方式。

      设备操作权限

      • 发布:设备侧消息上报时,可按配置中自定义的Topic进行消息上报;数据流转时,设备消息中会携带Topic参数标识该消息从哪个Topic上报。

      • 订阅:应用侧消息下发时,可在消息内容中指定Topic;消息发往设备时,可以根据指定的Topic下发。

      • 发布和订阅:同时具备发布和订阅的权限。

      描述

      关于该Topic的描述。

    3. 单击“确定”,完成新增自定义Topic。自定义Topic添加成功后,您可以在自定义Topic列表执行修改和删除操作。

  3. 创建设备:在该产品下创建设备。创建的设备将继承产品设定的自定义Topic。详情可见:创建设备流程。
  4. 设备订阅/发布:查看使用自定义Topic进行通信的最佳实践,了解自定义Topic的发布与订阅的使用。

设备侧JAVA SDK使用示例

设备端可以通过集成华为云IoT提供的设备端SDK快速连接华为云IoTDA,并进行消息上报。以下示例为通过JAVA SDK实现设备连接到华为云IoTDA进行发布、订阅自定义Topic。以订阅"$oc/devices/" + device.getDeviceId() + "/user/wpy"为例。

  1. 配置设备侧SDK的Maven依赖。
    <dependency>
    	<groupId>com.huaweicloud</groupId>
    	<artifactId>iot-device-sdk-java</artifactId>
    	<version>1.1.4</version>
    </dependency>
  2. 配置设备侧SDK,设备连接参数。
    //加载iot平台的ca证书,获取连接参考:https://support.huaweicloud.com/intl/zh-cn/devg-iothub/iot_02_1004.html
    URL resource = MessageSample.class.getClassLoader().getResource("ca.jks");
    File file = new File(resource.getPath());
    
    //注意格式为:ssl://域名信息:端口号。
    //域名获取方式:登录华为云IoTDA控制台左侧导航栏“总览”页签,在选择的实例基本信息中,单击“接入信息”。选择8883端口对应的接入域名。
    String serverUrl = "ssl://localhost:8883";
    //在IoT平台创建的设备ID。
    String deviceId = "deviceId";
    //设备ID对应的密钥。
    String deviceSecret = "secret";
    //初始化设备连接
    IoTDevice device = new IoTDevice(serverUrl, deviceId, deviceSecret, file);
    if (device.init() != 0) {
        return;
    }
  3. 上报设备消息:
    device.getClient().publishRawMessage(new RawMessage( "$oc/devices/" + device.getDeviceId() + "/user/wpy", "hello", 1), new ActionListener() {
        @Override
        public void onSuccess(Object context) {
            System.out.println("reportDeviceMessage success: ");
        }
        @Override
        public void onFailure(Object context, Throwable var2) {
            System.out.println("reportDeviceMessage fail: " + var2);
        }
    });
  4. 订阅topic:
    device.getClient().subscribeTopic(new RawMessage("$oc/devices/" + device.getDeviceId() + "/user/wpy", new ActionListener() {
        @Override
        public void onSuccess(Object context) {
            System.out.println("subscribeTopic success: ");
        }
        @Override
        public void onFailure(Object context, Throwable var2) {
            System.out.println("subscribeTopic fail: " + var2);
        }
    }, 0);