摘要:本文讲解如何在安卓移动端实现阿里云物联网平台数字签名,使用的是android studio编写apk的方式进行,win7 x64系统下实现,文中提供了如何配置android studio的国内镜像,文末提供源代码链接。作为敲开云端控制大门的钥匙,本文非常重要,建议收藏。

android物联网应用程序开发 androidstudio物联网app_数字签名

目录

1.数字签名基本知识

使用eclipse实现阿里云物联网平台数字签名(Signature)(附源代码)

2.配置android studio

2.1 配置gradle-wrapper.properties

2.2 配置工程build.gradle

2.3配置应用build.gradle

2.4修改gradle.properties文件

2.5修改AdroidMainfest.xml文件

 3.为工程新建数字签名所需的类文件

3.1 新建Config.java文件

3.2新建UrlUtil.java文件

3.3新建SignatureUtils.java文件

3.4修改MainActivity.java文件

4.编译运行


 编程环境:android studio 3.5.2,gradle 5.4.1,win7 x64。

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_02

1.数字签名基本知识

数字签名是各个物联网平台必备的基础业务,在物联网知识中地位非常重要。

要实现对基于阿里云物联网平台的设备的控制,就需要调用阿里云的API。这些API不会让我们随意调用,而是有相当严格的审核机制,确保数据的安全。这种机制就是“签名机制”,我们每调用一次可以对硬件进行操作的API,就需要提供一次“数字签名”,阿里云物联网平台对每个接口访问请求的发送者进行身份验证,所以无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名(Signature)信息。

上篇文章介绍了如何使用eclipse在PC上计算出来数字签名,同时对签名机制做了比较详细的介绍,本文就不再详细讲解。需要的同学可以点击下文连接进行了解。

使用eclipse实现阿里云物联网平台数字签名(Signature)(附源代码)

2.配置android studio

目前android studio的资源非常丰富,阿里、腾讯都提供了有关资源连接。本文介绍的数字签名程序也需要这些配置,否则可能导致同步、编译速度缓慢。

2.1 配置gradle-wrapper.properties

当android studio打开一个工程时,首先就会打开这个文件,从而知道这个工程需要哪个版本的gradle(gradle不用多说了吧)。然后就会去找电脑上安装的gradle,如果找不到,就会自动从网上下载,默认的网址是:

distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

就是这个网址导致的我们下载几百兆的gradle特别慢的。

我们推荐使用腾讯的镜像,速度飞起。

distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-5.4.1-all.zip

设置好的界面如下图

android物联网应用程序开发 androidstudio物联网app_android studio_03

 2.2 配置工程build.gradle

一个默认的工程build.gradle是这样的,这段代码配置了当前的项目可以从哪些仓库上拉取依赖库以供使用。如下图所示,有google(),还有jcenter()。这两个都是远程仓库,访问速度非常慢。

其中google()顾名思义是谷歌的仓库,相当于官方仓库,android不就是谷歌家里的嘛。jcenter()是就是JCenter仓库,很多Android第三方库的代码都会提交到这。那么可以想象,如果JCenter不能够使用,那么很多库都不能够正常使用,这对于Android开发者来说影响是比较巨大的。

android物联网应用程序开发 androidstudio物联网app_阿里云物联网_04

 那么有没有其他的库进行替代?当然有了!

阿里云就提供了非常棒的“云效”仓库。至于为什么叫做“云效”,那就不晓得了。

我们将两个默认仓库修改为:

maven { url'https://maven.aliyun.com/repository/google/' }
 maven { url'https://maven.aliyun.com/repository/central/' }

修改完成的效果如下图所示,一共修改两个地方。

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_05

2.3配置应用build.gradle

我们知道,一个android工程有2个gradle。下面开始配置第二个gradle。双击打开第二个build.gradle。然后将minSdkVersion修改为21,原因是最小sdk版本太低,会导致导入依赖包的时候,数量有限制。这是第一处修改,后面还需要第二处修改,讲到具体依赖包的时候再说。修改效果如下图所示。

android物联网应用程序开发 androidstudio物联网app_数字签名_06

 2.4修改gradle.properties文件

这里需要将android.enableJetifier=true修改为false。

如果是true则表示将依赖包也迁移到AndroidX 。如果取值为 false ,表示不迁移依赖包到AndroidX,但在使用依赖包中的内容时可能会出现问题。

