IoT Hub

IoT Hub帮助设备连接阿里云IoT服务,IoT Hub支持PUB/SUB与RRPC两种通信方式,其中PUB/SUB是基于Topic进行的消息路由。IoT Hub具有以下特点:

  • 高性能扩展:支持线性动态扩展,可以支撑十亿设备同时连接
  • 全链路加密:整个通信链路以RSA,AES加密,保证数据传输安全
  • 消息实时到达:当设备与IoT Hub成功建立数据通道后,两者间将保持长连接,以减少握手时间,保证消息实时达到
  • 支持数据透传:IoT Hub支持将数据以二进制透传的方式传到自己服务器上,不保存设备数据,从而保证数据的安全可控性
  • 支持多种通信协议:IoT Hub支持RRPC和PUB/SUB两种通信模式
  • 支持多种设备接入协议:支持设备使用CoAP、MQTT、HTTPS协议接入物联网平台

阿里云物接入,IoT服务创建

接下来介绍以下阿里云物联网套件接入情况,首先要开通物联网套件服务,阿里云的物联网套件的收费情况和百度天工类似,都是以流量(消息条数进行收费的),并且每月百万条内的消息都是免费,因此研究成本很低,只要花时间即可。 
第一步,创建产品,阿里云的产品泛指一批具有相同功能的设备,创建产品是为了批量管理设备。创建产品分基础版和高级版,高级版有更多的功能,可以考虑直接创建高级版。节点类型分设备和网关,设备表示下面挂载的是设备,网关则挂载的是网关,网关下面可以继续挂载设备,网关相当于多了一个分组。 

第二步,给产品添加Topic,阿里云默认给了三个Topic,当然我们也可以定义自己的Topic类,在产品查看页面,选择消息通信,就可以定义Topic类了。定义Topic时,和百度天工定义策略一样,也需要指定权限,这里也是有两种:发布、订阅 

第三步,创建设备,创建时首选要选择一个产品,设备是挂在产品下面的。然后就可以创建设备了,设备创建成功后,界面会弹出一个三元组数据提示:ProductKey(创建产品时生成)、DeviceName(创建设备时填写)、DeviceSecret(设备创建成功后生成,可以在设备中修改),在MQTT的客户端端,我们进行设备接入时,需要通过这个三元组进行认证。 

终端设备物接入

阿里云的IoT接入可以自己使用MQTT协议自己实现,也可以使用阿里云提供的SDK包,目前阿里云支持SDK的版本有:Java、Python、PHP和.Net,其实SDK里面也是对标准MQTT协议的封装而已。

假如自己实现,maven依赖:

<dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.1.0</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.28</version>
</dependency>

简单客户端连接IoT实现:

