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
相关产品推荐
相关产品推荐