AndroidX 是对 android.support.xxx 包的整理后产物。由于之前的 support 包过于混乱,所以,Google 推出了AndroidX。Jetifier字面意思为“喷射器”。Jetifier会自动将support libraries所有依赖项转换为依赖项AndroidX,如果您未将其设置为true则您的项目将同时支持AndroidX软件包。

也就是说从支持库迁移到AndroidX时,启用Jetifier很重要,对于本文例子来说,设置为false。

设置的效果如下图所示。

android物联网应用程序开发 androidstudio物联网app_阿里云物联网_07

2.5修改AdroidMainfest.xml文件

添加对网络的权限,跟阿里云连接,肯定需要网络权限的吧。

<uses-permission android:name="android.permission.INTERNET" />

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_08

 3.为工程新建数字签名所需的类文件

android studio设置完成后,下面开始编程实现数字签名功能。

根据阿里云物联网平台官方文档介绍,签名机制需要4个文件,分别是Config.java,UrlUtil.java,SignatureUtils.java和Main.java。

签名机制 - 阿里云物联网平台 - 阿里云

android物联网应用程序开发 androidstudio物联网app_阿里云物联网_09

我们知道,android studio采用java语言编程,但是与PC机运行的java还是有很大的区别的。

因此,将这4个文件原封不动复制过来,肯定是无法正常运行的。比如android studio内就没有 public static void main(String[] args)方法。下面带领大家一步步来编程和改错。

3.1 新建Config.java文件

在Android视图下,在java的目录上右键,选择“New”----“Java Class”。这个操作的意思是新建一个类。

android物联网应用程序开发 androidstudio物联网app_阿里云物联网_10

在弹出的对话框中,填写类名Config,其他内容不变。

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_11

这样Config类的框架就生成完毕了。可以看到是一个空类,里面没有内容。

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_12

 下面复制阿里云官方文档的内容到框架内部

android物联网应用程序开发 androidstudio物联网app_阿里云物联网_13

填写到框架内,第一个文件就制作完成了。这个文件不会提示错误,因为这个类中只有我们的accessKey和accessKeySecret。

android物联网应用程序开发 androidstudio物联网app_java_14

3.2新建UrlUtil.java文件

按照新建Config.java的步骤新建UrlUtil.java,并且复制阿里云帮助文档的代码到文件中。

这次提示出现了错误。

android物联网应用程序开发 androidstudio物联网app_android studio_15

 原因是需要增加依赖包才行。

android物联网应用程序开发 androidstudio物联网app_数字签名_16

增加的方法是在应用的build.gradle中新增一个依赖。这就是前文所说的第二处修改。

implementation 'org.apache.commons:commons-lang3:3.7'

android物联网应用程序开发 androidstudio物联网app_android studio_17

 新增依赖之后,再clean一下工程

android物联网应用程序开发 androidstudio物联网app_阿里云物联网_18

 然后错误就消失了。

android物联网应用程序开发 androidstudio物联网app_android studio_19

 3.3新建SignatureUtils.java文件

按照前面的方法新建SignatureUtils.java文件,然后复制官方代码到这个文件中。复制结束后,由出现了一个错误。根据前面的经验,也是依赖库没有添加导致的。但是这个库就没有刚才lang3库那么好解决了,请往下看。

android物联网应用程序开发 androidstudio物联网app_android studio_20

这个库在PC端eclipse编程的时候,可以直接依赖,但是在android studio下进行编程,就不行了。原因是没有这个库的安卓版本!!!!

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_21

它不是一个标准的安卓库,而我们又需要这种base64编码,怎么办?只能找一个安卓能用的base64编码库来代替了。这个在阿里云官方文档中没有提到。

android物联网应用程序开发 androidstudio物联网app_android studio_22

我们先复习一下base64编码,安卓官方库中,有android.util.Base64,可以直接import而不用添加依赖。

android物联网应用程序开发 androidstudio物联网app_java_23

直接使用android.util.Base64库,不用添加依赖,看似更加方便了,但事实并非如此。

尽管都叫做Base64,但是库函数的原型未必一致。参数也未必相同。

