proyecto smart city uma€¦ · 1. intro: relación con fiware context broker iot agents sth portal...
TRANSCRIPT
Smart CitiesTelefónica España15.07.2019
PROYECTO SMART CITY UMAFIWARE y Plataforma Thinking Cities
2
Proyecto Smart City UMA (I)
Red de Pruebas sobre Tecnologías Smart City en el campus de la Universidad de Málaga (UMA)
✓ Prueba de concepto de diferentes soluciones y
tecnologías de comunicaciones.
✓ Combinación hardware-software altamente
configurable, orientada a la investigación.
▪ Plataforma IoT
▪ Red de dispositivos (sensores, actuadores, cámaras)
▪ Firmware y programación específicos
3
Proyecto Smart City UMA (II)✓ Sensores:
▪ Temperatura / Humedad / Presión
▪ Presencia / Proximidad (beacons)
▪ Luz
▪ Radiación ambiental (tubo Geiger)
▪ Gases
▪ Estación meteorológica (lluvia, viento)
▪ Grosor de tronco
▪ Radiación solar (piranómetro)
▪ Ultrasonidos (papeleras residuos)
▪ Cámaras infrarrojas
▪ Parking
✓ Actuadores ON/OFF: ▪ Iluminación
▪ Climatización
4
Agenda Formación (4 días)
DÍA 1 (lun 15/07)
SESIÓN ALCANCE PONENTE
09:00 - 14:00 FIWARE y Plataforma Thinking Cities PLATAFORMA Telefónica
DÍAS 2 y 3 (mar 16/07 y mié 17/07)
SESIÓN ALCANCE PONENTE
09:00 - 14:00 Red de sensores WaspmoteDISPOSITIVOS Libelium14:00 - 15:00 COMIDA
15:00 - 17:00 Red de sensores Waspmote
DÍA 4 (jue 18/07)
SESIÓN ALCANCE PONENTE
09:00 - 14:00 Integración de sensores con la plataforma INTEGRACIÓN EDP
5
FIWARE y Plataforma Thinking Cities
6
Protocolo estándar
1. Intro: Plataforma basada en estándar FIWARE
LTEWiFi LoRaWAN
Sensores Actuadores Equipos Terminales
ZigBee
Thinking Cities
Sigfox
Capa estandarizada de acceso a la información para los diferentes dispositivos y tecnologías
…
Plataforma IoT
InvestigadoresProyecto 1 Proyecto 2 Proyecto 3 Proyecto n
7
1. Intro: Arquitectura Plataforma FIWARE
CONTEXT BROKER (NGSI)
Short Term Historic (STH)
Complex Event Processing (CEP)
IoT Agents
IDM
& A
uth
Measures / Commands
Other Services
Apps
Legacy Systems
3rd Party
ActuatorsIoT Sensors
Queries / Subscriptions
8
1. Intro: Interacción con el Context Broker
CONTEXT PRODUCERS CONTEXT BROKER CONTEXT CONSUMERS
suscriptions
update
update
update
2026
query
notify
notify
2026
9
1. Intro: Relación con FIWARE
ContextBroker
IoT Agents
STH Portal de Configuración
Modelo multiusuario
CEP
PEP ProxyOAuth Server
IDM Plugins extra de seguridad
Entorno y equipode soporte dedicado
Módulos adicionales de Telefónica
Thinking Cities Platform
10
1. Intro: Portal de configuración
Telefónica IoT Platform REST API Client
Facilita la gestión de:▪ Reglas del CEP▪ Subscripciones
▪ Servicios & Subservicios▪ Usuarios
▪ Entidades & Atributos▪ Dispositivos IoT
vs
11
1. Intro: Gestión multiusuario
Service
(Fiware-Service)
Subservice
(Fiware-ServicePath)
Role User
1 N
N1
admin
ServiceCustomer SubServiceCustomer
SubServiceAdmin
12
1. Intro: Servicios / Subservicios en la UMA
smart_campus_umasmart_uma
PLATAFORMA UMA
Servicios:
Subservicios: smart_city
(Red de Pruebas)
https://150.214.58.178/
formacion_uma
(Formación)
apicampusbiblio_smart
cai_umaciesc
conmetdias2p_streetqr
fraterni_labgreen_senti
hort_sostmahduma
microsolsmart_secure_ev_urban_lab
smart_treese4
usmartdrivetfg_visor_iot
…
…
13
2. API NGSI: Información de contextoCity Governance System
City Services
3rd Party apps
Attributes
• Name• Type• Value
Entity
• EntityId• EntityType
1 n
“has”
NGSI API
APPLICATION / SERVICE
Bus- Location- Nº Passengers- Driver- License Plate
Shop- Location- Business Name- Franchise- Offerings
Citizen- Name - Surname- Birthday- Preferences- Location- ToDo list
CONTEXT BROKER
14
2. API NGSI: Ejemplo de uso
GET /v2/entities/plant/attrs/humidity
Cambiando el valor del atributo
“status” a “watering” disparamos la
ejecución del proceso que inicia el
riego en el dispositivo IoT
Permite leer la humedad para
decidir cuándo regar la planta
PUT /v2/entities/plant/attrs/status/value“watering”
API NGSIAPI estándar para el manejo de información de contexto
API Restful, simplifica y acelera el desarrollo
Orion Context Broker
NGSI APINGSI API
ID de la entidadNombre del atributoValor del atributo
15
2. API NGSI: CRUD de entidadesGET /v2/entitiesObtiene todas las entidades que se hayan creado
POST /v2/entitiesCrea una entidad
GET /v2/entities/{entityID}Obtiene una entidad dado su ID
[POST|PATCH|PUT] /v2/entities/{entityID}/attrsActualiza los atributos de una entidad
DELETE /v2/entities/{entityID}Borra una entidad
POST: Actualiza y si el atributo no existe lo crea.
PATCH: Actualiza y si el atributo no existe no lo crea.
PUT: Reemplaza todos los atributos de la entidad por
los nuevos que pongamos.
16
2. API NGSI: CRUD de atributosGET /v2/entities/{entityID}/attrs/{attrName}Obtiene el dato (tipo y valor) de un atributo concreto
PUT /v2/entities/{entityID}/attrs/{attrName}Actualiza el dato (tipo y valor) de un atributo concreto
DELETE /v2/entities/{entityID}/attrs/{attrName}Borra un atributo concreto
GET /v2/entities/{entityID}/attrs/{attrName}/valueObtiene el valor de un atributo concreto
PUT /v2/entities/{entityID}/attrs/{attrName}/valueActualiza el valor de un atributo concreto
17
2. API NGSI: Envío de datos al Context Broker
Creando entidad “car” Actualizando atributo “speed”
POST {{host}}:2026/v2/entities
Content-Type: application/json
…
{
"id": "Car1",
"type": "Car",
"speed": {
"type": "Number",
"value": 98
}
}
201 Created
PUT {{host}}:2026/v2/entities/Car1/attrs/speed
Content-Type: application/json
…
{
"type": "Number",
"value": 110
}
18
2. API NGSI: Consulta de datos del Context BrokerConsultando atributo “speed”
GET {{host}}:2026/v2/entities/Car1/attrs/speed
200 OK
Content-Type: application/json
…
{
"type": "Number",
"value": 110,
"metadata": {}
}
19
2. API NGSI: Modelo de datos completo
Attributes
• Name• Type• Value
Entity
• EntityId• EntityType
1 n
“has”
Metadata
• Name• Type• Value1 n
“has”
Uso de metadatos:
Amplían y/o particularizan la información de cada atributo
"id": "Car1",
"type": "Car",
"speed": {
"type": "Number",
"value": 110,
"metadata": {
"unit": {
"type": "Text",
"value": "km/h"
}
}
}
20
3. Modelo de datos armonizados
En todos los sectores
Propuestas a través de GitHub
Superconjunto de los modelos de la GSMA
Enlaces con los modelos de datos
https://www.fiware.org/developers/data-models
https://fiware-datamodels.readthedocs.io/
https://github.com/Fiware/dataModels
https://www.gsma.com/iot/wp-content/uploads/2016/11/CLP.26-v1.0.pdf
Alertas Transporte
Parking Residuos
AlumbradoPúblico
MedioAmbiente
21
Elementos involucrados● IDM: Provee la identificación del usuario● PEP: Proxy que deja pasar las peticiones● PDP: Contiene los roles y permisos de los
distintos usuarios
Pasos:
1. Login en IDM con usuario y contraseñapara obtener un token (válido por 1 hora).
2. Hacer la petición al Context Broker a travésdel PEP facilitando el token.
4. Seguridad: Arquitectura
IDM
PEP
Proxy
App
1
2
Similar al modelo Oauth (utilizado por Google, Facebook, etc)
22
4. Seguridad: Obtener token del IDM (I)POST /v3/auth/tokens
Host: {{host}}:{{idm_port}}
Content-Type: application/json
{ “auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"domain": {
"name": "{{service}}"
},
"name": "{{user}}",
"password": "{{password}}"
}
}
},
"scope": {
"project": {
"domain": {
"name": "{{service}}"
},
"name": "{{subservice}}"
}
}}}
HTTP/1.1 201 Created
Server :nginx
Date :Wed, 03 Apr 2019 11:24:30 GMT
Content-Type :application/json
Content-Length :840
Connection :keep-alive
X-Subject-Token :b2a955dbb2c74caca59bf0bbdf1a44df
Vary :X-Auth-Token
X-Openstack-Request-Id :req-a662643f-72d3-4325-832e-b88cdfe51f08
X-Frame-Options :SAMEORIGIN
Strict-Transport-Security :max-age=31536000; includeSubdomains;
X-Content-Type-Options :nosniff
Cache-Control :no-cache, no-store, max-age=0, must-revalidate
Pragma :no-cache
Expires :0
X-XSS-Protection :1; mode=block
Referrer-Policy :same-origin
...
23
4. Seguridad: Obtener token del IDM (II)
24
5. Subscripciones: Flujo
Context BrokerUpdate Entity Notification
Registro de subscripción
POST /v2/subscriptions
POST /v2/entities POST myHTTPServerwww.putsreq.com
Webhook (Callback HTTP)
http://telefonicaid.github.io/fiware-orion/api/v2/stable/ (Apartado Subscriptions)
25
5. Subscripciones: CRUD
Operaciones sobre la lista de subscripciones:
● Obtener subscripciones: GET /v2/subscriptions
● Crear nueva subscripción: POST /v2/subscriptions
Operaciones sobre una subscripción concreta (ID de susbcripción):
● Leer: GET /v2/subscriptions/subscriptionId
● Modificar: PATCH /v2/subscriptions/subscriptionId
● Borrar: DELETE /v2/subscriptions/subscriptionId
26
5. Subscripciones: Herramientas de depuración
Permiten ver el contenido enviado por las notificaciones.
Algunas utilidades web gratuitas:
● webhook.site
● requestbin.net
● putsreq.com
27
5. Subscripciones: Registro y envío de notificaciónPOST /v2/subscriptions HTTP/1.1
Host: {{host}}:{{cb_port}}
Fiware-Service: {{service}}
Fiware-ServicePath: {{subservice}}
X-Auth-Token: {{token}}
Content-Type: application/json
{
"description": "A subscription to get info about myEntity",
"subject": {
"entities": [
{
"id": "myEntity",
"type": "myType"
}
],
"condition": {
"attrs": [ ]
}
},
"notification": {
"http": {
"url": "https://webhook.site/6a29954a-1a55-43c2-8dd0-3a9c7f4d23b5"
},
"attrs": ["temperature"],
"attrsFormat": "normalized"
}
}
POST /aGSZ2hnoTXRaO4JHZNY1 HTTP/1.1
Host: putsreq.com
Fiware-Service: smart_uma
Fiware-ServicePath: /formacion_uma
X-Auth-Token: 077ceb500f34419e87c5776e17f86605
Content-Type: application/json
NGSIV2-ATTRSFORMAT: normalized
CONTENT-LENGTH: 146
{
"subscriptionId": "5c90d94515853173859be497",
"data": [
{
"id": "myEntity",
"type": "myType",
"temperature": {
"type": "Number",
"value": 26,
"metadata": {}
}
}
]
}
Ejemplo de subscripción
Ejemplo de notificación
"legacy"→ NGSIv1"normalized"→ NGSIv2
Para obtener todos los ids de un determinado tipo habría que poner: "id" : ".*"
La notificación puede configurarse en
NGSIv1 o NGSIv2 dependiendo del
valor establecido en "attrsFormat".
Actualmente, si la subscripción se
crea o edita desde el portal web, se
establece por defecto en formato
NGSIv1 aunque es posible modificarlo
con POSTMAN.
28
5. Subscripciones: Condiciones
POST /v2/subscriptions HTTP/1.1
Host: {{host}}:{{cb_port}}
Fiware-Service: {{service}}
Fiware-ServicePath: {{subservice}}
X-Auth-Token: {{token}}
Content-Type: application/json
{
"description": "A subscription to get info about myEntity",
"subject": {
"entities": [{
"id": "myEntity",
"type": "myType"
}],
"condition": {
"attrs": ["temperature"],
"expression": {"q": "temperature<10;temperature>0"}
}
},
"notification": {
"http": {"url": "https://webhook.site/6a29954a-1a55-43c2-8dd0-3a9c7f4d23b5"},
"attrs": ["temperature"]
}
}
Permiten enviar la notificación sólo
cuando se cumple una determinada
condición:
● attrs: cuando se actualiza alguno de los
atributos especificados en el campo attrs.
● expression: cuando se cumple la
expresión especificada. Tipos de
expresiones: q, mq, georel, geometry y
coords
29
5. Subscripciones: Custom Notificacions
Permiten modificar el contenido
de los headers y payload de la
notificación
● Uso del patrón ${..} para sustituir por
los datos de la entidad
● Uso del campo httpCustom en vez del
campo http en la creación de la
subscripción. Permite modificar
método, cabeceras y contenido de la
petición (no tiene por qué ser JSON).
POST /v2/subscriptions HTTP/1.1
Host: {{host}}:{{cb_port}}
Fiware-Service: {{service}}
Fiware-ServicePath: {{subservice}}
X-Auth-Token: {{token}}
Content-Type: application/json
{
"description": "Custom payload example",
"subject": {
"entities": [ {"id": "myEntity", "type": "myType"} ],
"condition": {"attrs": [ ]}
},
"notification": {
"httpCustom": {
"url": "https://webhook.site/6a29954a-1a55-43c2-8dd0-3a9c7f4d23b5",
"headers": {"MyHeader": "MyValue“},
"method": "POST",
"payload": "La temperatura de la entidad %22${id}%22 es: ${temperature} grados C"
},
"attrs": ["temperature"]
}
}
30
5. Subscripciones: Custom NotificacionsEjemplo:
…
"httpCustom": {
"url": "http://foo.com/entity/${id}",
"headers": {
"Content-Type": "text/plain"
},
"method": "PUT",
"qs": {
"type": "${type}"
},
"payload": "The temperature is ${temp} degrees"
}
…
PUT http://foo.com/entity/DC_S1-D41?type=Room
Content-Type: text/plain
Content-Length: 31
The temperature is 23.4 degrees
PUT /v2/entities/DC_S1-D41/attrs/temp/value?type=Room
…
23.4
Creación de la Custom Notification
update
notification
31
5. Subscripciones: Estado de las notificaciones
La información detallada está en el elemento notification con los siguientes campos:
● timesSent: número total de intentos (fallidos y satisfactorios)
● lastSuccess: última vez que se notificó con éxito
● lastFailure: última vez que hubo un fallo en la notificación
● lastNotification: última vez que se envió una notificación (con o sin éxito)
200 OK
Content-Type: application/json
…
[{
"id": " 51c0ac9ed714fb3b37d7d5a8 ",
"expires": "2026-04-05T14:00:00.00Z",
"status": "failed",
"subject": { … },
"notification": {
"timesSent": 3,
"lastNotification": "2016-05-31T11:19:32.00Z",
"lastSuccess": "2016-05-31T10:07:32.00Z",
"lastFailure": "2016-05-31T11:19:32.00Z",
…
}
}]
Status failed significa que el último intento de notificación ha fallado.
32
6. IoT Agent: Arquitectura
Ventajas
● No necesitan ir securizados (o puedenusar otro tipo de securización)
● Emplean protocolos IoT
● Proveen una capa de abstracción (mapeode parámetro con atributo)
● Permite gestionar grupos de dispositivoscomunes (grupos de provisionamiento) Grupo de prov 1
DEV
Grupo de prov 2
DEV
Grupo de prov 3
DEV...
Ultralight 2.0 JSON Sigfox
Los IoT Agents traducen el protocolo que hablan los dispositivos a NGSI
33
6. IoT Agent: Protocolos disponibles en la UMA
● Ultralight 2.0 (transporte HTTP o MQTT)https://fiware-iotagent-ul.readthedocs.io/
● JSON (transporte HTTP o MQTT)https://fiware-iotagent-json.readthedocs.io/
● SigFoxhttps://github.com/telefonicaid/sigfox-iotagent
34
6. IoT Agent: Tipos de Mensajes
Active Attributes Lazy Attributes
Commands
35
6. IoT Agent: Grupos de provisionamiento
Al crear un grupo de provisionamiento se
especifica:
● Protocolo
● Apikey
● Mapeo de atributos
● Autoprovisionamiento de entidades
POST /iot/services HTTP/1.1
Host: {{host_iota}}:{{iota_port}}
Fiware-Service: {{service}}
Fiware-ServicePath: {{subservice}}
X-Auth-Token: {{token}}
Content-Type: application/json
{
"services": [
{
"attributes": [],
"static_attributes": [],
"apikey": "AAFF9977",
"protocol": [
"IoTA-UL"
],
"entity_type": "lamp"
}
]
}
36
6. IoT Agent: Provisión de dispositivosPOST /iot/devices HTTP/1.1
Host: {{host_iota}}:{{iota_port}}
Fiware-Service: {{service}}
Fiware-ServicePath: {{subservice}}
X-Auth-Token: {{token}}
Content-Type: application/json
{"devices": [
{ "device_id": "id_sen1",
"entity_name": "myEntity",
"entity_type": "myType",
"attributes": [
{ "object_id": "t", "name": "temperature", "type": "Number" },
{ "object_id": "h", "name": "humidity", "type": "Number" }
],
"lazy":[{ "object_id": "l", "name": "luminosity", "type": "Number" }
],
"commands": [{ "object_id": "c", "name": "cmd", "type": "command" }
],
"static_attributes": [{ "name": "serialID", "type": "Text", "value":"02598347" }
],
"protocol": "IoTA-UL",
"transport": "HTTP"
}]}
37
6. IoT Agent: Transformación de medidasOperaciones numéricas: multiplicar (‘*’), dividir (‘/’),
sumar (‘+’), restar (‘-’), negar (‘-’), potencia (‘^’)
Operaciones de cadena:
● Concatenar ('#'):
● Localización de substrings (indexOf(<variable>,
<substring>)): devuelve el índice de la 1º
coincidencia de <substring> en la cadena
<variable>.
● substring (substr(<variable>, <start> <end>)):
● Eliminar espacios en blanco (trim(<string>)):
https://iotagent-node-
lib.readthedocs.io/en/latest/expressionLanguage/index.html
POST /iot/devices HTTP/1.1
Host: {{host_iota}}:{{iota_port}}
Fiware-Service: {{service}}
Fiware-ServicePath: {{subservice}}
X-Auth-Token: {{token}}
Content-Type: application/json
{"devices": [
{"device_id": "id_sen1",
"entity_name": "myEntity",
"entity_type": "myType",
"attributes": [
{ "object_id": "t",
"name": "temperature",
"type": "Number"
},
{ "name": "humidity",
"type": "Number",
"expression":"${@h*100}"
},
{ "name": "location",
"type": "geo:point",
"expression":"${@latitude}, ${@longitude}"
}
],
"protocol": "IoTA-UL",
"transport": "HTTP"
}]}
38
6. IoT Agent: Envío de datos con Ultralight 2.0HTTP POST:
http://{{host_iota}}:{{ul_port}}/iot/d?k={{UL_apikey}}&i=id_dev1
Headers:
{Content-Type: text/plain; Fiware-Service: {{service}}; Fiware-ServicePath: {{subservice}} }
Payload:
2019-07-01T15:15Z|t|25#h|80
Payload
▪ Si las medidas tienen diferente TimeInstant (formato ISO 8601), usar como separador la “#”:
<fecha_medida1>|<param1>|<valor>#<fecha_medida2>|<param2>|<valor> …
▪ Si las medidas comparten el mismo TimeInstant, usar como separador la “|”:
<fecha_medida>|<param1>|<valor>|<param2>|<valor> …
▪ Si no se especifica el TimeInstant de la medida se coge la fecha y hora del sistema. En este caso, se puede
usar como separador tanto la “|” como la “#”:
<param1>|<valor>|<param2>|<valor> … ò <param1>|<valor>#<param2>|<valor> …
39
6. IoT Agent: Envío de comandos con Ultralight 2.0
{
"devices": [ {
"device_id": “id_sen",
"entity_name": “myEntity",
"entity_type": “myType",
"protocol":"IoTA-UL",
"transport": "HTTP“,
...
"commands": [{
"name": “cmd",
"type": "command"
}]
...
} ]
}
PUT /v1/contextEntities/type/myType/id/myEntity/attributes/cmd
Fiware-Service:{{service}}
Fiware-ServicePath:{{subservice}}
X-Auth-Token:{{token}}
Content-Type:application/json
{
"value":{
"sleep": "10min“
},
"type": "command“
}
Provisionamiento (IOTA) Escritura comando (Context Broker)POST /iot/d?k={{UL_apikey}}&i=id_sen&getCmd=1
HTTP/1.1
Host: {{host_iota}}:{{UL_port}}
Content-Type: text/plain
2019-07-12T00:35:30Z|h|60|t|31.5
200 OK
id_sen@cmd|sleep=10min
Lectura (Dispositivo)
● El dato se envía al dispositivo cuando éste manda un nuevo update a la plataforma.
● Si el dispositivo tuviera un servidor de peticiones se podría configurar una URL de envío (no es común en IoT)
40
7. Uso Avanzado del Context Broker
• Operaciones batch• Filtrado de entidades• Geo-localización• Soporte de fechas• Paginación
• Federación & proveedores de contexto
41
7. Uso Avanzado: Operaciones batch
Posibles operaciones:
● Update: Crea, actualiza o borra una lista de entidades en
una sola petición.
● Query: Permite hacer una búsqueda avanzada.
● Notify: Envía o consume el payload de notificaciones
ENTRANTES y lo persiste. Sirve para sincronizar los datos
entre distintos Context Brokers (Federación)
POST /v2/op/updateConten-Type: application/json... {
"actionType": "APPEND","entities": [
{"id": "Room1","type": "Room","temperature": {"value": 21.2,"type": "Number" }},
{ "id": "Room2","type": "Room","temperature": { "value": 31.8, "type": "Number"}}
]}
http://fiware.github.io/specifications/ngsiv2/stable/ ( Apartado Batch Operations)
42
7. Uso Avanzado: Filtrado de entidades (I)Tipos de filtros
Para la operación GET /v2/entities:
● Por tipo de entidad: GET <cb_host>:<cb_port>/v2/entities?type=Room
● Por ID: GET <cb_host>:<cb_port>/v2/entities?id=Room1,Room2
● Por patrón de ID (regex): GET <cb_host>:<cb_port>/v2/entities?idPattern=^Room[2-5]
● Por patrón de tipo (regex): GET <cb_host>:<cb_port>/v2/entities?typePattern=T[ABC]
● Por valor de atributo (q): GET <cb_host>:<cb_port>/v2/entities?q=temperature>25
● Por valor de metadata (mq): GET <cb_host>:<cb_port>/v2/entities?mq=temperature.avg>25
● Por ubicación geográfica
● Se pueden anidar varios filtros (como una condición AND)
43
7. Uso Avanzado: Filtrado de entidades (II)Operadores
● Equal (==) Busca la coincidencia exacta. Se puede usar en combinación con:
○ Un sólo elemento: ?q=temperature==40
○ Valores separados por comas: ?q=color==black,red
○ Rangos: ?q=temperature==10..20
● Unequal (!=) Se pueden hacer búsquedas por elemento, valores separados o rango.
● Greater than (>)
● Less than (<)
● Greater or equal than (>=)
● Less or equal than (<=)
● Match pattern: (~=) Patron regex para string.
○ Ej: ?q=color~=ow. Encontraría los colores brown and yellow
http://fiware.github.io/specifications/ngsiv2/stable/ (Apartado Simple Query Language)
44
7. Uso Avanzado: Datos geoespaciales
Tipos de atributos geospaciales
● geo:point
● geo:line
● geo:box
● geo:polygon
● geo:json
http://fiware.github.io/specifications/ngsiv2/stable/
(Apartado Geospatial properties of entities)
POST /v2/entities
{
"type": "City",
"id": "Madrid",
"position": {
"type": "geo:point",
"value": "40.418889, -3.691944"
}
}
POST /v2/entities
{
"type": "City",
"id": "Barcelona",
"position": {
"value": {
"type": "Point",
"coordinates": [2.186447514, 41.3763726]
},
"type": "geo:json"
}
}
45
7. Uso Avanzado: Geoqueries● Georel: Identifica la relación espacial entre la referencia (geometry) y las entidades sobre las que se
va a hacer la búsqueda. Puede ser del tipo:
○ georel=near: Busca entidades a una determinada distancia. Soporta los modificadores:
■ maxDistance: Dentro del círculo
■ minDistance: Fuera del círculo
○ georel=coveredBy: Puntos dentro de un polígono
○ georel=intersects: Dos polígonos intersectan
○ georel=equals: Dos polígonos son idénticos
○ georel=disjoint: No intersectan
● Geometry: Es la referencia a la figura sobre la que se resuelve la query. Puede ser de tipo:
○ geometry=point: define un punto (posición geográfica)
○ geometry=line: define una línea
○ geometry=polygon: define un polígono
○ geometry=box: define un cuadrado delimitador
Ejemplo: &georel=coveredBy&geometry=polygon&coords=25.774,-80.190;18.466,-66.118;32.321,-64.757;25.774,-80.190
46
7. Uso Avanzado: Geoqueries
47
7. Uso Avanzado: Geoqueries
GET /v2/entities?georel=near;maxDistance:13500&geometry=point&coords=40.418889,-3691944
48
7. Uso Avanzado: Geoqueries
GET /v2/entities?georel=near;minDistance:13500&geometry=point&coords=40.418889,-3691944
49
7. Uso Avanzado: Soporte de fechas
Basado en ISO8601 y con un tipo de atributo reservado: DateTime
Permite hacer búsquedas por fechas:
GET /v2/entities?q=birthDate<1985-01-01T00:00:00
Las entidades y los atributos tienen fecha de modificación y
de creación. Se pueden consultar con las siguientes queries:
GET /v2/entities/myEntity?options=dateModified,dateCreated
GET /v2/entities/myEntity?attrs=dateModified,dateCreated
GET /v2/entities/myEntity?metadata=dateModified,dateCreated
Más detalles en: https://fiware-orion.readthedocs.io/en/master/user/ngsiv2_implementation_notes/index.html#datetime-support
POST /v2/entities…{"id": "John","birthDate": {"type": "DateTime","value": "1979-10-14T07:21:24.238Z"
}}
Ejemplo: entidad John, con atributo birthDate usando el tipo DateTime
50
7. Uso Avanzado: Paginación
Cuando se tienen grandes conjuntos de datos, ayuda a dividir y obtener la información en diferentes
bloques/peticiones.
Cuatro parámetros:
● limit: Números de elementos por página (por defecto 20, máximo 1000)
● offset: Números de elementos a saltar (desde el principio)
● count (opcional): Devuelve sólo el número total de elementos de la petición
● orderBy (opcional): Atributos por los que se puede ordenar los resultados
○ Por defecto se ordenan por fecha de creación
○ Se pueden usar los atributos especiales dateCreated y dateModified
GET /v2/entities?limit=20&offset=0&orderBy=temp,!humidity
51
7. Uso Avanzado: Proveedores de contextoApplication
Context Broker
Context Provider
1. registerContext(provider= )
db
2. query 3. query
4. data5. dataContext
Consumer
http://fiware.github.io/specifications/ngsiv2/stable/ (Apartado Registrations)
52
Referencias
✓ Documentación de la plataforma Thinking Cities:
▪ https://thinking-cities.readthedocs.io/
✓ Modelos normalizados FIWARE
▪ https://fiware-datamodels.readthedocs.io/
✓ Especificación FIWARE NGSIv2
▪ http://fiware.github.io/specifications/ngsiv2/stable/
✓ Orion Context Broker
▪ https://fiware-orion.readthedocs.io/
✓ IoT Agent UL2.0
▪ https://fiware-iotagent-ul.readthedocs.io/
53
ANEXOS
54
HTTP
Códigos de respuesta1xx: Respuestas informativas. Indica que la petición ha sido recibida y se está procesando.2xx: Respuestas correctas. Indica que la petición ha sido procesada correctamente.3xx: Respuestas de redirección. Indica que el cliente necesita realizar más acciones para finalizar la petición.4xx: Errores causados por el cliente. Indica que ha habido un error en el procesado de la petición a causa de que el cliente ha hecho algo mal.5xx: Errores causados por el servidor. Indica que ha habido un error en el procesado de la petición a causa de un fallo en el servidor.
Método Acción
GET Obtiene un recurso
POST Envía datos por el cuerpo
PUT Sube un recurso o fichero (más eficiente
que post)
DELETE Elimina un recurso
55
HTTP
56
CONTEXT BROKER (NGSI)
IoT Agent Manager
IoT Agent UL 2.0
…IoT Agent JSON
• Crear nuevo IoT Agent (con otro protocolo)• Provisionar configuración dispositivo lógico• Consultar dispositivos provisionados
Puerto 8088
device_ID: sensor1
Protocolo: UL 2.0
Transporte: HTTP
Entidad: entity1
Parámetros → atributos:
t → temperature
h→ humidity
…Puerto 8085
UL_apikey
Payload:
t|25#h|80
device_ID: sensor2
Protocolo: JSON
Transporte: HTTP
Entidad: entity2
Parámetros → atributos:
temp → temperature
humid → humidity
sensor1 sensor2
Puerto 8185JSON_apikey
Payload:
{
"temp": 4,
"humid": 31.5
}
{
"id": "entity1",
"type": "myType",
"temperature": {
"type": "Number",
"value": 25
},
"humidity": {
"type": "Number",
"value": 80
}
}
{
"id": "entity2",
"type": "myType",
"temperature": {
"type": "Number",
"value": 4
},
"humidity": {
"type": "Number",
"value": 31.5
}
}
HTTP / MQTT
IDAS
57
Plataforma UMA: Datos de acceso
Servicio Host Puerto
Identity Manager (IDM) https://150.214.58.178/ 6001
Context Broker* (API NGSI) https://150.214.58.178/ 2026
IoT Agent Manager https://150.214.58.178/ 9082
IoT Agent Ultralight 2.0 https://150.214.58.178/ 7896
* Realmente lo que atacamos en el puerto 2026 es el PEP Proxy