/*** aliyun.com Inc.* Copyright (c) 2004-2017 All Rights Reserved.*/
package com.aliyun.iot.demo.iothub;import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
import java.util.concurrent.TimeUnit;import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;import com.aliyun.iot.util.LogUtil;
import com.aliyun.iot.util.SignUtil;/*** IoT套件JAVA版设备接入demo*/
public class SimpleClient4IOT {/******这里是客户端需要的参数即前面说的三元组*******/public static String deviceName = "thing001";public static String productKey = "b1s2DQ7udsJ";public static String secret = "C9LncnlHEYAErdxM0GnubaOURApmrRDle";//用于测试的topicprivate static String subTopic = "/" + productKey + "/" + deviceName + "/get";private static String pubTopic = "/" + productKey + "/" + deviceName + "/update";public static void main(String... strings) throws Exception {//客户端设备自己的一个标记,建议是MAC或SN,不能为空,32字符内String clientId = InetAddress.getLocalHost().getHostAddress();//设备认证Map<String, String> params = new HashMap<String, String>();params.put("productKey", productKey); //这个是对应用户在控制台注册的 设备productkeyparams.put("deviceName", deviceName); //这个是对应用户在控制台注册的 设备nameparams.put("clientId", clientId);String t = System.currentTimeMillis() + "";params.put("timestamp", t);//MQTT服务器地址,TLS连接使用ssl开头String targetServer = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883";//客户端ID格式,两个||之间的内容为设备端自定义的标记,字符范围[0-9][a-z][A-Z]String mqttclientId = clientId + "|securemode=2,signmethod=hmacsha1,timestamp=" + t + "|";String mqttUsername = deviceName + "&" + productKey; //mqtt用户名格式String mqttPassword = SignUtil.sign(params, secret, "hmacsha1"); //签名System.err.println("mqttclientId=" + mqttclientId);connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword, deviceName);}public static void connectMqtt(String url, String clientId, String mqttUsername,String mqttPassword, final String deviceName) throws Exception {MemoryPersistence persistence = new MemoryPersistence();SSLSocketFactory socketFactory = createSSLSocket();final MqttClient sampleClient = new MqttClient(url, clientId, persistence);MqttConnectOptions connOpts = new MqttConnectOptions();connOpts.setMqttVersion(4); // MQTT 3.1.1connOpts.setSocketFactory(socketFactory);//设置是否自动重连connOpts.setAutomaticReconnect(true);//如果是true,那么清理所有离线消息,即QoS1或者2的所有未接收内容connOpts.setCleanSession(false);connOpts.setUserName(mqttUsername);connOpts.setPassword(mqttPassword.toCharArray());connOpts.setKeepAliveInterval(65);LogUtil.print(clientId + "进行连接, 目的地: " + url);sampleClient.connect(connOpts);sampleClient.setCallback(new MqttCallback() {@Overridepublic void connectionLost(Throwable cause) {LogUtil.print("连接失败,原因:" + cause);cause.printStackTrace();}@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {LogUtil.print("接收到消息,来至Topic [" + topic + "] , 内容是:["+ new String(message.getPayload(), "UTF-8") + "],  ");}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {//如果是QoS0的消息,token.resp是没有回复的LogUtil.print("消息发送成功! " + ((token == null || token.getResponse() == null) ? "null": token.getResponse().getKey()));}});LogUtil.print("连接成功:---");//这里测试发送一条消息String content = "{'content':'msg from :" + clientId + "," + System.currentTimeMillis() + "'}";MqttMessage message = new MqttMessage(content.getBytes("utf-8"));message.setQos(0);//System.out.println(System.currentTimeMillis() + "消息发布:---");sampleClient.publish(pubTopic, message);//一次订阅永久生效 //这个是第一种订阅topic方式,回调到统一的callbacksampleClient.subscribe(subTopic);//这个是第二种订阅方式, 订阅某个topic,有独立的callback//sampleClient.subscribe(subTopic, new IMqttMessageListener() {//    @Override//    public void messageArrived(String topic, MqttMessage message) throws Exception {////        LogUtil.print("收到消息:" + message + ",topic=" + topic);//    }//});//回复RRPC响应final ExecutorService executorService = new ThreadPoolExecutor(2,4, 600, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(100), new CallerRunsPolicy());String reqTopic = "/sys/" + productKey + "/" + deviceName + "/rrpc/request/+";sampleClient.subscribe(reqTopic, new IMqttMessageListener() {@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {LogUtil.print("收到请求:" + message + ", topic=" + topic);String messageId = topic.substring(topic.lastIndexOf('/') + 1);final String respTopic = "/sys/" + productKey + "/" + deviceName + "/rrpc/response/" + messageId;String content = "hello world";final MqttMessage response = new MqttMessage(content.getBytes());response.setQos(0); //RRPC只支持QoS0//不能在回调线程中调用publish,会阻塞线程,所以使用线程池executorService.submit(new Runnable() {@Overridepublic void run() {try {sampleClient.publish(respTopic, response);LogUtil.print("回复响应成功,topic=" + respTopic);} catch (Exception e) {e.printStackTrace();}}});}});}private static SSLSocketFactory createSSLSocket() throws Exception {SSLContext context = SSLContext.getInstance("TLSV1.2");context.init(null, new TrustManager[] {new ALiyunIotX509TrustManager()}, null);SSLSocketFactory socketFactory = context.getSocketFactory();return socketFactory;}
}

