2021年7月23日 星期五

照表施工保證成功系列二

 

Microsoft Azure IoT Hub(2) 

從Android裝置傳送訊息至IoT Hub

  • IoT Hub 建立新device

1. 進入上一章建立的IoT Hub(IoTWorkSuccess) 點選 "IoT 裝置" 
2.  點選 "新增" 進入 "建立裝置"
3. 在"裝置識別碼" 輸入 "andrid_device01"
4. 在"驗證類型" 選取"對稱金鑰"(原預設不動)
5. 在"自動產生金鑰" 選取"啟動" (原預設不動)
6. 按下"儲存", 完成新增

7. 點選新建立的"android_device01"裝置, 進入 "andrid_device01" 頁面
8. 點選"主要連接字串"後面"顯示/隱藏欄位內容" 可以顯示出此device的連線字符串
9. 點選 "copy" 待coding時使用此字串

  • 撰寫Android 程式

1. 建立新專案: 

A. 開啟Android Studio --> File --> Empty Activity--> Next

B. 輸入下列資料 Name : DeviceToIoT Package Name: com.rdwatchworld.devicetoiot, Save Location: E:\worksapces\Azure\DeviceToIoT 後按下 "Finish"

2. Layout設定: 佈置一個"Multiline Text"及"Button": 

A. 從"Android"切換至"Project"後展開以下目錄"DeviceToIoT", "app", "src", "main", "res", "layout"
B. 開啟"activity_main.xml",刪除原有的"TextView:,拖拉一個"Multiline Text"拉至適當大小再拖一個"Button放至下方, 分別id設為 "Info_Text"與"Send_Button" 
C. 從"Design" 切換"Code"
D. activity_main.xml程式碼如下:
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:layout_editor_absoluteX="123dp"
    tools:layout_editor_absoluteY="1dp"
    tools:ignore="MissingConstraints">
    <EditText
    android:id="@+id/Info_Text"
    android:layout_width="351dp"
    android:layout_height="101dp"
    android:ems="10"
    android:gravity="start|top"
    android:inputType="textMultiLine"
    tools:ignore="MissingConstraints"
    tools:layout_editor_absoluteX="42dp"
    tools:layout_editor_absoluteY="30dp" />
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <Button
    android:id="@+id/Send_Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Start"
    tools:layout_editor_absoluteX="85dp"
    tools:layout_editor_absoluteY="166dp"
    tools:ignore="MissingConstraints" />
        <Button
        android:id="@+id/stop_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop"
        tools:layout_editor_absoluteX="234dp"
        tools:layout_editor_absoluteY="166dp"
        tools:ignore="MissingConstraints" />
    </LinearLayout>
    </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>  

3. Android Studio Project設定(build.gradle):

A. 在"Tool Windows" 的 "Project" 中選擇"DeviceToIoT"後按右鍵, 在List中選擇"Open Module Settings ", 跳出"Project Structure"視窗.

B. 選擇"Dependencies"在"Module"中選擇"app",在"Declared Dependencies"中按下"Add Dependency"後選擇"Library Dependency", 跳出"Add Library Dependency"視窗.

C. 在"Step 1" 輸入 "azure"(全部小寫)後按"Search", List 相關的搜尋結果, 再選擇"com.microsoft.azure"
D.  在"Step 2" 選擇"Implementation"後按下"OK", 再按一次"OK".
 
E.  開啟"app"下的 "build.gradle" (在專案下也有一個build.gradle)檔案在dependencies {}中加入
        api ('com.microsoft.azure.sdk.iot:iot-device-client:1.28.0') {
            exclude module: 'slf4j-api'

        } 

F. 按下右上角"try sync"將設定值設給全專案.

4. 加入Android 權限(AndroidManifest.xml)

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

5. 撰寫程式碼:

