华为云IOT Android应用开发详细教程

Android Studio开发)

第〇章    简介

      大家好,上一期发布的教程叫大家如何利用华为云物联网平台提供的官方Java Demo去编写Java上位机程序,由于主要是用的是GET请求去查询设备影子和查询设备,之后接到了很多小伙伴私信咨询POST请求的实现,现在带着大家,写一个不基于官方Java Demo,而是完全参考于华为云帮助文档去写的一个Android应用,具体用到了POST请求获取鉴权的Token、设备命令下发,Get请求获取设备属性影子数据(依旧是用于解析属性)和查询设备(依旧是用于解析设备在线状态),先给大家看一下最终效果:

第一章    提前准备

  1. Android Studio IDE(模拟器可联网)
  2. 华为云设备接入IOTDA
  3. MQTT.fx

第二章    详细步骤

    1. 新建工程

   2. 新建一个类,实现我们需要的所有方法

  • 认证鉴权

根据华为云官方提供的帮助文档,我们可以知道,在调用接口前,我们需要完成认证鉴权,我们本次教程采用的是Token认证(帮助文档参考链接:认证鉴权_设备接入 IoTDA_API参考_应用侧API参考_如何调用API_华为云)

上图的最后一行,我们可以看到,官方给出了一个调用IAM用户Token(使用密码)的帮助信息

通过上述界面我们可以知道,该接口的URI以及需要准备的参数,大家可以仔细阅读,教程中我们直接查看页面中的示例:

我们需要准备的参数有:

  IAM用户所属帐号名、IAM用户名、IAM用户密码、项目名称所属

然后我们将准备的参数填入上述的JSON数据体

String postbody="{"+"\""+"auth"+"\""+": {"+"\""+"identity"+"\""+": {"+"\""+"methods"+"\""+": ["+"\""+"password"+"\""+"],"+"\""+"password"+"\""+": {"+"\""+"user"+"\""+":{"+"\""+"domain\": {\"name\": \"********\"},\"name\": \"********\",\"password\": \"********\"}}},\"scope\": {\"project\": {\"name\": \"cn-north-4\"}}}}";
String strurl="https://iam.cn-north-4.myhuaweicloud.com"+"/v3/auth/tokens?nocatalog=false";

现在我们写一个获取token的方法:

public static String gettoken() throws Exception
{String postbody="{"+"\""+"auth"+"\""+": {"+"\""+"identity"+"\""+": {"+"\""+"methods"+"\""+": ["+"\""+"password"+"\""+"],"+"\""+"password"+"\""+": {"+"\""+"user"+"\""+":{"+"\""+"domain\": {\"name\": \"********\"},\"name\": \"********\",\"password\": \"********\"}}},\"scope\": {\"project\": {\"name\": \"cn-north-4\"}}}}";String strurl="https://iam.cn-north-4.myhuaweicloud.com"+"/v3/auth/tokens?nocatalog=false";URL url = new URL(strurl);HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();urlCon.addRequestProperty("Content-Type", "application/json;charset=utf8");urlCon.setDoOutput(true);urlCon.setRequestMethod("POST");urlCon.setUseCaches(false);urlCon.setInstanceFollowRedirects(true);urlCon.connect();BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(urlCon.getOutputStream(),"UTF-8"));writer.write(postbody);writer.flush();writer.close();Map headers = urlCon.getHeaderFields();Set<String> keys = headers.keySet();for( String key : keys ){String val = urlCon.getHeaderField(key);System.out.println(key+"    "+val);}return null;
}

然后我们在主函数中调用一下

public httpGetHuaweiIOT()throws Exception
{gettoken();
}

我们选择运行

我们检查控制台的输出

接口返回的响应消息头中“X-Subject-Token”就是需要获取的用户Token,此时我们可以修改一下函数,在函数最后加上这两行:

String token = urlCon.getHeaderField("X-Subject-Token");
System.out.println("X-Subject-Token"+" : "+token);

返回值null改为return token;我们再run一下

此时我们的认证鉴权就完事了。(文章后面我们会修改类,把gettoken函数写在类的构造函数内调用)

【延伸】现在的postbody参数时我们写死的,大家也可以把参数做成变量传递进去;由于我们获取的TOKEN是有24小时有效期的,大家也可以学着华为云提供的java Demo在获取token以后去生成token.text文件,当过期时再重新获取,否则直接读取token保存的数据,本教程不在次延伸扩展。

