AWS Lambda - 如何获取来自AWS IOT

时间:2017-04-24 14:33:53

标签: scala amazon-web-services aws-lambda mqtt aws-iot

我正在使用AWS IOT源测试AWS Lambda。我的mqtt客户端以不同的主题发布:设备A将数据发布到streaming/A,设备B将数据发布到streaming/B,因此在AWS Lambda中我定义了一个SQL规则,选择来自主题{{1}的所有设备}。问题是,现在我没有设备源的信息,因为我只有streaming/+有额外的信息。如果有人有解决方案来访问带有主题信息的mqtt有效负载,我会接受它!

Array[Byte]]

2 个答案:

答案 0 :(得分:10)

我一直在寻找同样的事情,有办法实现这一目标。在构建SQL时,您可以使用topic()函数来获取发送消息的主题。这样你可以放入属性部分

*, topic() as topic

所以你的最终SQL看起来像:

SELECT *, topic() as topic FROM one/of/my/+/topics

然后,您的有效负载将包含一个可在lambda函数中解析的新属性主题。

答案 1 :(得分:0)

如果您的触发器是SNS消息,那么我只会阅读JSON。这将在Scala中起作用:

import com.amazonaws.services.lambda.runtime.events.SNSEvent

import scala.collection.JavaConverters._

object Example extends LambdaApp  {

  /** Convert Java lists (or nulls!) to Scala lists */
  def safeList[A](xs: java.util.List[A]) =
    Option(xs).map(_.asScala).getOrElse(List.empty[A])

  /** Install the handler in AWS Lambda as `Example::handler`. */
  def handler(e: SNSEvent)  = {

    val rs = for {
      r <- safeList(e.getRecords)
    } yield {
      r.getSNS.getMessage
    }
    rs.asJava // Convert Scala list to Java.
  }
}

您需要在build.sbt中包含以下依赖项:

libraryDependencies ++= Seq(
  "com.amazonaws" % "aws-lambda-java-core" % "1.1.0",
  "com.amazonaws" % "aws-lambda-java-events" % "1.3.0"
)

如果您对SNS主题名称感兴趣,那么您可以从以下网址获取:

r.EventSubscriptionArn

AWS Lambda JDK库使用jackson-core为您解析SNS消息的JSON。