Fuchsia 介面定義語言 (FIDL) 是用來描述 Fuchsia 程式使用的處理序間通訊 (IPC) 通訊協定的語言。FIDL 提供簡化的宣告語法,讓提供者將介面定義為 「protocol」。支援的資料類型包括整數、浮點數、布林值、字串, 和 帳號代碼 ,直接在 Google Cloud 控制台實際操作。這些項目可整理成更複雜的陣列、向量、結構體、資料表和聯集。
請參考下列 Echo
介面範例 FIDL 通訊協定:
library fuchsia.examples;
const MAX_STRING_LENGTH uint64 = 32;
@discoverable
closed protocol Echo {
strict EchoString(struct {
value string:MAX_STRING_LENGTH;
}) -> (struct {
response string:MAX_STRING_LENGTH;
});
strict SendString(struct {
value string:MAX_STRING_LENGTH;
});
strict -> OnString(struct {
response string:MAX_STRING_LENGTH;
});
};
FIDL 通訊協定會說明透過傳送郵件的方式,所叫用的一組方法 管道。管道訊息本質上為非同步,且傳送者和接收者會各自獨立運作。FIDL 方法會引入較高層級的語意,讓您在 FIDL 交易的用戶端和伺服器端,執行更符合慣例的程式設計。
FIDL 支援下列方法類型:
- 雙向方法:這是一般方法呼叫,可接受選用參數,且傳回類型是在
->
運算子之後定義。雙向方法區塊 直到收到回應為止在Echo
範例中,EchoString()
方法是一種雙向方法。 - 單向方法:非同步方法呼叫,會立即傳回,而不需要等待回應。未宣告傳回類型的方法為
視為單向用戶端。在
Echo
範例中,SendString()
方法是單向方法。 - 事件:必要時,伺服器可能會傳送非預期的訊息給用戶端,稱為事件。事件會在
->
運算子的傳回端宣告方法名稱。在Echo
範例中,OnString()
方法為事件。
建立 FIDL 程式庫
FIDL 程式庫會將 FIDL 來源檔案分組。程式庫可做為所含通訊協定的命名空間,而 FIDL 來源檔案可隱含地存取同一個程式庫中的所有其他宣告。FIDL 來源檔案必須匯入其他程式庫中的任何宣告。
Fuchsia SDK 提供要編譯的 fuchsia_fidl_library()
建構目標
將 FIDL 來源檔案複製到程式庫中。程式庫目標的名稱必須與各來源檔案中的 library
宣告相符。請參閱以下 BUILD.bazel
範例,瞭解 fuchsia.examples
程式庫的用法:
# Import the fidl template.
load("fuchsia_fidl_library")
# Define a FIDL library target.
fuchsia_fidl_library(
name = "fuchsia.examples",
srcs = [
"echo.fidl",
],
library = ""fuchsia.examples"",
visibility = ["//visibility:public"],
)
在建構期間,FIDL 編譯器 (fidlc
) 前端工具會驗證並編譯程式庫來源檔案,轉換為 JSON 中介表示法 (IR)。這個 JSON
IR 格式是 FIDL 繫結的基礎。
產生 FIDL 繫結
元件會透過稱為 FIDL 繫結的產生程式碼使用 FIDL 通訊協定。將編碼要求和回應的編碼及解碼作業繫結至 FIDL 訊息,並透過基礎 IPC 管道轉移這些訊息。 特定語言專屬的繫結程式庫可為這些結構提供包裝函式 並根據熟悉的程式設計慣用語言來調整互動
用戶端介面 (有時稱為 Proxy) 會在較高層級的函式呼叫和 FIDL 訊息之間執行轉譯作業。在伺服器端 繫結會處理傳入的要求訊息,並透過摘要傳送 元件要實作的介面
在建構期間,fidlgen
後端工具會根據 fidlc
產生的 JSON IR 程式庫,為支援的程式語言產生繫結。Fuchsia SDK 提供建構範本,可針對各個支援的
語言。請參閱下列 BUILD.bazel
範例,瞭解如何產生 HLCPP 繫結:
fuchsia.examples
程式庫:
fuchsia_fidl_hlcpp_library(
name = "fuchsia.examples.fidl_cc",
library = ":fuchsia.examples",
visibility = ["//visibility:public"],
deps = [
"@fuchsia_sdk//pkg/fidl_cpp",
],
)
使用這個程式庫的元件可以使用繫結目標做為依附元件。
練習:Echo FIDL 程式庫
在本節中,您將使用名為 Echo
的通訊協定定義新的 FIDL 程式庫,其中包含一個方法,可將字串值傳回給呼叫端。
建立 FIDL 程式庫
請先為 FIDL 程式庫目標建立新目錄:
mkdir -p fuchsia-codelab/echo-fidl
完成本節後,專案應具有下列目錄結構:
//fuchsia-codelab/echo-fidl
|- BUILD.bazel
|- echo.fidl
新增名為 echo.fidl
的 FIDL 介面檔案,包含以下內容:
echo-fidl/echo.fidl
:
library examples.routing.echo;
const MAX_STRING_LENGTH uint64 = 32;
@discoverable
closed protocol Echo {
/// Returns the input.
strict EchoString(struct {
value string:<MAX_STRING_LENGTH, optional>;
}) -> (struct {
response string:<MAX_STRING_LENGTH, optional>;
});
};
EchoString
是雙向方法,可接受選用 (可為空值) 的字串值,並傳回相同的值。
新增含有下列內容的 BUILD.bazel
檔案,以宣告程式庫目標:
echo-fidl/BUILD.bazel
:
load(
"@fuchsia_sdk//fuchsia:defs.bzl",
"fuchsia_fidl_library",
"fuchsia_fidl_llcpp_library",
)
package(default_visibility = ["//visibility:public"])
fuchsia_fidl_library(
name = "examples.routing.echo",
srcs = [
"echo.fidl",
],
library = "examples.routing.echo",
)
fuchsia_fidl_llcpp_library(
name = "examples.routing.echo.fidl_cc",
library = ":examples.routing.echo",
deps = [
"@fuchsia_sdk//pkg/fidl_cpp_v2",
],
)
執行 bazel build
,並確認建構作業是否順利完成:
bazel build --config=fuchsia_x64 //fuchsia-codelab/echo-fidl:examples.routing.echo.fidl_cc
檢查 FIDL 繫結
FIDL 繫結目標會編譯 FIDL 介面,並在 bazel-bin/
目錄中產生特定語言繫結:
bazel-bin/fuchsia-codelab/echo-fidl/_virtual_includes/
找出並開啟上述目錄中產生的標頭:
find bazel-bin/fuchsia-codelab/echo-fidl/_virtual_includes -name *.h
探索這些檔案的內容。以下是產生的幾個主要介面摘要:
介面 | 說明 |
---|---|
Echo
|
代表 FIDL 通訊協定,同時是 FIDL 通訊協定的主要進入點, 用戶端和伺服器都使用該類別與該通訊協定互動的類別。 |
EchoString
|
用於表示 FIDL 通訊協定方法,用戶端和伺服器會使用這項方法提供類型化的請求和回應。 |
fidl::Server<Echo>
|
伺服器元件的抽象類別,用於覆寫和處理傳入 FIDL 要求。 |
fidl::internal::NaturalClientImpl<Echo>
|
非同步用戶端,可將通訊協定方法轉換為透過 IPC 管道傳送的 FIDL 要求訊息。在為此通訊協定建立 fidl::Client 時提供。 |
fidl::internal::NaturalSyncClientImpl<Echo>
|
將通訊協定方法轉換為 FIDL 要求的同步用戶端
或是透過 IPC 管道傳送的訊息數量在 fidl::SyncClient 時提供
都是針對這個通訊協定所建立
|