接下来我们完成通过查询设备属性影子来获取设备属性信息。

  • 获取设备影子解析属性

首先我们查看华为云官方提供的帮助文档(https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html)

我们需要的URI

我们可以这么拼接URI

String strurl="https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s/shadow";String project_id="*********";
String device_id="*********";
strurl = String.format(strurl, project_id,device_id);

需要注意的是,除了上述两个必备参数以外,我们的token在这就派上用场了

写程序之前,我们先导入安装一个jackson-databind、jackson-core、jackson-annotations的jar,我用的是jackson-databind-2.8.1.jar、 jackson-core-2.8.1.jar 和jackson-annotations-2.8.1.jar (大家可在网站上搜索下载,或者在文章末尾下载)

我们切换为Java的project目录,在app/libs中粘贴并载入jar包

剩下的两个jar包也是这样操作,如下图所示

然后我们在类头中引入我们用到的路径

接下来我们编写获取设备影子数据函数:

public static String getdev() throws Exception
{String strurl="https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s/shadow";String project_id="*********";String device_id="********* ";strurl = String.format(strurl, project_id,device_id);String  token=gettoken();URL url = new URL(strurl);HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();urlCon.addRequestProperty("Content-Type", "application/json");urlCon.addRequestProperty("X-Auth-Token",token);urlCon.connect();InputStreamReader is = new InputStreamReader(urlCon.getInputStream());BufferedReader bufferedReader = new BufferedReader(is);StringBuffer strBuffer = new StringBuffer();String line = null;while ((line = bufferedReader.readLine()) != null) {strBuffer.append(line);}is.close();urlCon.disconnect();String result = strBuffer.toString();System.out.println(result);return null;
}

主函数中run一下

public static void main(String[] args)throws Exception {//gettoken();getdevshadow();
}

我们在控制台可以看到第一行是获取的token,第二行是我们得到的设备影子json数据

大家可以在华为云设备接入IOTDA的控制台修改产品:

我们检查一下我们需要的数据:

在华为云控制台那可以看一下:

为了清楚的查看,我们格式化一下:

其中的“report”->”properties”内的数据为我们要解析的设备属性,我们在函数中加上下面几句进行提取

比如我们获取temp属性

String pro="temp";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readValue(result, JsonNode.class);
JsonNode tempNode = jsonNode.get("shadow").get(0).get("reported").get("properties").get(pro);
String attvaluestr = tempNode.asText();
System.out.println(pro+"=" + attvaluestr);

运行一下

为了方便调用,我们改造一下函数定义,给他添上参数,改为:

public static String getdev(String pro) throws Exception{}
主函数这么调用:
getdev("temp");
getdev("humi");
getdev("light");
我们跑一下:

为了能够调用,我们最后要把return null;改为return attvaluestr;
  • 查询设备在线状态

同样我们查看华为云的帮助文档

   
   我们可以得主要区别是URI不同: "https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s;解析的数据不同,我们还是在getdev函数中进行修改,再给他加一个参数,如
