PandaX-Go/PandaXとは
PandaXは、Go言語にて開発されたオープンソースの企業向けIoTプラットフォームを構築するための低コード開発基盤です。go-restful、Vue3.0、TypeScript、vite3、element-Plusを活用したフロントエンドとバックエンドの分離型アーキテクチャを採用しています。デバイス管理、ルールチェーン、クラウド組態、ビジュアライゼーションダッシュボード、レポートデザイナー、フォームデザイナー、コードジェネレーターなどの機能を提供し、高速にIoTプラットフォームや関連業務システムを構築することができます。
プロジェクトURL: https://gitcode.com/PandaX-Go/PandaX
PandaXのプロジェクト概要と主要機能
PandaXは、Go言語を基盤とした企業向けIoTプラットフォームの高速開発フレームワークです。フロントエンドとバックエンドの分離型設計により、柔軟で効率的なIoTソリューションを提供します。多プロトコル接続サポートやコードジェネレーターを活用することで、開発効率を大幅に向上させることができます。
| 機能 | 説明 |
|---|---|
| デバイス管理 | MQTT、TCP、UDPなど多様なプロトコルをサポートし、デバイスの増加、削除、更新、状態監視、コマンド送信を実現します。 |
| 製品管理 | デバイステンプレートを定義し、製品分類やグループ管理を行います。 |
| OTAアップデート | リモートでのファームウェアアップデートを提供します。 |
技術アーキテクチャ
PandaXはモジュール化された設計を採用し、以下の主要モジュールを含みます:
| モジュール | 機能 |
|---|---|
| `アプリケーション` | デバイス管理、ルールエンジンなどの業務機能を提供します。 |
| `IoTハブ` | 多プロトコル通信をサポートするデバイス接続層を提供します。 |
| `共通ライブラリ` | ミドルウェア、データベース操作などの共通機能を提供します。 |
| `デプロイメント` | K3Sを活用したコンテナ化デプロイメントを提供します。 |
フロントエンドとバックエンドの分離型設計
フロントエンドとバックエンドを独立させた設計により、開発効率、メンテナンス性、拡張性を大きく向上させます。
| 要素 | 説明 |
|---|---|
| フロントエンド | Vue3.0 + TypeScript + Vite3 + Element-plusを活用し、UI開発を迅速に行います。 |
| バックエンド | Go 1.20を活用し、go-restfulをベースとした軽量RESTfulフレームワークを提供します。 |
以下はAPI通信の例です:
// デバイスリストのAPI定義
func GetDeviceListAPI(c *gin.Context) {
devices, err := service.GetAllDevices()
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, devices)
}
| 設計要素 | 評価 |
|---|---|
| 分離型設計 | ⭐⭐⭐⭐ |
| メンテナンス性 | ⭐⭐⭐⭐ |
| 拡張性 | ⭐⭐⭐⭐ |
| パフォーマンス | ⭐⭐⭐ |
多プロトコル接続のサポート
PandaXは、以下のプロトコルをサポートしています:
| プロトコル | 特徴 | 適用シーン |
|---|---|---|
| MQTT | 軽量なパブリッシュ/サブスクライブ型メッセージングプロトコル。 | 遠隔地のデバイス監視、リアルタイムデータ転送。 |
| TCP | 接続指向型の信頼性の高い通信プロトコル。 | 工業機械制御、リアルタイム通信。 |
| UDP | 接続指向でない軽量なプロトコル。 | 動画ストリーム転送、センサーデータ収集。 |
| HTTP | リクエスト/レスポンス型の通信プロトコル。 | デバイス管理、設定配信。 |
| gRPC | 高パフォーマンスなリモートプロシージャコールプロトコル。 | マイクロサービス間の通信、クロスプラットフォーム通信。 |
以下はMQTT接続の例です:
// EMQXのgrpcフックを初期化
go emqxserver.InitEmqxHook(fmt.Sprintf(":%d", global.Conf.Server.GrpcPort), service)
ルールチェーンの設計と実装
PandaXのルールチェーンは、複雑なデータ処理やビジネスロジックを柔軟に実現します。
| モジュール | 役割 |
|---|---|
| `アプリケーション/ルール` | ルールチェーンの核となる処理を定義します。 |
| `アプリケーション/ルール_ログ` | ルールチェーンの実行ログを記録します。 |
| `共通/ルールエンジン` | ルールエンジンの初期化と実行を管理します。 |
ルールノードは以下のような構造を持ちます:
type 処理ノード struct {
名称 string `json:"name"`
種類 string `json:"type"`
設定 map[string]interface{} `json:"config"`
}
以下はルールチェーンの実行フローです:
func 実行ルールチェーン(input データ) (output データ, err error) {
for _, ノード := range チェーン.ノード {
output, err = ノード.処理(input)
if err != nil {
return nil, err
}
input = output
}
return output, nil
}
ルールチェーンの設定例:
{
"name": "data_processing_chain",
"nodes": [
{
"name": "filter_node",
"type": "filter",
"config": {
"condition": "value > 10"
}
},
{
"name": "transform_node",
"type": "transform",
"config": {
"operation": "add",
"value": 5
}
}
]
}
ルールチェーンのメリット
- データフィルタリング
- データ変換
- イベントトリガー
- データ保存