摘要:本文講解如何在安卓移動端實作阿里云物聯網平臺數字簽名,使用的是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
第二種是通過微信索取,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290746.html
標籤:其他
下一篇:三子棋練習
