中州養老:華為云設備管理接口開發全流程

需求分析

點擊同步數據時,要把華為云的數據拉取到我們的系統中

對于新增設備操作,實際上這些參數與華為云產品我們添加設備時的參數是一樣的

表結構設計

E-R圖

數據庫字段

接口分析

對于設備中的數據,我們既要再IOT平臺存儲,又要在數據庫中存儲.之所以保存兩份數據的原因:

IOT平臺中只是維護了基礎的設備信息,并沒有跟業務數據進行綁定,比如,設備屬于哪個位置,綁定了哪個老人。

對于我們要實現的功能,華為云提供了豐富的接口

環境集成

IOT平臺目前已經給提供了完整的SDK,我們在conmon模塊引入華為云的兩個依賴

我們添加關于IOT的配置并修改

endpoint

測試客戶端能否連接成功

package com.zzyl.test;import com.huaweicloud.sdk.iotda.v5.IoTDAClient;
import com.huaweicloud.sdk.iotda.v5.model.ListProductsRequest;
import com.huaweicloud.sdk.iotda.v5.model.ListProductsResponse;
import com.huaweicloud.sdk.iotda.v5.model.Page;
import com.huaweicloud.sdk.iotda.v5.model.ProductSummary;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
public class IoTDeviceTest {@Autowiredprivate IoTDAClient client;/*** 查詢公共實例下的所有產品* @throws Exception*/@Testpublic void selectProduceList() throws Exception {ListProductsRequest listProductsRequest = new ListProductsRequest();listProductsRequest.setLimit(50);ListProductsResponse response = client.listProducts(listProductsRequest);List<ProductSummary> products = response.getProducts();System.out.println(products);}}

功能開發

從物聯網平臺同步產品列表

Controller層就是一個簡單的post請求

