通过受信任的本地网络,直接从移动设备读取已捕获的项目数据。
此 API 提供的内容
- 对作业、设站、扫描、标签及相关元数据的只读访问
- 对点云、图像和附件文件的流式访问
- 在源数据可用时提供 E57 导出和未处理图像检索
重要安全提示
该 API 使用明文 HTTP,且不提供 API 身份验证。请仅在受信任、隔离的本地网络或直接设备热点上使用。不要将该服务暴露到互联网或不受信任的网络。
1. 简介
Cyclone FIELD 360 移动应用包含一个轻量的设备端 HTTP 服务器。受授权的配套应用或桌面客户端可使用 REST API 浏览并下载在移动设备上捕获或同步的数据。
专为数据检索设计
该 API 为只读。它支持 GET 和 OPTIONS 请求。它不会创建、编辑或删除 FIELD 360 数据。
1.1 典型集成工作流
- 将客户端计算机与移动设备连接到同一受信任的 Wi-Fi 网络或设备热点。
- 从受支持的应用或集成工作流获取移动设备 IP 地址和动态分配的 API 端口。
- 调用版本端点以确认服务器可达并识别数据模型版本。
- 列出作业,然后检索所需的设站、扫描、标签或其他资源。
- 流式传输所需文件。对于需要断点续传的大型二进制负载,使用 HTTP range 请求。
1.2 集成特性
| 属性 | 值 |
|---|---|
| 协议 | HTTP/1.1,明文 HTTP |
| 路由前缀 | /api/v1 |
| 元数据格式 | JSON,UTF-8 |
| 文件传输 | 二进制流 |
| 身份验证 | 无;依赖本地网络与设备信任 |
| 访问模型 | 只读 |
| 平台 | iOS 和 Android |
| 资源标识符 | UUID;路由不区分大小写 |
1.3 范围与限制
- 该 API 暴露当前在移动设备上可用的数据。
- 某些端点取决于作业类型以及所需源数据是否已同步到设备。
- 该 API 不提供 TLS 加密、用户身份验证或写入操作。
- 客户端必须发现所分配的 API 端口。不得假定固定端口。
2. 连接到 API
2.1 基础 URL
服务器监听移动设备的网络接口。使用移动设备 LAN 或热点 IP 地址以及 API 启动时分配的端口构建请求:
http://<DEVICE_IP>:<PORT>/api/v1/<resource>
| 占位符 | 说明 | 示例 |
|---|---|---|
| 手机或平板的 Wi-Fi 或热点 IP 地址 | 192.168.1.42 | |
| 启动时动态选择的端口 | 8081 | |
| 请求的 API 资源 | jobs |
不要使用 localhost
客户端运行在与 API 服务器不同的设备上。不要使用 localhost 或 127.0.0.1,也不要硬编码旧的 Windows 端口 32000。
2.2 连接性检查
使用版本信息端点作为首次连接性与 schema 检查:
curl http://192.168.1.42:8081/api/v1/versioninfo
成功响应返回一个包含数据模型 schema 版本的 JSON 对象。
2.3 端口选择
在启动时,应用从平台提供的范围内选择第一个可用端口。因此所选端口可能会变化。集成应通过受支持的应用或集成工作流获取当前端口,而非假定固定值。
2.4 安全要求
- 仅使用受信任的本地 Wi-Fi 网络或直接设备热点。
- 不要通过路由器、VPN 网关或公共隧道转发 API 端口。
- 不要在公共日志或支持附件中暴露设备 IP 地址和 API 端口。
- 根据贵组织的数据处理规则对待下载的点云、图像、标签和元数据。
- 数据传输完成后结束本地连接。
3. 请求与响应约定
3.1 支持的 HTTP 方法
| 方法 | 行为 |
|---|---|
| GET /v1/ |
以 JSON 数组形式列出资源实例。 |
| GET /v1/ |
按 UUID 检索单个实例。 |
| GET /v1/ |
检索详细文档或二进制负载。 |
| OPTIONS | 返回 200 OK 及 Allow: OPTIONS, GET。 |
| HEAD | 返回 501 Not Implemented。 |
| POST、PUT、PATCH、DELETE | 返回 405 Method Not Allowed。该 API 为只读。 |
3.2 查询参数
| 参数 | 适用于 | 用途 |
|---|---|---|
| full_nested | 列表与检索 | 嵌入相关对象,而非仅返回其 ID。 |
| filter__job_type= |
GET /v1/jobs | 按作业类型枚举筛选作业。 |
| filter__job_id= |
GET /v1/controlpoints | 按所属作业筛选控制点。 |
| layer= |
Cube-face 与 LWPO 路由 | 选择 range、intensity、validity、color 或 infrared。默认:range。 |
| image= |
未处理图像路由 | 流式传输单张图像,而非返回图像 ID 列表。 |
3.3 标准对象字段
序列化对象包含通用的生命周期字段,然后是资源特定的字段。与远程或设备来源相关的字段仅出现在适用的对象上。
{
"id": "07210aea-f4bf-47e9-bb8f-35ed9d51b8bb",
"remoteId": "...",
"remoteIds": { "<ownerIdentifier>": "..." },
"deviceModificationTime": 1718000000,
"createdTime": 1717000000,
"lastModifiedTime": 1717500000,
"inDatabase": true,
"modified": false,
"deleted": false
}
3.4 状态码
| 代码 | 含义 | 典型原因 |
|---|---|---|
| 200 | OK | 请求成功完成。 |
| 206 | Partial Content | 返回了有效的字节范围。 |
| 404 | Not Found | 路由、对象或源文件不可用。 |
| 405 | Method Not Allowed | 向此只读 API 发送了写入方法。 |
| 416 | Range Not Satisfiable | 请求的字节范围无效。 |
| 500 | Internal Error | 服务器无法完成请求。 |
| 501 | Not Implemented | 所请求的处理程序(如 HEAD)未实现。 |
4. 资源概览
本节中的所有路由都相对于以下基础路径:
http://<DEVICE_IP>:<PORT>/api
| 资源 | 路由 | 常用场景 |
|---|---|---|
| 版本信息 | /v1/versioninfo | 检查连接性与数据模型版本。 |
| 作业 | /v1/jobs | 浏览顶层已捕获项目。 |
| 扫描束 | /v1/bundles | 读取设站的配准分组。 |
| 设站 | /v1/setups | 读取扫描仪设站、位置与图像。 |
| 扫描 | /v1/scans | 读取单个扫描与数据可用性标志。 |
| 关联 | /v1/links | 读取设站之间的配准关联。 |
| 设站信息 | /v1/setupinfo | 读取派生的图像与几何信息。 |
| 扫描仪设置 | /v1/scannersettings | 读取扫描仪配置资源。 |
| 传感器数据 | /v1/sensordata | 读取 GNSS、罗盘与高度计元数据。 |
| 原始数据 | /v1/raw | 读取原始产物元数据并流式传输 blob。 |
| 图像信息 | /v1/imageinfo | 读取图像尺寸、投影与变换。 |
| 缩略图 | /v1/thumbnails | 读取预览元数据与图像 blob。 |
| 标签 | /v1/tags | 读取标注及其 3D 位置。 |
| 标签附件 | /v1/tagattachments | 下载附加文件与缩略图。 |
| 标签分类法 | /v1/tagcategories 及相关路由 | 读取类别、值、字段与标签。 |
| 控制点 | /v1/controlpoints | 读取靶标拟合控制点。 |
| 限界框 | /v1/limitboxes | 读取裁剪与限界框定义。 |
5. 核心项目数据
5.1 作业
作业是捕获项目的顶层容器。它可以引用设站、配准扫描束、标签、缩略图、控制点和标签分类法。
GET /v1/jobs
GET /v1/jobs/<id>
GET /v1/jobs?filter__job_type=<int>
GET /v1/jobs/<id>?full_nested
| 关键字段 | 说明 |
|---|---|
| name / description | 作业标识与描述。 |
| type | 作业类型枚举。 |
| setups / unlinkedSetups | 设站引用,包括扫描束之外的设站。 |
| bundles | 配准扫描束引用。 |
| tags / thumbnails | 标注与预览引用。 |
| controlPoints | 控制点引用。 |
| setupCount / totalSetupCount | 可见与总设站计数。 |
| tagCount / totalTagCount | 可见与总标签计数。 |
| hasMultiAttachmentTags | 指示标签是否具有多个附件。 |
5.2 设站
设站表示一个扫描仪设站或位置及其关联的图像与扫描数据。设站列表返回属于某个作业的设站。
GET /v1/setups
GET /v1/setups/<id>
GET /v1/setups/<id>?full_nested
| 区域 | 可用数据示例 |
|---|---|
| 标识 | 名称、描述、可见性及所属作业或扫描束。 |
| 位置 | 地图位置、视觉配准增量位姿与倾斜矩阵。 |
| 扫描仪 | 序列号、扫描仪类型、硬件与固件版本。 |
| 发布 | 发布应用与应用版本。 |
| 关系 | 标签、关联、缩略图、原始产物与扫描。 |
| 地理配准 | 指示是否已应用地理配准的标志。 |
| 嵌套图像元数据 | 使用 full_nested 时逐层的 cube-face 元数据。 |
6. 扫描与可下载内容
6.1 扫描
扫描是设站内的单个扫描。扫描对象提供本地可访问数据的元数据、关系与可用性标志。
GET /v1/scans
GET /v1/scans/<id>
| 子路由 | 内容 | 说明 |
|---|---|---|
| /definition | 扫描定义文档 | 文本响应。 |
| /lwpo?layer= |
LWPO 层 | 支持 range 的二进制流。 |
| /hspc | HSPC 点云包 | 流式传输 tree.hspc.pack。 |
| /panorama | 全景图像 | 流式传输 panorama.tga。 |
| /e57 | E57 点云 | 在所需源原始数据存在时可用。 |
| /unprocessed-images | 图像 ID 列表或图像流 | 使用 image= |
6.2 设站图像与导出
| 路由 | 结果 |
|---|---|
| /v1/setups/ |
扫描定义文本。 |
| /v1/setups/ |
所选原始分层图像数据。 |
| /v1/setups/ |
Cube-face 图像元数据。 |
| /v1/setups/ |
posx、negx、posy、negy、posz 或 negz 的图像字节。 |
| /v1/setups/ |
通过设站扫描数据委托的 E57 导出。 |
| /v1/setups/ |
未处理图像列表或所选图像流。 |
6.3 E57 导出
- E57 包含经过运动学校正、无颜色的点云。
- E57 在首次访问时由下载的源原始点云生成,并缓存在源文件旁边。
- 可用性跟随源原始数据,而非缓存。hasE57 扫描标志在不启动转换的情况下报告可用性。
- 当扫描未知或所需源原始数据不可用时,端点返回 404。
作业适用性
E57 和未处理图像导出路由适用于 RTC 系列和 Livelink 作业。
6.4 估算数据量
下载大小取决于所选扫描分辨率和该设站可用的数据。以下数值在具有代表性的测试作业上测得,仅作为存储与传输规划的实用参考。
| 作业 / 扫描分辨率 | 点云(E57) | 全景相机图像 |
|---|---|---|
| Job 25 mm | 48.1 MiB | 128.7 MiB(36 个 JPEG 文件) |
| Job 6 mm | 605.1 MiB | 128.7 MiB(36 个 JPEG 文件) |
| Job 1.6 mm | 9.5 GiB | 129.0 MiB(36 个 JPEG 文件) |
额外测得的元数据量: 在 Job 25 mm 测量中,温度数据为 41.1 KiB。该值与测试中使用的点云分辨率无关。
近似值 这些测量仅为示例,并非限制或保证的文件大小。实际值可能更小或更大。客户在开始导出前应检查可用存储空间,尤其是高分辨率 E57 数据。
7. 图像、标签与支持的元数据
7.1 未处理图像
列表形式返回可用未处理帧相机图像文件名的排序 JSON 数组。下载形式流式传输一张所选图像。
GET /v1/scans/<id>/unprocessed-images
GET /v1/scans/<id>/unprocessed-images?image=<id>
- 图像 ID 必须是纯文件名。
- 包含 /、 或 .. 的 ID 会被拒绝并返回 404,以防止路径遍历。
- 未知的扫描或缺失的图像返回 404。没有图像的扫描返回空列表。
- hasUnprocessedImages 扫描标志报告可用性。
7.2 原始产物与图像信息
GET /v1/raw
GET /v1/raw/<id>
GET /v1/raw/<id>/blob
GET /v1/imageinfo/<id>
原始资源提供产物类型、大小、格式代码以及可选的 image-info 引用。图像信息可包括宽度、高度、值范围、曝光、投影与变换。
7.3 标签与附件
| 资源 | 可用信息 |
|---|---|
| 标签 | 类型、可见性、名称、MIME 类型、描述、3D 位置与文件名。 |
| 标签附件 | 名称、MIME 类型、相对存储文件与缩略图路径,以及附件类型。 |
| 标签分类法 | 类别、类别值、字段与字段标签。 |
| 控制点 | 坐标、描述、关联的标签桥接与靶标引用。 |
GET /v1/tagattachments/<id>/blob
GET /v1/tagattachments/<id>/thumbnail
7.4 传感器数据
传感器数据资源可包含 GNSS 纬度、经度、海拔、HDOP 以及原始 NMEA GGA 消息,连同气压海拔与罗盘航向、精度及可用性标志。
8. 数据存储、保留与删除
REST API 为只读,无法删除 FIELD 360 数据。数据保留通过扫描仪、FIELD 360 作业浏览器和作业存储设置控制。本指南未定义固定的自动保留时长。
8.1 创建作业时配置原始数据存储
创建作业时,使用存储设置控制哪些扫描数据保留在移动设备上:
- 启用原始数据存储以导出为标准文件格式:当不需要保留原始扫描数据以供后续导出时,清除此选项。原始扫描数据可能非常大,会迅速占用平板上的可用存储空间。

