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

如何将Raspbian系统传感器数据对接Mobius平台实现前端管理(解决X-M2M-RI缺失导致的400错误)

如何将Raspbian系统传感器数据对接Mobius平台实现前端管理(解决X-M2M-RI缺失导致的400错误)

看起来你现在既卡在Mobius对接的400错误上,又需要把MySQL里的传感器数据和Mobius打通实现前端展示,我来一步步帮你解决:

一、先解决核心的400错误:X-M2M-RI缺失

你遇到的所有400错误根源很明确:OneM2M协议要求每个请求必须携带X-M2M-RI请求头,这个字段是唯一请求标识符,用来区分不同的请求,Mobius会强制校验它的存在。你的Python代码里的请求头恰好漏掉了这个关键字段,所以每次请求都被拒绝了。

解决方法很简单:在请求头中添加X-M2M-RI,推荐用随机唯一值(比如UUID)来避免请求冲突,测试场景下也可以用固定值。


二、完整解决方案代码(含错误修复+MySQL数据同步)

下面是修改后的代码,不仅修复了X-M2M-RI的问题,还加入了从MySQL读取温湿度数据并同步到Mobius的逻辑:

import requests
import json
import uuid
import mysql.connector
from mysql.connector import Error

# Mobius服务器配置
BASE_URL = "http://127.0.0.1:7579/Mobius"
HEADERS = {
    "X-M2M-Origin": "SOrigin",
    "Content-Type": "application/json"
}

# MySQL数据库配置(替换成你的实际信息)
MYSQL_CONFIG = {
    'host': 'localhost',
    'database': 'sensor_db',
    'user': 'pi',
    'password': 'your_mysql_password'
}

def get_latest_sensor_data():
    """从MySQL读取最新的温湿度数据"""
    try:
        connection = mysql.connector.connect(**MYSQL_CONFIG)
        if connection.is_connected():
            cursor = connection.cursor(dictionary=True)
            # 假设你的传感器数据表是sensor_data,包含timestamp、temperature、humidity字段
            query = "SELECT temperature, humidity FROM sensor_data ORDER BY timestamp DESC LIMIT 1"
            cursor.execute(query)
            record = cursor.fetchone()
            return record
    except Error as e:
        print(f"MySQL读取错误: {e}")
        return None
    finally:
        if connection.is_connected():
            cursor.close()
            connection.close()

def create_ae(ae_name):
    """创建Mobius应用实体(AE),仅需运行一次"""
    url = BASE_URL
    # 动态生成唯一请求ID
    request_headers = {**HEADERS, "X-M2M-RI": str(uuid.uuid4()), "ty": "2"}
    payload = {
        "m2m:ae": {
            "rn": ae_name,
            "api": "0.2.481.2.0001.001.000111",
            "rr": True,
            "poa": ["http://203.254.173.104:9727"]
        }
    }
    response = requests.post(url, headers=request_headers, json=payload)
    if response.status_code in [200, 201]:
        print(f"AE创建成功: {ae_name}")
    else:
        print(f"AE创建失败: {response.status_code}, {response.text}")

def create_container(ae_name, container_name):
    """创建Mobius容器(Container),仅需运行一次"""
    url = f"{BASE_URL}/{ae_name}"
    request_headers = {**HEADERS, "X-M2M-RI": str(uuid.uuid4()), "ty": "3"}
    payload = {
        "m2m:cnt": {
            "rn": container_name
        }
    }
    response = requests.post(url, headers=request_headers, json=payload)
    if response.status_code in [200, 201]:
        print(f"容器创建成功: {container_name}")
    else:
        print(f"容器创建失败: {response.status_code}, {response.text}")

def send_data_to_mobius(ae_name, container_name, data):
    """将传感器数据发送到Mobius容器"""
    url = f"{BASE_URL}/{ae_name}/{container_name}"
    request_headers = {**HEADERS, "X-M2M-RI": str(uuid.uuid4()), "ty": "4"}
    payload = {
        "m2m:cin": {
            "con": json.dumps(data)
        }
    }
    response = requests.post(url, headers=request_headers, json=payload)
    if response.status_code in [200, 201]:
        print(f"数据同步成功: {data}")
    else:
        print(f"数据同步失败: {response.status_code}, {response.text}")

if __name__ == "__main__":
    AE_NAME = "mySensorApp"
    CONTAINER_NAME = "temperatureHumidityData"

    # 以下两行仅需运行一次,创建成功后注释掉
    # create_ae(AE_NAME)
    # create_container(AE_NAME, CONTAINER_NAME)

    # 从MySQL读取最新数据并同步到Mobius
    latest_data = get_latest_sensor_data()
    if latest_data:
        send_data_to_mobius(AE_NAME, CONTAINER_NAME, latest_data)
    else:
        print("未读取到有效传感器数据")

三、实现实时数据同步与前端展示

1. 定时同步配置

数据存入MySQL后,你需要让Raspbian定时同步到Mobius:

  • 运行crontab -e打开定时任务编辑器
  • 添加一行配置(每分钟同步一次,可根据需求调整):
    * * * * * python3 /home/pi/your_script_path.py >> /home/pi/mobius_sync.log 2>&1
    
  • 保存退出后,系统会自动每分钟执行脚本,同步最新数据到Mobius。

2. 前端数据管理

数据成功存入Mobius后,你有两种方式实现前端展示:

  • 使用Mobius自带Web UI:访问http://your-server-ip:7579,登录后可直接查看AE、容器及历史数据
  • 自定义前端:调用Mobius的REST API查询数据,例如发送GET请求到:
    http://127.0.0.1:7579/Mobius/mySensorApp/temperatureHumidityData?rcn=4
    
    即可获取容器内所有历史数据,在前端解析后展示。

四、注意事项

  • AE和容器仅需创建一次,成功后请注释掉对应的调用代码,避免重复请求报错
  • 确保Mobius服务正常运行:可通过curl http://127.0.0.1:7579/Mobius测试连通性
  • 若Mobius配置了Origin白名单,需将SOrigin添加到允许列表中

备注:内容来源于stack exchange,提问作者JC Moon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:23:04