阿里云帮助文档中的代码是下面这个语句,调用的方式是Base64.encodeBase64(bytes, false)。其中两个参数bytes和false。bytes是binary data,false是isChunked。其中isChunked的意思是字符超过76个之后怎么处理,如果是false,就继续连成一串,如果是true,就会换行。

return new String(Base64.encodeBase64(bytes, false), CHARSET_UTF8);

上面的语句是在org.apache.commons.codec.binary.Base64类库下,也就是PC端运行java程序可以正常执行的语句。

参数定义是

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_24

 那么在android.util.Base64类库下,它的参数是什么呢?如果一致,那么就可以直接使用它来代替原来的函数。

下图是函数说明,可以看到,这个函数的参数和org.apache.commons.类的函数参数是不同的,也就是说,阿里云的源代码中,涉及encode的函数需要重写。

android物联网应用程序开发 androidstudio物联网app_阿里云物联网_25

 下面我们查找flags怎么样才能实现阿里云帮助文档的源代码效果。我们找到了参数的说明。可以发现,“NO_WRAP”参数可以达到org.apache类库函数相同的效果。

android物联网应用程序开发 androidstudio物联网app_数字签名_26

几种参数运行起来的效果如下图所示,我们的确需要的是NO_WRAP参数。

android物联网应用程序开发 androidstudio物联网app_阿里云物联网_27

 明白了原理,我们就对SignatureUtils.java文件进行修改。一共修改2处。

第一处是import类库改变,如下图红框所注,导入的是安卓自带的库。

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_28

 第二处是文件末尾,将原来的代码

return new String(Base64.encodeBase64(bytes, false), CHARSET_UTF8);

修改为

return new String(Base64.encode(bytes,Base64.NO_WRAP),CHARSET_UTF8);

 效果如下图所示,这样就不再提示错误了。

android物联网应用程序开发 androidstudio物联网app_java_29

 3.4修改MainActivity.java文件

在android studio里,是没有java程序的main方法的,所以我们需要将阿里云帮助文档中的main.java文件内容想办法“移植”到“主活动”里面。方法如下:

首先导入几个库

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

android物联网应用程序开发 androidstudio物联网app_android studio_30

 然后在MainActivity类中新建一个public String signature()方法。代码如下

public String signature() throws Exception {
        Map<String, String> map = new HashMap<String, String>();

        String test = "xx";
        // 公共参数
        map.put("Format", "JSON");
        map.put("Version", "2018-01-20");
        map.put("AccessKeyId", Config.accessKey);
        map.put("SignatureMethod", "HMAC-SHA1");
        map.put("Timestamp", "2018-07-31T07:43:57Z");
        map.put("SignatureVersion", "1.0");
        map.put("SignatureNonce", "1533023037");
        map.put("RegionId", "cn-shanghai");
        // 请求参数
        map.put("Action", "RegisterDevice");
        map.put("DeviceName", "smart_light01");
        map.put("ProductKey", "a1XXXXXXXUy");

        return test = SignatureUtils.generate("GET", map, Config.accessKeySecret);
    }

修改完成的效果如下图所示。

android物联网应用程序开发 androidstudio物联网app_android studio_31

 在activity_main.xml主界面上添加一个按钮button,一个文本显示textview。

android物联网应用程序开发 androidstudio物联网app_android studio_32

在button响应代码中添加数字签名的代码,这样的话,点击按钮之后,textview就显示签名计算结果了。

tbutton.setOnClickListener(new View.OnClickListener(){
            public void onClick(View view) {
                tview.setText("原来是helloworld");
                tbutton.setText("我被点击了 ");
                Toast.makeText(MainActivity.this,"亲,你点击按钮了 ",1000).show();

                try {
                    tview.setText(signature());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    System.out.println("signature----" + signature());
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });

代码修改后的效果如下图所示。

android物联网应用程序开发 androidstudio物联网app_android物联网应用程序开发_33

4.编译运行

使用Build APK(s)编译APK文件,然后下载到手机,安装,运行。也可以通过模拟器运行。

android物联网应用程序开发 androidstudio物联网app_android studio_34

 运行效果如下图,打开软件

android物联网应用程序开发 androidstudio物联网app_android studio_35

点击BUTTON,textview就显示了计算出来的签名字符串。

android物联网应用程序开发 androidstudio物联网app_数字签名_36

 当你拥有了这个签名字符串,就拥有了调用阿里云物联网API的钥匙。