$oc开头自定义Topic通信使用说明
使用流程&操作步骤
- 创建产品:访问设备接入服务,单击“管理控制台”进入设备接入控制台。选择您的实例,单击实例卡片进入。参考创建产品流程。
- 设定$oc开头自定义Topic。在产品详情页中创建一个自定义Topic,Topic前缀固定为:$oc/devices/{device_id}/user/。
- 选择MQTT协议类产品,在产品详情页中,选择图2 Topic管理-自定义Topic
,单击“新增自定义Topic”。
- 在弹出的页面中,选择设备操作权限,填写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列表执行修改和删除操作。
- 选择MQTT协议类产品,在产品详情页中,选择
- 创建设备:在该产品下创建设备。创建的设备将继承产品设定的自定义Topic。详情可见:创建设备流程。
- 设备订阅/发布:查看使用自定义Topic进行通信的最佳实践,了解自定义Topic的发布与订阅的使用。
设备侧JAVA SDK使用示例
设备端可以通过集成华为云IoT提供的设备端SDK快速连接华为云IoTDA,并进行消息上报。以下示例为通过JAVA SDK实现设备连接到华为云IoTDA进行发布、订阅自定义Topic。以订阅"$oc/devices/" + device.getDeviceId() + "/user/wpy"为例。
- 配置设备侧SDK的Maven依赖。
<dependency> <groupId>com.huaweicloud</groupId> <artifactId>iot-device-sdk-java</artifactId> <version>1.1.4</version> </dependency>
- 配置设备侧SDK,设备连接参数。
//加载iot平台的ca证书,获取连接参考:https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section3 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; }
- 上报设备消息:
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); } });
- 订阅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);