IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 使用android studio实现阿里云物联网平台数字签名(Signature)(附源代码) -> 正文阅读

[移动开发]使用android studio实现阿里云物联网平台数字签名(Signature)(附源代码)

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

目录

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。

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

设置好的界面如下图

?2.2 配置工程build.gradle

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

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

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

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

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

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

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

2.3配置应用build.gradle

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

?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。

设置的效果如下图所示。

2.5修改AdroidMainfest.xml文件

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

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

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

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

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

https://help.aliyun.com/document_detail/30563.html?spm=a2c4g.11186623.6.804.5b863f83S2O8xh

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

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

3.1 新建Config.java文件

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

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

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

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

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

3.2新建UrlUtil.java文件

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

这次提示出现了错误。

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

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

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

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

?然后错误就消失了。

?3.3新建SignatureUtils.java文件

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

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

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

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

直接使用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.util.Base64类库下,它的参数是什么呢?如果一致,那么就可以直接使用它来代替原来的函数。

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

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

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

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

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

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

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

修改为

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

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

?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;

?然后在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);
    }

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

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

在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();
                }

            }
        });

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

4.编译运行

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

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

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

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

下一步,将实现一个安卓程序,控制一个智能灯,从而实现一个完整的移动端物联网应用。

源代码可以通过两种途径获取。

第一种是通过CSDN资源下载,链接是:

https://download.csdn.net/download/youngwah292/20496144

第二种是通过微信索取。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:20:36  更:2021-07-27 16:21:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 19:07:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码