AWS IoT biedt veilige, bidirectionele communicatie tussen met internet verbonden apparaten zoals sensoren, actuatoren, ingebedde microcontrollers of slimme apparaten en de AWS Cloud. Hiermee kunt u telemetriegegevens van meerdere apparaten verzamelen, opslaan en analyseren. U kunt ook toepassingen maken waarmee uw gebruikers deze apparaten via hun telefoon of tablet kunnen besturen.
Biedt een beveiligd mechanisme voor apparaten en AWS IoT-toepassingen om berichten met elkaar te publiceren en te ontvangen. U kunt het MQTT-protocol direct gebruiken of MQTT over WebSocket om te publiceren en te abonneren.
De AWS IoT-berichtbroker is een publish/subscribe-brokerservice die het verzenden en ontvangen van berichten naar en van AWS IoT mogelijk maakt. Bij communicatie met AWS IoT verzendt een client een bericht geadresseerd aan een onderwerp zoals Sensor/temp/room1.
De berichtenbroker stuurt op zijn beurt het bericht naar alle clients die zich hebben geregistreerd om berichten voor dat onderwerp te ontvangen. Het verzenden van het bericht wordt publiceren genoemd. Het registreren om berichten voor een onderwerpfilter te ontvangen, wordt abonneren genoemd.
De topic-naamruimte is geïsoleerd per AWS-account en regio-combinatie. Zo is het topic Sensor/temp/room1 voor een AWS-account onafhankelijk van het topic Sensor/temp/room1 voor een ander AWS-account. Dit geldt ook voor regio's. Het topic Sensor/temp/room1 in hetzelfde AWS-account in us-east-1 is onafhankelijk van hetzelfde topic in us-east-2. AWS IoT ondersteunt het verzenden en ontvangen van berichten niet over AWS-accounts en regio's heen.
De berichtenbroker onderhoudt een lijst van alle clientsessies en de abonnementen per sessie. Wanneer een bericht wordt gepubliceerd op een onderwerp, controleert de broker welke sessies abonnementen hebben die overeenkomen met dat onderwerp. De broker stuurt het gepubliceerde bericht vervolgens door naar alle sessies met een momenteel verbonden client.
TsgcIoTAmazon_MQTT_Client is de component die wordt gebruikt om verbinding te maken met AWS IoT. Eén client kan verbinding maken met slechts één apparaat. De client maakt verbinding via het gewone MQTT-protocol en authenticeert met een X.509-clientcertificaat.
Om verbinding te maken met AWS IoT heeft de client de volgende eigenschappen nodig:
Amazon.ClientId: identificatie van de client, optioneel.
Amazon.Endpoint: servernaam waarmee de MQTT-client verbinding maakt.
Amazon.Port: gebruikt standaard poort 8883. Als poort 443 is, wordt ALPN automatisch gebruikt om verbinding te maken (vereist aangepaste Indy-versie).
AWS IoT Core ondersteunt apparaten en clients die het MQTT- en het MQTT via WebSocket Secure (WSS)-protocol gebruiken om berichten te publiceren en te abonneren. De volgende tabel toont de protocollen die de AWS IoT-apparaateindpunten ondersteunen en de authenticatiemethoden en poorten die ze gebruiken.
| Protocol | Verificatie | Port | ALPN-protocolnaam |
| MQTT via WebSocket | Handtekeningversie 4 | 443 | |
| MQTT via WebSocket | Aangepaste authenticatie | 443 | |
| MQTT | X.509 clientcertificaat | 443 | x-amzn-mqtt-ca |
| MQTT | X.509 clientcertificaat | 8883 | |
| MQTT | Aangepaste authenticatie | 443 | mqtt |
U moet certificaten aanmaken in uw Amazon AWS-console en het pad instellen waar ze zijn opgeslagen.
Bij gebruik van OpenSSL als IOHandler moet u het certificaat instellen in de volgende paden
Certificate.Enabled: stel in op True als u certificaten wilt gebruiken.
Certificate.CertFile: pad naar het X.509-clientcertificaat.
Certificate.KeyFile: path to X.509 client key file.
Bij gebruik van SChannel als IOHandler moet u eerst het PEM-certificaat + de sleutel converteren naar een PFX-certificaat. Dit vereist OpenSSL-binaire bestanden:
openssl pkcs12 -inkey 884ccf73ff-private.pem.key -in 884ccf73ff-certificate.pem.crt -export -out 884ccf73ff-certificate.pfx
Stel vervolgens de volgende paden in (er is geen noodzaak om het key-bestand in te stellen omdat het al in het certificaat is opgenomen).
Certificate.Enabled: stel in op True als u certificaten wilt gebruiken.
Certificate.CertFile: pad naar PFX-certificaat
U moet een gebruiker aanmaken in uw Amazon AWS-console en de Access- en Secret-sleutels opslaan, die worden gebruikt om het WebSocket-verzoek te ondertekenen.
SignatureV4.Enabled: stel in op True als u dit type verificatie wilt gebruiken.
SignatureV4.Region: de regio waar uw apparaat zich bevindt (voorbeeld: us-east-1).
SignatureV4.AccessKey: de toegangssleutel aangemaakt in uw Amazon-console of verkregen als tijdelijke referentie.
SignatureV4.SecretKey: de geheime sleutel die is aangemaakt in uw Amazon-console of verkregen als tijdelijke referentie
SignatureV4.SessionToken: (voorwaardelijk) als u tijdelijke beveiligingsreferenties gebruikt, stel hier het beveiligingstoken in.
OpenSSL_Options: configuration of the openSSL libraries.
APIVersion: maakt het mogelijk te definiëren welke OpenSSL API wordt gebruikt.
oslAPI_1_0: gebruikt API 1.0 OpenSSL, de meest recente versie die door Indy wordt ondersteund
oslAPI_1_1: maakt gebruik van OpenSSL API 1.1; vereist onze aangepaste Indy-bibliotheek en biedt de mogelijkheid OpenSSL 1.1.1-bibliotheken te gebruiken (met TLS 1.3-ondersteuning).
oslAPI_3_0: gebruikt API 3.0 OpenSSL, vereist onze aangepaste Indy-bibliotheek en staat het gebruik van OpenSSL 3.0.0-bibliotheken toe (met TLS 1.3-ondersteuning).
LibPath: hier kunt u configureren waar de openSSL-bibliotheken zich bevinden
oslpNone: dit is de standaard; de openSSL-bibliotheken moeten zich in dezelfde map bevinden als het binaire bestand of in een bekend pad.
oslpDefaultFolder: stelt automatisch het openSSL-pad in waar de bibliotheken zich moeten bevinden voor alle IDE-platformpersoonlijkheden.
oslpCustomFolder: als deze optie is geselecteerd, definieer dan het volledige pad in de eigenschap LibPathCustom.
LibPathCustom: wanneer LibPath = oslpCustomFolder, definieer hier het volledige pad waar de openSSL-bibliotheken zich bevinden.
UnixSymLinks: het laden van symbolische koppelingen onder Unix-systemen in- of uitschakelen (standaard ingeschakeld, behalve onder OSX64):
oslsSymLinksDefault: standaard ingeschakeld, behalve onder OSX64 (na MacOS Monterey mislukt het laden van de bibliotheek zonder versie.).
oslsSymLinksLoadFirst: Laad SymLinks en doe dit voor het laden van de versiebibliotheken.
oslsSymLinksLoad: Laad SymLinks nadat geprobeerd is de versie-bibliotheken te laden.
oslsSymLinksDontLoad: laadt de SymLinks niet.
*SignatureV4 vereist Indy 10.5.7+
Aangepaste authenticatie stelt u in staat te definiëren hoe clients worden geauthenticeerd en geautoriseerd met behulp van autorisatiebronnen. Het apparaat geeft referenties door in de headervelden of queryparameters van het verzoek (voor MQTT over WebSockets-protocollen) of in het veld voor gebruikersnaam en wachtwoord van het MQTT CONNECT-bericht (voor de MQTT- en MQTT over WebSockets-protocollen).
CustomAuthentication.Enabled: stel in op True als u dit type authenticatie wilt gebruiken.
CustomAuthentication.Parameters: stel hier de queryparameters in die worden doorgegeven aan de server (standaard is /mqtt)
CustomAuthentication.Headers: hier kunt u de aangepaste headervelden opgeven.
CustomAuthentication.WebSockets: indien ingesteld op true werkt de verbinding via het WebSocket-protocol, anders via gewone TCP.
MQTTAuthentication.Enabled: als u de gebruikersnaam/het wachtwoord in de MQTT-verbinding wilt doorgeven, schakel deze eigenschap dan in
MQTTAuthentication.Username: username of the mqtt verbinding
MQTTAuthentication.Password: geheim van de MQTT-verbinding.
Een client kan optioneel een ClientId sturen om de clientverbinding te identificeren; andere clients kunnen zich dan abonneren om een melding te ontvangen telkens wanneer deze client verbinding heeft gemaakt, zich heeft geabonneerd, de verbinding heeft verbroken...
Als u geen verbinding kunt maken via poort 8883 en TCP als transport gebruikt (de standaard), gebruikt Amazon "AWS IoT Core policy" om autorisatie aan clients en abonnementen toe te kennen of te weigeren. Waarschijnlijk moet u uw client-id autoriseren.
Log in op uw Amazon AWS-console, ga naar IoT Core en open het menu "Secure/Policies"; selecteer daar het beleid dat aan uw IoT Thing is gekoppeld en controleer aan het einde hoe de verbinding is geconfigureerd. Voorbeeld:
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:222178873557:client/sdk-java",
"arn:aws:iot:us-east-1:222178873557:client/basicPubSub",
"arn:aws:iot:us-east-1:222178873557:client/sdk-nodejs-*"
]
}
Deze configuratie betekent dat alleen clients met ID: sdk-java, basicPubSub en sdk-nodejs-* verbinding mogen maken. Pas dit dienovereenkomstig aan en probeer opnieuw.
Als het nog steeds niet werkt, schakel dan het logboek in en controleer in CloudWatch waarom u geen verbinding kunt maken.
MQTTHeartBeat: indien ingeschakeld, probeert de MQTT-verbinding actief te houden door elke x seconden een ping te sturen.
Interval: aantal seconden tussen elke ping.
MQTTAuthentication: als ingeschakeld, wordt de gebruikersnaam en het wachtwoord opgenomen in de MQTT-verbinding
UserName: naam van de gebruiker
Wachtwoord: geheime tekenreeks
WatchDog: indien ingeschakeld, probeert het bij een onverwachte verbreking automatisch opnieuw verbinding te maken met de server.
Interval: seconden voor herverbindingspogingen.
Attempts: maximum aantal herverbindingspogingen; nul betekent onbeperkt.
LogFile: als ingeschakeld, slaat socketberichten op in een logbestand (nuttig voor foutopsporing). De toegang tot het logbestand is niet thread-safe als het wordt benaderd vanuit meerdere threads.
Enabled: als ingeschakeld, wordt elk bericht dat via de socket wordt ontvangen en verzonden, opgeslagen in een bestand.
FileName: volledig pad naar de bestandsnaam.
De Amazon MQTT-implementatie is gebaseerd op MQTT versie 3.1.1, maar wijkt als volgt af van de specificatie:
In AWS IoT betekent abonneren op een onderwerp met Quality of Service (QoS) 0 dat een bericht nul of meer keren wordt afgeleverd. Een bericht kan meer dan één keer worden afgeleverd. Berichten die meer dan één keer worden afgeleverd, kunnen worden verzonden met een ander pakket-ID. In deze gevallen wordt de DUP-vlag niet ingesteld.
AWS IoT ondersteunt niet publiceren en abonneren met QoS 2. De AWS IoT-berichtenbroker stuurt geen PUBACK of SUBACK wanneer QoS 2 wordt aangevraagd.
Bij het beantwoorden van een verbindingsverzoek stuurt de berichtbroker een CONNACK-bericht. Dit bericht bevat een vlag die aangeeft of de verbinding een vorige sessie hervat. De waarde van deze vlag kan onjuist zijn als twee MQTT-clients tegelijkertijd verbinding maken met dezelfde client-ID.
Wanneer een client zich abonneert op een topic, kan er een vertraging zijn tussen het moment waarop de berichtenbroker een SUBACK verzendt en het moment waarop de client begint nieuwe overeenkomende berichten te ontvangen.
De MQTT-specificatie biedt een voorziening waarmee de uitgever kan verzoeken dat de broker het laatste bericht dat naar een onderwerp is verzonden, bewaart en naar alle toekomstige abonnees van dat onderwerp stuurt. AWS IoT ondersteunt geen bewaarde berichten. Als een verzoek wordt gedaan om berichten te bewaren, wordt de verbinding verbroken.
De berichtbroker gebruikt de client-ID om elke client te identificeren. De client-ID wordt van de client naar de berichtbroker verzonden als onderdeel van de MQTT-payload. Twee clients met dezelfde client-ID mogen niet tegelijkertijd verbonden zijn met de berichtbroker. Wanneer een client verbinding maakt met de berichtbroker met een client-ID die al door een andere client wordt gebruikt, wordt een CONNACK-bericht naar beide clients verzonden en wordt de momenteel verbonden client verbroken.
In zeldzame gevallen kan de berichtbroker hetzelfde logische PUBLISH-bericht opnieuw verzenden met een ander pakket-ID.
De berichtenmakelaar garandeert niet de volgorde waarin berichten en ACK worden ontvangen.
Eerst moet u zich aanmelden bij uw AWS-console, een nieuw apparaat registreren en een X.509-certificaat voor dit apparaat aanmaken. Zodra dit is gedaan, kunt u een nieuwe TsgcIoTAmazon_MQTT_Client aanmaken en verbinding maken met de AWS IoT-server. Bijvoorbeeld:
oClient := TsgcIoTAmazon_MQTT_Client.Create(nil);
oClient.Amazon.Endpoint := 'a2ohgdjqitsmij-ats.iot.us-west-2.amazonaws.com';
oClient.Amazon.ClientId := 'sgcWebSockets';
oClient.Certificate.CertFile := 'amazon-certificate.pem.crt';
oClient.Certificate.KeyFile := 'amazon-private.pem.key';
oClient.OnMQTTConnect := OnMQTTConnectEvent;
oClient.Active := True;
procedure OnMQTTConnect(Connection: TsgcWSConnection; const Session: Boolean; const ReturnCode: TmqttConnReturnCode);
begin
ShowMessage('Connected to AWS');
end;
De berichtenbroker gebruikt onderwerpen om berichten te routeren van publicerende clients naar abonnerende clients. De schuine streep (/) wordt gebruikt om de onderwerpshiërarchie te scheiden. De volgende tabel bevat de jokertekens die kunnen worden gebruikt in het onderwerpfilter bij het abonneren. # Moet het laatste teken zijn in het onderwerp waarop u zich abonneert. Werkt als jokerteken door de huidige boom en alle subbomen te matchen.
Bijvoorbeeld, een abonnement op Sensor/# ontvangt berichten gepubliceerd op Sensor/, Sensor/temp, Sensor/temp/room1, maar niet de berichten gepubliceerd op Sensor.
+ Komt overeen met exact één item in de onderwerpshiërarchie. Zo ontvangt een abonnement op Sensor/+/room1 berichten die zijn gepubliceerd naar Sensor/temp/room1, Sensor/moisture/room1, enzovoort.
oClient := TsgcIoTAmazon_MQTT_Client.Create(nil);
...
oClient.OnSubscribe := OnSubscribeEvent;
vPacketIdentifier := oClient.Subscribe('Sensor/moisture/room1');
procedure OnMQTTSubscribe(Connection: TsgcWSConnection; aPacketIdentifier: Word; aCodes: TsgcWSSUBACKS);
begin
if vPacketIdentifier = aPacketIdentifier then
ShowMessage('Subscribed to topic Sensor/moisture/room1');
end;
// Client, can send a message using Publish method.
oClient.Publish('Sensor/moisture/room1', '{"temp"=10}');
// Messages received from server, are dispatched OnMQTTPublishEvent.
// For extended payload access (string, bytes or stream), use OnMQTTPublishEx.
procedure OnMQTTPublish(Connection: TsgcWSConnection; aTopic, aText: string);
begin
DoLog('Received Message: ' + aTopic + ' ' + aText);
end;
De volgende methoden worden gebruikt om je te abonneren op / te publiceren naar gereserveerde topics.
Subscribe_ClientConnected(const aClientId: String): AWS IoT publiceert naar dit onderwerp wanneer een MQTT-client met het opgegeven client-ID verbinding maakt met AWS IoT
Subscribe_ClientDisconnected(const aClientId: String): AWS IoT publiceert naar dit onderwerp wanneer een MQTT-client met de opgegeven client-ID de verbinding met AWS IoT verbreekt
Subscribe_ClientSubscribed(const aClientId: String): AWS IoT publiceert naar dit onderwerp wanneer een MQTT-client met de opgegeven client-ID zich abonneert op een MQTT-onderwerp
Subscribe_ClientUnSubscribed(const aClientId: String): AWS IoT publiceert naar dit onderwerp wanneer een MQTT-client met de opgegeven client-ID zich afmeldt bij een MQTT-onderwerp
Publish_Rule(const aRuleName, aText: String): Een apparaat of applicatie publiceert naar dit onderwerp om regels rechtstreeks te activeren
Publish_DeleteShadow(const aThingName, aText: String): Een apparaat of applicatie publiceert naar dit onderwerp om een schaduw te verwijderen
Subscribe_DeleteShadow(const aThingName: String): Een apparaat of een toepassing abonneert zich op dit topic om een schaduw te verwijderen
Subscribe_ShadowDeleted(const aThingName: String): De Device Shadow-service stuurt berichten naar dit onderwerp wanneer een shadow wordt verwijderd
Subscribe_ShadowRejected(const aThingName: String): De Device Shadow-service verzendt berichten naar dit onderwerp wanneer een verzoek om een shadow te verwijderen wordt geweigerd.
Publish_ShadowGet(const aThingName, aText: String): Een applicatie of een apparaat publiceert een leeg bericht naar dit onderwerp om een shadow op te halen
Subscribe_ShadowGet(const aThingName: String): Een applicatie of een ding abonneert zich op dit onderwerp om een shadow op te halen
Subscribe_ShadowGetAccepted(const aThingName: String): De Device Shadow-service stuurt berichten naar dit onderwerp wanneer een aanvraag voor een shadow succesvol wordt uitgevoerd
Subscribe_ShadowGetRejected(const aThingName: String): De Device Shadow-service stuurt berichten naar dit topic wanneer een verzoek voor een schaduw wordt geweigerd
Publish_ShadowUpdate(const aThingName, aText: String): Een thing of toepassing publiceert naar dit topic om een shadow bij te werken
Subscribe_ShadowUpdateAccepted(const aThingName: String): De Device Shadow-service stuurt berichten naar dit onderwerp wanneer een update succesvol is gemaakt aan een shadow
Subscribe_ShadowUpdateRejected(const aThingName: String): De Device Shadow-service stuurt berichten naar dit onderwerp wanneer een update van een shadow wordt geweigerd
Subscribe_ShadowUpdateDelta(const aThingName: String): De Device Shadow-service stuurt berichten naar dit onderwerp wanneer een verschil wordt gedetecteerd tussen de gerapporteerde en gewenste secties van een schaduw
Subscribe_ShadowUpdateDocuments(const aThingName: String): AWS IoT publiceert een statusdocument naar dit onderwerp wanneer een update van de shadow succesvol is uitgevoerd
Een persistente sessie vertegenwoordigt een doorlopende verbinding met een MQTT-berichtenbroker. Wanneer een client verbinding maakt met de AWS IoT-berichtenbroker via een persistente sessie, slaat de berichtenbroker alle abonnementen op die de client tijdens de verbinding maakt. Wanneer de client de verbinding verbreekt, slaat de berichtenbroker niet-bevestigde QoS 1-berichten op en nieuwe QoS 1-berichten gepubliceerd op onderwerpen waarop de client is geabonneerd. Wanneer de client opnieuw verbinding maakt met de persistente sessie, worden alle abonnementen hersteld en worden alle opgeslagen berichten naar de client gestuurd met een maximale snelheid van 10 berichten per seconde.
U maakt een MQTT persistente sessie door de parameter cleanSession op False in te stellen in de gebeurtenis OnMQTTBeforeConnect. Als er geen sessie bestaat voor de client, wordt een nieuwe persistente sessie aangemaakt. Als er al een sessie bestaat voor de client, wordt deze hervat.
Apparaten moeten het attribuut Session in de gebeurtenis OnMQTTConnect controleren om te bepalen of er een persistente sessie aanwezig is. Als Session True is, is er een persistente sessie aanwezig en worden opgeslagen berichten aan de client geleverd. Als Session False is, is er geen persistente sessie aanwezig en moet de client opnieuw abonneren op zijn onderwerpfilters.
Persistente sessies hebben een standaard vervaltermijn van 1 uur. De vervaltermijn begint wanneer de berichtenbroker detecteert dat een client de verbinding verbreekt (MQTT-verbreking of time-out). De vervaltermijn van persistente sessies kan worden verlengd via het standaard limietverhogingsproces. Als een client zijn sessie niet heeft hervat binnen de vervaltermijn, wordt de sessie beëindigd en worden eventuele opgeslagen berichten verwijderd. De vervaltermijn is bij benadering; sessies kunnen tot 30 minuten langer worden bewaard (maar niet korter) dan de geconfigureerde duur.
AWS IoT Core kan werken met tijdelijke referenties verkregen via identiteitspools; er zijn 2 typen identiteiten:
Als u niet-geverifieerde referenties gebruikt, koppelt u het beleid gewoon aan de rol UnAuthenticated die automatisch is aangemaakt in het IAM-menu. Configureer vervolgens de client door de Access, Secret Key en Token in te stellen die worden geretourneerd door de Cognito-service.
Hieronder vindt u een codevoorbeeld in .NET om niet-geverifieerde inloggegevens te verkrijgen
CognitoAWSCredentials credentials = new CognitoAWSCredentials(
"us-east-1:cc3c9c48-646d-44ef-bfd5-0c5fb2f0882f", // Identity pool ID
Amazon.RegionEndpoint.USEast1 // Region
);
var identityPoolId = credentials.GetCredentialsAsync();
AmazonCognitoIdentityClient cognitoClient = new AmazonCognitoIdentityClient(
credentials, // the anonymous credentials
Amazon.RegionEndpoint.USEast1 // the Amazon Cognito region
);
GetIdRequest idRequest = new GetIdRequest();
idRequest.AccountId = "222178873557";
idRequest.IdentityPoolId = "us-east-1:cc3c9c48-646d-44ef-bfd5-0c5fb2f0882f";
GetIdResponse idResp = cognitoClient.GetId(idRequest);
string AccessKey = identityPoolId.Result.AccessKey;
string SecretKey = identityPoolId.Result.SecretKey;
string SessionToken = identityPoolId.Result.Token;
string IdentityId = idResp.IdentityId;
Geverifieerde inloggegevens, vereisen het koppelen van het beleid in de automatisch aangemaakte geverifieerde rol in het IAM-menu en het koppelen van het beleid van de gebruiker in AWS IoT Core-beleidsregels.
Maak dus een nieuw beleid in het IoT Core-beleidsmenu en koppel dit beleid elke keer dat een nieuwe gebruiker zich authenticeert aan deze gebruiker.
U kunt de volgende AWS-opdracht gebruiken om een beleid te koppelen of een lambda-functie te maken.
aws iot attach-policy --policy-name PolicyName --target us-east-1:XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
De Fleet Provisioning-service ondersteunt de volgende MQTT API-bewerkingen:
CreateCertificateFromCsr
Gebruik de methode CreateCertificateFromCsr met de CertificateSigningRequest als parameter om het certificaat aan te maken. Om de respons op dit verzoek te ontvangen, abonneer u eerst op de volgende methoden: SubscribeCreateCertificateFromCsrResponse en SubscribeCreateCertificateFromCsrError
CreateKeysAndCertificate
Gebruik de methode CreateKeysAndCertificate om een nieuw certificaat en sleutels aan te maken. Om het antwoord op dit verzoek te ontvangen, abonneert u zich eerst op de volgende methoden: SubscribeCreateKeysAndCertificateResponse en SubscribeCreateKeysAndCertificateError
RegisterThing
Gebruik de methode RegisterThing om een nieuw ding te registreren door als parameter de sjabloonnaam en de payload in JSON-formaat door te geven. Om het antwoord op dit verzoek te ontvangen, abonneer u eerst op de volgende methoden SubscribeRegisterThingResponse en SubscribeRegisterThingError.