XGRIDSDocs
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • PortalCam

    • Product Overview
    • Basic Operation
    • Using the LCC Scan App
    • Maintenance and Care
    • FAQ
  • Lixel K Series

    • Lixel K1

      • Product Overview
      • Basic Operation
      • Device Activation and Connection
      • Scanning Workflow
      • Acquire Point Cloud Data with Absolute Coordinate
      • Map Fusion
      • Route Planning Suggestions for Typical Scenes
      • Precautions
      • FAQ
    • Lixel K2

      • Product Overview
      • Basic Operation
      • Device Activation and Connection
      • Scanning Workflow
      • Acquire Point Cloud Data with Absolute Coordinate
      • Map Fusion
      • Route Planning Suggestions for Typical Scenes
      • Precautions
      • FAQ
  • Lixel L Series

    • Lixel L2 Pro

      • Product Overview
      • Basic Operation
      • Device Activation and Connection
      • Scanning Workflow
      • Acquire Point Cloud Data with Absolute Coordinate
      • Measure Point
      • Appendix
      • FAQ
    • Lixel L3

      • Product Overview
      • Basic Device Functions
      • Device Activation and Connection
      • Data Capture
      • Capturing Absolute Coordinates
      • Appendix
  • Accessories

    • Stick Light

      • Installation Guide
      • Basic Operation
      • FAQ
  • Lixel Studio

    • Version and Copyright
    • Installation and Activation
    • Software Interface
    • File Operations
    • Project Processing
    • Tools
    • 2D Drawing
    • Applications
    • Settings
    • Device Connection
    • FAQ
  • Lixel CyberColor

    • LCC Studio

      • Getting Started
      • Version and Updates
      • Download and Installation
      • Interface Overview and Navigation
      • Before Reconstruction
      • Model Reconstruction
      • Single Model Reconstruction
      • Map Fusion
      • Aerial-Ground Fusion
      • Aerial Reconstruction
      • My Models
      • Other Features
      • Settings and Account
      • Converter
      • Video Reconstruction
      • FAQ
    • LCC Scene Editor

      • Version & Updates
      • Account & Login
      • Product Overview & Home
      • Editor Interface
      • Scene Navigation Modes
      • File
      • Settings
      • Edit Operations
      • Window
      • Global Toolbar
      • Assets & Properties
      • Left Toolbar
      • Viewpoints
      • Portal
      • Skybox
      • Annotations
      • Measurement
      • Flythrough
      • Scene Report
      • 3D Layout
      • Mini-Map
      • Preview Mode (Viewer)
      • Help
      • FAQ
      • Spawn Point
    • LCC Model Editor

      • Version and Updates
      • User Guide
      • Overview and Interface
      • File Operations
      • Selectors
      • Editing Models
      • Measurement
      • Color Grading
      • Asset Management
      • Settings and Help
      • FAQ
    • Capture Guide

      • Overview
      • Capture Devices Overview
      • General Capture Principles
      • Indoor Scene Capture
      • Outdoor Scene Capture
      • Large-Scale Capture (Map Fusion)
      • Aerial-Ground Map Fusion Capture
      • Object Capture
      • People Capture
      • Video Reconstruction Capture
      • HD Enhancement
      • Control Points (Lixel P1)
      • FAQ and Troubleshooting
    • LCC Studio Linux

      • Product Overview
      • Architecture Guide
      • Installation and Deployment Guide
      • Container Startup Parameters Guide
      • CodeMeter Offline Licensing Deployment Guide
      • API Reference
      • Appendix - Developer Data Guide
      • Appendix - Error Code List
      • Single-Machine Multi-GPU Cluster Deployment QuickStart
    • Best Practices

      • Merging Multiple Large 3DGS Models
    • Version History
  • Plugin & SDK

    • Unreal

      • Introduction
      • Quick Start - Windows
      • Quick Start - Linux
      • Quick Start - Quest3
      • Editions and Licensing
      • Rendering
      • Tiled Rasterization (Experimental)
      • Visual Settings
      • Normals and Lighting
      • Scene Editing
      • Performance Parameters
      • Performance Guide
      • Third-party and Engine Plugin Integration
      • Proxy Mesh
      • Loading Animation
      • Collision
      • Navigation System Support
      • Single Layer Water Support
      • Localization
      • FAQ
      • Troubleshooting
      • Logging and Diagnostics
      • Contact Us
      • Best Practices

        • Relighting 3DGS with a LixelStudio Mesh
      • API Reference

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • SOG / SPZ / PLY Actors
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • Changelog

        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • Web

      • Introduction
      • Rendering Performance Optimization Guide
      • Graphics Configuration
      • FAQ
      • API Reference

        • LCCRender::clearIndexDB
        • LCCRender::dispose
        • LCCRender::load
        • LCCRender::setCamera
        • LCCRender::unload
        • LCCRender::update
        • LCCObject::checkRenderNextFrame
        • LCCObject::clearRenderNextFrame
        • LCCObject::ecef2Prj
        • LCCObject::getBounds
        • LCCObject::getEnvInstancedMesh
        • LCCObject::getInstancedMesh
        • LCCObject::getLodInfos
        • LCCObject::getOriginPosition
        • LCCObject::getProjectionCoordinateSystemInfos
        • LCCObject::hasCollision
        • LCCObject::hasEnvironment
        • LCCObject::hasShcoef
        • LCCObject::intersectsCapsule
        • LCCObject::intersectsRayExt
        • LCCObject::intersectsRayFromOriginExt
        • LCCObject::intersectsSphere
        • LCCObject::lowerToBottom
        • LCCObject::prj2Ecef
        • LCCObject::raiseToTop
        • LCCObject::raycast
        • LCCObject::raycastFromOrigin
        • LCCObject::setAlpha
        • LCCObject::setClipBox
        • LCCObject::setClipPlane
        • LCCObject::setEndLod
        • LCCObject::setLodAutoLevelUp
        • LCCObject::setMaxDistance
        • LCCObject::setMaxNodeSplats
        • LCCObject::setMaxSplats
        • LCCObject::setOriginPosition
        • LCCObject::setPointsColor
        • LCCObject::setRenderState
        • LCCObject::setRotation
        • LCCObject::setScale
        • LCCObject::setSemantic
        • LCCObject::setSemanticColor
        • LCCObject::setSmooth
        • LCCObject::setStartLod
        • LCCObject::setTranslation
        • LCCObject::setVisible
        • LCCObject::togglePointsDisplayMode
        • LCCObject::useEnvironment
        • LCCObject::useShcoef
      • Changelog

        • v0.6.3
        • v0.6.2
        • v0.6.1
        • v0.6.0
        • v0.5.5
        • v0.5.4
        • v0.5.3
        • v0.5.2
        • v0.5.1
        • v0.5.0
        • v0.4.1
        • v0.4.0
        • v0.3.1
        • v0.3.0
        • v0.2.0
    • Lixel OpenAPI

      • Overview
      • Connection & Authentication
      • Message Model & Codec
      • Interface Catalog
      • Real-time Data
      • Project File Access
      • Error Codes
      • Python

        • Quick Start
        • Client Wrapper & Tools
        • FAQ
      • C++

        • Quick Start
        • Client & Examples
        • FAQ

