首页 理论 架构 工程 文档 白皮书 著作 研究 案例 下载 博客 关于 开始使用 →

第78章 自定义 Adapter

第78章 自定义 Adapter

第64章已经建立了 Adapter 的基本概念:

Renderer
    ↓
Rendered Result
    ↓
Adapter
    ↓
External Environment

第65章进一步建立了 DeviceAdapter:

Device Command
    ↓
DeviceAdapter
    ↓
Device
    ↓
Device Response

因此,本章的 Custom Adapter(自定义 Adapter),就是允许 ICAI 根据具体设备、外部系统、通信方式或业务环境,创建自己的连接适配器。

其核心不是改变 ICAI 的认知过程,而是解决:

ICAI 已经形成了 Action,如何通过一个确定的接口把 Action 送到具体环境,并把实际结果重新带回 ICAI。

完整关系:

Action
   ↓
Custom Adapter
   ↓
External Device / External System
   ↓
Feedback
   ↓
ICAI

1. Adapter Interface

Adapter Interface 是所有 Adapter 遵循的统一接口。

一个基本的 Adapter Interface 可以定义为:

interface AdapterInterface
{
    public function getId();

    public function getName();

    public function getVersion();

    public function connect($target);

    public function send($action);

    public function receive();

    public function disconnect();

    public function getState();
}

这样不同 Adapter 虽然连接不同环境,但管理方式保持一致。

例如:

DeviceAdapter
NetworkAdapter
FileAdapter
ApiAdapter
DatabaseAdapter
RobotAdapter
MachineAdapter
CustomAdapter

都可以统一成为:

AdapterInterface
       ↓
具体 Adapter

Adapter Interface 的职责

Interface 主要规定:

连接
发送
接收
断开
状态

而不规定:

具体设备协议
具体通信方式
具体 Action 内容
具体 Feedback 内容

这些属于具体 Adapter。

因此:

Interface
    = 统一标准

Adapter
    = 具体连接实现

Device / External System
    = 实际目标

2. 创建 Adapter

创建自定义 Adapter 时,首先确定它负责连接什么。

例如建立:

TemperatureDeviceAdapter

目标:

TemperatureController

它负责:

ICAI Action
    ↓
TemperatureDeviceAdapter
    ↓
Temperature Controller
    ↓
Feedback

一个基本 PHP OOP 实现:

class TemperatureDeviceAdapter implements AdapterInterface
{
    protected $state = 'NEW';

    protected $target = null;

    public function getId()
    {
        return 'temperature_device';
    }

    public function getName()
    {
        return 'Temperature Device Adapter';
    }

    public function getVersion()
    {
        return '1.0.0';
    }

    public function connect($target)
    {
        if (!$target) {
            $this->state = 'ERROR';
            return false;
        }

        $this->target = $target;
        $this->state = 'CONNECTED';

        return true;
    }

    public function send($action)
    {
        if ($this->state !== 'CONNECTED') {
            return array(
                'state' => 'FAILED',
                'error' => 'Adapter is not connected'
            );
        }

        if (!is_array($action)) {
            return array(
                'state' => 'FAILED',
                'error' => 'Invalid action'
            );
        }

        return array(
            'state' => 'SENT',
            'action' => $action
        );
    }

    public function receive()
    {
        return array(
            'state' => 'SUCCESS',
            'feedback' => array(
                'device_id' => $this->target,
                'device_state' => 'READY'
            )
        );
    }

    public function disconnect()
    {
        $this->target = null;
        $this->state = 'DISCONNECTED';

        return true;
    }

    public function getState()
    {
        return $this->state;
    }
}

这个 Adapter 只是一个结构化的适配器示例。

实际系统中:

connect()
send()
receive()

应该根据具体设备的真实通信协议实现。

不能把模拟返回值当成真实设备反馈。


3. 注册 Adapter

创建 Adapter 后,需要注册到 Adapter Registry 或 Adapter Manager。

基本注册结构:

AdapterRegistry
{
    id
    name
    class
    version
    type
    target
    protocol
    dependencies
    state
    enabled
}

例如:

{
    "id": "temperature_device",
    "name": "Temperature Device Adapter",
    "class": "TemperatureDeviceAdapter",
    "version": "1.0.0",
    "type": "device",
    "target": "TemperatureController",
    "protocol": "custom",
    "dependencies": [],
    "state": "REGISTERED",
    "enabled": true
}

AdapterManager

可以使用统一的管理器:

class AdapterManager
{
    protected $adapters = array();

