基于华为物联网IOT的应用开发 ---界面管理开发
在前面随笔《基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装》介绍过IOT中应用侧SDK的封装,主要就是基于华为IOT的应用侧封装,以便在应用系统中进行调用。应用侧SDK的封装是一切应用开发的基础,不过华为并没有提供对应.net的SDK封装,不过SDK都是基于Web API 的JSON数据进行交互,因此花了一点时间进行了华为.net 的SDK进行了全面封装,本篇随笔介绍如何基于封装好的IOT 应用侧的SDK进行界面管理的开发,实现对IOT业务数据的管理等。
1、应用侧SDK封装回顾
应用侧的开发接口一般云平台都会提供不同平台的SDK,如阿里云开源提供Java SDK/C# SDK等;而华为则提供了Java、PHP等SDK,没有包含.net 的SDK。华为物联网云的应用侧API接口包括:


基于对应应用侧API接口的定义,我们使用C#进行了对应接口的封装。

包含了一个测试接口项目、一个SDK封装接口项目,以及一个订阅的消息推送接口的解析和处理,例如新增设备、设备信息变化、设备绑定激活等。
对于事件的通知,我们一般是在应用端被动的进行相应的处理,因此需要对它们的消息进行转换和处理。

类似在管理后台订阅这些事件,然后这些事件触发后会推送给应用服务器。

2、接口的测试使用
根据IOT的应用侧API的定义,我们编写一个快速测试SDK工作情况的Winform程序来测试,如获取授权信息,以及查询产品、注册设备、修改设备、获取设备状态和详细等等接口的正常与否,然后再在Web应用中进行整合,这样可以减少返工调试的问题。
按照业务接口的归类测试,我们编写如下程序用来测试对应SDK接口。

在使用SDK接口前,我们需要知道,华为IOT的API接口,基本上全部需要证书的对接的,这个和我们开发微信API有所差异。例如,我们的Winform测试程序,让它带有一个Cert目录下的证书文件,这个证书文件可以在API的Demo里面找到,或者在华为IOT平台上下载。

我们最终用到的是cert/outgoing.CertwithKey.pkcs12这个证书文件。
我们创建一个HTTPRequest对象获取数据的时候,需要指定这个证书,如下所示。
helper.ContentType = "application/json";
helper.ClientCertificates = new X509CertificateCollection() { new X509Certificate2(Constants.CertFilePath, Constants.CertPassword) };
其他部分就是对API接口封装的调用测试了。
如首先是授权的测试,用来获取AccessToken的,这个是调用其他接口的前提。
private void btnLogin_Click(object sender, EventArgs e)
{
var result = basicApi.Authentication();
Console.WriteLine(result != null ? "accessToken:" + result.ToJson() : "获取结果出错"); if (result != null)
{
var refreshResult = basicApi.RefreshToken(result.refreshToken); Console.WriteLine(refreshResult != null ? "accessToken:" + refreshResult.ToJson() : "获取结果出错");
this.accessToken = refreshResult.accessToken;//记录待用
}
}
华为IOT接口很多没有全部整合在一起,有的在https://support.huaweicloud.com/api-IoT/iot_06_0003.html,而有的则在https://support.huaweicloud.com/api-iothub/iot_06_0008.html, 就拿授权来说,还有另外一个版本的接口可以获取,两个接口获得的token都可以通用。
var url = Constants.AppBaseUrl + "/iocm/app/sec/v1.1.0/login";
var url = Constants.AppBaseUrl + "/api/v3.0/auth/tokens";
这两个地址都可以获取AccessToken,如设备创建,也是有多个接口,版本不同。
我们针对各个接口的封装,对相关接口进行测试,如基于产品、产品下面的列表等信息,可以在一个接口测试代码里面进行测试,如下所示。
/// <summary>
/// 产品相关接口测试
/// </summary>
private void btnProduct_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(accessToken))
{
MessageUtil.ShowTips("请先鉴权获取AccessToken");
return;
}
try
{
var productApi = new ProductApi();
var deviceApi = new DataCollectionApi(); //查询产品列表
var queryJson = new QueryProductJson { ownerAppId = Constants.AppId };
var result = productApi.QueryProduct(accessToken, queryJson);
Console.WriteLine(result != null ? result.ToJson() : "no result"); if (result != null && result.products != null)
{
//遍历产品,根据产品ID获取产品信息
foreach (var p in result.products)
{
var detailResult = productApi.QueryProduct(accessToken, p.productId, Constants.AppId);
Console.WriteLine(detailResult != null ? detailResult.ToJson() : "no result");
} //遍历产品下面的设备信息
foreach (var p in result.products)
{
var deviceJson = new QueryDeviceJson { ownerAppId = Constants.AppId, productId = p.productId };
var deviceResult = deviceApi.BatchQueryDevice2(accessToken, deviceJson);
Console.WriteLine(deviceResult != null ? deviceResult.ToJson() : "no result");
}
}
}
catch (Exception ex)
{
MessageUtil.ShowError(ex.Message);
}
}
对于设备,产品、设备组,都属于设备的入口之一,因此设备组也是管理接口设备的一个类别,我们可以根据SDK对设备组接口进行测试,如下代码所示。
/// <summary>
/// 设备分组测试
/// </summary>
private void btnDeviceGroup_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(accessToken))
{
MessageUtil.ShowTips("请先鉴权获取AccessToken");
return;
} try
{
//根据自己数据修改
var deviceId = "64bf5869-b271-4007-8db8-fab185e19c10";
var groupName = "testGroup";
var groupApi = new DeviceGroupApi();
var groupJson = new CreateDeviceGroupJson()
{
appId = Constants.AppId,
name = groupName,
description = "测试设备分组",
deviceIds = { deviceId }
}; //创建设备组
var result = groupApi.CreateDeviceGroup(accessToken, groupJson);
Console.WriteLine(result != null ? result.ToJson() : "no result"); //查询设备组
var queryJson = new QueryDeviceGroupJson()
{
accessAppId = Constants.AppId,
name = groupName
};
var queryResult = groupApi.QueryDeviceGroup(accessToken, queryJson);
Console.WriteLine(queryResult != null ? queryResult.ToJson() : "no result"); //查询设备组成员
if (queryResult != null && queryResult.list != null)
{
foreach (var group in queryResult.list)
{
//设备明细
var groupResult = groupApi.GetDeviceGroup(accessToken, group.id, Constants.AppId);
Console.WriteLine(groupResult != null ? groupResult.ToJson() : "no result"); //设备组成员
var queryMemberJson = new QueryDeviceGroupMemberJson()
{
appId = Constants.AppId,
devGroupId = group.id
};
var queryMemberResult = groupApi.QueryDeviceGroupMember(accessToken, queryMemberJson);
Console.WriteLine(queryMemberResult != null ? queryMemberResult.ToJson() : "no result");
}
}
}
catch (Exception ex)
{
MessageUtil.ShowError(ex.Message);
}
}
3、IOT业务界面管理开发
当我们把大多数接口都跑一遍,并解决相关问题后,我们就可以根据这些接口进行Web应用的开发了。
为了方便,我们把IOT相关的业务,定义在一个控制器里面,方便管理,以后如果有需要,可以拆分进行管理。