Connection & Authentication

A Lixel device runs a built-in MQTT broker and RTSP service. Real-time control and the real-time point cloud go over MQTT; the real-time video goes over RTSP. The device supports both wired and wireless networking with other devices: wired over a USB cable, wireless over Wi-Fi.

Connection parameters

Each product model supports only one of the connection protocols (not both):

ProtocolPortUsernamePasswordProduct model
MQTT1883——K1 / L2PRO
MQTTS8883Provided by the vendorProvided by the vendorKnown: K2 / H1 / F1 / Porcam use MQTTS (source: example project comments); other models follow the port the device actually exposes
  • MQTT version: V3.1.1
  • Wired networking uses the fixed IP 192.168.55.1; for wireless networking the IP is obtained over Bluetooth.
  • In Quick Connect mode the device IP is fixed at 192.168.56.1.

Note: MQTTS uses TLS. The device uses a self-signed certificate, and the example clients disable certificate verification by default to work with it. When MQTTS is selected, pass the vendor-provided username and password. With verification off, the client cannot confirm it is really talking to the device; a man-in-the-middle on the same network can impersonate the device and read the requests (including the openapi_key). Before production, switch to importing the device certificate and enabling verification.

USB connection

Devices running Linux, Windows, or Android share the network with the Lixel device over RNDIS; iOS devices use USB Tethering.

  Lixel device (192.168.55.1)                     other device
      +---------+                                    +---------+
      |   USB   | <----- RNDIS / USB Tethering ----> |   USB   |
      +---------+                                    +---------+

Wi-Fi connection

The device supports three wireless modes:

  • Normal mode: another device acts as the hotspot.
  • Quick Connect mode: the Lixel device acts as the hotspot.
  • Bridge mode: a router is used.

All modes require network provisioning over Bluetooth first. The device accepts a Bluetooth connection to configure Wi-Fi so it can join a given network.

The device's Bluetooth name has 10 characters: most models use the fixed prefix XGR- plus the last 6 digits of the SN, e.g. XGR-A12345; some ODM models use a different prefix (e.g. PCAM). Follow the name you actually scan.

      Lixel device                                 other device
      +---------+                                      +---------+
      |   BT    | <----- Bluetooth (provisioning) --> |   BT    |
      |  WiFi   | <----- WiFi (data) ---------------> |  WiFi   |
      +---------+                                      +---------+

Provisioning flow

