Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

快速開始

本章節描述在 Ubuntu 22.04 環境的快速安裝步驟。

目前的可執行檔採用 GLIBC 2.31 編譯,可以在 Ubuntu 22.04 或以上的 OS 執行。 較舊的 OS 可以使用 Docker 映像。 相關的設定和環境變數將於 設定檔 說明。

安裝工具

sudo apt -y install curl jq

安裝 Docker

這裡參考 Docker 官方網站 的安裝步驟。

sudo apt -y install apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER

記得重啟 shell 套用使用者權限。

安裝 MongoDB、RabbitMQ、EMQX

啟動服務(版本和資料保存的資料夾可以視情形調整):

export MONGODB_VER=7.0.9
export RABBITMQ_VER=3.13.2
export EMQX_VER=5.6.1

export MONGODB_DIR=$HOME/db/mongodb
export RABBITMQ_DIR=$HOME/db/rabbitmq
export EMQX_DIR=$HOME/db/emqx

mkdir -p $MONGODB_DIR
docker run --rm --name mongodb -d \
  -p 27017:27017 \
  -v $MONGODB_DIR:/data/db \
  mongo:$MONGODB_VER

mkdir -p $RABBITMQ_DIR
docker run --rm --name rabbitmq -d \
  -e RABBITMQ_NODENAME="rabbit@localhost" \
  -p 5671:5671 -p 5672:5672 -p 15672:15672 \
  -v $RABBITMQ_DIR:/var/lib/rabbitmq \
  rabbitmq:$RABBITMQ_VER-management-alpine

mkdir -p $EMQX_DIR
docker run --rm --name emqx -d \
  -e EMQX_LOADED_PLUGINS="emqx_dashboard|emqx_management|emqx_auth_mnesia" \
  -e EMQX_LOADED_MODULES="emqx_mod_acl_internal,emqx_mod_presence,emqx_mod_topic_metrics" \
  -p 1883:1883 -p 8883:8883 -p 18083:18083 \
  -v $EMQX_DIR:/opt/emqx/data \
  emqx/emqx:$EMQX_VER

這裡只是介紹 EMQX 需要使用的 plugin,下面的展示不會使用。您也可以先不啟動 EMQX。

下載 Sylvia-IoT

curl -LO https://github.com/woofdogtw/sylvia-iot-core/releases/latest/download/sylvia-iot-core.tar.xz
curl -LO https://github.com/woofdogtw/sylvia-iot-core/releases/latest/download/sylvia-iot-coremgr-cli.tar.xz
curl -L -o config.json5 https://github.com/woofdogtw/sylvia-iot-core/raw/main/files/config.json5.example
tar xf sylvia-iot-core.tar.xz
tar xf sylvia-iot-coremgr-cli.tar.xz

修改 config.json5

為了方便展示,這裡對範例的 config.json5 做了一些修改:

  • 由於這裡要展示的是 MongoDB,將所有的 "engine": "sqlite" 改成 "engine": "mongodb"
    "db": {
        "engine": "mongodb",
        ...
    },
    
  • 先不啟用 HTTPS,將憑證檔設定註解掉:
    //"cacertFile": "/etc/ssl/certs/ca-certificates.crt",
    //"certFile": "/home/user/rust/conf/certs/sylvia-iot.crt",
    //"keyFile": "/home/user/rust/conf/certs/sylvia-iot.key",
    
  • 建立一個資料夾作為靜態檔案的存放處,此處的例子是 /home/user/static
    "staticPath": "/home/user/static",
    
  • 使用預設的登入頁面樣板,將範例的註解掉:
    "templates": {      // Jinja2 template paths.
        //"login": "/home/user/rust/static/login.j2",
        //"grant": "/home/user/rust/static/grant.j2",
    },
    
  • 使用 rumqttd 而非 EMQX:
    "coremgr": {
      ...
      "mq": {
        "engine": {
          "amqp": "rabbitmq",
          "mqtt": "rumqttd",
        },
        ...
      },
      ...
    },
    

設定初始資料

先進入 MongoDB shell:

docker exec -it mongodb mongosh

在 MongoDB shell 介面建立基本資料:

use test1

db.user.insertOne({
  userId: 'admin',
  account: 'admin',
  createdAt: new Date(),
  modifiedAt: new Date(),
  verifiedAt: new Date(),
  expiredAt: null,
  disabledAt: null,
  roles: {"admin":true,"dev":false},
  password: '27258772d876ffcef7ca2c75d6f4e6bcd81c203bd3e93c0791c736e5a2df4afa',
  salt: 'YsBsou2O',
  name: 'Admin',
  info: {}
})