A. 收起"res"後展開"java"及"com.rdwatchworld.devicetoiot"後點開"MainActivity"
B, 在onCreate Function中將之前佈置的Info_TextSend_Button分別建立mInfo與mSend二件物件
C. 將mSend建立OnClickListener以對應button事件
D. 程式碼如下:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EditText mInfo = (EditText)findViewById(R.id.Info_Text);
        Button mSend = (Button)findViewById(R.id.Send_Button);
        mSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
        

E. 撰寫連線雲端需要的定義:

a. 連接字串:  private final String connString "HostName=IotWorkSuccess.azure-devices.net;DeviceId=android_device01;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
b. 連接Device ID: private final String deviceId "andrid_device01"; 

 c. 連線的protocol: private static IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
d. 定義雲端Device Client端物件: private static DeviceClient client; 

 F. 建立一個Thread來無限發送Message(隨機產生的溫度溼度值)至IoT Hub:

private static class MessageSender implements Runnable {

    public void run() {
        try {
// Initialize the simulated telemetry.
    double minTemperature = 20; //最小的溫度值 
    double minHumidity = 60; //最大的溼度值
    Random rand = new Random(); //建立一個隨機產生的值的rand物件
    while (true) { //無限迴圈
    // Simulate telemetry.
double currentTemperature = minTemperature + rand.nextDouble() * 15;
        double currentHumidity = minHumidity + rand.nextDouble() * 20;
            TelemetryDataPoint telemetryDataPoint = new TelemetryDataPoint();
            telemetryDataPoint.temperature = currentTemperature;//產生的隨機溫度
            telemetryDataPoint.humidity = currentHumidity; //產生的隨機溼度
        // Add the telemetry to the message body as JSON.
        String msgStr = telemetryDataPoint.serialize();
            Message msg = new Message(msgStr); //Message是com.microsoft.azure.sdk.iot.device內的Message物件
        // Add a custom application property to the message.
            // An IoT hub can filter on these properties without access to the message body.
        msg.setProperty("temperatureAlert", (currentTemperature > 30) ? "true" : "false"); //超過30度就列為警示
            System.out.println("Sending message: " + msgStr);
        // Send the message.
        EventCallback callback = new EventCallback();
        client.sendEventAsync(msg, callback, 1);//將msg送至雲端, response 到EvenCallback
mInfo.setText("Temperature = "+ currentTemperature + " Humidity = " + currentHumidity + "\n");將溫度及溼度秀在Edit Text中 
            Thread.sleep(5000);//停5秒再繼續
  }
} catch (InterruptedException e) {
      System.out.println("Finished.");
}
    } 
}

 G. 建立EventCallback來收取傳送Message後雲端傳回來的事件

    private static class EventCallback implements IotHubEventCallback {

public void execute(IotHubStatusCode status, Object context) {
System.out.println("IoT Hub responded to message with status: " + status.name());
if (context != null) {
synchronized (context) {
context.notify();
}
}
}
    } 

H. 在Button 的onClick事件中建立Thread來發送Message到雲端

    public void onClick(View view) {

MessageSender sender = new MessageSender(); //步驟F所建立的MessageSender Thread
executor = Executors.newFixedThreadPool(1);
executor.execute(sender);//執行MessageSender Thread
    }

 I. 離開時記得釋出物件:

    public void onDestroy() {

super.onDestroy();
try {
executor.shutdownNow();//Thread停止
client.closeNow();//關閉雲端連線
} catch (IOException e) {
e.printStackTrace();
}

    } 

 J. 驗證雲端是否收到Message:

  • 建立雲端儲存體來存放message

    1. 在搜尋列輸入"儲存體帳戶", 進入儲存體帳戶頁面
    2.  按下"新增"進入建立儲存體帳戶頁面
    3. 在"資源群組"選擇之前建立的"WorkSuccessRG" 
    4. 在"儲存體帳戶名稱"輸入"storageworksuccess"(只能小寫) 
    5. 在"位置"選擇"東南亞"(跟 WorkSuccessRG同一區會比較好)
    6. 其餘設定保持預設不變按下"檢閱+建立" 後再按下"建立"等待完成 
  • 開啟cloud shell來下command, 如開啟時需選擇一儲存體請選擇"storageworksuccess"

  •  在command下輸入az iot hub monitor-events --hub-name IotWorkSuccess --device-id android_device01按下enter即可看到傳來的Message

 

