全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
阿里云物联网套件

JAVA-SDK使用(MQTT)

更新时间:2018-02-09 09:56:01

本文以JAVA版SDK为例,演示如何让设备通过MQTT协议连接到阿里云IoT。

使用步骤:

  • 下载mqttClient SDK,iotx-sdk-mqtt-java
  • 此demo为maven工程,请先安装maven。
  • 用idea或者eclipse导入该demo到工程里面。
  • 从控制台获取productKey、deviceName、deviceSecret信息,修改下面的文件,然后直接运行即可。
  • 本DEMO并不适合android特性,如果您是android可以参考开源库 https://github.com/eclipse/paho.mqtt.android

修改文件SimpleClient4IOT.java

  1. 1,配置参数
  2. /** 从控制台获取productKey、deviceName、deviceSecret信息*/
  3. private static String productKey = "";
  4. private static String deviceName = "";
  5. private static String deviceSecret = "";
  6. /** 用于测试的topic */
  7. private static String subTopic = "/"+productKey+"/"+deviceName+"/get";
  8. private static String pubTopic = "/"+productKey+"/"+deviceName+"/pub";
  1. 2,连接MQTT服务器
  2. //客户端设备 自己的一个标记 建议是mac或sn ,不能为空,32字符内
  3. String clientId = InetAddress.getLocalHost().getHostAddress();
  4. //设备认证
  5. Map<String, String> params = new HashMap<String, String>();
  6. params.put("productKey", productKey); //这个是对应用户在控制台注册的 设备productkey
  7. params.put("deviceName", deviceName); //这个是对应用户在控制台注册的 设备name
  8. params.put("clientId", clientId);
  9. String t = System.currentTimeMillis()+"";
  10. params.put("timestamp", t);
  11. //mqtt服务器 ,tls的话ssl开头,tcp的话改成tcp开头
  12. String targetServer = "ssl://"+productKey+".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883";
  13. //客户端ID格式:
  14. String mqttclientId = clientId + "|securemode=2,signmethod=hmacsha1,timestamp="+t+"|"; //设备端自定义的标记,字符范围[0-9][a-z][A-Z]
  15. String mqttUsername = deviceName+"&"+productKey;//mqtt用户名格式
  16. String mqttPassword = SignUtil.sign(params, deviceSecret, "hmacsha1");//签名
  17. //连接mqtt的代码片段
  18. MqttClient sampleClient = new MqttClient(url, mqttclientId, persistence);
  19. MqttConnectOptions connOpts = new MqttConnectOptions();
  20. connOpts.setMqttVersion(4);// MQTT 3.1.1
  21. connOpts.setSocketFactory(socketFactory);
  22. //设置是否自动重连
  23. connOpts.setAutomaticReconnect(true);
  24. //如果是true 那么清理所有离线消息,即qos1 或者 2的所有未接收内容
  25. connOpts.setCleanSession(false);
  26. connOpts.setUserName(mqttUsername);
  27. connOpts.setPassword(mqttPassword.toCharArray());
  28. connOpts.setKeepAliveInterval(80);//心跳时间 建议60s以上
  29. sampleClient.connect(connOpts);
  1. 3,数据发送
  2. String content = "要发送的数据内容, 这个内容可以是任意格式";
  3. MqttMessage message = new MqttMessage(content.getBytes("utf-8"));
  4. message.setQos(0);//消息qos 0:最多一次,1:至少一次
  5. sampleClient.publish(topic, message);//发送数据到某个topic
  1. 4,数据接收
  2. //订阅某个topic,一旦有数据会回调到这里
  3. sampleClient.subscribe(topic, new IMqttMessageListener() {
  4. @Override
  5. public void messageArrived(String topic, MqttMessage message) throws Exception {
  6. //设备订阅topic成功后,数据会回调这里
  7. //重复订阅无影响
  8. }
  9. });

备注:我们设备模版默认在消息通信为您创建了几个固定topic: /productKey/${deviceName}/pub 等,详情参考控制台->产品->消息通信

如果您是Android设备,可以参考https://github.com/eclipse/paho.mqtt.android 这个库来移植。

本文导读目录