当前位置: 首页 > 知识库问答 >
问题:

在没有cognito的地区使用AWS服务(如物联网)

汪胡非
2023-03-14

我正在研究使用AWS IOT让我们的硬件与用户手机通信。为此,我们使用react-nate-paho-mqtt库。

我会在守则前简单解释:

>

  • 从ap-东北-1(东京)中的认知联邦标识检索令牌,因为那里有认知/联邦标识
  • 使用该令牌登录ap-东南-1(新加坡)的aws IOT
  • 失败:错误:AMQJS0007E套接字错误:未知套接字错误。

    生成的带有sigV4签名的mqttendpoint如下所示:

    wss://a2mt3pd9aiue3c.iot.ap-southeast-1.amazonaws.com/mqtt?X-Amz算法=AWS4-HMAC-SHA256

    代码片段如下所示:

        fetch('https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/app/connect', { // retrieve app token from ap-northeast-1 cognito
         method: 'POST',
         headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        },
          body: JSON.stringify({"data": {"coreUserId": 100, "companyId": 1, 
          "brandId": 2, "hotelId": 3, "roomId": 4}})
         })
         .then((response) => response.json())
         .then((responseJson) => {
    
        console.warn("resnpose json is : ", responseJson)
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: AppConfig.identityPoolId,
          IdentityId: responseJson.message.cognitoIdentityId,
          Logins: {
            'cognito-identity.amazonaws.com': responseJson.message.token
          }
        });
        AWS.config.credentials.get((err) => {
    
          if (err) {
            console.error(err)
          }
          console.warn("AWS.config.credentials --> ", AWS.config.credentials)
    
          var ioturl = this.getSignedUrl(AppConfig.iotEndpoint, AppConfig.region, AWS.config.credentials);
          const client = new Client({
            uri: ioturl,
            clientId: AppConfig.credentials.cognitoIdentityId,
            storage: AsyncStorage
          });
          this.client = client;
          client.on('messageReceived', (message) => {
            try {
              const jsonResponse = JSON.parse(message.payloadString);
              console.warn(Date.now()," : received : ", jsonResponse);
            } catch (e) {
              console.warn("Failed to recieve: ", e)
            }
            //this.handleIoTMessage(jsonResponse);
          });
    
          client.on('connectionLost', (responseObject) => {
            console.warn('CLIENT DC');
            if (responseObject.errorCode !== 0) {
              //clearInterval(this.publishInterval);
              console.warn('CONNECTIONLOST TRIGGERED:', responseObject.errorMessage);
            }
          });
    
          var connectOptions = {
            useSSL: true,
            timeout: 30000, // In milliseconds, it turns out
            keepAliveInterval:30000,
            cleanSession:true,
            mqttVersion: 4,
          };
          AWS.config.update({region: "ap-southeast-1"}); //now try to connect to another region..where there is no cognito available
          const IoT = new AWS.Iot();
    
    
          var params = {
            policyName: "Test",
            principal: AppConfig.credentials.cognitoIdentityId // this cognito identity id is in ap-northeast-1 . NOT in ap-southeast-1 where IOT is located
          };
    
          IoT.attachPrincipalPolicy(params, (err) => {
            if (err) {
              console.error('ERROR attachPrincipalPolicy: ', err);
            }
    
            client.connect(connectOptions)
              .then((result) => {
                console.warn("connect resutl : ", result, " .. not subs ")
                return client.subscribe('b/2/p/3/r/4/#', {qos: 1, timeout: 15000})
    
              })
              .then(function (xx, yy) {
                console.warn("Subscribe succss : ", xx, yy)
                const message = new Message(JSON.stringify({"xxx": "yyy"}));
                message.destinationName = 'b/2/p/3/r/4/xx';
                return client.send(message);
              })
              .then(function (xx, yy) {
                return console.warn("Successfully sent : ", xx, yy)
              })
    
              .catch((responseObject) => {
                console.warn("response object is : ", responseObject);
                if (responseObject.errorCode !== 0) { // fail
                  console.warn(`CATCH ONCONNECTIONLOSTTRIGGERED: ${responseObject.errorMessage}`);
                }
              });
          });
        });
    
      })
      .catch((error) => {
        console.error(error);
      });
    

    它失败于:

     Error: AMQJS0007E Socket error: Unknown socket error.
    

    有人能提出需要做什么吗?在没有cognito的地区认证用户的标准是什么?

  • 共有1个答案

    华子昂
    2023-03-14

    也许你已经意识到了这一点,但Cognito最近在新加坡推出

     类似资料:
    • 我目前正在原型化一个由AWS物联网支持的应用程序,允许用户控制他们的设备。 我的想法是使用AWS Cognito对用户进行身份验证,并通过IAM角色限制对该用户拥有的特定设备(主题)的访问。 我可以看到,您可以将角色分配给一组用户,这将非常好,但允许的组数上限非常低(25)。 我是错过了一个技巧,还是这是对认知的限制?如果是这样,处理这种情况的最佳方法是什么? 提前谢谢。

    • 根据文档,我了解了如何创建物联网,以及如何使用AWS物联网创建经过身份验证的用户。我的问题是如何有效地组合这些服务,以便每个用户都可以安全地访问他或她的多个设备。 假设Jane刚刚注册了该平台,并希望将她的灯泡设备连接到她的帐户。我们还假设她的灯泡设备上已经有证书和物联网中的策略,以便它可以连接到物联网平台,然后发布和订阅一些主题。为了简单起见,假设Jane可以通过简单地进行名为的API调用来创建

    • 使用AWS物联网规则功能,我可以定义一个将MQTT数据映射到DynamoDB的规则。是否可以使用来自不同帐户的第三方DynamoDB资源来实现相同的结果,而不是在同一帐户上使用本地DynamoDB?如果是积极的,如何实现?

    • 通过设置open_mqtt_protocol选项,启用后会解析mqtt包头,worker进程的onReceive事件每次会返回一个完整的mqtt数据包。 程序代码 mqtt_server.php <?php function decodeValue($data) { return 256 * ord($data[0]) + ord($data[1]); } function decode

    • 我想使用Cognito对我的用户进行身份验证,这是一个内置于Flutter和Dart的应用程序。 不幸的是,Dart不存在本机AWS SDK,我不能在颤振中使用JS互操作。 我已经研究了OAuth2流,但这需要将我的用户重定向到登录表单,这对移动应用程序来说不是很好。 有哪些替代方案?

    • 在iOSSDK(v2.4.8)中,我不能注销一个用户,然后以不同的用户正确登录。 AWS为第一个用户(自应用程序启动后)返回的(正确的)cognityIdentityId也为第二个用户返回(除非应用程序重新启动)。这允许另一个用户访问一个用户的AWSCognitoDataset。 我认为这是因为iOS SDK缓存了id,而清除该缓存的记录调用无法完全工作。 登录时: self.credential