Я тестирую AWS Lambda с источником AWS IOT. Мои клиенты mqtt публикуются в разных темах: устройство A публикует данные в streaming/A, устройство B публикует данные в streaming/B, поэтому в AWS Lambda я определил правило SQL, выбирая все устройства из тем {{X2} } . Дело в том, что теперь у меня не было информации об источнике устройства, потому что у меня есть только Array[Byte]] с дополнительной информацией. Если у кого-то есть решение для доступа к полезной нагрузке mqtt с информацией о теме, я возьму его!

import java.io.{ByteArrayOutputStream, InputStream, OutputStream}
import com.amazonaws.services.lambda.runtime.{Context, RequestStreamHandler}
/**
  * Created by alifirat on 24/04/17.
  */
class IOTConsumer extends RequestStreamHandler {

  val BUFFER_SIZE = 1024 * 4

  override def handleRequest(input: InputStream, output: OutputStream, context: Context): Unit = {
    val bytes = toByteArray(input)
    val logger= context.getLogger
    logger.log("Receive following thing :"  + new String(bytes))
    output.write(bytes)
  }

   /**
     * Reads and returns the rest of the given input stream as a byte array.
     * Caller is responsible for closing the given input stream.
     */
   def toByteArray(is : InputStream) : Array[Byte] = {
     val output = new ByteArrayOutputStream()
     try {
       val b = new Array[Byte](BUFFER_SIZE);
       var n = 0
       var flag = true
       while(flag) {
         n = is.read(b)
         if(n == -1) flag = false
         else {
           output.write(b, 0, n)
         }
       }
       output.toByteArray();
     } finally {
       output.close();
       Array[Byte]()
     }
   }
}
5
alifirat 24 Апр 2017 в 17:33

2 ответа

Лучший ответ

Я искал то же самое, есть способ добиться этого. При создании SQL вы можете использовать функцию topic (), чтобы получить тему, в которую было отправлено сообщение. Таким образом, вы можете поместить в раздел атрибутов

*, topic() as topic

Так что ваш окончательный SQL будет выглядеть так:

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

Ваша полезная нагрузка будет тогда содержать новую тему атрибутов, которую вы можете анализировать в своей лямбда-функции. Подробнее об этом https://docs.aws.amazon .com / ВГД / последний / developerguide / ИТН - SQL - functions.html

15
Mattia Procopio 17 Июн 2020 в 09:23

Если ваш триггер - сообщения 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 анализирует JSON сообщения SNS для вас с помощью jackson-core.

0
ashawley 24 Апр 2017 в 15:00
43590925