You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求助:如何在ACME oneM2M REST UI中创建资源及实现LED控制?

基于ACME oneM2M框架实现LED控制Web仪表盘步骤

一、准备工作

  • 确保ACME oneM2M平台(如IN-CSE)已部署运行,可正常访问其REST UI
  • 准备前端开发工具(HTML/CSS/JS)用于制作Web仪表盘
  • 若使用真实LED硬件,确认硬件控制接口(如GPIO)及对应开发环境

二、oneM2M资源架构设计

oneM2M采用分层资源模型,需创建以下核心资源:

  • 应用实体(AE):作为LED控制应用的顶层标识资源
  • 容器(Container):存储LED状态的历史数据实例
  • 内容实例(ContentInstance):每次控制操作生成的状态记录(ON/OFF)
  • 订阅(Subscription):可选,用于仪表盘实时接收状态变更推送

三、ACME REST UI创建资源的具体操作

1. 创建AE资源

  • 打开ACME REST UI,进入资源树根节点(如/in-cse),点击Create Resource
  • 资源类型选择AE,在请求体中填入:
    {
      "m2m:ae": {
        "rn": "LED_Control_AE",
        "api": "app.led.control",
        "rr": true
      }
    }
    
    • rn:自定义资源名称,唯一即可
    • api:应用标识符,需全局唯一
    • rr:设为true表示允许接收外部请求
  • 点击Send,成功后可在资源树中看到新建的AE节点

2. 创建Container资源

  • 进入刚创建的LED_Control_AE节点,点击Create Resource
  • 资源类型选择Container,请求体填入:
    {
      "m2m:cnt": {
        "rn": "LED_State_Container",
        "maxNrOfInstances": 10,
        "maxByteSize": 1024
      }
    }
    
    • maxNrOfInstances:设置容器最多存储的状态实例数量
    • maxByteSize:容器允许的最大存储字节数
  • 点击Send完成容器创建

3. 创建ContentInstance(测试状态写入)

  • 进入LED_State_Container节点,点击Create Resource,类型选ContentInstance
  • 请求体填入:
    {
      "m2m:cin": {
        "con": "ON"
      }
    }
    
    • con:填写LED状态(ON或OFF)
  • 发送请求后,容器会新增一条状态记录,可在资源树中查看

四、Web仪表盘开发实现

1. 前端页面布局

编写基础HTML,包含控制按钮和状态显示区:

<!DOCTYPE html>
<html>
<head>
  <title>LED Control Dashboard</title>
  <style>
    .control-btn { padding: 12px 24px; margin: 10px; font-size: 18px; cursor: pointer; }
    #state-display { font-size: 24px; margin: 20px 0; }
  </style>
</head>
<body>
  <h1>LED Control Panel</h1>
  <div id="state-display">Current State: OFF</div>
  <button class="control-btn" onclick="updateLEDState('ON')">Turn ON</button>
  <button class="control-btn" onclick="updateLEDState('OFF')">Turn OFF</button>

  <script>
    // 核心逻辑写在此处
  </script>
</body>
</html>

2. JavaScript核心逻辑

在script标签中添加代码,通过oneM2M API与ACME CSE交互:

// 替换为你的ACME CSE地址和端口
const CSE_BASE_URL = "http://[CSE_IP]:[PORT]/in-cse/in-name";
const AE_RESOURCE = "LED_Control_AE";
const CONTAINER_RESOURCE = "LED_State_Container";

// 更新LED状态函数
async function updateLEDState(targetState) {
  try {
    const requestUrl = `${CSE_BASE_URL}/${AE_RESOURCE}/${CONTAINER_RESOURCE}`;
    const payload = {
      "m2m:cin": {
        "con": targetState
      }
    };

    const response = await fetch(requestUrl, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "X-M2M-RI": "12345", // 请求标识符,自定义即可
        "X-M2M-Origin": "app.led.control" // 与AE的api字段一致
      },
      body: JSON.stringify(payload)
    });

    if (response.ok) {
      document.getElementById("state-display").textContent = `Current State: ${targetState}`;
    } else {
      console.error("Failed to update LED state");
    }
  } catch (err) {
    console.error("Request error:", err);
  }
}

// 页面加载时获取当前状态
async function fetchCurrentState() {
  try {
    const requestUrl = `${CSE_BASE_URL}/${AE_RESOURCE}/${CONTAINER_RESOURCE}/latest`;
    const response = await fetch(requestUrl, {
      headers: {
        "X-M2M-RI": "12346",
        "X-M2M-Origin": "app.led.control"
      }
    });

    if (response.ok) {
      const data = await response.json();
      const currentState = data["m2m:cin"].con;
      document.getElementById("state-display").textContent = `Current State: ${currentState}`;
    }
  } catch (err) {
    console.error("Failed to fetch current state:", err);
  }
}

// 页面加载完成后执行
window.onload = fetchCurrentState;

3. 真实LED硬件对接(可选)

若使用物理LED,需编写后端服务监听oneM2M容器的状态变化,示例Python代码(基于树莓派GPIO):

import requests
import RPi.GPIO as GPIO
import time

# 初始化GPIO
GPIO.setmode(GPIO.BCM)
LED_PIN = 18
GPIO.setup(LED_PIN, GPIO.OUT)

# ACME CSE配置
CSE_URL = "http://[CSE_IP]:[PORT]/in-cse/in-name/LED_Control_AE/LED_State_Container/latest"
HEADERS = {
    "X-M2M-RI": "12347",
    "X-M2M-Origin": "app.led.control"
}

def sync_led_state():
    try:
        response = requests.get(CSE_URL, headers=HEADERS)
        if response.status_code == 200:
            data = response.json()
            state = data["m2m:cin"].con
            GPIO.output(LED_PIN, GPIO.HIGH if state == "ON" else GPIO.LOW)
    except Exception as err:
        print("Sync error:", err)

# 定时同步状态(或使用oneM2M订阅推送)
while True:
    sync_led_state()
    time.sleep(2)

五、测试验证

  1. 确认ACME CSE正常运行,REST UI可访问
  2. 在REST UI中创建好AE、Container资源
  3. 打开Web仪表盘页面,点击ON/OFF按钮,检查REST UI中容器是否新增ContentInstance
  4. 若使用真实硬件,验证LED状态是否同步变更

内容的提问来源于stack exchange,提问作者shubham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:48:17