IoT-阿里云物接入套件相关推荐

  1. 亿佰特串口服务器接入阿里云物模型使用教程

    在之前的文章中我们了解到虚拟串口软件作为TCP客户端来结合串口服务器使用,这一期我们来看一下串口服务器怎样接入阿里云物模型. 步骤详尽,一文读懂. 硬件准备 ME31-AXAX4040网络IO联网模块 ...

  2. MQTT连接到阿里云物联

    连接到阿里云物联 既然懂得专门连接百度天工物接入,那么连接阿里云物联其实也是一样的,因为都是基于MQTT协议进行通信的,首先打开阿里云物联:https://iot.console.aliyun.com ...

  3. 【转载】破解物联网落地困境-阿里云硬件接入最佳实践

    破解物联网落地困境-阿里云硬件接入最佳实践 <剑指物联>第五期中,阿里云IoT事业部总经理库伟曾提到物联网实施过程中的困境.比如在设备厂家层面:智能设备连接不稳定,网络安全差:在ISV层面 ...

  4. [arduino]ESP8266配置连接IoT阿里云平台(arduino D1 mini)

    [arduino]ESP8266配置连接IoT阿里云平台(arduino D1 mini) 前言 ESP8266配置(基础) ESP8266头文件配置 安装AliyunIoTSDK库 安装Arduin ...

  5. 阿里云物模型层功能分析

    文章目录 1 阿里云物模型层功能分析 1.1 AT软件框架图 1.2 设备和云端交换的数据类型 1.3 阿里云物模型层总体提供的能力 1 阿里云物模型层功能分析 1.1 AT软件框架图 首先还是来看一 ...

  6. 阿里云物联实现不同设备间的通信

    最近在做项目的时候,发现阿里云物联同一个产品下的设备只能订阅以其设备名命名的topic,无法实现设备之间的通讯,我捣鼓了许久,终于解决了这个问题. 查看阿里云物联的官方文档,在topic的定义下发现了 ...

  7. esp8266 阿里云 arduino_ESP8266接入阿里云——基于官方SDK接入阿里云串口获取云下发数据...

    作者:电子快递哥 日期:于2020年3月18日 有态度,有温度,欢迎关注电子快递哥,转载请注明出处, ESP8266接入阿里云 --之一基于官方SDK接入阿里云串口获取云下发数据 一.获取阿里云IoT ...

  8. 阿里云服务器接入云盾Web应用防火墙教程

    什么是云盾Web应用防火墙? 云盾Web应用防火墙(Web Application Firewall, 简称 WAF)基于云安全大数据能力实现,通过防御SQL注入.XSS跨站脚本.常见Web服务器插件 ...

  9. 物联网小试一下——使用阿里云控制Arduino套件灯的开关

    首先搜索阿里云--注册账号--登录云平台 接下来简单创个产品创建灯控制设备,步骤如下: 一.创建产品(产品相当于一个类:抽象的) (1)先进入控制台 (2)接着搜索物联网平台云 有生活物联网平台和物联 ...

最新文章

  1. 这 HTTPS,真滴牛逼!
  2. Windows系统下MySQL安装详细教程(解决MySQL服务无法启动)
  3. 美国杜克大学计算机专业世界排名,美国杜克大学世界排名情况怎么样?
  4. Docker 环境下如何 安装 Zookeeper
  5. 【小夕精选】多轮对话之对话管理(Dialog Management)
  6. 文件字符输入流的使用 FileReader java
  7. 基于顺序存储结构的图书信息表的创建和输出(C++)
  8. scrapy.spider
  9. 雷军100亿押注IoT,小米借AI两翼齐飞
  10. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(4)签到题4题
  11. 侧栏广告 image flash
  12. linux kill
  13. 左耳听风——笔记二:程序员练级攻略
  14. 一文了解几十万年的科技史
  15. 调用远程摄像头进行人脸识别_工地如何实现安全帽检测/人脸识别?
  16. 华为手机禁用省电精灵
  17. 【Writeup】BUUCTF_Web_高明的黑客
  18. 深入理解JVM之四:详解垃圾收集器
  19. goproxy和go modules的初步使用
  20. transformer中相对位置编码理解

热门文章

  1. mysql统计重复次数并加序号_insert-mysql数据插入,计数时出现重复,序号不对
  2. 谷歌地球、谷歌地图卫星地图有偏移与无偏移
  3. 《动手学深度学习Pytorch版》中‘d2lzh_pytorch‘模块问题
  4. go语言socket编程
  5. 华为认证网络工程师认证考试笔试题
  6. windows建立隐藏账户
  7. 部分mp4视频在ios上无法播放问题
  8. Java项目-王者荣耀源码分享~Java项目开发
  9. 苏州阿尔卡特上海分公司面试奇遇记
  10. MySQL升级到8x版本遇到的问题汇总