İçeriğe geç
TREN
Atlıhan Harita

Lixel OpenAPI Kullanım Kılavuzu · C++

İstemci ve Örnekler

Bölüm 09.2 / 09Kılavuz sürümü v1.1.0Türkçe

C++ istemci kitaplığı lixel::openapi ad alanında yer alır; genel başlık dosyaları cpp/include/lixel/openapi/ dizinindedir. Bu sayfa, kitaplığın sunduklarını ve nasıl kullanılacağını anlatır.

Başlık Dosyalarına Genel Bakış

HeaderSağladıkları
client.hClient: Connect, Request, Publish, Subscribe, SubscribeMessage, RemoveSubscription
scan.hRunScan: Taramayı başlatır, cihazın gerçekten tarama yaptığını bekler, durdurur ve bekleme durumuna dönmesini bekler
pointcloud.hDecodePointCloud: lio_pcl yükünü ölçeklenmiş noktalara çözer
codec.hada göre mesaj, protobuf'tan JSON'a ve JSON'dan protobuf'a dönüşüm
catalog.h18 arayüzün ve 34 konunun tablosu
codes.h, result.hcihaz durum kodları, Result ve Errc

İstemci

Bağlanma

lixel::openapi::ClientOptions options;
options.transport.host = "192.168.55.1";
options.openapi_key = "<provided by XGRIDS>";

lixel::openapi::Client client(options);
lixel::openapi::Result r = client.Connect();   // blocks until connected

Başarısız bir Connect() çağrısı Errc::ConnectFailed veya Errc::ConnectTimeout döndürür; istemci daha sonra yeniden bir Connect() için kullanılabilir.

İstek-Yanıt

openapi::aiot_msgs::DeviceInfoRequest req;
openapi::aiot_msgs::DeviceInfoResponse rsp;
lixel::openapi::Result r = client.Request(
    "lixel/application/request/device_info", req,
    "lixel/application/response/device_info", &rsp);

Request dönüş kodları:

KodAnlamı
OkYanıt geldi ve Error.code bir başarı kodudur
DeviceErrorYanıt geldi ancak hata koduyla birlikte (bkz. Result::device_code, desc); response doldurulur
RequestTimeoutZaman aşımı süresi içinde aynı seq değerine sahip yanıt gelmedi. Cihaz isteği yine de yerine getirmiş olabilir; aksini varsaymadan önce cihazdan doğrulayın
NotConnectedBağlı değil veya beklerken bağlantı koptu
CalledFromCallbackRequest, bir abonelik geri çağrısından çağrıldı

Raporlara Abone Olma

client.SubscribeMessage(
    "lixel/application/report/device_status", "DeviceStatusReport",
    [](const std::string& topic, const google::protobuf::Message& msg) {
      // msg is already parsed into the matching protobuf message
    });

Not: Abonelik geri çağrıları MQTT katmanının iş parçacığında, her seferinde tek bir mesaj için çalışır; bunları kısa tutun. Bir geri çağrı Connect veya Disconnect çağırmamalıdır; Request çağrılırsa bloke olmak yerine Errc::CalledFromCallback döndürür. Geri çağrıya aktarılan dizeler yalnızca çağrı süresince geçerlidir; ihtiyacınız olanı kopyalayın.

Nokta Bulutu Kod Çözme

Gerçek zamanlı nokta bulutu (report/lio_pcl, MqttCompressMsg), sıkıştırmayı açıp seri durumdan çıkarmayı tek adımda yapan DecodePointCloud ile çözülür:

#include "lixel/openapi/pointcloud.h"

lixel::openapi::PointCloud cloud;
lixel::openapi::Result r = lixel::openapi::DecodePointCloud(payload, &cloud);
// On success, each point's x/y/z in cloud.points is reconstructed by header.scaler (the device sends scaler as 1000).

Sıkıştırma LZ4 bloğudur (frame değil). Zstd ile sıkıştırılmış bir nokta bulutu ve negatif bir scaler değeri Errc::Unsupported döndürür. Bir noktanın rgbi değeri değiştirilmeden aktarılır (proto yalnızca R+G+B+Intensity notunu içerir, ayrıca bir bayt sırası kuralı belirtmez).

Tarama Akışı