db.client.insertOne({
  clientId: 'public',
  createdAt: new Date(),
  modifiedAt: new Date(),
  clientSecret: null,
  redirectUris: ['http://localhost:1080/auth/oauth2/redirect'],
  scopes: [],
  userId: 'dev',
  name: 'Public',
  imageUrl: null
})

接著按兩次 Ctrl+C 離開。

開始使用

啟動 Sylvia-IoT core:

./sylvia-iot-core -f config.json5

如果程式沒有結束,表示已經啟動成功了 😊。

另外開一個命令列視窗,使用 CLI 登入:

./sylvia-iot-coremgr-cli -f config.json5 login -a admin -p admin

將會看到如下的畫面(您看到的內容會有些不同):

$ ./sylvia-iot-coremgr-cli -f config.json5 login -a admin -p admin
{
  "access_token": "ef9cf7cfc645f9092b9af62666d903c5a8e4579ff6941b479c1d9c9b63b0b634",
  "refresh_token": "265983a08af706fbe2912ff2edb1750311d1b689e4dab3a83c4b494c4cf2d033",
  "token_type": "bearer",
  "expires_in": 3599
}
OK (146 ms)

Access token 會自動被保留在 $HOME/.sylvia-iot-coremgr-cli.json 這個檔案中,CLI 會依據裡面的內容來存取 API。

可以使用 ./sylvia-iot-coremgr-cli help 查詢指令的使用方式。

建立資源

為了方便使用 mosquitto CLI,這裡我們分別以下的實體:

  • 一個單位,單位代碼是 demo
  • 一個 MQTT 應用,應用代碼是 test-app-mqtt
  • 一個 MQTT 網路,網路代碼是 test-net-mqtt
  • 一個裝置,裝置網路位址為 01000461
  • 一個路由,將該裝置綁定給應用

過程會需要變更連線密碼為 password(您看到的內容會有些不同):

UNIT_ID=$(./sylvia-iot-coremgr-cli -f config.json5 unit add -c demo -o admin -n 'Demo' | jq -r .unitId)
APP_ID=$(./sylvia-iot-coremgr-cli -f config.json5 application add -c test-app-mqtt -u $UNIT_ID --host 'mqtt://localhost' -n 'TestApp-MQTT' | jq -r .applicationId)
NET_ID=$(./sylvia-iot-coremgr-cli -f config.json5 network add -c test-net-mqtt -u $UNIT_ID --host 'mqtt://localhost' -n 'TestNet-MQTT' | jq -r .networkId)
./sylvia-iot-coremgr-cli -f config.json5 application update -i $APP_ID -p password
./sylvia-iot-coremgr-cli -f config.json5 network update -i $NET_ID -p password
DEV_ID=$(./sylvia-iot-coremgr-cli -f config.json5 device add -u $UNIT_ID --netid $NET_ID -a 01000461 -n 01000461 | jq -r .deviceId)
./sylvia-iot-coremgr-cli -f config.json5 device-route add -d $DEV_ID -a $APP_ID

上傳裝置資料

可以用以下指令安裝 mosquitto CLI:

sudo apt -y install mosquitto-clients

開啟一個 shell 訂閱應用主題(格式為 broker.application.[單位代碼].[應用代碼].uldata):

mosquitto_sub -u test-app-mqtt -P password -t broker.application.demo.test-app-mqtt.uldata

開啟另一個 shell 模擬網路系統傳送裝置資料(主題格式為 broker.network.[單位代碼].[網路代碼].uldata):

mosquitto_pub -u test-net-mqtt -P password -t broker.network.demo.test-net-mqtt.uldata -m '{"time":"2023-07-08T06:55:02.000Z","networkAddr":"01000461","data":"74657374"}'

這時您應該會在訂閱的 shell 看到如下畫面(內容可能有些不同):

$ mosquitto_sub -u test-app-mqtt -P password -t broker.application.demo.test-app-mqtt.uldata
{"dataId":"1688799672075-iJ4YQeQ5Lyv4","time":"2023-07-08T06:55:02.000Z","pub":"2023-07-08T07:01:12.075Z","deviceId":"1688798563252-aWcZVRML","networkId":"1688798370824-RwAbBDFh","networkCode":"test-net-mqtt","networkAddr":"01000461","isPublic":true,"profile":"","data":"74657374"}

如果有看到資料,恭喜您完成基本的 Sylvia-IoT 的使用了(恭喜你解鎖成就 😆)!