例如,对于数据提供,主要就是分页JSON数据的处理,方便界面控件通过Ajax进行获取数据显示。
例如,对于产品列表,我们构建了一个控制器方法,如下所示。
/// <summary>
/// 根据条件查询产品列表,并返回对象集合(用于分页数据显示)
/// </summary>
/// <returns>指定对象的集合</returns>
public virtual ActionResult FindProductWithPager()
{
var pagerInfo = GetPagerInfo();
var sort = GetSortOrder();
var accessToken = GetAccessToken(); var queryJson = new QueryProductJson(pagerInfo) { ownerAppId = Constants.AppId };
var result = productApi.QueryProduct(accessToken, queryJson); var list = result != null ? result.products : null;
var totalCount = result != null ? result.totalCount : ; //Json格式的要求{total:22,rows:{}}
var jsonResult = new { total = totalCount, rows = list };
return ToJsonContent(jsonResult);
}
其他,如设备组、设备列表等类似的处理,都是先通过接口获取数据,然后组装为对应的JSON格式提供给视图即可。

有时候,除了列表展示外,我们可能还需要对视图中创建、删除、获取单个明细的接口进行处理,如下所示是设备分组的管理接口。

其他的业务对象也是类似的封装,有了这些接口,我们就可以处理分页、获取详细、编辑、删除等接口的处理了。
在Web应用中定义几个业务菜单,用来管理产品信息、设备组和设备信息。

产品管理界面如下所示。

如果我们要查看产品明细,调用对应接口进行展示即可。

包含设备列表,我们根据产品ID获取对应设备列表返回到界面进行展示即可,如下所示效果。

设备分组如下所示。

而设备列表展示可以通过产品和设备组进行限定查询,我们如下管理这个设备列表的展示的。

同样,设备详细信息,通过对应ID调用SDK接口获取数据,并返回到视图即可展示出来了。设备的相关信息,如下历史数据、历史命令等,我们也可以通过对应接口进行数据获取返回,在界面的Tab控件进行展示即可。

如设备历史命令,可以获取到相关历史命令信息。