2021年7月20日 星期二

照表施工保證成功系列一

 

Microsoft Azure IoT Hub(1) 

簡介及創建IoT Hub

  • 什麼是Azure IoT

 IoT 解決方案是由一或多個 IoT 裝置所組成,而這些裝置會與裝載在雲端一或多個後端服務通訊。

1. IoT device : Raspberry pi, Android, Apple iPhone......

2. 通訊: 支援的通訊協定HTTP(HTTPS), MQTT, AMQP. 

3. 後端服務: 

  • 大規模接收來自裝置的遙測資料,並判斷如何處理與儲存該資料。
  • 分析遙測資料並提供見解 (即時或事後)。
  • 將命令從雲端傳送到特定裝置。
  • 佈建裝置並控制哪些裝置可連接到您的基礎結構。
  • 控制裝置狀態並監視其活動。
  • 管理您的裝置上安裝的韌體。

  • 架構簡介

1. 先看一張Microsoft提供的一張了解參考的架構圖:


2. IoT 應用程式可以描述為 事項 (裝置),傳送產生 深入解析 的資料。 這些深入解析會產生 動作,以改善商務或流程。

3. 例:

引擎 (事項) 傳送溫度資料 --> 是否如預期般執行 (深入解析) --> 主動排定引擎維修排程的優先順序 (動作)

  • Azure IoT SDK

1. C

2. Python

3. Node,js

4. Java

5. .NET

Azure 設定

1. Azure Command Line Interface(Azure CLI): 即透過Azure 提供的command來做設定

A. Run in windows : 下載 microsoft-cli.msi安裝後即可在windows端打開command line 來做設定

B. Run in Azure Cloud: 直接至Azure按下工具列的CLI

2. Azure Portal: 直接由Azure 網站找到要相關功能做設定.
  • 實作: 在Azure Portal創建Azure IoT Hub  

今天我們要 focus 在Microsoft Azure所提供的IoT Hub以Azure Portal來做設定
1. "所有服務"--> "物聯網"--> "IoT中樞" 進入IoT 中樞頁面

2. 按下 "新增" 進入  IoT 中樞 的 "基本" 頁面

3. 在 "資源群組" 按下 "新建" 輸入 名稱 "WorkSuccessRG"

4. "區域" 選擇 "東南亞"

5. "IoT中樞名稱" 輸入 "IoTWorkSuccess" 

6. 按下 "檢閱+建立" 


7. 再按下 "建立" : 開始建立相關設定, 約需等2分鐘.成功後會在工具列的"通知"欄位有相關訊息

8. 按下 "前往資源" 可以看到新建IoT Hub 此功能的"概觀"

9. 創建完成

2021年7月8日 星期四

Illusions of Competence(有能力的錯覺)

 #快速學習又保證記憶的方法


我常在上課學習或參加會議都會很認真做筆記,自以為這樣可以記得住所有內容或方便複習。結果一位外國朋友說我這種行為只不過是" Illusions of Competence"(有能力的錯覺),就像在書本上畫滿螢光筆每句都是重點一樣。
當日滿滿筆記,有人就笑我:"妳是記著用來忘的喔!"。

她告訴我讀書畫重點要很小心,每一節文章是要你咀嚼回顧(Recall)過真的覺得核心的地方,且最好是在書空白處做上你思考過的小短句。就像你當自己的小老師一樣,要告訴學生你的思考重點。就算要複習,不是打開書重複一直看或一直拜Google大神,如此你並不會真正得到知識或能力;而最好是換個地方去回顧當時書上或會議上的真的重點意義,直到就算你蓋上書或筆記都可以告訴別人真正的重點

