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ış
| Header | Sağladıkları |
|---|---|
client.h | Client: Connect, Request, Publish, Subscribe, SubscribeMessage, RemoveSubscription |
scan.h | RunScan: Taramayı başlatır, cihazın gerçekten tarama yaptığını bekler, durdurur ve bekleme durumuna dönmesini bekler |
pointcloud.h | DecodePointCloud: lio_pcl yükünü ölçeklenmiş noktalara çözer |
codec.h | ada göre mesaj, protobuf'tan JSON'a ve JSON'dan protobuf'a dönüşüm |
catalog.h | 18 arayüzün ve 34 konunun tablosu |
codes.h, result.h | cihaz 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ı:
| Kod | Anlamı |
|---|---|
Ok | Yanıt geldi ve Error.code bir başarı kodudur |
DeviceError | Yanıt geldi ancak hata koduyla birlikte (bkz. Result::device_code, desc); response doldurulur |
RequestTimeout | Zaman 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 |
NotConnected | Bağlı değil veya beklerken bağlantı koptu |
CalledFromCallback | Request, 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ı
ConnectveyaDisconnectçağırmamalıdır;Requestçağrılırsa bloke olmak yerineErrc::CalledFromCallbackdö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_pointvemeasure_pointcihazda değişiklik yapar;device_controlise 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:
| Aspect | C++ | Python |
|---|---|---|
| Yanıt Eşleştirme | Cihazın geri kopyaladığı header.seq değerine göre | Yanıt konusundaki ilk mesaj |
| JSON Dönüşümü | Katı: yanlış yazılmış bir alan veya sabit listesi adı hatadır | Sessizce 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ır | Hiç doğrulamaz |
Geri Çağrıda Request Çağırma | Errc::CalledFromCallback döndürür | Bloke olur |
Diğer sınırlamalar:
- Tek bir işlemdeki birden fazla
Clientnesnesi 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 birClientkullanır ve bundan etkilenmez. - Bekleyen bir
Requestiptal edilemez;request_timeoutsüresi içinde sona erer.
Sonraki Adımlar
- Derleme, bağımlılıklar ve entegrasyon için Hızlı Başlangıç bölümüne bakın.
- Protokolün kendisi için ortak bölümlere bakın: Arayüz Kataloğu, Gerçek Zamanlı Veriler ve Hata Kodları.
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:

