Wie kann ich über einen Browser eine Verbindung zu AWS IoT Core MQTT über WebSocket herstellen?JavaScript

Javascript-Forum
Anonymous
 Wie kann ich über einen Browser eine Verbindung zu AWS IoT Core MQTT über WebSocket herstellen?

Post by Anonymous »

Ziel
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
[*]IAM-Richtlinie IAM-MQTT erstellen (erlaubt iot:* zur Ressource *)
[*]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)
[*]Aktiviertes Protokoll für den IoT Core für die angehängte Rolle ABC-Benutzer

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();
Was ich durchgemacht habe
  • 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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post