public static String getdev(String mode,String pro) throws Exception{String strurl="";if(mode.equals("shadow")) strurl="https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s/shadow";else if(mode.equals("status")) strurl="https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s";//-----下面的程序不做变化//-----省略}
主函数调用就改为:
getdev("shadow","temp");
getdev("shadow","humi");
getdev("shadow","light");
运行结果是一样的
然后我们把最后的影子解析先注释掉:
//String pro="temp";
/*ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readValue(result, JsonNode.class);
JsonNode tempNode = jsonNode.get("shadow").get(0).get("reported").get("properties").get(pro);
String attvaluestr = tempNode.asText();
System.out.println(pro+"=" + attvaluestr);*/
//return attvaluestr;
加上return null;然后主函数添加:
getdev("status","");
运行一下:

   
我们把最后的数据格式化一下

其中status是我们需要提取的,我们取消原来的注释,改造一下解析数据的代码
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readValue(result, JsonNode.class);
if(mode=="shadow")
{JsonNode tempNode = jsonNode.get("shadow").get(0).get("reported").get("properties").get(pro);String attvaluestr = tempNode.asText();System.out.println(pro+"=" + attvaluestr);return attvaluestr;
}
if(mode=="status")
{JsonNode statusNode = jsonNode.get("status");String statusstr = statusNode.asText();System.out.println("status = " + statusstr);return statusstr;
}
return "something is error ";
我们运行一下:

  • 命令下发

老样子,我们依旧查看华为云帮助文档

我们得到的信息:
URI为:
strurl="https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s/commands";
消息体是:
String body="{\"paras\":{\""+"*****"+"\""+":"+"*****"+"},\"service_id\":\"***** \",\"command_name\":\"*****\"}";
我们写一下实现方法:
public String setCom(String com,String value) throws Exception{String strurl="";strurl="https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s/commands";String project_id="*****";String device_id="*****";strurl = String.format(strurl, project_id,device_id);URL url = new URL(strurl);HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();urlCon.addRequestProperty("Content-Type", "application/json");String token=gettoken();urlCon.addRequestProperty("X-Auth-Token",token);urlCon.setDoOutput(true);urlCon.setRequestMethod("POST");urlCon.setUseCaches(false);urlCon.setInstanceFollowRedirects(true);urlCon.connect();String body = "{\"paras\":{\""+com+"\""+":"+value+"},\"service_id\":\"*****\",\"command_name\":\"*****\"}";BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(urlCon.getOutputStream(),"UTF-8"));writer.write(body);writer.flush();writer.close();InputStreamReader is = new InputStreamReader(urlCon.getInputStream());BufferedReader bufferedReader = new BufferedReader(is);StringBuffer strBuffer = new StringBuffer();String line = null;while ((line = bufferedReader.readLine()) != null) {strBuffer.append(line);}is.close();urlCon.disconnect();String result = strBuffer.toString();System.out.println(result);return result;
}
在主函数调用一下
setCom("led","1");
我们在华为云控制台的设备那查看

   
我们可以发现命令是成功的,但还有一个错误代码,那是因为设备不在线或没有对命令进行处理响应,这个我们交给设备处理,不在此介绍
另外设备需要订阅topic: $oc/devices/{device_id}/sys/commands/request_id={request_id}

同样在控制台也可以看到数据:

最后我们可以看到这个token每次都要调用,其实是没必要的,我们在这里把放到构造函数里:
String token="";
public huaweiIOT()throws Exception
{token=  gettoken();
}

最后我们删除的getdev的static声明,getdev函数的String  token=gettoken();,删除main函数,现在我们的函数结构是:

public class httpGetHuaweiIOT {

String token="";
public httpGetHuaweiIOT()throws Exception
{token=gettoken();
}
public String getAtt(String att,String mode) throws Exception{}
public String setCom(String com,String value) throws Exception{}

这样我们的核心功能就完成了,接下来是安卓界面与逻辑部分

3. MainActivity中调用方法

我们在protected void onCreate(Bundle savedInstanceState) {}添加一个线程用于获取数据和命令下次测试

Thread t = new Thread() {@Overridepublic void run() {try {huaweiIOT hwiot=new huaweiIOT();System.out.println("获取状态");String str="";str=hwiot.getdev("status","");if(str.equals("ONLINE")){str="设备在线";}else if(str.equals("OFFLINE")){str="设备离线";}System.out.println("获取成功,状态:"+str);System.out.println("获取温度");str=hwiot.getdev("shadow","temp");System.out.println("获取成功,温度:"+str);str=hwiot.getdev("shadow","humi");System.out.println("获取成功,湿度:"+str);str=hwiot.getdev("shadow","light");System.out.println("获取成功,光照强度:"+str);}catch (Exception e) {e.printStackTrace();System.out.println("获取失败:"+e.toString());}}
};
t.start();
注意,在run app之前我们要加入联网的权限,我们打开AndroidManifest文件,在<application>前添加下述:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"/>

然后我们run一下app:

最后就是就是创建界面显示与逻辑设计啦

5.结语

到这里大家已经学习到了华为云物联网平台Android应用开发的基础操作啦,本期教程就到这里啦,大家可以完成自己的华为云物联网平台的Android应用开发;
      如果有需要上述参考工程,请微信搜索公众号“IOT趣制作”,回复关键字“华为云安卓”,领取教程的实例Demo,然后在HuaweiIOT类文件中填写参数信息运行即可。

华为云IOT Android应用开发详细教程相关推荐

  1. 华为云IOT的应用侧开发Java Demo使用详细教程(IntelliJ IDEA 开发)

    第0章 简介         最近有很多小伙伴在使用华为云IOT的应用侧开发的Java Demo时遇到一些问题,本期就教大家如何使用这个基于华为云官方提供的Java Demo,本期教程带大家做的是查询 ...

