第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 与设备、系统、服务及其他外部对象之间的确定性双向执行与反馈通道。