如何将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
相关产品推荐
相关产品推荐

