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

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

使用流程&操作步骤

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

  • 为了适配新老客户的使用,策略默认放通所有“非$oc开头的自定义Topic通信”。新增的资源空间会默认加入策略“system_default_policy”,system_default_policy策略会允许所有Topic的订阅与发布。当业务场景不适用时,可以删除该策略。
  • 值得注意的是,策略只会限制“非$oc开头的自定义Topic通信”。“$oc开头的自定义Topic”权限由产品下的设定决定。
  • 目前广州、北京四、上海局点不支持策略,可跳过策略(步骤2、3)、直接使用。
  1. 在平台创建产品与设备。详情可见:创建产品流程、创建设备流程。
  2. 创建策略。用于控制放通哪些Topic进行订阅/发布。(可选)

    1. 进入策略页面。访问设备接入服务,单击“管理控制台”进入设备接入控制台。选择您的实例,单击实例卡片进入。在左侧导航栏选择“设备 > 策略”。
      图2 设备策略-进入界面
    2. 创建策略。在策略界面单击“创建策略”,按照业务填写策略参数,填写完成后单击“生成策略”。下图以允许主题“/v1/test/hello”发布及订阅为例。
      表1 参数说明

      参数说明

      所属资源空间

      下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间

      策略名称

      自定义,如PolicyTest。长度不超过128,只允许字母、数字、下划线(_)、连接符(-)的组合。

      资源

      在MQTT主题发布与订阅中,需要以“topic:”作为参数前缀。比如说:禁止订阅/test/v1,则该参数填写 topic:/test/v1。

      操作

      值为发布或订阅。发布代表MQTT设备端Publish请求,订阅代表MQTT设备端Subscribe请求。

      权限

      值为允许或拒绝。用于允许或拒绝某topic的发布或订阅。

  3. 绑定策略目标。用于指定设备/产品/资源空间可以使用该策略。策略可以从“资源空间”、“产品”、“设备”这3个范围进行绑定,被绑定的设备将遵循策略的要求允许或拒绝某Topic的发布或订阅。(可选)

    图3 设备策略-绑定设备
    表2 参数说明

    参数说明

    设备目标类型

    下拉选择设备目标类型。类型有“资源空间”、“产品”、“设备”三种。这三种类型并不是互斥的,可以同时存在,比如说:绑定产品A与设备C(C是产品B下的设备)。

    • 资源空间:实现多业务应用的分域管理,绑定后所选资源空间下的所有设备都将匹配该策略。可选择多个资源空间绑定。
    • 产品:一个产品下一般有多个设备,绑定后所选产品下的所有设备都将匹配该策略,比起资源空间,绑定范围更小。可绑定一个或多个不同资源空间下的产品。
    • 设备:绑定策略目标的最小单位,可绑定一个或多个不同资源空间、不同产品的设备。

    策略目标

    选择对应的“策略目标类型”后,在“策略目标”的参数中会显示可选的数据,勾选需要绑定的即可。

  4. 设备订阅/发布。定义成功后可以发布、订阅该Topic。没有绑定策略成功的自定义Topic无法订阅/发布。

设备侧JAVA SDK使用示例

设备端可以通过集成华为云IoT提供的设备端SDK快速连接华为云IoTDA,并进行消息上报。以下示例为通过JAVA SDK实现设备连接到华为云IoTDA对自定义Topic“/test/deviceToCloud”进行发布、订阅。

  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("/test/deviceToCloud", "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("/test/deviceToCloud", 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);