【版本】
当前版本号v20230222
版本 | 修改说明 |
---|---|
v20230222 | 更新 Mosquito 为 EMQX,更新了云平台的数据库表 |
v20220429 | 初始化版本 |
任务3.1 - 构建物联网云平台项目(iot-cloud-training-init)
【任务目的】
- 掌握构建物联网云平台项目
- 掌握数据库的构建
- 掌握使用 Flyway 来构建数据库
【任务环境】
- 内存:至少4G
- 硬盘:至少空余40G
- 操作系统: Windows 系统。
【任务资源】
【任务要求】
【任务步骤】
解压
iot-cloud-training-init.zip
项目,并使用 IDEA 打开项目。进入IDEA 菜单,
File
->Settings
,修改为你的Maven
的安装路径和settings.xml
的路径。使用 HeidiSQL 运行脚本
src/main/resources/V000__CREATE_DB_AND_USER.sql
,创建数据库iotcloudtr
、数据库用户和授权。利用 Flyway 进行数据迁移,按顺序执行
src/main/resources/db/migration
下的 SQL 脚本。创建的表如下描述:
device
设备表device_msg
设备消息表token
用户令牌表user
用户表dev_shadow_desire
期望设备影子dev_shadow_reported
报告设备影子flyway_schema_history
flyway执行历史记录表
任务3.2 - 完成物联网云平台新增设备功能
【任务目的】
- 掌握物联网云平台功能的开发与实现
【任务环境】
- 内存:至少4G
- 硬盘:至少空余40G
- 操作系统: Windows 系统。
【任务资源】
【任务要求】
- 完善
新增设备
功能,登录物联网云平台以后,进入我的设备
,点击新增设备,输入设备信息并提交能够新增用户设备。
【任务效果】
- 输入设备信息可以新增设备,并且为设备生成设备的
物联网云平台ID
(iotId)和设备密钥
(devSecret)。
【任务步骤】
- 完善
http://localhost:8098/device_create
API,创建设备。/device_create
路径对应DeviceController.createDevice
方法。以下为调用该 API 的实例。
- (1)当用户输入设备的信息,并点击
新增
按钮。前端会向后端发起http://localhost:8098/device_create POST 请求,并提交以下JSON格式的数据。
{
"devName":"设备名",
"devType": "设备类型",
"description": "设备描述",
"status": "设备状态",
}
- (2)如果创建成功,返回值如下所示。
{
"errcode":"0",
"errmsg":"设备创建成功",
"data":{
"url":"/device_list",
}
}
- (3)如果创建失败,返回值如下所示。
{
"errcode":"30001",
"errmsg":"设备创建失败"
}
- 完善
DeviceServiceImpl.createDevice()
方法来创建设备,可以调用DeviceMapper.createDevice()
。
设备的 iotId和 devSecret 可以调用 RandomStringUtils.randomAlphanumeric(16) 方法来生成。RandomStringUtils 是 commons-lang3 包内的功能,主要功能是生成随机的字符串。
- 完善
DeviceMapper.xml
下id="createDevice"
的 SQL 语句的编写。
任务3.3 - 设备端实现调用物联网云平台API获取用户令牌
【任务目的】
- 掌握设备端调用物联网云平台 API 功能的开发与实现
【任务环境】
- 内存:至少4G
- 硬盘:至少空余40G
- 操作系统: Windows 系统。
【任务资源】
- iot-thermometer-init.zip
【任务要求】
- 进入表情温度计的配置页面http://localhost:8100/config,输入用户的ID和用户密钥,通过物联网云平台获取用户Token的 API http://localhost:8098/token,获取到用户令牌,并保存在表情温度计的配置表内。
【任务效果】
- 表情温度计配置页面,通过调用物联网云平台获取用户Token的 API 获取用户令牌并保存到设置。
【任务说明】
Retrofit 是一个类型安全的 HTTP 调用框架,常用于 Android 和 Java 开发。
以设备端调用物联网云平台端的 HTTP API 为例。发起 GET 请求以下链接。
http://localhost:8098/token?user_id=zhangsan&secret=JOGP9IEQNBOEOPRTJ
此 API 的 URL 中包含的参数
user_id
指的是用户ID,secret
指的是用户密钥。
- 调用成功可以获得类似以下 JSON 格式响应数据
{
"errcode": "0",
"errmsg": "获取令牌成功",
"data": {
"userId": "zhangsan",
"token": "2c6825dc35226f4b534cfc4141b66ad8209b43809caf8a741876a732bc4c9ad5",
"expiredTime": "2022-04-29T17:36:45.000+00:00",
"expiredTs": 1651253805857
}
}
- 调用失败可以获得以下 JSON 格式响应数据
{
"errcode": "1003",
"errmsg": "用户不存在或secret不匹配",
"data": null
}
- Retrofit 可以实现 Java 的接口调用转换为 HTTP API 调用。例如以下接口的方法 getUserToken 就实现了获取令牌的 API 。
public interface HttpService {
Retrofit RETROFIT = new Retrofit.Builder()
.addConverterFactory(JacksonConverterFactory.create())
.baseUrl("http://localhost:8098")
.build();
@GET("/token")
Call<ResMsg> getUserToken(@Query("user_id") String userId,@Query("secret") String userSecret);
}
- @Query 注解表示方法的参数转换为HTTP 请求的参数,例如第一个参数 userId 会转换为 HTTP 请求的参数 user_id。
- @GET("/token") 注解表示会转换为一GET 方法发起 http://localhost:8098/token 请求。
- 方法的返回值类型 ResMsg 表示的是响应的 JSON 数据转换的对象类型。
- Retrofit 接口方法的调用例子。
ResMsg result = new ResMsg();
Call<ResMsg> call= httpService.getUserToken(userId, userSecret);
try {
Response<ResMsg> response = call.execute();//调用 API,发起请求并获得响应
result = response.body();//读取响应 body 部分(JSON 消息)转换为对象。
Map data=(Map)result.getData();
String token=(String)data.get("token");//获取到Token的值
} catch (IOException e) {
result.setErrcode("8001");
result.setErrmsg("无法连接服务器");
}
【任务步骤】
- 打开
iot-thermometer-init
项目,修改完善ConfigController.getToken
方法,实现调用物联网云平台获取用户令牌的 API,并且保存获取的令牌到 config 表。
提示:保存 config 数据可以调用
ConfigServiceImpl.saveConfig()
方法。