Cyclone FIELD 360 中的作业存储设置
重要:关闭原始数据存储选项会移除该作业此前存储的原始数据。
所需存储量可能有显著差异。在测得的示例中,E57 点云范围从约 48.1 MiB(25 mm 作业)到约 9.5 GiB(1.6 mm 作业)不等。全景相机图像约为 128.7 至 129.0 MiB(36 个 JPEG 文件)。这些数值仅为代表性测量,对于其他作业、扫描仪或软件版本可能有所不同。
8.2 完全移除项目数据
要完全移除一个项目及其本地存储的数据,需从两个存储位置删除该项目:
- 从扫描仪中删除项目。 使用扫描仪项目管理工作流移除存储在扫描仪上的项目与扫描数据。
- 在 Cyclone FIELD 360 中删除相应的作业。 使用 FIELD 360 作业管理工作流删除存储在移动设备上的作业与数据。
- 确认移除。 确认项目不再列于扫描仪上,且作业不再列于 FIELD 360 中。
8.3 对 API 访问与导出的影响
- 在 FIELD 360 作业被删除后,其作业、设站、扫描、图像、附件及相关元数据不再通过设备端 REST API 可用。
- E57 和未处理图像的可用性取决于所需源数据是否存在。如果禁用了原始数据存储,或源项目或作业已被删除,相关的原始下载与导出可能不再可用。
- 此前导出或下载到其他系统的任何副本不在设备端删除工作流范围内,必须在目标系统中单独删除(如需要)。
8.4 保留摘要
| 存储位置 | 保留控制 | 移除操作 |
|---|---|---|
| 扫描仪 | 项目一直保留,直到通过扫描仪项目管理移除。 | 从扫描仪中删除项目。 |
| FIELD 360 移动设备 | 作业数据一直保留,直到作业被删除。新作业的原始数据保留由作业存储选项控制。 | 在 FIELD 360 中删除作业。当不应为作业存储原始数据时,清除 “Enable storage of raw data for export to standard file formats”。 |
| 外部下载或导出目标 | 由目标系统控制,而非由设备端 API 控制。 | 在目标系统中单独删除(如需要)。 |
9. 下载大文件
二进制端点支持 HTTP Range 头,使集成能够检索文件的一部分并续传中断的传输。
9.1 支持的 range 形式
| Header 值 | 含义 |
|---|---|
| bytes= |
从指定字节到末尾。 |
| bytes=- |
API 接受的尾缀范围。 |
| bytes= |
指定的含端字节范围。 |
9.2 部分下载示例
curl -H "Range: bytes=0-1048575" \
http://192.168.1.42:8081/api/v1/raw/367d8b01-24c4-4c17-9332-31e95412539b/blob \
-o chunk.bin
有效的 range 请求返回 206 Partial Content。无效的 range 返回 416 Range Not Satisfiable。
9.3 推荐客户端行为
- 在处理响应前检查 HTTP 状态码。
- 当客户端支持续传时,对大型二进制负载使用 Range 请求。
- 不要将缓存的 E57 视为独立可用。检查 hasE57 标志或端点响应。
- 使用可用性标志以避免对缺失负载发起不必要的请求。
- 仅将下载的客户数据存储到经审批的目标位置。
10. 使用示例
以下示例假设设备 IP 地址为 192.168.1.42,动态分配端口为 8081。请将 ID 替换为设备返回的值。
检查 schema 版本
curl http://192.168.1.42:8081/api/v1/versioninfo
列出作业
curl http://192.168.1.42:8081/api/v1/jobs
检索带嵌套资源的作业
curl "http://192.168.1.42:8081/api/v1/jobs/e6bd578d-8ae2-4f80-b1e0-4fa5a19ee3bc?full_nested"
下载 E57 点云
curl http://192.168.1.42:8081/api/v1/scans/07210aea-f4bf-47e9-bb8f-35ed9d51b8bb/e57 \
-o scan.e57
列出并下载未处理图像
curl http://192.168.1.42:8081/api/v1/scans/07210aea-f4bf-47e9-bb8f-35ed9d51b8bb/unprocessed-images
# 列表响应示例:["image_0001.jpg", "image_0002.jpg"]
curl "http://192.168.1.42:8081/api/v1/scans/07210aea-f4bf-47e9-bb8f-35ed9d51b8bb/unprocessed-images?image=image_0001.jpg" \
-o image_0001.jpg
检索强度 cube face
curl "http://192.168.1.42:8081/api/v1/setups/07210aea-f4bf-47e9-bb8f-35ed9d51b8bb/cubeface/posx?layer=intensity" \
-o posx_intensity.bin
11. 故障排除
| 症状 | 检查 |
|---|---|
| 无法连接 | 确认两台设备位于同一受信任本地网络、设备 IP 正确,且正在使用当前动态分配的端口。 |
| 对象返回 404 | 确认 UUID 与路由。该对象或其源文件可能在设备上不可用。 |
| E57 返回 404 | 确认所需的已下载源原始数据存在。使用 hasE57 在不启动转换的情况下检查可用性。 |
| 空的未处理图像列表 | 该扫描当前没有受支持的未处理图像可用。 |
| 405 响应 | 仅支持 GET 和 OPTIONS。移除 POST、PUT、PATCH 或 DELETE。 |
| 416 响应 | 修正 Range 头,使其指向有效的字节范围。 |
| 501 响应 | 不支持 HEAD 及其他未实现的处理程序。 |
| 非预期 schema | 从 /v1/versioninfo 读取 modelVersion,并确保客户端支持该数据模型。 |
11.1 联系支持前
- 记录 FIELD 360 应用版本与移动操作系统。
- 记录响应状态码与请求路由,但酌情移除客户敏感值。
- 在本地确认设备 IP 与当前端口。不要包含网络凭据。
- 检查 /v1/versioninfo 并记录 modelVersion。
- 说明作业类型以及所需数据是否存在于移动设备上。
保护客户信息
日志、URL 和下载的负载可能包含项目标识符、扫描仪信息、坐标、图像或其他客户数据。仅通过经审批的支持渠道共享必要内容。
附录 A. 快速参考
| 任务 | 请求 |
|---|---|
| 检查 API/schema | GET /api/v1/versioninfo |
| 列出作业 | GET /api/v1/jobs |
| 检索嵌套作业 | GET /api/v1/jobs/ |
| 列出设站 | GET /api/v1/setups |
| 列出扫描 | GET /api/v1/scans |
| 下载设站 E57 | GET /api/v1/setups/ |
| 下载扫描 E57 | GET /api/v1/scans/ |
| 列出未处理图像 | GET /api/v1/scans/ |
| 下载单张图像 | GET /api/v1/scans/ |
| 下载原始 blob | GET /api/v1/raw/ |
| 下载标签附件 | GET /api/v1/tagattachments/ |
| 下载缩略图 | GET /api/v1/thumbnails/ |
附录 B. 文档说明
本面向客户的指南描述了为 iOS 和 Android 上的 Cyclone FIELD 360 提供的设备端 REST API 契约(按观察所得)。端点可用性取决于设备上存在的数据,对于导出路由,还取决于适用的作业与源数据条件。
实现说明
源材料未指定用于启动服务器或显示所分配端口的面向客户的 UI 步骤。集成必须使用受支持的应用或集成工作流来获取此信息。