Astute DDS
Realtidsdataanslutning för försvarssystem
Mellanprogramvaran som driver verksamhetskritiska fordonsplattformar
Fullt utrustad DDS med X-Types. Vapenklassad DDS för försvar.
Powering defence
Astute DDS är datadistributionsmellanprogramvaran i hjärtat av Astute Systems kompletta DEF-STAN 23-009 Generic Vehicle Architecture (GVA)-lösning. Från sensorer till skärmar kopplar en enhetlig plattform samman alla delsystem i ditt militärfordon.
Why Publish/Subscribe
Problemet med traditionella arkitekturer
Äldre fordonssystem använder punkt-till-punkt-anslutningar. När du lägger till ett nytt delsystem måste du modifiera alla system det kommunicerar med. Detta skapar:
- ❌ Dyr integration — Varje ny komponent kräver anpassad kodning
- ❌ Sköra system — Ett fel kan kaskadsprida sig genom nätverket
- ❌ Leverantörslåsning — Egenutvecklade protokoll låser dig med en enda leverantör
- ❌ Långsamma uppgraderingar — Att ändra ett delsystem innebär att allt måste testas om
Publicera/prenumerera-lösningen
Med DDS publicerings-/prenumerationsarkitektur publicerar delsystem helt enkelt data till namngivna ämnen. Alla system som behöver dessa data prenumererar på ämnet. Inga punkt-till-punkt-kopplingar. Ingen anpassad integrationskod.
| Affärsfördel | Hur Pub/Sub levererar |
|---|---|
| 💰 Lägre integrationskostnader | Lägg till nya delsystem utan att ändra befintliga |
| 🔧 Enklare underhåll | Byt ut eller uppgradera komponenter separat |
| 🛡️ Större motståndskraft | System fortsätter att fungera även när andra fallerar |
| 🏭 Frihet från flera leverantörer | Blanda utrustning från olika leverantörer på en databuss |
| ⏱️ Snabbare tid till marknaden | Standardgränssnitt innebär mindre anpassad utveckling |
En enda källa för hela GVA-stacken
Astute Systems är den enda leverantören som erbjuder en komplett, integrerad programvaruuppsättning för GVA-kompatibla militära fordon:
| Komponent | Vad den gör |
|---|---|
| Bohemisk | Visa och validera SysML-modeller, generera gränssnittsdefinitioner |
| LDMX | Klassledande redigerare och validator för markdatamodeller för LDM v10.0.0 |
| VerktygX | Automatiserad kodgenerering, byggintegration och distributionsverktyg |
| Astute DDS | Koppla samman alla delsystem med säker datadistribution i realtid |
| Markdatamodell v10.0.0 | Förbyggda GVA-kompatibla datatyper för alla fordonsdomäner |
| Astute HMI | Programvara för besättningsdisplay som uppfyller DEF-STAN 23-009-kraven |
Fördelar med fullstacken
| Förmån | Inverkan |
|---|---|
| 🎯 Enskild ansvarspunkt | Ett kontrakt, ett supportteam, en integrationspartner |
| 📋 Bevisad efterlevnad | Förvaliderad mot DEF-STAN 23-009-kraven |
| 🔄 Sömlösa uppdateringar | Uppgradera valfri komponent utan att förstöra de andra |
| 💰 Förutsägbara kostnader | Inga överraskande integrationsavgifter eller licensproblem |
| ⏱️ Snabbare leverans | Börja med fungerande programvara, inte tomma ramverk |
Comparison
Överväganden vid upphandling
| Faktor | Astute DDS | RTI Connext | CyklonDDS | OpenDDS | Snabb DDS |
|---|---|---|---|---|---|
| Licensmodell | Flexibla alternativ | Reklam per säte | Eclipse EPL 2.0 | LGPL | Apache 2.0 |
| Licenskostnad | Konkurrenskraftig | $$$ per driftsättning | Gratis | Gratis | Gratis |
| Stödmodell | Australiskt leverantörskontrakt | Globalt företagande | Eclipse Foundation | OCI-reklam | eProsima-reklam |
| Australienbaserat stöd | ✅ Ja | ❌ USA-baserad | ❌ Nej | ❌ USA-baserad | ❌ Baserat i Spanien |
| BVT-förintegration | ✅ Inbyggd | ❌ Anpassat arbete | ❌ Gör-det-själv | ❌ Gör-det-själv | ❌ Gör-det-själv |
| Full Stack tillgänglig | ✅ Enskild källa: HMI + LDM + DDS + Verktyg | ❌ Endast mellanprogramvara | ❌ Endast mellanprogramvara | ❌ Endast mellanprogramvara | ❌ Endast mellanprogramvara |
| SysML-verktyg | ✅ Bohemian + LDMX + ToolX | ❌ Ingen | ❌ Ingen | ❌ Ingen | ❌ Ingen |
| Exportkontroll | australisk jurisdiktion | Överväganden om amerikanska ITAR | EU | USA | EU |
Jämförelse av tekniska funktioner
| Särdrag | Astute DDS | RTI Connext | CyklonDDS | OpenDDS | Snabb DDS |
|---|---|---|---|---|---|
| DDSI-RTPS 2.5 | ✅ Komplett | ✅ Komplett | ✅ Komplett | ✅ Komplett | ✅ Komplett |
| DDS-säkerhet 1.1 | ✅ Komplett | ✅ Komplett | ⚠️ Delvis | ✅ Komplett | ✅ Komplett |
| X-Types 1.3 | ✅ Komplett | ✅ Komplett | ⚠️ Delvis | ⚠️ Delvis | ⚠️ Delvis |
| Dynamisk data-API | ✅ Komplett | ✅ Komplett | ❌ Ingen | ⚠️ Grundläggande | ⚠️ Grundläggande |
| Typsökningstjänst | ✅ Komplett | ✅ Komplett | ❌ Ingen | ❌ Ingen | ⚠️ Delvis |
| Innehållsfiltrering | ✅ Komplett | ✅ Komplett | ✅ Komplett | ✅ Komplett | ✅ Komplett |
| Delad minnestransport | ✅ Komplett | ✅ Komplett | ✅ Komplett | ❌ Ingen | ✅ Komplett |
| TCP-transport | ✅ Komplett | ✅ Komplett | ✅ Komplett | ✅ Komplett | ✅ Komplett |
| Nollkopiering | ✅ Stöds | ✅ Stöds | ✅ Stöds | ❌ Ingen | ✅ Stöds |
Standardöverensstämmelse
| Standard | Astute DDS | RTI Connext | CyklonDDS | OpenDDS | Snabb DDS |
|---|---|---|---|---|---|
| Herregud DDS 1.4 | ✅ | ✅ | ✅ | ✅ | ✅ |
| OMG DDSI-RTPS 2.5 | ✅ | ✅ | ✅ | ✅ | ✅ |
| OMG DDS-XTypes 1.3 | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ |
| OMG DDS-säkerhet 1.1 | ✅ | ✅ | ⚠️ | ✅ | ✅ |
| OMG IDL 4.2 | ✅ | ✅ | ✅ | ✅ | ✅ |
| DEF-STAN 23-009 (GVA) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Markdatamodell v10.0.0 | ✅ | ❌ | ❌ | ❌ | ❌ |
Språk- och plattformsstöd
| Förmåga | Astute DDS | RTI Connext | CyklonDDS | OpenDDS | Snabb DDS |
|---|---|---|---|---|---|
| C++ | C++20 | C++11 | C99-omslag | C++11 | C++11 |
| C | Via C++ | ✅ Infödd | ✅ Infödd | ❌ | ✅ Infödd |
| Pytonorm | ✅ | ✅ | ✅ | ✅ | ✅ |
| Rost | ✅ | ❌ | ✅ | ❌ | ❌ |
| Linux | ✅ | ✅ | ✅ | ✅ | ✅ |
| Fönster | ✅ | ✅ | ✅ | ✅ | ✅ |
| VxWorks | Färdplan | ✅ | ⚠️ | ✅ | ⚠️ |
| Inbyggd/RTOS | ✅ Utformad för | ✅ Mikrovariant | ⚠️ | ⚠️ | ⚠️ |
| Statisk länkning | ✅ Enskilt bibliotek | ⚠️ | ⚠️ Delade bibliotek | ⚠️ Delade bibliotek | ⚠️ Delade bibliotek |
Varför Astute DDS vinner
| mot RTI Connext | mot CycloneDDS | jämfört med OpenDDS | jämfört med snabb DDS |
|---|---|---|---|
| Flexibla licensalternativ | Fullständigt stöd för X-Types | Komplett dynamisk data-API | Australienbaserat stöd |
| Australisk leverantör, inga ITAR-problem | Inbyggd säkerhet | Typsökningstjänst | Fullständig GVA-efterlevnad |
| En enda källas fullständiga GVA-stack | Bäst i sin klass LDMX + ToolX | Bäst i sin klass LDMX + ToolX | Enklare implementering |
| LDM v10.0.0 ingår | Kommersiellt stöd | australisk jurisdiktion | Kompletta X-typer |
Why Astute DDS
"Vi minskade vår GVA-integrationstidslinje med 40 % med hjälp av Astute-stacken. Att ha en leverantör som ansvarar för middleware, HMI och datamodell eliminerade den pekande kritik som plågade tidigare program."
— Programchef, Storbritanniens försvarsminister
Interoperabilitet garanterad
Astute DDS är helt kompatibelt med alla större DDS-implementeringar. Ditt fordon kan kommunicera sömlöst med:
Ingen leverantörslåsning. Om ett partnersystem använder en annan DDS-implementering kommer Astute DDS att ansluta utan modifiering.
Efterlevnad av försvarsstandarder
Byggd för militära behov
| Standard | Status |
|---|---|
| DEF-STAN 23-009 | ✅ Fullständig GVA-efterlevnad |
| Markdatamodell v10.0.0 | ✅ Kompletta domäntyper |
| NATO STANAG | ✅ Klar för interoperabilitet |
| Cyber-essentials | ✅ Säkerhetscertifierad |
Säkerhet du kan lita på
- 🔐 Krypterad kommunikation — All data skyddas under överföring
- 🎫 Certifikatbaserad autentisering — Endast auktoriserade system ansluter
- 📋 Åtkomstkontrollpolicyer — Definiera vem som kan publicera eller prenumerera på varje ämne
- 📝 Fullständig revisionsloggning — Komplett spårning för säkerhetsgranskningar
Beprövat i produktion
Distribueras över flera program
Astute DDS är betrott av försvarsministerier i Australien, Storbritannien och allierade nationer:
| Domän | Applikationer |
|---|---|
| 🎖️ Pansarfordon | Besättningsdisplayer, sensorfusion, vapenintegration |
| 🤖 Robotik och autonoma system | Obemannade markfordon, robotplattformar, autonom navigering |
| 🛡️ Mot-UAS (CUAS) | System för drönardetektering, spårning och förstörelse |
| ✈️ Markkontrollstationer | UAV-kommando och kontroll, sensormatningar |
| 🚢 Marinsystem | Bryggdisplayer, skadekontroll, navigering |
| 🏭 Träning och simulering | Syntetiska miljöer, eftergranskning, debriefing |
🎬 Begär demo
Se Astute DDS och den kompletta GVA-stacken i aktion. Läs mer om vår stack eller begär en demonstration nu.
Frequently Asked Questions
De vanligaste frågorna utvecklare ställer sig oftast när de använder Astute DDS.
1. Vad är Astute DDS?
Astute DDS är en C++20-implementering av OMG Data Distribution Service
(DDS) DCPS API, DDSI-RTPS 2.5-trådsprotokoll, DDS-XTypes 1.3-typsystem,
DDS-Security 1.1/1.2-plugins och IDL 4.2. Den levereras som statisk
biblioteket libastutedds.a (plus C-, Python- och Rust-bindningar) och levereras med
det grafiska användargränssnittet för astutedds-inspect och en interoperabel Shapes-demo.
2. Hur publicerar och prenumererar jag på ett ämne?
Skapa en DomainParticipant , ett Topic och sedan en DataWriter (utgivarens sida)
eller DataReader (prenumerantsidan):
using namespace astutedds::dcps;
auto dpf = DomainParticipantFactory::get_instance();
auto dp = dpf->create_participant(0, PARTICIPANT_QOS_DEFAULT, nullptr, 0);
auto topic = dp->create_topic("Hello", "HelloMsg", TOPIC_QOS_DEFAULT, nullptr, 0);
// Publisher
auto pub = dp->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr, 0);
auto writer = pub->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, nullptr, 0);
writer->write(sample, HANDLE_NIL);
// Subscriber
auto sub = dp->create_subscriber(SUBSCRIBER_QOS_DEFAULT, nullptr, 0);
auto reader = sub->create_datareader(topic, DATAREADER_QOS_DEFAULT, nullptr, 0);Se Komma igång › Första applikationen .
3. Vad är skillnaden mellan read() och take() ?
-
read()returnerar exempel men **lämnar dem i läsarens cache**, så att senare anrop (eller andra läsare i samma prenumerant) kan läsa dem igen. -
take()returnerar exempel och **tar bort dem** från cachen.
Använd read() när ämnet representerar det delade tillståndet som du vill inspektera.
upprepade gånger; använd take() när ämnet representerar händelser du vill
konsumera exakt en gång.
4. Varför får inte prenumeranter som ansluter sig sent tidigare prover?
Som standard är DURABILITY VOLATILE , så prover skrivna före en prenumerant
matchas levereras inte. För att leverera historiska prover till sena anslutna,
konfigurera skrivaren och matchande läsare med TRANSIENT_LOCAL
hållbarhet (vilket också kräver RELIABLE tillförlitlighet):
DataWriterQos qos;
writer->get_qos(qos);
qos.durability().kind = TRANSIENT_LOCAL_DURABILITY_QOS;
qos.reliability().kind = RELIABLE_RELIABILITY_QOS;
writer->set_qos(qos); För beständighet över omstarter av skrivare, använd
Persistenstjänst eller TRANSIENT / PERSISTENT
hållbara typer.
5. Vad gör RELIABILITY QoS?
-
BEST_EFFORT(standard för många inbyggda teman): prover som går förlorade på kabeln sänds inte om. Lägsta overhead. -
RELIABLE: skribenten spårar bekräftelser (ACKNACK/ heartbeat) från varje matchad läsare och sänder om missade sekvensnummer tills
läsaren kommer ikapp eller så är historiken full.
Tillförlitligheten beror på varje författare/per läsare och måste vara kompatibel: en BEST_EFFORT
Läsaren kan matcha en RELIABLE skribent, men inte tvärtom.
6. Vad gör DURABILITY QoS?
DURABILITY styr om prover behålls för leverans till läsaresom går med efter att exemplet skrevs:
| Slag | Tillgänglig för sena anslutningar? |
|---|---|
VOLATILE | Inga |
TRANSIENT_LOCAL | Ja, medan författaren lever |
TRANSIENT | Ja, under hela skribentens livstid (via Persistence Service) |
PERSISTENT | Ja, omstart mellan processer (på disk) |
7. Vad är skillnaden mellan HISTORY och DURABILITY ?
HISTORY ( KEEP_LAST(depth) eller KEEP_ALL ) styr hur många samplingar skrivar-/läsarcachen lagras när som helst. DURABILITY styr om
författaren erbjuder exempel till läsarna som matchar senare. De arbetar tillsammans men
lösa olika problem: KEEP_ALL ensamt gör inte prover tillgängliga
till sena anslutningar.
8. Hur anger jag ett domän-ID?
Skicka domän-ID:t som första argument till create_participant :
auto dp = DomainParticipantFactory::get_instance()
->create_participant(42, PARTICIPANT_QOS_DEFAULT, nullptr, 0); Deltagare på olika domäner kommunicerar inte. DDSI-RTPS-porten
formel 7400 + 250 * domain_id bestämmer de bas-UDP-portar som används för
upptäckt.
9. Varför upptäcker inte min utgivare och prenumerant varandra?
Vanliga orsaker:
- Olika domän-ID: n — båda deltagarna måste använda samma ID.
- Multicast blockerad — SPDP använder UDP-multicast på
239.255.0.1av
standard. Kontrollera värdens brandvägg och byt till IGMP-snooping. - Fel nätverksgränssnitt — på multi-homed-värdar är
ASTUTEDDS_NETWORK_INTERFACE=inställtASTUTEDDS_NETWORK_INTERFACE=eller konfigurera den i JSON/XML-profilen för identifiering (se JSON-identifieringskonfiguration ). - Inkompatibel QoS — se fråga 15.
- Olika transporter — verifiera att båda peer-enheterna använder UDPv4 (eller båda UDPv6,
TCP, SHM).
Aktivera spårningsloggning med ASTUTEDDS_LOG_LEVEL=trace och inspektera ett paket
fånga med astutedds-inspect .
10. Vilka IDL-funktioner stöds?
Den medföljande astutedds-idl kompilatorn implementerar OMG IDL 4.2 inklusive:
- Primitiva typer (
boolean,octet, heltalstyperint8–uint64,float/double/long double,char/wchar,string/wstring). - Strukturer, unioner, uppräkningar, bitmasker, typdefinitioner.
- Begränsade och obegränsade sekvenser, matriser, avbildningar.
-
@key,@id,@optional,@default,@range,@min,@max,@unit,@extensibility(FINAL|APPENDABLE|MUTABLE),@nested. - Konstanter och
module.
Genererad C++ använder XCDR2 som standard med valfritt XCDR1 för interop.
11. Hur filtrerar jag exempel jag själv publicerat?
Två alternativ:
- Ignorera på deltagarnivå : anropa
dp->ignore_publication(handle)
skickar den lokala skribentensInstanceHandle_t. - Filtrera in läsarens återanrop med
SampleInfo::publication_handle
och jämför det med din skribentsget_instance_handle().
Ett innehållsfiltrerat ämne kan också exkludera ett självpublicerat nyckelfält.
12. Vilka tecken är tillåtna i ämnesnamn?
Ämnesnamn kan innehålla alfanumeriska ASCII-tecken, _ och / som en
hierarkiavgränsare. Längden begränsas av 256 tecken. Undvik inledande tecken
siffror och reserverade inbyggda DDS-prefix ( DCPS , dds ). Typnamn följer
samma regel.
13. Hur känner jag av när en skribent eller läsare på distans försvinner?
Installera en DataReaderListener och implementera on_subscription_matched /
on_liveliness_changed , eller reader->get_subscription_matched_status() . Den current_count_changefältet är negativt när en peer avmatchar.
Livligheten styrs av LIVELINESS — set
kind = AUTOMATIC_LIVELINESS_QOS med en lease_duration för att detekteratysta kamrater inom en begränsad tid.
14. Hur får jag ett återuppringningssamtal när ny data anländer?
Koppla en lyssnare med masken DATA_AVAILABLE_STATUS :
class MyListener : public DataReaderListener {
void on_data_available(DataReader* reader) override {
// call reader->take(...) here
}
};
reader->set_listener(&listener, DATA_AVAILABLE_STATUS); on_data_available utlöses för både nya exempel och instanslivscykel ändringar; kontrollera alltid SampleInfo::valid_data innan du avreferenserar
exempelnyttolast.
15. Vad betyder "Inkompatibel QoS"?
En skribent och läsare matchar endast när varje begäran/erbjuden QoS är
kompatibel:
| Politik | Begärt ≤ Erbjudet |
|---|---|
RELIABILITY | läsare BEST_EFFORT ≤ skribent RELIABLE |
DURABILITY | läsartyp ≤ skribenttyp (i specifik beställning) |
DEADLINE | period ≥ period |
LATENCY_BUDGET | duration ≥ duration |
OWNERSHIP | måste vara lika ( SHARED eller EXCLUSIVE ) |
PARTITION | minst ett partitionsnamn måste överlappa |
Lyssna efter on_offered_incompatible_qos / on_requested_incompatible_qos
för att hitta det exakta policy-ID:t vid körning.
16. Hur skickar jag exempel som är större än ett UDP-datagram?
Astute DDS fragmenterar automatiskt prover som är större än det konfigurerade
fragment_size (standard 1344 byte för IPv4) och sätter ihop dem igen på läsare som använder DDSI-RTPS DATA_FRAG undermeddelanden. Tillförlitlighetsprotokollet
återställer saknade fragment utan att skicka om hela provet.
För mycket stora samplingar (≥ 1 MB) öka OS-socketbuffertarna:
sudo sysctl -w net.core.rmem_max=8388608
sudo sysctl -w net.core.wmem_max=8388608och överväg att byta till delad minnestransport för lokala läsare.
17. Hur konfigurerar jag vilket nätverksgränssnitt som används?
Tre alternativ, i prioritetsordning:
- Miljövariabel:
ASTUTEDDS_NETWORK_INTERFACE=eth0. - JSON-identifieringskonfiguration — se JSON-identifieringskonfiguration .
- XML QoS-profil – se DDS-XML QoS-profiler .
Om inget är inställt väljer Astute DDS det första icke-loopback-gränssnittet med en
multicast-kompatibel adress.
18. Kan jag använda Astute DDS i ett nätverk utan multicast?
Ja. Två alternativ:
- Unicast SPDP-peerlista : tillhandahåller en lista över peer-värd-/portpar i
identifieringskonfiguration; Astute DDS unicastar SPDP-meddelanden till varje peer. - TCP-transport : växla deltagaren till TCP RTPS-transport för
miljöer som blockerar UDP helt. Se
DDS-domänrouter för att korsa isolerade nätverk.
19. Hur justerar jag för låg latens?
- Använd
RELIABLEtillförlitlighet medKEEP_LAST(1)-historik i båda ändar så att
återsändningarna är minimala. - Aktivera transport av delat minne för deltagare som är placerade på samma plats.
- Fäst Astute DDS-trådar med CPU-affinitet och använd realtidsschemaläggning
(SCHED_FIFO) på utgivarens och prenumeranternas processer. - Inaktivera Nagle med hjälp av UDP (standard).
- Öka socketbuffertarna (se fråga 16) för att absorbera bursts.
- Sätt
LATENCY_BUDGET = 0för att inaktivera eventuella batchfördröjningar.
20. Varför ser jag latenstoppar när jag publicerar stora samplingar?
När samplingar överskrider operativsystemets standardbuffert för sockets (ofta 208 KB på Linux),
kärnan släpper paket och det tillförlitliga protokollet måste sända om, vilket orsakar
spikar. Höjer net.core.rmem_max / net.core.wmem_max till åtminstone
urvalsstorlek löser detta. Överväg fragmentering med mindre fragment_size
på förlustbringande nätverk.
21. Hur överbryggar jag två DDS-domäner?
Använd Astute DDS Domain Router – en tjänst som kopplar samman två eller fler
domäner och vidarebefordrar konfigurerade ämnen mellan dem, med valfritt
nyckel-/innehållsfiltrering och QoS-översättning. Se
DDS-domänrouter .
22. Vilka språkbindningar finns tillgängliga?
| Språk | Status | Anteckningar |
|---|---|---|
| C++20 | Stabil | Primärt API — libastutedds.a |
| C | Stabil | Flat C API för FFI, se include/astutedds/c/astutedds.h |
| Pytonorm | Stabil | pybind11-bindningar, CPython 3.10 – 3.13 |
| Rost | Beta | astutedds crate (säkert omslag över C API) |
23. Vilka plattformar och operativsystemversioner stöds?
| Plattform | Testade versioner |
|---|---|
| Linux | Ubuntu 22.04/24.04, RHEL 9/10, AlmaLinux 9/10, Debian 12 |
| Fönster | Windows 10, Windows 11, Windows Server 2022 |
Linux Python-hjulen är taggade manylinux_2_28 (glibc ≥ 2.28) och körs
på vilken kompatibel distribution som helst.
24. Hur aktiverar jag DDS-säkerhet?
- Tillhandahåll identitets- (X.509) och behörighetsartefakter (signerad XML).
- Konfigurera deltagaregenskapens QoS med Autentisering, Åtkomstkontroll och
Egenskaper för krypto-plugin (CA-certifikat, identitetscertifikat/nyckel, behörighetsfil,
styrningsfil). - Länk mot Astute DDS byggd med
-DASTUTEDDS_ENABLE_SECURITY=ON.
Se DDS-säkerhet för fullständiga instruktioner och en
mall för styrning/behörigheter.
25. Hur sparar jag data efter omstarter?
Kör Persistence-tjänsten tillsammans med din domän. Den prenumererar på
konfigurerade TRANSIENT / PERSISTENT -ämnen, lagrar exempel i en lokal
databas (SQLite som standard) och publicerar dem igen till late-joining
prenumeranter – inklusive de som går med efter att den ursprungliga skribenten är borta.
Se Persistenstjänst .
26. Hur spelar jag in och spelar upp trafik?
Använd det medföljande verktyget astutedds-record för att registrera en domän i en
.astdb filen och astutedds-replay för att publicera den tillbaka med justerbar tidsskalning. Inspelningen är typmedveten och använder XCDR2 internt. Se
Inspelning och återuppspelning .
27. Hur utvecklar jag en datatyp utan att prenumeranter bryts?
Annotera IDL-typen med @extensibility(MUTABLE) (eller APPENDABLE ) och
Tagga varje medlem med @id(N) . XCDR2-muterbara strömmar tillåter:
- Lägger till nya medlemmar i båda ändar.
- Tar bort valfria medlemmar.
- Omordning av medlemmar.
Felmatchande medlemmar hoppas över via X-Types tilldelningsregler.
@extensibility(FINAL) låser layouten och måste användas vid binärkompatibilitet med äldre XCDR1-läsare är viktigt.
28. Hur använder jag innehållsfiltrerade ämnen?
Skapa ett ContentFilteredTopic från ett vanligt ämne med ett SQL-liknande filter
uttryck och binda en DataReader till det:
std::vector params{"42"};
auto cft = dp->create_contentfilteredtopic(
"HighSeverity", topic, "severity > %0", params);
auto reader = sub->create_datareader(cft, DATAREADER_QOS_DEFAULT, nullptr, 0); Filtret utvärderas på skrivsidan när det är möjligt för att spara bandbredd.
29. Hur konfigurerar jag QoS från en XML-fil?
Använd XmlQosLoader för att läsa en DDS-XML-profil och tillämpa den när du skapar
enheter:
XmlQosLoader loader;
loader.load_file("qos_profiles.xml");
auto qos = loader.get_datawriter_qos("MyLib", "ReliableProfile");
auto writer = pub->create_datawriter(topic, qos, nullptr, 0); Se DDS-XML QoS-profiler för schemat och den fungerande
exempel.
30. Hur felsöker jag interoperabilitets- eller identifieringsproblem?
- Kör
astutedds-inspectmot domänen för att se vad som upptäckts
deltagare, slutpunkter och matchad status i realtid. - Samla in trafik med
tcpdump -i any -w dds.pcap 'udp port 7400 or portrange 7400-7500'och öppna den i Wireshark — RTPS-dissektorn
avkodar SPDP, SEDP och användardata. - Aktivera spårningsloggar:
ASTUTEDDS_LOG_LEVEL=trace ASTUTEDDS_LOG_FILE=/tmp/astutedds.log. - Verifiera enhets-ID:n och portar:
- SPDP-skribent/läsare:
00:01:00:c2/00:01:00:c7 - SEDP-publikation:
00:00:03:c2/00:00:03:c7 - SEDP-prenumeration:
00:00:04:c2/00:00:04:c7 - Basport:
7400 + 250 × domain_id.
- SPDP-skribent/läsare:
- Bekräfta att båda peer-kontona annonserar kompatibla leverantörs-ID:n och protokollversionen
(DDSI-RTPS 2.5).