servic層,我們調用華為云的接口請求獲得產品的列表存入到Redis中

 /*** 同步產品列表*/@Overridepublic void syncProductList(){//請求參數ListProductsRequest listProductsRequest=new ListProductsRequest();//設置條數listProductsRequest.setLimit(50);//發起請求ListProductsResponse response=client.listProducts(listProductsRequest);if(response.getHttpStatusCode()!=200){throw new BaseException("物聯網接口 - 查詢產品,同步失敗");}//存儲到redisredisTemplate.opsForValue().set(CacheConstants.IOT_ALL_PRODUCT_LIST,JSONUtil.toJsonStr(response.getProducts()));}

此時打開redis圖形化界面,所有數據均已經存儲到redis中

查詢所有產品列表

Controller

從redis中查詢數據并返回

/*** 查詢所有產品列表** @return*/@Overridepublic List<ProductVo> allProduct(){//從redis中查詢數據String jsonStr=redisTemplate.opsForValue().get(CacheConstants.IOT_ALL_PRODUCT_LIST);//如果數據為空,則返回一個空集合if(StringUtils.isEmpty(jsonStr)){return Collections.emptyList();}//解析數據,并返回return JSONUtil.toList(jsonStr,ProductVo.class);}

前后端聯調查看結果

查詢已經入住的老人列表

接口文檔

對于分頁查詢接口,傳入分頁數量和每頁數量

通過傳入的狀態作為mp的條件查詢我們想要的姓名,年齡等

/*** 老人分頁查詢* @param status* @param pageNum* @param pageSize* @return*/@Overridepublic TableDataInfo pageQuery(Integer status,Integer pageNum,Integer pageSize){//分頁查詢老人數據//創建條件構建器LambdaQueryWrapper<Elder> queryWrapper=new LambdaQueryWrapper<>();//創建分頁對象Page<Elder> page=new Page<>(pageNum,pageSize);//按照狀態查詢if(ObjectUtil.isNotNull(status)){queryWrapper.eq(Elder::getStatus,status);}//sql返回結果,只展示主鍵、名字、身份照號、床位編號queryWrapper.select(Elder::getId,Elder::getName,Elder::getIdCardNo,Elder::getBedNumber);//執行查詢page=page(page,queryWrapper);//返回分頁結果return getDataTable(page);}/*** 封裝分頁結果* @param page* @return*/private TableDataInfo getDataTable(Page<Elder> page){//封裝分頁結果TableDataInfo tableDataInfo=new TableDataInfo();tableDataInfo.setTotal(page.getTotal());tableDataInfo.setCode(HttpStatus.SUCCESS);tableDataInfo.setMsg("請求成功");tableDataInfo.setRows(page.getRecords());return tableDataInfo;}

注冊設備

在Controller層,我們傳入設備信息

service層的邏輯

/*** 注冊設備* @param deviceDto*/@Overridepublic void registerDevice(DeviceDto deviceDto){//判斷設備名稱是否重復LambdaQueryWrapper<Device> queryWrapper=new LambdaQueryWrapper<>();queryWrapper.eq(Device::getDeviceName,deviceDto.getDeviceName());if(count(queryWrapper)>0){throw new BaseException("設備名稱已存在,請重新輸入");}//檢驗設備標識碼是否重復LambdaQueryWrapper<Device> queryWrapperNodeId=new LambdaQueryWrapper<>();queryWrapperNodeId.eq(Device::getNodeId,deviceDto.getNodeId());if(count(queryWrapperNodeId)>0){throw new BaseException("設備標識碼已存在,請重新輸入");}//校驗同一位置是否綁定了同一類產品LambdaQueryWrapper<Device> condition=new LambdaQueryWrapper<>();condition.eq(Device::getProductKey,deviceDto.getProductKey()).eq(Device::getLocationType,deviceDto.getLocationType()).eq(Device::getPhysicalLocationType,deviceDto.getPhysicalLocationType()).eq(Device::getBindingLocation,deviceDto.getBindingLocation());if(count(condition)>0){throw new BaseException("該老人/位置已綁定該產品,請重新選擇");}//iot中新增設備AddDeviceRequest request=new AddDeviceRequest();AddDevice body=new AddDevice();body.withProductId(deviceDto.getProductKey());body.withDeviceName(deviceDto.getDeviceName());body.withNodeId(deviceDto.getNodeId());request.withBody(body);AuthInfo authInfo=new AuthInfo();//秘鑰String secret=UUID.randomUUID().toString().replaceAll("-","");authInfo.withSecret(secret);body.setAuthInfo(authInfo);AddDeviceResponse response;try{response=client.addDevice(request);}catch(Exception e){e.printStackTrace();throw new BaseException("物聯網接口 - 注冊設備,調用失敗");}//設備數據保存到數據庫//屬性拷貝Device device=BeanUtil.toBean(deviceDto,Device.class);//設備id、設備綁定狀態device.setIotId(response.getDeviceId());//秘鑰device.setSecret(secret);//在數據庫中新增設備try{save(device);}catch(Exception e){throw new BaseException("同一個位置不能綁定同類型的產品");}}

測試

查看設備上報的數據

前端傳入Controller層物聯網設備的id

   /*** 獲取設備詳細信息*/@GetMapping("/{iotId}")@ApiOperation("獲取設備詳細信息")@ApiImplicitParams({@ApiImplicitParam(name = "iotId", value = "物聯網設備id", required = true, dataTypeClass = String.class)})public AjaxResult getInfo(@PathVariable("iotId") String iotId){return success(deviceService.queryDeviceDetail(iotId));}/*** 查詢設備上報數據*/@GetMapping("/queryServiceProperties/{iotId}")@ApiOperation("查詢設備上報數據")@ApiImplicitParams({@ApiImplicitParam(name = "iotId", value = "物聯網設備id", required = true, dataTypeClass = String.class)})public AjaxResult queryServiceProperties(@PathVariable("iotId") String iotId){AjaxResult ajaxResult=deviceService.queryServiceProperties(iotId);return ajaxResult;}

service層通過Controller層傳入的iotId查詢數據庫中的設備信息,調用華為的物聯網接口查詢華為云中設備的實時信息,將數據封裝到deviceVo中返回給前端

   /*** 查詢設備詳情** @return*/@Overridepublic DeviceDetailVo queryDeviceDetail(String iotId){//查詢數據庫Device device=getOne(Wrappers.<Device>lambdaQuery().eq(Device::getIotId,iotId));if(ObjectUtil.isEmpty(device)){return null;}//調用華為云物聯網接口ShowDeviceRequest request=new ShowDeviceRequest();request.setDeviceId(iotId);ShowDeviceResponse response;try{response=client.showDevice(request);}catch(Exception e){log.info("物聯網接口 - 查詢設備詳情,調用失敗:{}",e.getMessage());throw new BaseException("物聯網接口 - 查詢設備詳情,調用失敗");}//屬性拷貝DeviceDetailVo deviceVo=BeanUtil.toBean(device,DeviceDetailVo.class);deviceVo.setDeviceStatus(response.getStatus());String activeTimeStr=response.getActiveTime();if(StringUtils.isNotEmpty(activeTimeStr)){LocalDateTime activeTime=LocalDateTimeUtil.parse(activeTimeStr,DatePattern.UTC_MS_PATTERN);//日期時區轉換activeTime=activeTime.atZone(ZoneId.from(ZoneOffset.UTC)).withZoneSameInstant(ZoneId.of("Asia/Shanghai")).toLocalDateTime();deviceVo.setActiveTime(activeTime);}return deviceVo;}/*** 查詢設備上報數據** @param iotId* @return*/@Overridepublic AjaxResult queryServiceProperties(String iotId){ShowDeviceShadowRequest request=new ShowDeviceShadowRequest();request.setDeviceId(iotId);ShowDeviceShadowResponse response=client.showDeviceShadow(request);if(response.getHttpStatusCode()!=200){throw new BaseException("物聯網接口 - 查詢設備上報數據,調用失敗");}List<DeviceShadowData> shadow=response.getShadow();if(CollUtil.isEmpty(shadow)){List<Object> emptyList=Collections.emptyList();return AjaxResult.success(emptyList);}//返回數據JSONObject jsonObject=JSONUtil.parseObj(shadow.get(0).getReported().getProperties());List<Map<String, Object>>list=new ArrayList<>();//處理上報時間日期LocalDateTime activeTime=LocalDateTimeUtil.parse(shadow.get(0).getReported().getEventTime(),"yyyyMMdd'T'HHmmss'Z'");//日期時區轉換LocalDateTime eventTime=activeTime.atZone(ZoneId.from(ZoneOffset.UTC)).withZoneSameInstant(ZoneId.of("Asia/Shanghai")).toLocalDateTime();jsonObject.forEach((k,v)->{Map<String, Object> map=new HashMap<>();map.put("functionId",k);map.put("value",v);map.put("eventTime",eventTime);list.add(map);});return AjaxResult.success(list);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96392.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Llama-Factory微調Qwen2.5-VL從數據集制作到部署記錄

Llama-Factory微調Qwen2.5-VL從數據集制作到部署記錄 電腦環境配置&#xff1a; 1.ubuntu24 2.3090(24G) 3.Cuda12.9 一、數據集制作 我的數據集主要是對圖像內容進行描述 1.Label-studio制作數據集 這是最原始的從零開始制作數據集的方法&#xff0c;不建議這樣做&#xff01;…

【藍橋杯真題67】C++數位和為偶數的數 第十五屆藍橋杯青少年創意編程大賽 算法思維 C++編程選拔賽真題解

C++數位和為偶數的數 第十五屆藍橋杯青少年創意編程大賽C++選拔賽真題 博主推薦 所有考級比賽學習相關資料合集【推薦收藏】 1、C++專欄 電子學會C++一級歷年真題解析 電子學會C++二級歷年真題解析

【計算機網絡 | 第11篇】寬帶接入技術及其發展歷程

文章目錄寬帶接入技術詳解數字傳輸系統技術演進早期電話網的傳輸技術演變數字傳輸系統技術演進&#xff1a;從碎片到統一寬帶接入技術 ADSLADSL的基本原理與非對稱特性DMT調制技術&#xff1a;多子信道并行傳輸ADSL接入網組成電話分離器的設計原理與優勢ADSL的升級&#xff1a;…

(論文速讀)SCSegamba:用于結構裂紋分割的輕量級結構感知視覺曼巴

論文題目&#xff1a;SCSegamba: Lightweight Structure-Aware Vision Mamba for Crack Segmentation in Structures&#xff08;用于結構裂紋分割的輕量級結構感知視覺曼巴&#xff09;會議&#xff1a;CVPR2025摘要&#xff1a;不同場景下的結構裂縫像素級分割仍然是一個相當…

《蘇超風云》亮相時尚大賞,成短劇行業發展新風向

當男頻短劇憑借《一品布衣》五天橫掃10億播放的數據宣告逆襲&#xff0c;短劇市場格局正經歷深刻洗牌。風口之下&#xff0c;頭條視聽、中皋文旅、國內時尚視覺與短視頻創作領域的頭部廠牌“大灣視頻”攜手下場&#xff0c;打造精品男頻短劇《蘇超風云》&#xff0c;劍指2025年…

HTML5新年元旦網站源碼

新年主題網站開發概述 本項目基于HTML5、CSS3與JavaScript技術棧&#xff0c;打造了一個功能豐富、交互體驗流暢的新年主題網站&#xff0c;涵蓋文化展示、互動娛樂與社交分享三大核心模塊&#xff0c;通過現代化前端技術實現沉浸式節日氛圍營造。 1.1、核心功能架構 網站采…

CentOS 7 下iscsi存儲服務配置驗證

一、環境說明 centos7服務器*2服務器ip&#xff1a;服務端10.10.10.186 客戶端10.10.10.184服務端存儲卷sda1提前關閉防火墻&#xff0c;或開放默認 iSCSI 使用 3260 端口 二、服務端&#xff08;Target&#xff09;配置 安裝 iSCSI target 服務 yum install -y targetcli syst…

立即數、棧、匯編與C函數的調用

一、立即數在 ARM 架構中&#xff0c;立即數是指在指令中直接編碼的常量值&#xff0c;而不是通過寄存器或內存引用的值立即數的特點編碼限制&#xff1a;ARM指令是固定長度的&#xff08;32位&#xff09;&#xff0c;因此立即數不能占用太多位數。典型的算術和邏輯指令通常只…

貪心算法與動態規劃:數學原理、實現與優化

貪心算法與動態規劃&#xff1a;數學原理、實現與優化 引言&#xff1a;算法選擇的本質 在計算機科學領域&#xff0c;算法選擇的本質是對問題特征的數學建模與求解策略的匹配。貪心算法與動態規劃作為兩種經典的優化算法&#xff0c;分別在不同問題域展現出獨特優勢。本文將從…

Leetcode 刷題記錄 21 —— 技巧

Leetcode 刷題記錄 21 —— 技巧 本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答&#xff0c;01~07為C語言&#xff0c;08及以后為Java語言&#xf…

Android Studio Meerkat | 2024.3.1 Gradle Tasks不展示

把這兩個開關打開&#xff0c;然后刷新gradle文件

Java中方法重寫與重載的區別

目錄 1. 方法重載 (Overload) 什么是方法重載&#xff1f; 重載的特點&#xff1a; 重載的示例&#xff1a; 重載的調用&#xff1a; 2. 方法重寫 (Override) 什么是方法重寫&#xff1f; 重寫的特點&#xff1a; 重寫的示例&#xff1a; 重寫的調用&#xff1a; 3.…

微信小程序發送訂閱消息-一次訂閱,一直發送消息。

實現思路長期訂閱要求太高&#xff0c;需要政府、公共交通等單位才有資格&#xff0c;所以只能使用一次性訂閱。 就像是買奶茶&#xff0c;下單以后&#xff0c;會彈出讓用戶訂閱消息那種。以買奶茶為例:用戶第一次下單成功&#xff0c;點擊了訂閱消息。&#xff08;一般都有三…

408 Request Timeout:請求超時,服務器等待客戶端發送請求的時間過長。

408 Request Timeout 是 HTTP 狀態碼之一&#xff0c;表示客戶端在發送請求時&#xff0c;服務器等待的時間過長&#xff0c;最終放棄了處理該請求。此問題通常與網絡延遲、客戶端配置、服務器設置或者應用程序的性能有關。1. 常見原因1.1 客戶端問題網絡連接延遲或不穩定&…

MongoDB面試集錦

該書的使用的MongoDB版本是 4.2.01、什么是NoSQL數據庫&#xff1f;NoSQL和RDBMS有什么區別&#xff1f;在那些情況下使用和不使用NoSQL數據庫&#xff1f;NoSQL是非關系型數據庫&#xff0c;NoSQLNot Only SQL 。關系型數據庫采用的是結構化的數據&#xff0c;NoSQL采用的是鍵…

直擊JVM面試題

JVM組成 JVM JVM 就是 Java 程序的運行環境&#xff0c;它通過 類加載、字節碼執行、內存管理、GC、線程調度 等機制&#xff0c;讓 Java 實現了 跨平臺、自動內存管理和高效執行。 它是一個抽象的計算機&#xff0c;能執行以 字節碼&#xff08;.class 文件&#xff09; 為單…

地球系統模式(CESM)實踐技術應用及進階

目前通用地球系統模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的過去、現在和未來的氣候狀況中具有越來越普遍的應用。CESM由美國NCAR于2010年07月推出以來&#xff0c;一直受到氣候學界的密切關注。近年升級的CESM2.0在大氣、陸地、海…

StarRocks導入數據-使用 Broker Load 進行異步導入

目錄 一、背景 二、實操 三、查看導入進度 一、背景 將hive庫數據表導入starrocks. 二、實操 LOAD LABEL user_behavior (DATA INFILE("hdfs://<hdfs_ip>:<hdfs_port>/user/amber/user_behavior_ten_million_rows.parquet")INTO TABLE user_behavior…

c語言,識別到黑色就自動開槍,4399單擊游戲狙擊戰場,源碼分享,豆包ai出品

不好用&#xff0c;識別速度慢&#xff0c;有時候識別不準確#include <windows.h> #include <stdio.h> #include <math.h> HDC hdcScreen; void leftClick(); void RGBtoHSV(int r, int g, int b, int* h, int* s, int* v); int fuzzyFindColor(int x1, int…

電動汽車充電標準之 — SAE J1772“電動汽車傳導充電連接器”簡介

SAE J1772&#xff08;通常讀作 "J seventeen seventy-two"&#xff09;是由美國汽車工程師學會&#xff08;SAE&#xff09;制定的&#xff0c;針對電動汽車傳導充電連接器的北美標準。它規范了電動汽車&#xff08;EV&#xff09;與充電設備&#xff08;EVSE&#…