建议使用以下浏览器,以获得最佳体验。 ie 9.0 以上版本 chrome 31 谷歌浏览器 firefox 30 火狐浏览器
温馨提示

抱歉,您需设置社区昵称后才能参与社区互动!

前往修改
我再想想
选择版块
iot物联网 主题:17818帖子:255165

【技术干货】

华为云iot的android应用开发【详细教程】

2022/4/28 1118

华为云iot的android应用开发【详细教程】-星辰平台

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

 

  1. android studio ide(模拟器可联网)
  2. 华为云设备接入iotda
  3. mqtt.fx

    1. 新建工程

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

  • 认证鉴权

根据华为云官方提供的帮助文档,我们可以知道,在调用接口前,我们需要完成认证鉴权,我们本次教程采用的是token认证(帮助文档参考链接:

       上图的最后一行,我们可以看到,官方给出了一个调用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 ;
    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 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-databindjackson-corejackson-annotationsjar,我用的是jackson-databind-2.8.1.jar jackson-core-2.8.1.jar jackson-annotations-2.8.1.jar (大家可在网站上搜索下载,或者在文章末尾下载)

我们切换为javaproject目录,在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 ;
    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 ;
    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() {
    @override
    public 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>前添加下述:





然后我们run一下app:


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

 

    5.结语

      到这里大家已经学习到了华为云物联网平台android应用开发的基础操作啦,本期教程就到这里啦,大家可以完成自己的华为云物联网平台的android应用开发;
      如果有需要上述参考工程或获取jar包的话,扫描下方二维码,或微信搜索公众号“iot趣制作”,回复关键字“华为云安卓”,领取教程的实例demo,然后在huaweiiot类文件中填写参数信息即可。

回复23

0 0
2022/4/29 10:44

看着和普通对接其他系统差异不大

0 1
2022/4/29 10:47

不错,感谢分享

0 1
2022/4/29 11:25

不错,感谢分享

0 0
2022/4/29 13:49

感谢分享

0 0
2022/4/29 14:24

感谢分享

0 0
2022/4/29 14:35

感谢分享

0 0
2022/4/29 14:37

感谢分享

0 1
2022/5/10 15:03

步骤详细,一文直接学会接口对接原理。

0 0
2022/5/20 15:56

感谢分享

上划加载中
直达楼层
全部回复
正序浏览
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 星辰平台的解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消
您已采纳当前回复为最佳回复

发帖: 5粉丝: 3

[技术干货] 华为云iot的android应用开发【详细教程】

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

 

  1. android studio ide(模拟器可联网)
  2. 华为云设备接入iotda
  3. mqtt.fx

    1. 新建工程

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

  • 认证鉴权

根据华为云官方提供的帮助文档,我们可以知道,在调用接口前,我们需要完成认证鉴权,我们本次教程采用的是token认证(帮助文档参考链接:

       上图的最后一行,我们可以看到,官方给出了一个调用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 ;
    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 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-databindjackson-corejackson-annotationsjar,我用的是jackson-databind-2.8.1.jar jackson-core-2.8.1.jar jackson-annotations-2.8.1.jar (大家可在网站上搜索下载,或者在文章末尾下载)

我们切换为javaproject目录,在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 ;
    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 ;
    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() {
    @override
    public 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>前添加下述:





然后我们run一下app:


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

 

    5.结语

      到这里大家已经学习到了华为云物联网平台android应用开发的基础操作啦,本期教程就到这里啦,大家可以完成自己的华为云物联网平台的android应用开发;
      如果有需要上述参考工程或获取jar包的话,扫描下方二维码,或微信搜索公众号“iot趣制作”,回复关键字“华为云安卓”,领取教程的实例demo,然后在huaweiiot类文件中填写参数信息即可。

分享文章到朋友圈

分享文章到微博
您已采纳当前回复为最佳回复

kswil

发帖: 380粉丝: 2

发表于2022年04月29日 10:44:56

看着和普通对接其他系统差异不大

您已采纳当前回复为最佳回复

白先生

发帖: 4粉丝: 8

发表于2022年04月29日 10:47:10

不错,感谢分享

您已采纳当前回复为最佳回复

发帖: 0粉丝: 0

发表于2022年04月29日 11:25:09

不错,感谢分享

您已采纳当前回复为最佳回复

发帖: 2粉丝: 1

发表于2022年04月29日 13:49:30

感谢分享

您已采纳当前回复为最佳回复

发帖: 0粉丝: 0

发表于2022年04月29日 14:24:10

感谢分享

您已采纳当前回复为最佳回复

发帖: 0粉丝: 0

发表于2022年04月29日 14:35:47

感谢分享

您已采纳当前回复为最佳回复

发帖: 0粉丝: 1

发表于2022年04月29日 14:37:58

感谢分享

您已采纳当前回复为最佳回复

发帖: 70粉丝: 33

发表于2022年05月10日 15:03:23

步骤详细,一文直接学会接口对接原理。

您已采纳当前回复为最佳回复

发帖: 7粉丝: 1

发表于2022年05月20日 15:56:04

感谢分享

您需要登录后才可以回帖 | 立即注册

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200