The BLE provisioning flow between the device and the client: the client, as the master, searches for and connects to the device (the slave); after connecting, the device first sends its current Wi-Fi status; if Wi-Fi is not connected, the client sends the Wi-Fi info (SSID and password) and the device joins the target network.

        Lixel device                                    client
  +----------------------+                     +----------------------+
  |   BLE slave mode     |                     |   BLE master mode    |
  +----------+-----------+                     +----------+-----------+
             |                                            |
             v            <---- connecting ---->          v
  +----------------------+                     +----------------------+
  |   send WiFi status   | ------------------> |   get WiFi status    |
  +----------+-----------+                     +----+------------+----+
             |                                      |            |
             |                        WiFi not      |            | WiFi
             |                        connected      |            | connected
             |   <------ send WiFi info ----------- |            |
             v                                      v            v
  +----------------------+                     +----------------------+
  |   connect to WiFi    |                     |         end          |
  +----------------------+                     +----------------------+

OpenAPI Key authentication

An OpenAPI request is executed only after the device authenticates it. The request header must carry openapi_key, which the device uses to validate the request. When openapi_key is missing or wrong, the device still replies: error.code is EC_ProtoError (0x32040001), error.desc is openapi auth error, the response carries no business data, and request() returns normally without a timeout.

Requesting an OpenAPI Key

The OpenAPI Key is distributed by XGRIDS and cannot be generated by yourself. To obtain one:

  1. Request it through the XGRIDS business or technical support channel, stating the device model and intended use.
  2. XGRIDS checks and issues a key string.
  3. Fill it into the connection configuration; no extra activation step is needed.

Note: the key is bound to a specific device / authorization. Keep it safe; do not hard-code it into a public repository or share it with third parties.

Using it in code

Set ClientOptions.openapi_key, and request() / publish() fill it into the header automatically:

from example.core import ClientOptions, OpenApiClient

opts = ClientOptions(host="192.168.55.1", openapi_key="<provided by XGRIDS>")
with OpenApiClient(opts) as client:
    ...  # header.openapi_key is filled automatically

Header fields

The first field of every request/response/report message is usually a Header:

FieldTypeDescription
sequint32Frame sequence number
stampsint64Frame timestamp. Device-reported frames are in microseconds, with the Unix epoch as the time base
scalersint64Scale factor (used by point cloud, etc.)
device_idstringDevice ID (generated by the device)
session_idstringSession ID (generated by the request/report side)
openapi_keystringAPI key (optional in the proto, but the device executes only requests with a valid key)

The corresponding proto definition:

message Header {
    uint32 seq = 1;                  // frame sequence number
    sint64 stamp = 2;                // frame timestamp
    sint64 scaler = 3;               // scale factor (positive: magnify, negative: shrink, 0: disable scaling)
    string device_id = 4;            // device ID (generated by the device)
    string session_id = 5;           // session ID (generated by the request/report side)
    optional string openapi_key = 6; // API key (apply from XGRIDS)
}

Appendix: low-level provisioning interface

Note: this section is only for reference when you implement Bluetooth provisioning yourself (without an existing app). In most cases provisioning is done with the bundled tool or app, and you do not need these low-level definitions.

Provisioning reads and writes characteristics over the BLE GATT service. Android and iOS use different UUIDs:

/* Android GATT Characteristic Types */
#define UUID_GATT 0x1801
#define GATT_CHARAC_WIFI_INFO_SET 0x2AB0
#define GATT_CHARAC_WIFI_STATUS_GET 0x2AB1

/* iOS GATT Characteristic Types */
#define IOS_UUID_GATT 0x7F00
#define IOS_GATT_CHARAC_WIFI_INFO_SET 0x7F01
#define IOS_GATT_CHARAC_WIFI_STATUS_GET 0x7F02

The data structures for writing the Wi-Fi config and reading the Wi-Fi status:

#pragma pack(1)
/***********************************************************
 * WiFi status information (device -> Android)
 * ssid_len : 0 means WiFi is disconnected
 * ssid     : WiFi access point name
 * ip_len   : 0 means WiFi has no assigned IP
 * ip       : WiFi IP address
 * auth_mode: Not used yet
 * wifi_mode: 0 - STA mode  1 - AP mode (Quick Connect mode) 255 - ignore WiFi mode
 **********************************************************/
typedef struct wifi_info_s {
    uint8 ssid_len;
    uint8 ssid[32];
    uint8 passwd_len;
    uint8 passwd[64];
    uint8 auth_mode;
    uint8 wifi_mode;        // 0: Normal mode 1: Quick Connect mode 255: Only configure country code
    uint8 country_code[2];  // Country code (ISO2)
} wifi_info_t;

typedef struct wifi_status_s {
    uint8 ssid_len;
    uint8 ssid[32];
    uint8 ip_len;
    uint8 ip[16];
    uint8 connect_state;    // 0 - Not connected 1 - Connected successfully 2 - Connecting 3 - Device scanning
    uint8 wifi_mode;        // 0: Normal mode 1: Quick Connect mode
    uint8 country_code[2];  // Country code (ISO2)
} wifi_status_t;
#pragma pack()