在前面随笔《 

基于对应应用侧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 <