以上就是对IOT应用侧API接口的封装和应用界面的管理开发,不过使用过程中,对于IOT的接口还是不够完善,希望华为在这方便能够继续完善和提供良好的开发人员支持,我们也继续关注,以便在后续项目中整合物联网的硬件设备进行使用。
基于华为物联网IOT的应用开发 ---界面管理开发的更多相关文章
- 基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装
最近,物联网的概念比较热门,一大批厂商抢着占领物联网的高低,包括有华为物联网.阿里云物联网.腾讯物联网.AWS物联网等等,无法一一列举,一般物联网包含设备侧开发.平台侧开发.应用侧开发,三个部分构成了 ...
- 基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一
[摘要]仓储管理存在四大细分场景:出入库管理.盘点.分拣和货物跟踪.本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践. 仓储 ...
- 基于华为云IoT Studio自助生成10万行代码的奥秘
华为IoT小助手们搬好板凳.备好笔记本.听了HDC.Cloud的几场华为云技术架构师的直播讲课,感觉获益匪浅却又似懂非懂,直后悔自己没有好好打下基础.为了避免再次出现这样的情况,小助手偷偷跑去找了华为 ...
- 华为物联网IoT学习笔记目录
实验准备: 1.<小熊派功能介绍> 2.<小熊派硬件分析> 3.<STM32Cube软件安装介绍> 4.<MDK软件安装介绍> 5.<华为 IoT ...
- 聊聊如何在华为云IoT平台进行产品开发
摘要:华为云物联网平台承载着南北向数据互通的功能职责. 本文分享自华为云社区<如何基于华为云IoT物联网平台进行产品开发>,作者: Super.雯 . 华为云物联网平台承载着南北向数据互通 ...
- 直击Huawei Mate 40产线背后的华为云IoT智能制造
摘要:数字孪生?在数字世界找到物理世界的设备! 本文分享自华为云社区<[云驻共创]Huawei Mate 40产线直击之华为云IoT智能制造助力工厂数字化转型>,原文作者:启明. Part ...
- HC大会,华为联合合作伙伴发布一站式物联网IoT开发工具小熊派BearPi
传统的物联网产品开发步骤复杂,涉及硬件开发.软件开发.云端开发等众多流程.而且产品的开发周期长.开发成本高.产品稳定性不佳.维护成本高.而物联网设备本身市场竞争激烈,价格低,设备更新迭代快,所以在保证 ...
- 华为云MVP熊保松谈物联网开发:华为云IoT是首选,小熊派是神器
摘要:在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间,也得乘风破浪跟上新技术的节奏. 在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间 ...
- 基于STM32+华为云IOT设计智能称重系统
摘要:选择部署多个重量传感器和必要的算法.通过WiFi 通信模块.GPS定位模块,采集车辆称重数据一地理位置信息,并通过网络发送至云平台,设计图形化UI界面展示称重.地图位置等重要信息,实现对称重系统 ...
随机推荐
- (转) websocket 和 socket 剖析
Socket 与 WebSocket 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文 ...
- egret引擎中使用tiled运行在微信小游戏中
egret的官方文档,对tiled的介绍不是很细致,很多东西都需要摸索.现在把踩的坑记录下来.作为一个备忘 引用tiledmap的库 在GitHub上下载egret的tiledmap支持库:https ...
- 从0开始学FreeRTOS-1
我们知道,(单核)单片机某一时刻只能干一件事,会造成单片机资源的浪费,而且还有可能响应不够及时,所以,在比较庞大的程序或者是要求实时性比较高的情况下,我们可以移植操作系统.因为这种情况下操作系统比裸机 ...
- java IO、NIO、AIO详解
概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous):同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调 ...
- conversion function——转换函数
类型转换函数 与 explicit关键字 1.类型转换函数 在C++中,可以使用构造函数将一个指定类型的数据转换为类的对象,也可以使用类型转换函数 (type conversion function) ...
- JavaScript ES6函数式编程(二):柯里化、偏应用和组合、管道
上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心.这一篇来看看高阶函数的实战场景. 首先强调两点: 注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量 高阶函数思想:以变量作用域作为根 ...
- luoguP4779 【模板】单源最短路径
题目描述 单源最短路径模板. 使用 SPFA 肯定是不行的啦,网格图hack. 所以我们使用 Dijkstra 算法. 这里有一篇写的很好的 blog,无必要赘述.最后贴上代码. #include&l ...
- opencv::轮廓周围绘制矩形框和圆形框
基于RDP算法实现,目的是减少多边形轮廓点数 approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool ...
- POJ 1035 Spell checker(串)
题目网址:http://poj.org/problem?id=1035 思路: 看到题目第一反应是用LCS ——最长公共子序列 来求解.因为给的字典比较多,最多有1w个,而LCS的算法时间复杂度是O( ...
- Git & Github 使用教程【1】入门篇
Github教程 1-1 版本管理工具简介 主要作用:备份文件.记录历史.回到过去.多端共享.独挡一面.团队协作 2-1 版本管理工具发展历史 3-1 Git下载和安装[略] 3-2 linux下安装 ...