Part 3 - 物联网云平台端项目构建和开发

2022-04-29
5分钟阅读时长

【版本】

当前版本号v20230222

版本修改说明
v20230222更新 Mosquito 为 EMQX,更新了云平台的数据库表
v20220429初始化版本

任务3.1 - 构建物联网云平台项目(iot-cloud-training-init)

【任务目的】

  • 掌握构建物联网云平台项目
  • 掌握数据库的构建
  • 掌握使用 Flyway 来构建数据库

【任务环境】

  • 内存:至少4G
  • 硬盘:至少空余40G
  • 操作系统: Windows 系统。

【任务资源】

实验资源下载

【任务要求】

  1. 构建物联网云平台项目的数据库。
  2. 能够运行物联网云平台应用。访问 能够查看应用首页。

【任务步骤】

  1. 解压iot-cloud-training-init.zip项目,并使用 IDEA 打开项目。

  2. 进入IDEA 菜单, File->Settings,修改为你的Maven的安装路径和settings.xml的路径。

  3. 使用 HeidiSQL 运行脚本src/main/resources/V000__CREATE_DB_AND_USER.sql,创建数据库iotcloudtr、数据库用户和授权。

  4. 利用 Flyway 进行数据迁移,按顺序执行 src/main/resources/db/migration 下的 SQL 脚本。创建的表如下描述:

  • device 设备表
  • device_msg 设备消息表
  • token 用户令牌表
  • user 用户表
  • dev_shadow_desire 期望设备影子
  • dev_shadow_reported 报告设备影子
  • flyway_schema_history flyway执行历史记录表
  1. 使用 HeidiSQL 访问数据库iotcloudtr,检查是否存在以上表。

  2. 启动IoTCloudApplication,访问。使用账号密码zhangsan/123456登录。

任务3.2 - 完成物联网云平台新增设备功能

【任务目的】

  • 掌握物联网云平台功能的开发与实现

【任务环境】

  • 内存:至少4G
  • 硬盘:至少空余40G
  • 操作系统: Windows 系统。

【任务资源】

实验资源下载

【任务要求】

  1. 完善新增设备功能,登录物联网云平台以后,进入我的设备,点击新增设备,输入设备信息并提交能够新增用户设备。

【任务效果】

  1. 输入设备信息可以新增设备,并且为设备生成设备的物联网云平台ID(iotId)和设备密钥(devSecret)。

【任务步骤】

  1. 完善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":"设备创建失败"
}
  1. 完善DeviceServiceImpl.createDevice()方法来创建设备,可以调用DeviceMapper.createDevice()

设备的 iotId和 devSecret 可以调用 RandomStringUtils.randomAlphanumeric(16) 方法来生成。RandomStringUtils 是 commons-lang3 包内的功能,主要功能是生成随机的字符串。

  1. 完善 DeviceMapper.xmlid="createDevice"的 SQL 语句的编写。

任务3.3 - 设备端实现调用物联网云平台API获取用户令牌

【任务目的】

  • 掌握设备端调用物联网云平台 API 功能的开发与实现

【任务环境】

  • 内存:至少4G
  • 硬盘:至少空余40G
  • 操作系统: Windows 系统。

【任务资源】

  • iot-thermometer-init.zip

实验资源下载

【任务要求】

  1. 进入表情温度计的配置页面http://localhost:8100/config,输入用户的ID和用户密钥,通过物联网云平台获取用户Token的 API http://localhost:8098/token,获取到用户令牌,并保存在表情温度计的配置表内。

【任务效果】

  1. 表情温度计配置页面,通过调用物联网云平台获取用户Token的 API 获取用户令牌并保存到设置。

【任务说明】

  1. Retrofit 是一个类型安全的 HTTP 调用框架,常用于 Android 和 Java 开发。

  2. 以设备端调用物联网云平台端的 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
}
  1. 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 数据转换的对象类型。
  1. 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("无法连接服务器");
      }

【任务步骤】

  1. 打开iot-thermometer-init项目,修改完善ConfigController.getToken方法,实现调用物联网云平台获取用户令牌的 API,并且保存获取的令牌到 config 表。

提示:保存 config 数据可以调用ConfigServiceImpl.saveConfig() 方法。

扫码或长按识别访问