このページでは、通信方式に依存しない DeviceClass を実装し、ese774 Frame でデバイスサーバーとして公開し、別プロセスのクライアントから呼び出すまでを示す。以下は HTTP / FastAPI による最小構成であり、gRPC Frame の起動方法ではない。
Python 環境に ese774 Frame を導入する。
pip install ese774-frame
DeviceClass を単体で利用するだけなら、サーバーやクライアントを起動する必要はない。
次を server.py として保存する。
from ese774_frame.api_server import FastApiServer
class SimpleCtrl:
def __init__(self, name: str = "simple", logger=None):
self._name = name
self._logger = logger
def echo(self, value: str) -> str:
return value
@property
def name(self) -> str:
return self._name
if __name__ == "__main__":
server = FastApiServer(
device_cls=SimpleCtrl,
router_cls=None,
config=None,
api_spec=None,
device_kwargs={"name": "simple"},
object_name="simple",
)
server.run(host="127.0.0.1", port=8000)
SimpleCtrl は HTTP、FastAPI、gRPC、クライアントを知らない通常の Python クラスである。FastApiServer が起動時に device_cls(**device_kwargs, logger=self.logger) で生成するため、コンストラクタは logger を受け取る。object_name="simple" はサーバー側の公開名であり、クライアント側と一致させる。
この例は api_spec=None と router_cls=None を指定し、標準 DeviceRouter による動的公開を利用する。専用 Router や明示的 API が必要な場合は動的ディスパッチと明示的 APIを参照する。
ターミナルで次を実行する。
python server.py
サーバーは 127.0.0.1:8000 で待ち受ける。このアドレスはローカル接続用であり、外部ネットワークへの公開を意図していない。
次を client.py として保存し、サーバーを起動したまま別のターミナルで実行する。
from ese774_frame.clients.sync_device_client import SyncDeviceClient
client = SyncDeviceClient(
server_ip="127.0.0.1",
server_port=8000,
object_name="simple",
)
try:
print(client.echo("hello")) # hello
print(client.name) # simple
finally:
client.close()
SyncDeviceClient は api_spec を省略すると自動ディスパッチを使用する。ここで呼び出す echo() と読み出す name は DeviceClass が公開するメソッドとプロパティである。client.close() は HTTP クライアントのリソースを解放する。
この例では DeviceProxy の登録は不要である。専用クライアントの登録と Factory の使用はDeviceProxy と Factory の利用で別途説明する。
実際の機器では、DeviceClass の初期化・切断、排他制御、通信断、装置固有のエラー処理を設計する。ネットワーク境界での要求・応答やエラーの転送は Frame 側の責務であり、DeviceClass に HTTP 固有の処理を追加しない。外部ホストへの公開には待受アドレスに加えて、アクセス制御と運用ネットワークの設計が必要になる。
旧 Quick Start は現行仕様ではなく、履歴資料として保存している。