本文介绍如何使用Java语言的Paho MQTT库,接入阿里云物联网平台,并进行物模型消息通信。
前提条件
已在物联网平台中,创建了产品和设备,并在产品的功能定义页签下,定义一个LightSwitch属性。
准备开发环境
本示例使用的开发环境如下:
操作系统:Windows 10
JDK版本:JDK8
集成开发环境:IntelliJ IDEA社区版
下载Java语言的Paho MQTT库
根据要使用的MQTT协议版本,在Maven工程中添加如下依赖:
您需要通过官网查看MQTT协议的可用版本,替换version
值。
MQTT 3.1和3.1.1版本
<dependencies> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.1</version> </dependency> </dependencies>
MQTT 5.0版本
<dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.mqttv5.client</artifactId> <version>1.2.5</version> </dependency>
接入物联网平台
单击打开MqttSign.java,获取阿里云提供的获取MQTT连接参数所需的源代码。
MqttSign.java文件定义了MqttSign类,类说明如下:
原型:
class MqttSign
功能:
用于计算设备接入物联网平台的MQTT连接参数username、password和clientid。
成员:
类型定义
方法描述
public void
calculate(String productKey, String deviceName, String deviceSecret)
根据设备的productKey、deviceName和deviceSecret计算出MQTT连接参数username、password和clientid。
public String
getUsername()
用于获取MQTT建连参数username。
public String
getPassword()
用于获取MQTT建连参数password。
public String
getClientid()
用于获取MQTT建连参数clientid。
打开IntelliJ IDEA,创建项目。
将MqttSign.java导入项目中。
在项目中,添加实现设备接入物联网平台的程序文件。
您需编写程序调用MqttSign.java中的MqttSign类计算MQTT连接参数,实现设备接入物联网平台和通信。
开发说明和示例代码如下:
调用MqttSign计算MQTT连接参数。
String productKey = "a1X2bEn****"; String deviceName = "example1"; String deviceSecret = "ga7XA6KdlEeiPXQPpRbAjOZXwG8y****"; // 计算MQTT连接参数。 MqttSign sign = new MqttSign(); sign.calculate(productKey, deviceName, deviceSecret); System.out.println("username: " + sign.getUsername()); System.out.println("password: " + sign.getPassword()); System.out.println("clientid: " + sign.getClientid());
调用Paho MQTT客户端连接物联网平台。
//接入物联网平台的域名。 String port = "443"; String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port; // Paho MQTT客户端。 MqttClient sampleClient = new MqttClient(broker, sign.getClientid(), persistence); // Paho MQTT连接参数。 MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); connOpts.setKeepAliveInterval(180); connOpts.setUserName(sign.getUsername()); connOpts.setPassword(sign.getPassword().toCharArray()); sampleClient.connect(connOpts); System.out.println("Broker: " + broker + " Connected");
重要修改代码
String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;
中的接入域名,broker 值的格式为"ssl://" + "${对应实例下MQTT接入域名}" + ":" + port
。公共实例和企业版实例接入域名的格式说明,请参见查看实例终端信息。
发布消息。
以下示例代码上报物模型属性LightSwitch。
// Paho MQTT发布消息。 String topic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post"; String content = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":1}}"; MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(0); sampleClient.publish(topic, message);
如果您使用MQTT 5.0协议通信,可添加以下示例代码,上报消息时携带自定义属性。
//MQTT 5.0新特性:用户自定义属性 MqttProperties properties = new MqttProperties(); List<UserProperty> userPropertys = new ArrayList<>(); userPropertys.add(new UserProperty("key1","value1")); properties.setUserProperties(userPropertys); //MQTT 5.0新特性:请求/响应模式 properties.setCorrelationData("requestId12345".getBytes()); properties.setResponseTopic("/" + productKey + "/" + deviceName + "/user/get"); message.setProperties(properties); //支持MQTT 5.0的Paho SDK默认会使用Topic别名 sampleClient.publish(topic, message);
物模型通信数据格式,请参见设备属性、事件、服务。
如果您要使用自定义Topic通信,请参见什么是Topic。
订阅Topic,获取云端下发消息。
以下示例中,订阅的是上报属性值后,物联网平台返回应答消息的Topic。
class MqttPostPropertyMessageListener implements IMqttMessageListener { @Override public void messageArrived(String var1, MqttMessage var2) throws Exception { System.out.println("reply topic : " + var1); System.out.println("reply payload: " + var2.toString()); } } ... // Paho MQTT消息订阅。 String topicReply = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post_reply"; sampleClient.subscribe(topicReply, new MqttPostPropertyMessageListener());
关于设备、服务器和物联网平台的通信方式介绍,请参见物联网平台通信方式概述。
单击Build Project按钮,编译项目。
示例代码
使用Demo代码程序接入物联网平台。
下载代码包(v3.1.1Demo或v5.0Demo),并解压缩。
打开IntelliJ IDEA,导入Demo包中的示例工程aiot-java-demo。
在pom.xml文件中修改Maven依赖项版本。详细说明,请参见上文的“下载Java语言的Paho MQTT库”。
重要如果使用的相关插件版本不可用,请前往对应插件的官网查看可用版本进行替换。
在src/main/java/com.aliyun.iot下App或Mqtt5App文件中,修改设备信息为您的设备信息。
说明MQTT 3.1和3.1.1协议通信,使用App文件,MQTT 5.0协议通信,使用Mqtt5App文件。
替换一下代码中productKey、deviceName和deviceSecret的值为您的设备证书信息。
String productKey = "${ProductKey}"; String deviceName = "${DeviceName}"; String deviceSecret = "${DeviceSecret}";
修改代码
String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;
中的接入域名。详细说明,请参见上文“接入物联网平台”中的步骤4。
运行App或Mqtt5App程序。
错误码
如果设备通过MQTT协议接入物联网平台失败,请根据错误码排查问题。服务端错误码说明,请参见错误排查。