You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native集成AWS Cognito与IoT Core订阅失败求助

问题:React Native应用无法接收AWS IoT Core消息

场景与已完成操作

开发React Native应用,实现用户通过AWS Cognito注册/认证,并订阅AWS IoT Core消息。已完成:

  • App.jsx成功展示AWS官方“登录/注册”表单,用户可完成注册、验证码验证、登录/退出流程
  • 注册用户已同步到AWS Cognito用户池
  • ESP32可正常向AWS IoT Core发布消息,消息在平台及CloudWatch日志中可见

当前问题

React Native应用仅打印日志LOG Attempting to subscribe...,无法接收IoT Core推送的消息,无后续日志输出。

已排查操作

  • 反复核对权限、区域、Cognito身份池配置
  • 执行命令aws iot attach-policy --policy-name myIoTPolicy --target us-east-2:xxxx.xxxxx.xxxxx.x.xxxxx.关联IoT策略与目标
  • AWS IoT策略设置全权限(允许*操作*资源)
  • CloudWatch可查看到ESP32发布消息及AWS推送消息的日志

应用代码

import React, { useState, useEffect } from 'react';
import { Button, View, Text, ScrollView } from 'react-native';
import { AWSIoTProvider } from '@aws-amplify/pubsub';
import { Amplify, PubSub } from 'aws-amplify';

import {
  useAuthenticator,
  withAuthenticator,
} from '@aws-amplify/ui-react-native';

import awsconfig from './src/aws-exports';
Amplify.configure(awsconfig);

function SignOutButton() {
  const { signOut } = useAuthenticator();
  return <Button onPress={signOut} title="Sign Out" />;
}

Amplify.addPluggable(new AWSIoTProvider({
  aws_pubsub_region: 'us-east-2',
  aws_pubsub_endpoint: 'wss://xxxxx.xxxxx.xxxxx.xxxxx.amazonaws.com/mqtt',
}));


function App() {
  const [messages, setMessages] = useState<string[]>([]);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    console.log('Attempting to subscribe...');
    const subscription = PubSub.subscribe('xxxx.xxxxx.xxxxx.xxxxx/pub').subscribe({
      next: (data: { value: any }) => {
        console.log('Message received', data);
        if (data.value) {
          setMessages(prevMessages => [...prevMessages, JSON.stringify(data.value)]);
        } else {
          console.error('Received data does not contain a value property');
        }
      },
      error: error => {
        console.error('An error occurred', error);
        setError(error.message);
      },
      complete: () => console.log('Done'),
    });

    return () => {
      console.log('Unsubscribing...');
      subscription.unsubscribe();
    };
  }, []);


  return (
    <View>
    <Text>IoT Messaging</Text>
    <Text>
      New messages from your device(s) that publish to the topic 'xxxx.xxxx.xxxx.xx/pub' will appear below:
    </Text>
    {error && <Text>Error: {error}</Text>}
    <ScrollView>
      {messages.map((msg, index) => (
        <Text key={index}>
          {msg}
        </Text>
      ))}
    </ScrollView>
    <SignOutButton/>
  </View>
  );
}


export default withAuthenticator(App);

解决方案与排查方向

1. 订阅主题与发布主题严格匹配

检查代码中订阅的'xxxx.xxxxx.xxxxx.xxxxx/pub'是否与ESP32实际发布的主题完全一致(包括大小写、斜杠、前缀后缀),IoT Core主题匹配是严格区分的。

2. 调整订阅时机,确保登录后执行

当前订阅逻辑在组件挂载时执行,可能早于用户完成认证,导致未获取到有效凭证。修改代码,依赖用户登录状态触发订阅:

function App() {
  const { user } = useAuthenticator();
  const [messages, setMessages] = useState<string[]>([]);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    if (!user) return; // 未登录时不执行订阅

    console.log('Attempting to subscribe...');
    const subscription = PubSub.subscribe('xxxx.xxxxx.xxxxx.xxxxx/pub').subscribe({
      next: (data: { value: any }) => {
        console.log('Message received', data);
        if (data.value) {
          setMessages(prevMessages => [...prevMessages, JSON.stringify(data.value)]);
        } else {
          console.error('Received data does not contain a value property');
        }
      },
      error: error => {
        console.error('An error occurred', error);
        setError(error.message);
      },
      complete: () => console.log('Done'),
    });

    return () => {
      console.log('Unsubscribing...');
      subscription.unsubscribe();
    };
  }, [user]); // 依赖user状态,登录后触发

3. 验证IoT策略资源范围

即使设置全权限,也要确认策略资源包含订阅主题的过滤器,示例策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect",
        "iot:Subscribe",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:us-east-2:你的账户ID:client/*",
        "arn:aws:iot:us-east-2:你的账户ID:topicfilter/xxxx.xxxxx.xxxxx.xxxxx/pub"
      ]
    }
  ]
}

同时确认策略已关联到Cognito身份池对应的角色,而非仅通过命令绑定单个目标。

4. 监控WebSocket连接状态

添加连接状态日志,排查是否成功建立连接:

// 在App组件外添加
PubSub.on('connect', () => console.log('PubSub connected'));
PubSub.on('disconnect', () => console.log('PubSub disconnected'));

若未触发connect,需检查WebSocket endpoint配置是否正确,或应用网络权限、防火墙是否阻止连接。

5. 检查当前用户凭证权限

通过代码打印当前登录用户的凭证,确认是否包含IoT权限:

import { Auth } from 'aws-amplify';

// 在useEffect中添加
if (user) {
  Auth.currentCredentials().then(creds => {
    console.log('Current credentials:', creds);
  });
}

6. 核对依赖版本兼容性

检查@aws-amplify/pubsub、@aws-amplify/ui-react-native等依赖版本是否匹配官方文档要求,版本不兼容可能导致订阅失败,建议更新至最新稳定版。

内容的提问来源于stack exchange,提问作者caesar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:17:47