  2. 一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

    一文解锁华为云新技能-AIOT开发全流程[设备接入-ESP端侧数据收集[MQTT]-实时数据分析](步步截图较详细) 在这篇你将会接触到:从物联网工程师从硬件层-通信层到应用层全流程:开发华为云最基本 ...

  3. 华为云MVP熊保松谈物联网开发:华为云IoT是首选,小熊派是神器

    摘要:在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间,也得乘风破浪跟上新技术的节奏. 在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间 ...

  4. Android连接SQLServer详细教程(数据库+服务器+客户端),并在微软Azure云上搭建云服务

    Android连接SQLServer详细教程(数据库+服务器+客户端),并在微软Azure云上搭建云服务 参考博客:http://blog.csdn.net/zhyl8157121/article/d ...

  5. 聊聊如何在华为云IoT平台进行产品开发

    本文分享自华为云社区<如何基于华为云IoT物联网平台进行产品开发>,作者: Super.雯 . 华为云物联网平台承载着南北向数据互通的功能职责.在华为云物联网平台基础上实现端到端物联网业务 ...

  6. 【教程】ESP32连接华为云IoT平台

    目录 1前言 2应用侧接入华为云IoT平台 3必备环境 4使用步骤 4.1华为云IoT平台简介 4.2产品定义 4.3设备定义与注册 4.4ESP32编程接入 4.4.1头文件的包含 4.4.2接入参 ...

  7. 【教程】应用侧连接华为云IoT平台

    文章目录 1.写在前面 2.关于设备侧与华为云IoT平台的连接 3.进入华为云IoT平台 4.接收属性上报,实现数据转发至服务器 4.1.数据转发的总体实现思路 4.2.创建规则触发条件 4.3.创建 ...

  8. 手把手完成智慧路灯的开发,完成设备上云【华为云IoT】

    一.前言 近年来,物联网引领了继计算机.互联网之后世界信息产业的第三次发展浪潮,且逐步在各行各业得到更广泛的应用.物联网的定义是万物互联,表示任何设备都可以连在一起,进行数据交互. 那么物联网到底是什 ...

  9. 详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

    git地址:智能门禁(云IOT+微信小程序) 开关门效果 设备侧 产品创建 创建产品 创建产品,协议类型选择MQTT,数据格式选择JSON,其他参数自定 设备注册 找到所属产品,认证类型选择密钥,单击 ...

最新文章

  1. java.lang.VerifyError
  2. CentOS7_装机软件推荐
  3. Android应用从树莓派读取数据
  4. RocketMQ错误消息重试策略之Consumer的重试机制(Exception情况)
  5. 李天平×××作诞生记——《亮剑.NET:.NET深入体验与实战精要》
  6. zabbix的入门到精通之zabbix的触发器Trigger
  7. Dataguard学习笔记
  8. 【LeetCode】剑指 Offer 26. 树的子结构
  9. 干活的不如写ppt的吗_“干活不如写PPT”为啥扎心?
  10. 书单 | 读了这10本书,再也不怕黑客攻击了
  11. OC中不可变数组的常用方法
  12. 主板检测卡c5_电脑主板检测卡的代码是什么意思_电脑主板故障诊断检测卡代码汇总(5)_飞翔教程...
  13. Python —— 第一部分 序列
  14. 软考真题答案-2021年11月系统集成项目管理工程师上午题(二)
  15. 苹果和谷歌应用商店的APP搜索排名算法
  16. Linux --------- 远程操作工具
  17. pip download与pip install简介
  18. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解
  19. 程序员应该知道的——《Java程序员上班那点事儿》精华
  20. 浅谈企业网络安全边界

热门文章

  1. 电梯调度问题模型分析及程序设计(一)
  2. Mirai qq机器人 c++版sdk(MiraiCP)
  3. Go语言的中文编码问题
  4. java 定时任务只执行一次_Java执行定时任务
  5. AE基础教程第一阶段——17父级
  6. 新股发行基本流程及网下投资者参与过程介绍
  7. 航天科工研发“高速飞行列车”,最高时速可达4000公里?
  8. OpenCV + OpenCV Contrib安装教程(windows)
  9. python公里转海里_海里和公里怎么换算?
  10. 《Fundamentals of Computer Grahpics 4ed》虎书第四版翻译——第三章光栅图像