Taramayı başlatma ve durdurma cihazda eşzamansızdır: AC_START yanıtı yalnızca isteğin kabul edildiği anlamına gelir; ardından cihaz bekleme → başlatma → tarama durumlarına geçer. RunScan tüm akışı kapsar: cihaz durumuna abone olur, bekleme durumunu bekler, taramayı başlatır, gerçekten taramaya geçmesini bekler, bir süre izler, durdurur ve bekleme durumuna dönmesini bekler:

#include "lixel/openapi/scan.h"

lixel::openapi::ScanOptions options;
options.project_name = "demo";
options.watch = std::chrono::seconds(8);

lixel::openapi::ScanReport report = lixel::openapi::RunScan(client, options);
return report.exit_code();   // 0 success, others see ScanOutcome

RunScan çağıran iş parçacığını bloke eder, bağlı bir istemci gerektirir ve bir abonelik geri çağrısından çağrılmamalıdır. ScanOutcome sonucu: Completed (0), Timeout (1), NotStandby (2), StartRejected (3), NoResponse (4), Error (5), Interrupted (130).

18 Komut Satırı Örneği

cpp/examples/ dizini, python/example/usage/ içindeki her betik için aynı ad ve seçeneklerle bir C++ programı içerir. Bunlar kitaplıkla birlikte (varsayılan olarak açık) cpp/build/examples/ dizinine derlenir:

./cpp/build/examples/heartbeat --seconds 5                 # no key needed
./cpp/build/examples/device_info --key <provided by XGRIDS>
./cpp/build/examples/modeling --key <provided by XGRIDS> --project demo --watch 8
./cpp/build/examples/lio_pcl --key <provided by XGRIDS> --seconds 20   # while the device scans

Ortak seçenekler: --host (varsayılan 192.168.55.1), --port, --tls, --username, --password, --key, --timeout; TLS için ayrıca --ca-file ve --insecure. Çıkış kodları: 0 başarılı, 1 bağlanılamadı veya yanıt yok, 2 hatalı seçenek (modeling: cihaz bekleme durumunda değildi), 3 cihaz bir hata koduyla yanıt verdi, 130 kesildi.

18 örnek: control_point, data_unpack, device_config, device_control, device_info, device_status, get_ntrip_profile, get_rtk_advance, heartbeat, lio_pcl, lio_pose, measure_point, modeling, modeling_status, project_list, set_ntrip_profile, set_rtk_advance, system_error.

Not: Bunlar arasında device_control, device_config, set_ntrip_profile, set_rtk_advance, control_point ve measure_point cihazda değişiklik yapar; device_control ise cihazı kapatabilir veya diski biçimlendirebilir. Kullanmadan önce onaylayın.

Python İstemcisinden Farklar

C++ istemcisi birkaç noktada bilinçli olarak farklılık gösterir:

AspectC++Python
Yanıt EşleştirmeCihazın geri kopyaladığı header.seq değerine göreYanıt konusundaki ilk mesaj
JSON DönüşümüKatı: yanlış yazılmış bir alan veya sabit listesi adı hatadırSessizce yok sayılır
MQTTS SertifikasıSunucu sertifikasını varsayılan olarak doğrular; kendinden imzalı cihaz sertifikası için --ca-file gerekir, doğrulamayı kapatmak için ise --insecure kullanılırHiç doğrulamaz
Geri Çağrıda Request ÇağırmaErrc::CalledFromCallback döndürürBloke olur

Diğer sınırlamalar:

  • Tek bir işlemdeki birden fazla Client nesnesi tek bir MQTT çalışan iş parçacığını paylaşır; ikinci bir bağlantı açmak yaklaşık 2 saniye sürer. Her örnek tek bir Client kullanır ve bundan etkilenmez.
  • Bekleyen bir Request iptal edilemez; request_timeout süresi içinde sona erer.

Sonraki Adımlar

Bu bölüm XGRIDS'in resmî kullanım kılavuzundan Türkçeye çevrildi; ekran görüntüleri ve arayüz adları özgün haliyle İngilizcedir. İngilizce aslı (yeni sekmede açılır) · Güncelleme:

XGRIDS Türkiye

Kurulumda ve Sahada Yanınızdayız

Atlıhan Harita; cihaz kurulumu, firmware güncellemesi, yazılım kullanımı ve saha uygulamalarında eğitim ve teknik destek verir. Sorunuzu iletin, uzmanımız size dönsün.

+90 216 546 0804