Overview¶
The stack reports where assets are inside a private venue, such as tools, pallets and forklifts, through the CAMARA Device Location API. The positions come from on-site sources such as WiFi, UWB or a vendor's positioning cloud, and are fused at the edge.
CAMARA was designed for public mobile networks, where the tracked device is a phone with a number and the operator computes its position. In a factory the same organisation owns the network, the assets and the applications, and an asset has no phone number. The stack keeps the CAMARA interface and changes what sits behind it: the entity is an asset, the positions come from sources the venue runs, and authorisation follows the organisation. These changes form the private-asset profile.
Components¶
flowchart LR
subgraph sources["adapters"]
W["wifi-adapter"]
V["vendor-adapter"]
S["synthetic-adapter"]
end
W --> E
V --> E
S --> E
E["positioning-engine"] --> G["camara-gateway"]
G --> C["location-app"]
ED["placement-editor"] -. blueprint .-> E
| Component | Role |
|---|---|
| adapters | Each one speaks to one kind of source and answers GET /measurement/{positioningId} with a fix. |
| positioning-engine | Collects the fixes for a positioning id, fuses them, places them in the venue and converts them to WGS84. Stores the venue blueprint. |
| camara-gateway | Serves the CAMARA API. Resolves an asset to its positioning ids, fuses them, and restricts each consumer to its organisation. Stores the asset map. |
| placement-editor | Operator tool to draw the venue: floor plan, rooms, anchors, walls. |
| location-app | A CAMARA consumer: a browser application that shows the assets on the venue. |
Component names follow <flavor>-<role>: the suffix is the role in this flow,
the prefix qualifies it
(naming).
A new kind of source is a new adapter. For a vendor cloud with a REST API it is
a configuration document loaded into the generic vendor-adapter. The engine
and the gateway do not change.
Terms¶
The rest of the documentation uses five terms in this sense.
| Term | Meaning |
|---|---|
| asset | The tracked physical thing, named by an assetId the organisation chooses. A CAMARA client asks about assets. |
| capability | One way of locating an asset: a source and the positioningId that source knows the asset by. An asset has one or more. |
| source | The positioning technology behind a capability, such as wifi, wittra or synthetic. It is also the name under which the serving adapter registers. |
| positioningId | The identifier of the asset inside one source. |
| adapter | The service that translates one source into the adapter contract. |
A request resolves as follows. The gateway looks up the asset's capabilities.
For each one it asks the engine for the position of that positioningId,
naming the source. The engine asks the adapter registered under that source.
The gateway then fuses the answers into one CAMARA Location. The engine never
sees the asset, so adding an asset changes nothing in the engine.
A CAMARA request names only the assetId. The management surfaces of the
profile (GET /assets, asset details, the position stream) also carry the
positioningId of the primary capability, so an operator can relate an asset
to its source.
Further reading¶
| Goal | Page |
|---|---|
| Run it on a laptop | the repository README |
| Understand the services and the request flow | Architecture |
| Add a positioning source | Adapters, then Integrating a vendor REST API |
| Build a CAMARA client | Private-asset profile, then Data contracts |
| Deploy on Kubernetes | Deployment |