---
# System prepended metadata

title: DataCenter Service

---

# DataCenter Service

## 目錄

[TOC]

# Service 建立與管理

## 開發環境及管理工具

* 使用 [Visual Studio Code](https://code.visualstudio.com/) 作為 Linux 開發環境
* 安裝 [.Net Core SDK 3.1](https://dotnet.microsoft.com/download)
* 安裝 [C# extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)
* 使用 [PostgreSQL](https://www.postgresql.org/) 作為 Database 工具
* 使用 [pgAdmin](https://www.pgadmin.org/) 作為 Database 圖形介面
* 使用 [X2Go](https://wiki.x2go.org/doku.php) 作為遠端桌面工具
* 使用 [FileZilla](https://filezilla-project.org/) 進行遠端程式碼及設定檔更新

## Linux Systemd 建立方式

### 建立程式

1. 開啟 VS Code 命令列輸入 <code>dotnet new worker</code>
2. 加入套件 <code>Microsoft.Extensions.Hosting.Systemd</code>
3. 增加 <code>UseSystemd()</code> 到 <code>Program.cs</code> 的 <code>CreateHostBuilder</code> 中
```gherkin=
Host.CreateDefaultBuilder(args)
    .UseSystemd()
    .ConfigureServices((hostContext, services) =>
    {
        services.AddHostedService<Worker>();
    });
```
*以上程式碼中的 CreateDefaultBuilder 即為程式進入點

簡易 Worker.cs 程式：
```gherkin=
public class Worker : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // do something
            await Task.Delay(1000, stoppingToken);
        }
    }
}
```


### 建立 Service

1. 發佈專案，可自行指定路徑 (以下以檔案傳輸 Service 為例)
```=shell
sudo dotnet publish -o /usr/sbin/dcDataTransferService
```

2. 建立 .service 檔
在 <code>/etc/systemd/system</code> 目錄下提供一個 <code>dcDataTransfer.service</code> 檔做配置 service 之用
```gherkin=
[Unit]
Description=Data Center DataTransfer Service

[Service]
WorkingDirectory=/home/SSD1TB/IAIoT-DataCenter/Config #設定檔路徑
Type=notify
ExecStart=/usr/sbin/dcDataTransferService/DataTransferService
TimeoutSec=300
TimeoutStopSec=90

[Install]
WantedBy=multi-user.target
```

3. 重載服務
```=shell
sudo systemctl daemon-reload
```
4. 啟用 Service
```=shell
sudo systemctl enable dcDataTransfer.service
```
5. 執行 Service
```=shell
sudo systemctl start dcDataTransfer.service
```

6. 查看 Service 狀態
```=shell
sudo systemctl status dcDataTransfer.service
```

7. 啟用後重開機時 service 也會自動開啟，如需停用需移除 <code>dcDataTransfer.service</code> 檔案

# DataCenter Service 說明

## DataTransfer Service

### Service 目的

1. 檢測結果資料透過 SFTP 傳送至 Data Center
2. 機台狀態 log 檔案傳輸 (最終目標是做出 Digital Twin, log檔格式需先統一定義)

### 相關 Database Table

* DetectionResult

### 啟動 Service

修改設定後需關閉並重新啟動 Service
* 關閉 <code>sudo systemctl stop dcDataTransfer.service</code>
* 開啟 <code>sudo systemctl start dcDataTransfer.service</code>

### 設定檔說明

設定檔位置 <code>/home/SSD1TB/IAIoT-DataCenter/Config/DataCenterConfig.json</code>

```gherkin=
{
    "DatabaseName": "SpindleDataCenter-GVL",
    "FilePath": "/home/SSD1TB/IAIoT-DataCenter",
    "LimitedHardDriveName" = "/home/SSD1TB",
    "LimitedHardDriveSpaceGB" = 100.0,
    "MachineConfig": [
        {
            "ID": "NOGV0A1000",
            "Address": "10.68.200.1",
            "Username": "datacenter",
            "Password": "0ycVpzC3HEc0rb041o+jUXYc1O26n3NjnAw9VAU3TIzo22roXLbUFGPDvCBjwAuChA7pN3NPZLF0vJdITXJxf2j2RU0/BLHgwuVmNL1emLE=",
            "EnableDataTransfer": true,
            "EnableDataDelete": true,
            "DataTransferTime": [
                { "Start": "22:00", "Stop": "08:00" },
                { "Start": "12:00", "Stop": "13:00" }
            ]
        },
        {
            "ID": "NOGV0A1001",
            "Address": "10.68.200.2",
            "Username": "datacenter",
            "Password": "0ycVpzC3HEc0rb041o+jUXYc1O26n3NjnAw9VAU3TIzo22roXLbUFGPDvCBjwAuChA7pN3NPZLF0vJdITXJxf2j2RU0/BLHgwuVmNL1emLE=",
            "EnableDataTransfer": true,
            "EnableDataDelete": true,
            "DataTransferTime": [
                { "Start": "22:00", "Stop": "08:00" },
                { "Start": "12:00", "Stop": "13:00" }
            ]
        }
    ]
}
```

* DatabaseName - DC 端資料庫名稱
* FilePath - DC 端檔案儲存根目錄
* LimitedHardDriveName - DC 儲存資料裝置名稱，空間不足時停止資料傳輸
* LimitedHardDriveSpaceGB - DC 儲存資料空間限制
* MachineConfig - 以陣列方式儲存，可根據機台配置新增/刪除
* ID - 機台對應名稱
* Address - 機台 IP 位置
* Username - 機台登入帳號，需有管理者權限
* Password - 機台登入密碼
* EnableDataTransfer - 開啟/關閉檔案傳輸功能
* EnableDataDelete - 開啟/關閉檔案刪除功能。開啟時，機台端檔案將在傳送至DC端後刪除
* DataTransferTime - 資料傳輸限定時間, 需為固定格式 "HH:mm"

## LabelProject Service

### Service 目的

1. 產生 LabelProject
2. 監控標定狀態
3. 上傳標定專案及標定圖檔 ([參考連結](https://hackmd.io/@1Howr5YGR5WJmeFl-gN0uw/S1jKkpcpv))

### 相關 Database Table

* LabelProject
* LabelProjectTask
* DetectionResult
* Machine

### 啟動 Service

修改設定後需關閉並重新啟動 Service
* 關閉 <code>sudo systemctl stop dcLabelProject.service</code>
* 開啟 <code>sudo systemctl start dcLabelProject.service</code>

### 設定檔說明

設定檔位置 <code>/home/SSD1TB/IAIoT-DataCenter/Config/LabelProject.json</code>

```gherkin=
[
  {
    "ModelName": "C8C80",
    "ConfigXML": "/home/HHD10TB1/IAIoT-DataCenter/Config/C8C80.xml",
    "Address": "10.68.161.31",
    "Username": "nvidia",
    "Password": "Cs0TYZD9Vp60XbHn6GuG+7u3GWncsFv9ZlGQEz2Tv6Y38Vq3ZOnBElNEk3E0Ke73TX7P3EcEHVHa+luwGiPvpKZgQ6rrERKZKfWrcOOmMLU=",
    "UploadFilePath": "/media/nvidia/HDD1T/RemoteData",
    "StartTime": "2020-12-29 00:00:00"
  },
  {
    "ModelName": "C9C78",
    "ConfigXML": "/home/HHD10TB1/IAIoT-DataCenter/Config/C9C78.xml",
    "Address": "10.68.161.31",
    "Username": "nvidia",
    "Password": "Cs0TYZD9Vp60XbHn6GuG+7u3GWncsFv9ZlGQEz2Tv6Y38Vq3ZOnBElNEk3E0Ke73TX7P3EcEHVHa+luwGiPvpKZgQ6rrERKZKfWrcOOmMLU=",
    "UploadFilePath": "/media/nvidia/HDD1T/RemoteData",
    "StartTime": "2020-12-29 15:46:00"
  }
]
```

* ModelName - 機台型號
* ConfigXML - AI Team 定義 Label-Studio 相關設定檔位置
* Address - 上傳裝置 IP
* Username - 上傳裝置使用者名稱
* Password - 上傳裝置密碼 (加密後結果)
* ID - 機台對應名稱
* UploadFilePath - 上傳資料夾位置
* StartTime - 標定資料開始收集時間

## Report Service

### Service 目的

1. 產生 Daily Report PDF 檔案
2. 產生 Region 對應 Excel 檔案
3. 將 PDF 及 Excel 檔案以 Email 方式寄出

### 相關 Database Table

* DetectionResult
* DetectionResultObject
* ProcessReport
* Network
* Machine

### 啟動 Service

修改設定後需關閉並重新啟動 Service
* 關閉 <code>sudo systemctl stop dcReport.service</code>
* 開啟 <code>sudo systemctl start dcReport.service</code>

### 設定檔說明

設定檔位置 <code>/home/SSD1TB/IAIoT-DataCenter/Config/ReportConfig.json</code>

```gherkin=
{
    "DayDelta": -1,
    "ReportCreateTimeStart": 7,
    "ReportCreateTimeStop": 9,
    "MailToList": [
        "py.yang@getac.com.tw",
        "woody.lin@getac.com.tw",
        "frank.cw.chen@getac.com.tw",
        "mike.lc.lai@getac.com.tw",
        "ken.liang@getac.com.tw",
        "denver.tan@getac.com.tw"
    ],
    "MailCCList": [
        "ky.tsai@getac.com.tw",
        "ivy.cheng@getac.com.tw"
    ]
}
```

* DayDelta - 產生第幾天的資料，e.g. -1 指產生昨天的資料
* ReportCreateTimeStart - 開始產生資料時間
* ReportCreateTimeStop - 停止產生資料時間，只在開始與停止中間產生一次
* MailToList - 收件者 Email 名單
* MailCCList - 副本 Email 名單

## Message Service

### Service 目的

1. 定期檢查 DataCenter 與機台間網路狀況並寫入 Database 供 ReportService 產生報表使用

### 啟動 Service

修改設定後需關閉並重新啟動 Service
* 關閉 <code>sudo systemctl stop dcMessage.service</code>
* 開啟 <code>sudo systemctl start dcMessage.service</code>