在前面随笔《基于华为物联网 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 , 而有的则在, 就拿授权来说, 还有另外一个版本的接口可以获取, 两个接口获得的 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 : 0;
- //JSON 格式的要求 {total:22,rows:{}}
- var jsonResult = new { total = totalCount, rows = list };
- return ToJsonContent(jsonResult);
- }
其他, 如设备组, 设备列表等类似的处理, 都是先通过接口获取数据, 然后组装为对应的 JSON 格式提供给视图即可.
有时候, 除了列表展示外, 我们可能还需要对视图中创建, 删除, 获取单个明细的接口进行处理, 如下所示是设备分组的管理接口.
其他的业务对象也是类似的封装, 有了这些接口, 我们就可以处理分页, 获取详细, 编辑, 删除等接口的处理了.
在 Web 应用中定义几个业务菜单, 用来管理产品信息, 设备组和设备信息.
产品管理界面如下所示.
如果我们要查看产品明细, 调用对应接口进行展示即可.
包含设备列表, 我们根据产品 ID 获取对应设备列表返回到界面进行展示即可, 如下所示效果.
设备分组如下所示.
而设备列表展示可以通过产品和设备组进行限定查询, 我们如下管理这个设备列表的展示的.
同样, 设备详细信息, 通过对应 ID 调用 SDK 接口获取数据, 并返回到视图即可展示出来了. 设备的相关信息, 如下历史数据, 历史命令等, 我们也可以通过对应接口进行数据获取返回, 在界面的 Tab 控件进行展示即可.
如设备历史命令, 可以获取到相关历史命令信息.
以上就是对 IOT 应用侧 API 接口的封装和应用界面的管理开发, 不过使用过程中, 对于 IOT 的接口还是不够完善, 希望华为在这方便能够继续完善和提供良好的开发人员支持, 我们也继续关注, 以便在后续项目中整合物联网的硬件设备进行使用.
来源: https://www.cnblogs.com/wuhuacong/p/11833440.html