當下很訝異我這種自以為是的習慣現在才發現,於是默默地把那本厚厚的筆記本藏在櫃子最深處。



2021年7月1日 星期四

如何佈建 AWS 資源

 與 AWS 服務互動的方式



1. AWS 管理主控台:

是一種以 Web 為基礎的界面,可用來存取和管理 Amazon 服務。也可以使用 AWS 主控台行動應用程式來執行監控資源、檢視警示和存取帳單資訊等任務,且同時可以有多個身分登入 AWS 主控台行動應用程式。

2.AWS 命令列界面 (AWS CLI):

為了在提出 API 請求時節省時間,直接從命令列控制多個 AWS 服務可以將原本透過指令碼執行的服務和應用程式動作加以自動化。例如,可以使用命令啟動 Amazon EC2 執行個體、將 Amazon EC2 執行個體連接到特定的 Auto Scaling 群組等。

3.軟體開發套件 (SDK):

透過專為程式設計語言或平台設計的 API,可將 AWS 服務搭配現有應用程式使用,或建立全新的應用程式以便在 AWS 上執行。


如何佈建 AWS 資源

1. 三種工具:

可以利用AWS所提供的以上三種工具透過登入管理主控台手動勾選、進入AWS CLI 寫入指令或者利用SDK套件去執行使用API。

2.AWS Elastic Beanstalk:

在提供程式碼和組態設定後,透過 AWS Elastic Beanstalk,它會擷取這些資訊並建立起你的環境,負責部署執行下列任務所需的資源,讓你不必個別佈建與管理上述所有元件:

  • 調整容量
  • 負載平衡
  • 自動擴展
  • 應用程式運作狀態監控
AWS Elastic Beanstalk 也能讓你更輕鬆儲存環境組態,以便再次輕鬆部署組態。它帶來的便利性讓你不必個別佈建與管理上述所有元件,同時還能清楚查看並控制基礎資源。你可以專心開發業務應用程式,不必費時處理基礎設施。

3.AWS CloudFormation:

是一種 Infrastructureas Code工具,讓你運用 JSON 或 YAML 文字格式的文件,也就是 CloudFormation 範本,以宣告式方法來定義各種 AWS 資源。 CloudFormation 既讓你自行定義,且 CloudFormation 引擎也會分擔所有細節,負責呼叫 API 來完成所有建立。

它還不僅只能用於 EC2 解決方案,事實上可支援多種不同 AWS 資源,不論儲存、資料庫、分析、機器學習等,都能包辦。只要你在 CloudFormation 範本中定義了資源,CloudFormation 就會剖析範本並開始佈建所有你平行定義的資源。CloudFormation 會幫你管理所有後端 AWS API 的呼叫。你可以在多個帳戶或區域執行相同 CloudFormation 範本,它都會建立出一模一樣的環境。於是人為錯誤減少了,因為它是完全自動化的過程。

結論

AWS 管理主控台很適合用於初步了解以及為使用者提供視覺化資訊。AWS管理主控台是一種手動工具。實際操作的時候,它並不是自動化的好選擇。你可以改為使用 CLI 編寫程式碼,透過終端機與 AWS 互動。你可以使用 SDK 撰寫程式,以便與 AWS 互動,或者使用 AWS Elastic Beanstalk 或 AWS CloudFormation 這類管理工具。



在 Windows 架設 Redmine 專案管理安裝

  Redmine   是一套 Web 介面的專案管理平台,經同事推薦便試著安裝起來試試,試用的過程由於能夠與   Subversion   完美結合,所以看起來很能夠彌補公司裡 SVN 專案缺乏專案控管與議題追蹤的問題,由於   Redmine   安裝步驟有些麻煩,所以不得不...