Appearance
设备数据
设备数据接口提供两种功能:
- GET: 获取设备下所有数据点的实时数据,数据来源于 Cloudflare D1 实时数据库,带有 2 分钟缓存。
- POST: 设备端上报数据,数据会同时发送到 SQS 队列和写入 Cloudflare D1。
获取实时数据
GET /api/v2/projects/{project_id}/devices/{device_id}/data/响应示例
json
[
{
"agri_id": "d-1000-abc123-1-00",
"value": 25.6,
"the_type": 2001,
"unit": "℃",
"t": 1711008140
},
{
"agri_id": "d-1000-abc123-1-01",
"value": 65.2,
"the_type": 2002,
"unit": "%RH",
"t": 1711008140
}
]响应字段
| 字段 | 类型 | 描述 |
|---|---|---|
agri_id | string | 数据点标识符 |
value | number | 当前值 |
the_type | integer | 数据点类型 |
unit | string | 数据单位 |
t | integer | 时间戳(秒) |
bash
curl "https://dl.yengear.com/api/v2/projects/proj_abc/devices/123/data/" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Organization-Slug: your-org-slug"python
response = requests.get(
f"{API_BASE}/projects/{project_id}/devices/{device_id}/data/",
headers=headers
)
for item in response.json():
print(f"{item['agri_id']}: {item['value']} {item.get('unit', '')}")说明
- 返回设备下所有启用数据点的最新数据
- 数据来源:Cloudflare D1
point_data表 - 缓存键:
device_data_<device.agri_id>,缓存时间约 2 分钟 t字段为 UTC 时间戳(秒)
上报设备数据
POST /api/v2/projects/{project_id}/devices/{device_id}/data/请求示例
json
[
{
"agri_id": "d-1000-abc123-1-00",
"value": 25.6,
"t": 1711008140
},
{
"agri_id": "d-1000-abc123-1-01",
"value": 65.2
}
]请求字段
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
agri_id | string | 是 | 数据点标识符,必须以设备 agri_id 为前缀 |
value | number | 是 | 数据值 |
t | integer | 否 | UTC 时间戳(秒),缺省为当前时间 |
服务端处理
对于每条有效数据:
- 根据
agri_id查找数据点元数据 - 自动补全
the_type字段 - 添加
project_id和org_id - 如果
t缺失或无效,填充当前 UTC 时间戳
数据流向
数据会同时发送到两个目标:
- AWS SQS 队列: 供 Lambda 异步处理(规则引擎、MongoDB 存储、告警等)
- Cloudflare D1: 供 GET 接口实时查询,每个
agri_id只保留最新值(UPSERT)
如果 SQS 或 D1 操作失败,错误会被记录但不会阻断响应。
响应示例
json
[
{
"agri_id": "d-1000-abc123-1-00",
"value": 25.6,
"the_type": 2001,
"t": 1711008140,
"project_id": "proj_abc",
"org_id": "your-org-slug"
}
]bash
curl -X POST "https://dl.yengear.com/api/v2/projects/proj_abc/devices/123/data/" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Organization-Slug: your-org-slug" \
-H "Content-Type: application/json" \
-d '[{"agri_id": "d-1000-abc123-1-00", "value": 25.6}]'python
data = [
{"agri_id": "d-1000-abc123-1-00", "value": 25.6},
{"agri_id": "d-1000-abc123-1-01", "value": 65.2}
]
response = requests.post(
f"{API_BASE}/projects/{project_id}/devices/{device_id}/data/",
headers=headers,
json=data
)
print(f"上报成功: {len(response.json())} 条")错误码
| 状态码 | 描述 |
|---|---|
| 400 | 请求格式错误 |
| 401 | 未授权 |
| 403 | 无权限访问该项目/设备 |
| 404 | 设备不存在或已禁用 |
注意事项
- 前缀校验:
agri_id必须以设备的agri_id为前缀,否则数据会被丢弃 - 静默丢弃: 无效数据会被跳过,不会中断整个批次处理
- 幂等性: 接口不做去重处理,建议包含
t字段帮助下游服务识别重复数据 - 频率限制: 建议批量上报,避免频繁调用
