文章目录
前言
本文详细讲解了阿里云OSS和IOT创建流程和Java实现思路,较为浅显说明了Apache Qpid框架的使用。
一、文件上传
在介绍OSS之前首先介绍下文件上传和本地储存相关内容
2. 前端三要素
提交表单时这表单项中所有数据都会被提交到后台
2. 后端接收处理注意事项
由于设置了Miltipart/form-data编码格式,表单项中的每一项都会产生一个临时文件。
3. 本地存储
MultipartFile类中的提供了transserTo方法来将问存到磁盘,注意文件名不能写死,设置为某个固定文件名,每次存储都会被覆盖掉,所以需要借用UUID的randomUUID()生成一个随机唯一的UUID,通过这个UUID进行拼接来确保我们文件名的唯一性
代码实现:
上传文件大小配置
#配置单个文件最大上传大小
spring:
servlet:
multipart:
max-file-size: 10MB
#配置单个请求最大上传大小(一次请求可以上传多个文件)
spring:
servlet:
multipart:
max-request-size: 100MB
#文件大小的配置都是spring.servlet.multipart.max,其中一个是file应该是request
二、阿里对象存储 OSS
实际开发中会选择存的公司服务器或者云存储上,以下以阿里云为例说明,云存储操作思路和方式是一致的
1. 介绍
2. 入门程序
将下面代码复制到集成开发工具中运行即可
package com.itheima;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "oss-testfile-001";
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
String objectName = "01.jpg";
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
String filePath= "E:\\24383\\Pictures\\Saved Pictures\\微信图片_20240803113433.jpg";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
InputStream inputStream = new FileInputStream(filePath);
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
3. 集成至项目
- 实例:
下图请求流程,用户上传图片后被change事件监听,向后端发送请求,请求携带图片路径,后端将图片上传到阿里云,然后将其云路径响应给前端。
- 接口文档分析
- 接收文件—存储—返回路径 根据官方提供的方法改造(开发者会提供)
- 但是这样写配置信息是有问题的,例如当我们跟换云存储地址的时候,需要找到每个用到旧地址的类,这个时候就需要使用配置文件了
- 通过@Value注解读取配置文件内容,修改的配置文件内容就可以修改全局(这种方式用的比较多,属性过多是可以封装到类中并使用@ConfigurationProperties注解标注)
- 阿里云文件访问路径规则: https://BucketName.Endpoint/ObjectName
三、阿里云IOT
1. 介绍
1.1. 什么是物联网
把所有物品通过信息传感设备与互联网连接起来,进行信息交换,即物物相息,以实现智能化识别和管理。
物联网(英文:Internet of Things,缩写:IoT)起源于传媒领域,是信息科技产业的第三次革命。物联网是指通过信息传感设备,按约定的协议,将任何物体与网络相连接,物体通过信息传播媒介进行信息交换和通信,以实现智能化识别、定位、跟踪、监管等功能。
常见的应用场景:
- 共享充电宝充电宝设备接入物联网平台后,可上报充电宝电量和借用状态等信息到物联网平台云端。充电宝用户扫码后,云端低延时向充电宝下发指令,使其弹出。同时,企业运营者能够实时获知充电宝的运行状况。
- 智能音箱 播报音箱接入物联网平台后,用户扫码完成支付后,将支付金额实时通过音箱,向用户和商家进行语音播报。
- 智能家居智能家居技术已经成为当今家庭装潢的一大特色。比如,通过智能灯泡,可以实现远程控制灯光和电视等设备,调节温度和湿度,实现智能化生活。
- 智能农耕智能农耕可以通过物联网技术来监测、传输、分析、管理农业生产过程中的信息。比如作物的生长情况、土壤的状况等,以提高农业生产的效率,改善利润率,减少污染,节约农业资源。
- 智能医疗在智慧医疗中,可以捕捉人的生理状态信息,例如心跳频率、体力消耗、血压高低等。然后对采集数据进行备份、加工和分析,以便个人或医生快速查询。在物联网平台接入传感器设备,采集人体及周边环境参数的信息,通过数据服务处理数据后,反馈给用户。
1.2. IOT简介
产品文档:https://help.aliyun.com/zh/iot/product-overview/?spm=a2c4g.11186623.0.0.32d844a6NPRO9e
阿里云物联网平台是一个集成了设备管理、数据安全通信、消息订阅和数据服务等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端API,服务端可通过调用云端API将指令下发至设备端,实现远程控制。
我们作为一个开发者,基本的设备与后台调度思路,如下:
更多的介绍可以阅读官方产品文档
1.2.1. 开通物联网平台
- 开通阿里云账号
前往阿里云官网注册账号。如果已有注册账号,请跳过此步骤。
进入阿里云首页后,如果没有阿里云的账户需要先进行注册,才可以进行登录。由于注册较为简单,课程和讲义不在进行体现(注册可以使用多种方式,如淘宝账号、支付宝账号等…)。
需要实名认证和活体认证。 - 开通物理网平台
登录账号以后,我们可以在产品中搜索物联网平台
打开之后,点击管理控制台
如果没有开通的话,会提示你开通物联网平台,如下图,直接开通即可
- 申请公共实例
在IOT中分为了两种实例,一个是公共实例,另外一个是企业实例,不同的实例收费标准和功能是不一样的
- 公共实例,免费,使用地域为上海,支持同时在线设备数为50个,最多可创建500个设备,消息通信TPS为5条/秒
- 企业实例,如果公共实例超出了业务需求资源,可以使用企业实例,企业实例可以按照包年包月方式计算
申请使用公共实例使用,如下图
注意:地域必须选择上海才能申请公共实例
1.3. 产品
一旦拥有了公共实例,我们就可以使用临时实例来进行开发,我们先来介绍产品和设备
- 创建产品
https://help.aliyun.com/zh/iot/user-guide/create-a-product?spm=a2c4g.11186623.0.0.6ac7133dbo6zWV
产品:设备的集合,通常指一组具有相同功能的设备。物联网平台为每个产品颁发全局唯一的ProductKey。
简单说就是某一类产品,比如,手表、大门通道门禁、紧急呼叫报警器、滞留报警器、跌倒报警器
现在我们可以创建产品,找到产品–>创建产品
如下图,输入产品名称,然后选择平台提供好的分类,其他选择默认即可,然后确认创建
创建成功之后,如下图
在产品列表中也可以查看,刚刚创建的产品
- 物模型
https://help.aliyun.com/zh/iot/user-guide/add-a-tsl-feature?spm=a2c4g.11186623.0.0.9abf6ec2jkNsER
产品创建好之后,可以给产品添加物模型,也就是给产品定义功能。
比如我们刚才创建的手表产品,可以定义功能,功能也可以分为两类,一个是监测手表本身,一个是因为指标数据
- 手表本身:耗电量,使用时间
- 指标数据:身体血压、血氧、体温数据
像这些耗电量、血压、血氧数据都属于产品的功能,也叫做物模型
在IOT平台的物模型中,分为了三类:
创建物模型流程,如下图:
注意:为已发布产品添加物模型时要先撤销发布
1.4. 设备
https://help.aliyun.com/zh/iot/user-guide/create-a-device?spm=a2c4g.11186623.0.0.4f1b12ackrzdOs
产品是设备的集合,通常指一组具有相同功能的设备。创建产品完成后,需在产品下添加设备,获取设备证书。您可在物联网平台上,同时创建一个或多个设备
前提条件:设备是绑定在产品上的,所以必须先创建产品才行
操作步骤:
- 在左侧导航栏,选择设备管理> 设备。
- 在设备页面,单击添加设备。
- 在添加设备对话框中,输入设备信息,单击确认。
如下图:
在添加设备的时候有三个参数,解释如下:
创建设备成功后,会自动弹出添加完成对话框。您可以查看、复制设备证书信息。设备证书由设备的ProductKey、DeviceName和DeviceSecret组成,是设备与物联网平台进行通信的重要身份认证。
1.5. 设备数据上报
https://help.aliyun.com/zh/iot/user-guide/devices-retrieve-certificates/?spm=a2c4g.11186623.0.0.671b53felMSmzL
物理设备可通过两种方式获取物联网平台颁发的设备证书(ProductKey、DeviceName和DeviceSecret):设备厂商在产线上将证书烧录到设备上和设备上电联网后从厂商云服务中获取证书。
物联网烧录:是指将特定的程序或数据写入物联网设备中的过程。这些设备可能包括智能家居设备、智能穿戴设备、智能传感器等。通过烧录,可以实现设备的特定功能,例如控制灯光、监测温度、收集数据等。物联网烧录需要使用专业的工具和技术,确保烧录信息的完整性和准确性,以保证设备的正常工作和稳定性。
我们在开发阶段可以使用联网的电脑,来模拟设备的数据上报,比较简答的方式可以使用node来进行链接上报数据,参考代码如下:
const mqtt = require('aliyun-iot-mqtt');
// 1. 设备身份信息
var options = {
productKey: "j0rk1AN61hM",
deviceName: "watch001",
deviceSecret: "ea94110e5495bb04b0a7b35b9535a50c",
host: "iot-06z00frq8umvkx2.mqtt.iothub.aliyuncs.com"
};
// 2. 建立MQTT连接
const client = mqtt.getAliyunIotMqttClient(options);
//订阅云端指令Topic
client.subscribe(`/${
options.productKey}/${
options.deviceName}/user/get`)
client.subscribe(`/sys/${
options.productKey}/${
options.deviceName}/thing/event/property/post_reply`)
client.on('message', function (topic, message) {
console.log("topic " + topic)
console.log("message " + message)
})
setInterval(function () {
// 3.定时上报温湿度数据
client.publish(`/sys/${
options.productKey}/${
options.deviceName}/thing/event/property/post`, getPostData(), {
qos: 0 });
}, 5 * 1000);
var power = 1000;
function getPostData () {
const payloadJson = {
id: Date.now(),
version: "1.0",
params: {
PowerConsumption: power--
},
method: "thing.event.property.post"
}
console.log("payloadJson " + JSON.stringify(payloadJson))
return JSON.stringify(payloadJson);
}
把上述代码保存到一个文件夹下,以js为后缀名,如:iot_device_01.js
然后在js所在的文件夹下,打开cmd窗口,分别执行
node -i
node iot_device_01.js
启动之后的效果如下:
设备启动后,可以在物联网平台查看刚才创建的设备,现在已在线
找到物模型数据,可以看到上报之后的数据
2. IOT接口对接(Java环境操作设备信息—增删改查)
2.1. 环境集成
IOT平台目前已经给提供了完整的SDK,我们可以快速集成到项目进行接口的调用,集成方式链接如下:
https://help.aliyun.com/zh/iot/developer-reference/use-iot-platform-sdk-for-java-1?spm=a2c4g.11186623.0.0.4de85c09n2V2vb
导入依赖
<!-- https://mvnrepository.com/artifact/com.aliyun/iot20180120 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>iot20180120</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.2.2</version>
</dependency>
创建Client的Bean
package com.zzyl.config;
import com.aliyun.iot20180120.Client;
import com.aliyun.teaopenapi.models.Config;
import com.zzyl.properties.AliIoTConfigProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class IotClientConfig {
@Autowired
//该类封装了阿里账号密钥等信息的相关配置
private AliIoTConfigProperties aliIoTConfigProperties;
@Bean
//参考官方文档
public Client instance() throws Exception {
Config config = new Config();
config.accessKeyId = aliIoTConfigProperties.getAccessKeyId();
config.<