<style> .reveal { font-size: 32px; } </style> ### <span style="color: dodgerblue">μSCENE</span> #### uma abordagem orientada a microserviços para desenvolvimento de aplicações de IoT sensíveis a situações <span style="float:right;font-size:0.5em">`Isaac Pereira`</span> --- ### Agenda * Contextualização e Objetivos * **SCENE** Toolkit * Plataforma μ**SCENE** * Estudo de Caso (Medicine Quality Control) * Considerações Finais --- ### Computação Pervasiva (*Ubiquitous computing*) > **"** the age of calm technology, when technology recedes into the background of our lives <span style="float:right;font-size:0.5em">`Mark Weiser`</span> ---- #### Internet of Things (<span style="color: dodgerblue">IoT</span>) * **50 bilhões** de dispositivos conectados em 2020 * Mercado de **$11 trilhões** de dólares (até 2025) * Adoção de plataformas de nuvem IoT (`Azure IoT Hub`, `Google IoT Cloud`, `AWS IoT`, ...) ---- #### Internet of Things <span style="color: dodgerblue">**+**</span> *Context-Awareness* = :muscle: Suporte à **context-awareness**... :globe_with_meridians: Pouco explorada em soluções ou plataformas de IoT mercado :wrench: Falta de ferramentas como *frameworks*, *toolkits*, etc. ---- #### Objetivos :dart: Fornecer ferramentas que suportem o desenvolvimento de aplicações IoT sob a ótica da sensibilidade ao contexto :dart: Facilitar a adoção de abordagens *context-awareness* em soluções IoT existentes ---- #### Evolução e contribuições em trabalhos da área * SiNOS - Situation Notification Service (`Carol Rizzi`) * SMaaS - Situation Management (`Higor Borjaille`) * Um framework de apoio ao des. de aplicações sensíveis a situações (`Bernardo Sunderhus`) * LAURA architecture: Towards a simpler way of building situation-aware IoT applications (`Sergio Teixeira`) --- ### SCENE - *Situation-awareness* Toolkit :hammer_and_wrench: Toolkit para gerenciamento de situações orientado à regras em **Drools** ---- #### Situações > “um estado particular de interesse para aplicações cujos seus constituintes podem ser uma combinação de entidades e de suas condições contextuais. <span style="float:right;font-size:0.5em">`DOCKHORN (2007)`</span> ---- ### Situações em SCENE *Situation types (templates)* vs. *Situation instances* <img src="https://i.imgur.com/O2tZulQ.png" style="border: none;background: none;box-shadow:none" height="300"> ---- ### Características do uso do SCENE * Especificação *situation-types* em tempo de design * *Situation-types* usam entidades do domínio e outras *situation-types* como *building-blocks* * *Situation instances* possuem ***propriedades temporais*** * *runtime* avalia *situation-types* e gerencia ciclo de vida das instâncias. ---- ### SCENE-DRL > **Extensão da DRL com *bindings* específicos para lidar com:** - [ ] Definições de *situation-types* - [ ] Identificação de *participantes* e *unificadores*. - [ ] Regras de situação ---- ### SCENE-DRL ```java= declare Fever extends Situation febrile: Person @part @key end rule "Fever" @role(situation) @snapshot(on) when $febrile: Person(temperature > 37) then SituationHelper.situationDetected(drools, Fever.class) end ``` ---- ### *Bindings* e *decorators* do SCENE-DRL * `role` * `part` | `key` * `snapshot` * `restore` `(first | last | stable)` ---- #### Operações temporais entre situações <img src="https://i.imgur.com/w2wsWCd.png" style="border: none;background: none;box-shadow:none" height="300"> ---- ### Composição de situações por operadores temporais ```java= declare IntermittentFever extends Situation febrile: Person @part @key end rule "IntermittentFever" @role(situation) @snapshot(on) when $pastFever: Fever($febrile: febrile, !active) $current: Fever(this.febrile == febrile, this after[1h,2d] $pastFever, active) then SituationHelper.situationDetected(drools, Fever.class) end ``` ---- #### Arquitetura do Toolkit * ~~Drools Situation Model~~ :arrow_right: ***situation-model* (0.10.2)** * ~~Drools Situation Helper~~ :arrow_right: ***scene-core* (0.10.7)** <img src="https://i.imgur.com/LTymO88.png" style="border: none;background: none;box-shadow:none" height="300"> ---- #### Situation Model <span style="font-size:0.5em">Provido como um biblioteca Java independente do Drools</span> ![](https://i.imgur.com/Gwtrx42.png) ---- #### SCENE Core O toolkit fornece um *KieModule* pré-configurando as dependências para tornar o processamento de situações possível. <img src="https://i.imgur.com/YALYM1O.png" style="border: none;background: none;box-shadow:none" height="300"> *Drools Situation Layer* :arrow_right: **SceneKieModule** ---- #### Gerenciamento de Ciclo de Vida de Situações ```java= rule "SituationActivation" when $act: OngoingSituation( situation == null, $type: type, $castset: castset, $timestamp: timestamp) then SituationHelper.activateSituation( drools, $castset, $type, $timestamp)); end ``` ---- #### Gerenciamento de Ciclo de Vida de Situações ```java= rule "SituationDeactivation" when $sit: Situation(active==true) not(exists OngoingSituation(situation == $sit)) then SituationHelper .deactivateSituation(drools, (Object) $sit); end end ``` --- ### Plataforma μSCENE > Modelo de PaaS para desenvolvimento, execução e gerenciamento de aplicações *Situation-aware* (**SIaaS**). *IoT* + *Situation-Awareness* ---- <img src="https://i.imgur.com/T67BsDm.png" style="border: none;background: none;box-shadow:none" height="300"> ---- <img src="https://i.imgur.com/XSw09xR.png" style="border: none;background: none;box-shadow:none" height="400"> Uma aplicação *μSCENE* necessita gerenciar recursos em todos os níveis da plataforma (IoT :arrow_right: Contexto :arrow_right: Situação ) ---- ### Desenvolvedores de soluções IoT podem... * Registrar e habilitar dispositivos à rede de coleta e armazenamento da aplicação (MQTT, HTTP, COAP) * Definir características de hardware e de grandezas observadas (QoS, métricas, amostragem). * Instanciar, classificar e relacionar entidades e contextos (*context binding*) * Definir tipos ou templates de situação em SCENE-DRL para inferência de situações. * SIaaS para consumidores de eventos de situação (pub/sub) ---- ### Princípios Arquiteturais * Modularizável (:building_construction:) * Orientado à mensagem (:email:) * Adaptável e não-opinativo ( :electric_plug: ) ---- <img src="https://i.imgur.com/ktjWREP.png" style="border: none;background: none;box-shadow:none" height="600"> ---- <img src="https://i.imgur.com/GpSDDvE.png" style="border: none;background: none;box-shadow:none" height="600"> ---- #### Modelo de Referência de Domínio (:world_map:) <img src="https://i.imgur.com/VbqoMZg.png" style="border: none;background: none;box-shadow:none" height="620"> ---- #### Event Bus :lightning: <img src="https://i.imgur.com/XjWKDPv.png" style="border: none;background: none;box-shadow:none" height="200"> ```javascript= topic: /devices/sense346112/props/temperature/observations type: observation { "timestamp": 11245362311, "values": { "temperature": 24 }, "metadata": { "unit": "celsius" } } ``` ---- #### IoT Broker :satellite_antenna: * Provisionamento, coleta e agregação de dados originados de *sensingDevices* ```javascript= POST /sensingDevices (registro de um SensingDevice em operação) { "id": "sense346112", "descriptor": "mote@freezer" "metadata": { "location": "roomA", "model": "esp32" }, "props": { "temperature": { "metadata": { "type": "sensor", "model": "ds1880", "precision": 0.1, "unit": "celsius" } } } } ``` ---- #### Context Manager * Racionalização dos eventos de baixo-nível. ("entitificação") * Criação de entidades, contextos, relações contextuais e o provisionamento desses elementos como serviço. * Permite *context-binding* baseado em fluxo de eventos (do nível de IoT) do barramento ```javascript= # criação de um contexto com binding # para observations de um sensingDevice POST /entities/5eb4c685665a75ec7d90826e/contexts { "kind": "temperature", "label": "temp", "bind": { "from": "/devices/sense346112/props/temperature", "map": "(x) -> x" } } ``` ---- #### Situation Inference Manager * Gerencia instância da SCENE runtime (1 engine dedicada por solução ) * Consome *streams* de dados contextuais e roteia para o nó SCENE correto * publica notificações de eventos de detecção para o *event bus* <img src="https://i.imgur.com/bvSshuF.png" style="border: none;background: none;box-shadow:none" height="250"> ---- #### Regras de situação em aplicações μSCENE ```java= declare 'Fever' extends Situation febrile: Entity @part @key temperature: IntrinsicContext @part end rule 'Fever' @role(situation) when temperature: IntrinsicContext( kind=="temperature", value!.entries["current"].asNumber > 37.0 ) febrile: Entity(kind=="person") from temperature.bearer then SituationHelper.situationDetected(drools); end ``` ---- #### Situation Pub/Sub * Notificação de eventos situacionais originados no motor de inferência de situação. * API de assinatura de eventos ```json Evento de ativicação de situação de febre: { "type" : "ACTIVATION", "timestamp" : 1541978996090, "situation" : { "id" : 1, "type" : "scene.Fever", "active" : true, "started" : 1541978996090, "participations" : { "febrile" : { "id" : 1, "kind" : "Person", "descriptor" : "Dr. Mary Sue", "attributes" : { "age" : 35.0 }, "contexts" : { "Temperature" : { "type" : "intrinsic", "id" : 1, "descriptor" : "Dr. Mary Sue's temperature", "kind" : "Temperature", "value" : { "timestamp" : 1541066766, "entries" : { "value" : 39.0 } }, "bearer" : 1 } } } } } } ``` --- ### Estudo de Caso Medicine Quality Control ---- > Uma clínica que mantém um estoque de produtos dermatologicos sensíveis as condições de ambiente (e.g. botox) precisa de ações de contingência para evitar perdas de produto. ---- > Uma solução de monitoramento e alertas foi proposta para mitigar o problema ---- #### Solução MQC * O estoque é mantido em **freezers monitorados** por sensores de temperatura * Os **profissionais da clínica são responsáveis** por atender problemas quando requisitados * Eles devem se registrar através do **aplicativo mobile** da solução como "vigias" dos estoques * Quando algum risco é detectado **"vigias" ativos são alertados** para tomarem medidas e protegerem os produtos em risco ---- #### Modelo conceitual do cenário <img src="https://i.imgur.com/tBNeIiq.png" style="border: none;background: none;box-shadow:none" height="600"> ---- ### Instanciação do Cenário MQC em ---- Criar profissional/vigilante de lotes de produtos ```json= POST /entities { "kind": "user", "descriptor": "Dr. Mary Sue", "attributes": { "username": "mary", "email": "marysue@laura.com", "role": "Doctor" } } ``` ---- Associar leitura do termostato ao contexto temperatura do freezer da clínica ```json= POST /entities/5eb4c685665a75ec7d90826e/contexts { "kind": "temperature", "label": "temp", "bind": { "from": "/devices/iotFreezer0211/props/temperature", "map": "(x) -> x" } } ``` ---- Ativar a vigilância de usuários para lote de produto ```json= POST /relations { "kind": "watch", "label": "watch", "parts": { "observer": "user/5eb4bffe2a95c0dc827f1680", "observed": "product/5eb4c0546130af7ea1378a5c" } } ``` ---- #### Definir situações de interesse ---- AbsentTemperatureReading ```java= declare 'AbsentTemperatureReading' extends Situation container: Entity @part @key end rule 'AbsentTemperatureReading' @role(situation) @type(AbsentSensorReading) when temperature: IntrinsicContext(kind=="temperature") container: Entity(kind=="container") from temperature.bearer not (ContextData(source == temperature) over window:time( 1m30s )) then SituationHelper.situationDetected(drools); end ``` ---- ETAGreaterThanETT ```java= declare ETAGreaterThanETT extends Situation person: Entity @part @key container: Entity @part @key product: Entity @part @key eta: Context @part @key ett: Context @part @key end rule ETAGreaterThanETT @role(situation) @type(ETAGreaterThanETT) when RelationalContext( kind=="watch", person: parts["observer"], product: parts["observed"]) ttt: RelationalContext( kind=="EstimatedTimeToThreshold", product == parts["product"], container: parts["container"]) eta: RelationalContext( kind == "EstimatedTimeOfArrival", container == parts["container"], person == parts["person"], value!.entries["eta"] != null, ttt.value!.entries["ett"] != null, value!.entries["eta"].asNumber > ttt.value!.entries["ett"].asNumber) not ExceedingThreshold(active, this.product == product) then SituationHelper.situationDetected(drools); end ``` ---- #### Avaliação Empírica * Uma avaliação empírica da arquitetura LAURA (`Teixeira, 2018`) foi aplicada * 30 participantes avaliaram a facilidade de uso em descrever situações em SCENE-DRL </br> </br> | Factor | Avg. | SD | |------------------|------|------| | Ease-of-Use | 4.33 | 0.62 | | Usefulness | 4.73 | 0.46 | | Intention of use | 4.47 | 0.64 | --- ### Considerações * O trabalho fornece um toolkit para gerenciamento de situações baseadas em regras maduro (*battle-tested*) * A plataforma μSCENE se beneficia do SCENE toolkit em seu núcleo e oferece facilidades para o desenvolvimento de aplicações *situation-awareness* na nuvem. * Algumas características de modelos PaaS podem ser adotadas para amadurecimento da plataforma --- ### Obrigado! :wave:
{"metaMigratedAt":"2023-06-15T08:18:48.208Z","metaMigratedFrom":"YAML","title":"μSCENE uma abordagem orientada amicroserviços para desenvolvimento deaplicações de IoT sensíveis a situações","breaks":true,"description":"Apresentação da defesa de mestrado","slideOptions":"{\"theme\":\"white\",\"transition\":\"slide\",\"spotlight\":{\"enabled\":true}}","contributors":"[{\"id\":\"f68e4433-ed93-4564-a6f2-82501df0c6ce\",\"add\":25622,\"del\":11139}]"}
    492 views