快速开始

本指南将帮助你快速上手 NeoRuntime Platform Python SDK。

基本概念

NeoRuntime Platform 提供以下核心服务:

  • AI Runtime: AI 推理服务,支持模型注册和推理

  • Event Bus: 事件总线,支持发布/订阅模式

  • Device Control: 设备控制服务,管理硬件设备

  • Camera Daemon: 摄像头服务,提供视频流

所有服务通过 gRPC over Unix Domain Socket 通信。

第一个应用

创建一个简单的人员检测应用:

from neoruntime_ipc_sdk import InferenceClient, EventClient
import time

def main():
    # 初始化客户端
    inf = InferenceClient()
    events = EventClient()

    print("开始人员检测...")

    # 订阅视频流推理结果
    for frame_seq, result in inf.subscribe(
        stream="cam0_main",
        model="person_v1",
        fps=10
    ):
        # 统计检测到的人数
        person_count = len([
            obj for obj in result.objects
            if obj.label == "person"
        ])

        if person_count > 0:
            print(f"帧 {frame_seq}: 检测到 {person_count} 个人")

            # 发布告警事件
            events.publish("app/alert", {
                "type": "person_detected",
                "count": person_count,
                "timestamp": time.time()
            })

if __name__ == "__main__":
    main()

配置环境变量

SDK 通过环境变量配置连接参数:

export APP_ID=my_app
export AI_RUNTIME_ENDPOINT=unix:///run/aipc/ai-runtime.sock
export EVENT_BUS_ENDPOINT=unix:///run/aipc/event-bus.sock
export DEVICE_CONTROL_ENDPOINT=unix:///run/aipc/device-control.sock
export DEBUG=0
export LOG_LEVEL=INFO

或者在代码中配置:

from neoruntime_ipc_sdk import Config

config = Config(
    app_id="my_app",
    ai_runtime_endpoint="unix:///run/aipc/ai-runtime.sock",
    debug=True
)

核心功能示例

AI 推理

单次推理

from neoruntime_ipc_sdk import InferenceClient
import numpy as np

inf = InferenceClient()

# 准备图像数据
image = np.random.randint(0, 255, (1080, 1920, 3), dtype=np.uint8)

# 执行推理
result = inf.infer(image, model_id="person_v1")

# 处理结果
for obj in result.objects:
    print(f"{obj.label}: {obj.score:.2f} at ({obj.bbox.x}, {obj.bbox.y})")

流式推理

# 订阅视频流推理结果
for frame_seq, result in inf.subscribe(
    stream="cam0_main",
    model="person_v1",
    fps=15
):
    print(f"帧 {frame_seq}: {len(result.objects)} 个对象")

模型管理

# 列出可用模型
models = inf.list_models()
for model in models:
    print(f"{model.id}: {model.name} v{model.version}")

# 获取模型信息
model_info = inf.get_model_info("person_v1")
print(f"输入尺寸: {model_info.input_width}x{model_info.input_height}")

事件总线

发布事件

from neoruntime_ipc_sdk import EventClient

events = EventClient()

# 发布简单事件
events.publish("app/status", {"status": "running"})

# 发布复杂事件
events.publish("app/detection", {
    "objects": [
        {"label": "person", "score": 0.95},
        {"label": "car", "score": 0.88}
    ],
    "timestamp": 1234567890
})

订阅事件

# 订阅单个主题
for event in events.subscribe("system/temperature"):
    print(f"温度: {event.payload['value']}°C")

# 订阅通配符主题
for event in events.subscribe("model/*/detections"):
    print(f"模型 {event.topic.split('/')[1]} 检测结果")

# 使用回调函数
def on_alert(event):
    print(f"告警: {event.payload}")

events.on_event("app/alert", on_alert)

设备控制

灯光控制

from neoruntime_ipc_sdk import DeviceClient, IrCutMode

dev = DeviceClient()

# 白光灯
dev.set_white_light(80)  # 80% 亮度

# 红外灯
dev.set_ir_led(True)

# 红外滤光片
dev.set_ircut(IrCutMode.NIGHT)  # 夜视模式

云台控制

# 绝对位置
dev.ptz_goto(pan=45.0, tilt=30.0, zoom=2.0)

# 相对移动
dev.ptz_move(pan_speed=10, tilt_speed=5)

# 停止移动
dev.ptz_stop()

GPIO 控制

# 读取 GPIO
value = dev.gpio_read(12)
print(f"GPIO 12: {value}")

# 写入 GPIO
dev.gpio_write(21, True)

视频流访问

from neoruntime_ipc_sdk import FdMediaClient

media = FdMediaClient()

# 获取原始视频流(可用流 ID 通常为 main / sub)
for frame in media.subscribe("main"):
    print(f"帧 {frame.sequence}: {frame.width}x{frame.height}")
    # frame.image 是解码后的 numpy array
    process_frame(frame.image)

# 获取编码视频流:get_encoded_stream() 返回 EncodedStreamClient
for packet in media.get_encoded_stream("main").subscribe():
    print(f"{packet.codec_name()} 包: {len(packet.data)} 字节")

错误处理

SDK 使用标准的 Python 异常:

from neoruntime_ipc_sdk import InferenceClient
from grpc import RpcError

inf = InferenceClient()

try:
    result = inf.infer(image, model_id="invalid_model")
except RpcError as e:
    print(f"gRPC 错误: {e.code()} - {e.details()}")
except ValueError as e:
    print(f"参数错误: {e}")
except Exception as e:
    print(f"未知错误: {e}")

日志记录

SDK 使用 Python 标准 logging 模块:

import logging

# 设置日志级别
logging.basicConfig(level=logging.DEBUG)

# 或者只设置 SDK 日志
logger = logging.getLogger('neoruntime_ipc_sdk')
logger.setLevel(logging.DEBUG)

下一步