    public function register(AdapterInterface $adapter)
    {
        $id = $adapter->getId();

        $this->adapters[$id] = $adapter;

        return true;
    }

    public function get($id)
    {
        if (!isset($this->adapters[$id])) {
            return null;
        }

        return $this->adapters[$id];
    }
}

注册:

$manager = new AdapterManager();

$adapter = new TemperatureDeviceAdapter();

$manager->register($adapter);

形成:

AdapterManager
       ↓
temperature_device
       ↓
TemperatureDeviceAdapter

4. 连接设备

Adapter 注册完成以后,还需要连接实际设备。

完整流程:

Adapter
   ↓
Target Identification
   ↓
Connection Check
   ↓
Connect
   ↓
Connected

例如:

$adapter = $manager->get('temperature_device');

$result = $adapter->connect('TemperatureController_A');

成功:

TemperatureDeviceAdapter
        ↓
TemperatureController_A
        ↓
CONNECTED

失败:

CONNECT
   ↓
FAILED

不能继续发送 Action。

因此:

CONNECTED

是发送 Action 的前置条件。


连接状态

可以定义:

NEW
CONNECTING
CONNECTED
DISCONNECTED
ERROR
TIMEOUT
UNKNOWN

其中:

UNKNOWN ≠ DISCONNECTED
DISCONNECTED ≠ ERROR

系统必须根据实际检测结果区分不同状态。


5. 发送 Action

Adapter 的重要职责之一,就是将已经形成的 Action 转换为目标环境能够处理的操作。

完整路径:

Decision
   ↓
Behavior
   ↓
Action
   ↓
Adapter
   ↓
External Device

例如 ICAI 已经形成:

Action
{
    id: 1001,
    type: "SET_TEMPERATURE",
    target: "TemperatureController_A",
    parameters: {
        temperature: 24
    }
}

Adapter 接收:

$action = array(
    'id' => 1001,
    'type' => 'SET_TEMPERATURE',
    'target' => 'TemperatureController_A',
    'parameters' => array(
        'temperature' => 24
    )
);

$result = $adapter->send($action);

Adapter 根据自己的协议形成设备命令。

例如:

Action
{
    type: SET_TEMPERATURE,
    temperature: 24
}

转换为:

DeviceCommand
{
    device_id: TemperatureController_A,
    command: SET_TEMP,
    value: 24
}

然后:

DeviceAdapter
       ↓
DeviceCommand
       ↓
TemperatureController_A

这里需要注意:

Adapter 不负责重新进行 Decision。

Decision 已经完成。

Adapter 的任务是传递和适配已经确定的 Action


6. 接收 Feedback

设备执行以后,Adapter 需要接收实际返回结果。

路径:

Device
   ↓
Device Response
   ↓
Adapter
   ↓
Feedback
   ↓
ICAI

例如设备返回:

DeviceResponse
{
    device_id: "TemperatureController_A",
    command_id: 1001,
    state: "SUCCESS",
    output: {
        temperature: 24
    }
}

Adapter 将其整理为 ICAI 可以继续处理的 Feedback:

Feedback
{
    source: "TemperatureController_A",
    target: "ICAI",
    type: "DEVICE",
    action: "SET_TEMPERATURE",
    state: "SUCCESS",
    result: {
        temperature: 24
    }
}

然后:

Feedback
   ↓
Information
   ↓
Perception
   ↓
Cognition

如果反馈是:

state = ERROR

则可以进入:

Feedback
   ↓
Detection
   ↓
Risk
   ↓
Diagnosis
   ↓
Decision

因此 Adapter 是一个非常重要的双向边界

ICAI → Adapter → External Environment

ICAI ← Adapter ← External Environment

7. 自定义 Adapter 实例

下面建立一个完整的:

LightDeviceAdapter

它用于连接一个灯光设备。

目标设备:

Light_A

支持:

POWER_ON
POWER_OFF

7.1 创建 Adapter

class LightDeviceAdapter implements AdapterInterface
{
    protected $state = 'NEW';

    protected $deviceId = null;

    public function getId()
    {
        return 'light_device';
    }

    public function getName()
    {
        return 'Light Device Adapter';
    }

    public function getVersion()
    {
        return '1.0.0';
    }

    public function connect($target)
    {
        if (!$target) {
            $this->state = 'ERROR';
            return false;
        }

        $this->deviceId = $target;
        $this->state = 'CONNECTED';

        return true;
    }

