Erlauben Sie einem Cognito-authentifizierten Benutzer (über einen Webbrowser), mit IoT Core-Dingen/-Geräten zu kommunizieren
Was ich bereits auf der AWS-Konsole getan habe:
- AWS Cognito-Benutzerpool erstellt - ABC
- AWS Cognito-Identitätspool ABC-Benutzer mit Konfiguration erstellt
Nur für Cognito-authentifizierte Benutzer zulassen. - Identitätsanbieter Cognito-Benutzerpool Benutzerpool – ABC
- Angehängte IAM-Rolle ABC-Benutzer
[*]Erstellte IAM-Rolle ABC-Benutzer mit angehängter Richtlinie IAM-MQTT und Vertrauensrichtlinie mit Cognito-authentifizierter Identitätspool-ID.
[*]Erstellte AWS IoT Core-Domäne mit Konfiguration (die vorhandene hatte Authentifizierungstyp und -protokoll als Standard):
- Name: ioTCoreWeb
- Authentifizierungstyp: Sig V4
- Anwendungsprotokoll: MQTT über Websockets
- Domäne: xxxxxxxxxxxxxxxxxxxx-ats.iot.eu-north-1.amazonaws.com (AWS verwaltet)
Dienstcode
Den folgenden Code verwende ich in einer neuen ReactJS-Anwendung, bis eine funktionierende Lösung vorliegt.
Sobald alles perfekt funktioniert, werde ich diesen Code in das bestehende AngularJS v15-Projekt konvertieren.
Code: Select all
import { Sha256 } from "@aws-crypto/sha256-js";
import { SignatureV4 } from "@aws-sdk/signature-v4";
import { fetchAuthSession } from "aws-amplify/auth";
import mqtt from "mqtt";
import { AWS_CONFIG } from "../aws-config";
class IotService {
private mqttClient: mqtt.MqttClient | null = null;
private async getAwsCredentials() {
const session = await fetchAuthSession();
const credentials = session.credentials;
if (!credentials) throw new Error("No AWS credentials");
return credentials;
}
private async createSignedUrl(): Promise {
const credentials = await this.getAwsCredentials();
const signer = new SignatureV4({
service: "iotdevicegateway",
region: AWS_CONFIG.iot.region,
credentials,
sha256: Sha256,
});
const signed = await signer.presign({
method: "GET",
protocol: "wss",
hostname: AWS_CONFIG.iot.endpoint,
port: 443,
path: "/mqtt",
headers: { host: AWS_CONFIG.iot.endpoint },
});
return `${signed.protocol}://${signed.hostname}${
signed.path
}?${new URLSearchParams(
signed.query as Record
).toString()}`;
}
public async connect() {
const signedUrl = await this.createSignedUrl();
const cred = await fetchAuthSession();
this.mqttClient = mqtt.connect(signedUrl, {
protocol: "wss",
clientId: cred.identityId,
// clientId: `web_${crypto.randomUUID()}`,
clean: true,
reconnectPeriod: 0,
keepalive: 60,
});
this.mqttClient.on("connect", () => {
this.mqttClient?.subscribe(AWS_CONFIG.iot.topic);
});
this.mqttClient.on("close", async () => {
// await this.connect();
});
}
}
export const iotService = new IotService();
- Während der Verwendung von aws-iot-device-sdk-js-v2 startet weder die ReactJS- noch die AngularJS-App, selbst wenn die Importe von aws-iot-device-sdk-js-v2/dist/browser erfolgten. Ursachen können die Eigenschaftsbindung von undefiniert oder etwas Ähnlichem nicht lesen.
- Die Verwendung von unpkg funktioniert auch nicht.
- AWS Amplify-Gerät/IOT-Paket gibt den gleichen Fehler zurück wie der von aws-iot-device-sdk-js-v2
- Nach einem langen AI-Gespräch habe ich die SigV4-URL-Lösung erhalten und sie scheint für mich gültig zu sein, da sie auf der AWS-Konsole selbst gültig ist websocket wird in AWS IoT Core verwendet >> MQTT Test Cient
- Jetzt erhalte ich die Meldung „IotService.ts:100 WebSocket-Verbindung zu wss://...ats.iot.eu-north-1.amazonaws.com... fehlgeschlagen“ und außerdem werden vorläufige Header angezeigt Warnung in der Registerkarte „Netzwerk“ der Browser-Tools. und selbst in den Nachrichten ist es leer.
- Es wurden keine IoT Core-Protokolle erstellt, was bedeutet, dass die Anfrage nicht einmal AWS erreicht hat.
Mobile version