Я тестирую 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]()
}
}
}
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
Если ваш триггер - сообщения 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.
Похожие вопросы
Новые вопросы
scala
Scala - это язык программирования общего назначения, в основном предназначенный для виртуальной машины Java. Разработанный для краткого, элегантного и безопасного для типов представления общих шаблонов программирования, он сочетает в себе как императивный, так и функциональный стили программирования. Его ключевые особенности: продвинутая система статического типа с выводом типа; типы функций; сопоставления с образцом ; неявные параметры и преобразования; перегрузка оператора; полная совместимость с Java; совпадение