    public function send($action)
    {
        if ($this->state !== 'CONNECTED') {
            return array(
                'state' => 'FAILED',
                'error' => 'Device is not connected'
            );
        }

        if (!isset($action['type'])) {
            return array(
                'state' => 'FAILED',
                'error' => 'Action type is required'
            );
        }

        if ($action['type'] === 'POWER_ON') {
            $command = 'ON';
        } elseif ($action['type'] === 'POWER_OFF') {
            $command = 'OFF';
        } else {
            return array(
                'state' => 'FAILED',
                'error' => 'Unsupported action'
            );
        }

        return array(
            'state' => 'SENT',
            'device_id' => $this->deviceId,
            'command' => $command
        );
    }

    public function receive()
    {
        return array(
            'state' => 'SUCCESS',
            'feedback' => array(
                'device_id' => $this->deviceId,
                'device_state' => 'ON'
            )
        );
    }

    public function disconnect()
    {
        $this->deviceId = null;
        $this->state = 'DISCONNECTED';

        return true;
    }

    public function getState()
    {
        return $this->state;
    }
}

7.2 注册

$manager = new AdapterManager();

$lightAdapter = new LightDeviceAdapter();

$manager->register($lightAdapter);

7.3 连接

$adapter = $manager->get('light_device');

$adapter->connect('Light_A');

结果:

Light_A
   ↑
LightDeviceAdapter
   ↓
CONNECTED

7.4 发送 Action

ICAI 的 Decision:

Decision
{
    choice: "POWER_ON"
}

形成:

Action
{
    type: "POWER_ON",
    target: "Light_A"
}

Adapter:

Action
   ↓
LightDeviceAdapter
   ↓
DeviceCommand

形成:

DeviceCommand
{
    device_id: "Light_A",
    command: "ON"
}

7.5 接收 Feedback

设备执行:

Light_A
OFF
 ↓
ON

返回:

DeviceResponse
{
    device_id: "Light_A",
    state: "SUCCESS",
    output: {
        power: "ON"
    }
}

Adapter 整理:

Feedback
{
    source: "Light_A",
    type: "DEVICE",
    state: "SUCCESS",
    result: {
        power: "ON"
    }
}

然后重新进入 ICAI:

Feedback
   ↓
Information
   ↓
Perception
   ↓
Cognition
   ↓
Memory

如果反馈异常:

Feedback
state = ERROR

则:

Feedback
   ↓
Detection
   ↓
Risk / Conflict
   ↓
Diagnosis
   ↓
Decision
   ↓
Repair
   ↓
Verification

自定义 Adapter 完整模型

                 ICAI
                  │
                Action
                  ↓
           AdapterManager
                  ↓
             CustomAdapter
                  ↓
            DeviceCommand
                  ↓
          External Device
                  ↓
          Device Response
                  ↓
              Adapter
                  ↓
               Feedback
                  ↓
                ICAI

进一步连接前面所有机制:

Information
    ↓
Perception
    ↓
Cognition
    ↓
Understanding
    ↓
Reasoning
    ↓
Decision
    ↓
Behavior
    ↓
Action
    ↓
Custom Adapter
    ↓
External Device
    ↓
Device Response
    ↓
Feedback
    ↓
Perception

异常情况下:

Feedback
   ↓
Detection
   ↓
Risk / Conflict
   ↓
Diagnosis
   ↓
Decision
   ↓
Repair
   ↓
Verification
   ↓
Feedback

本章核心定义

Adapter Interface

Adapter Interface 是规定 Adapter 连接、发送、接收、断开和状态管理行为的统一接口。

Custom Adapter

Custom Adapter 是按照 Adapter Interface 创建,用于连接特定设备或外部系统,并在 ICAI 与外部环境之间转换 Action 与 Feedback 的适配组件。

AdapterManager

AdapterManager 是负责 Adapter 注册、查找、加载、连接和调用的管理组件。

Adapter 的核心边界

Action
   ↓
Adapter
   ↓
External Environment
   ↓
Feedback

因此:

Engine
    = 执行内部功能处理

Adapter
    = 连接外部环境

Action
    = 已确定的具体操作

Feedback
    = 外部环境返回的实际结果

最终,自定义 Adapter 使 ICAI 从一个内部计算系统进一步形成:

ICAI
  ↕
Adapter
  ↕
External Environment

从而建立 ICAI 与设备、系统、服务及其他外部对象之间的确定性双向执行与反馈通道

Leave a Reply

Your email address will not be published. Required fields are marked *