def register(self):
        # Comprobar expiración del token
        tokens.server_token().exp_token()

        # Mensaje post a enviar
        payload = "{\"message\":\"" + self.config[
            'MESSAGE'] + "\",\"menu\":" + self.config[
                'MENU'] + ",\"client_id\":\"" + self.config[
                    'CLIENT_ID'] + "\",\"address\":\"" + self.config[
                        'ADDRR'] + "\",\"canUse\":[" + self.config[
                            'CANUSE'] + "]}"

        # Disposición de Headers
        token = tokens.server_token().get_tokenDB()

        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + token['Data']['id_token'],
            'Content-length': str(len(payload))
        }

        # Conexión con el dispatcher
        data = client.peticion("POST", self.config['HOSTNAME'],
                               self.config['PORT'],
                               self.config['NEW_FUNCTIONALITY'], payload,
                               headers, self.config['RUTA_CERT'])
        print(data)
    def deregister(self):
        # It checks expiration time of the token
        tokens.server_token().exp_token()

        # It obtains the token
        token = tokens.server_token().get_tokenDB()

        # It deletes the funcionality in the database
        data = requests.delete(
            self.config['DELETE_FUNCTIONALITY'] + "?client_id=" +
            self.config['CLIENT_ID'],
            headers={'Authorization': 'Bearer ' + token['Data']['id_token']},
            verify=self.config['RUTA_CERT'])
        print(data.content)
Example #3
0
    def get_user_data(self, user_number):
        # It checks expiration time of the token
        tokens.server_token().exp_token()

        # It obtains the token
        token = tokens.server_token().get_tokenDB()

        # Connection with the API gateway
        data_DB = requests.post(self.config['DB_REQUEST'], json={"url": "users/_find?criteria={\"id_signal\":\""+
        user_number+"\"}", "data": None}, headers={'Authorization': 'Bearer ' + token['Data']['id_token']}, verify=
        self.config['RUTA_CERT'])

        # It obtains the patient data
        return data_DB.json()['results'][0]
Example #4
0
def update_image(location, data): #localización base de datos
    #Disposición de Headers
    token = tokens.server_token().get_tokenDB()
    headers['Authorization'] = 'Bearer ' + token['Data']['id_token']

    #Mensaje a enviar
    data['basedOn'] = [{"identifier" : {"use": "temp",
                                        "value": "Procedure_Monitorizacion_Psoriasis",
                                        "assigner": "UNIZAR"
                                        }}]
    data['device'] = {"identifier": { "use": "temp",
                                      "value": "Procesado_imagen",
                                      "assigner": "UNIZAR"
                                      }}
    payload = json.dumps(data)

    #Petición put a la base de datos para actualizar el recurso
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
    conn.request('PUT', config['URL_FHIR']+location, payload, headers)
    r = conn.getresponse()
    header = r.getheaders()
    #print(header)
    data = r.read()
    print(r.status, r.reason, 'DB_FHIR Operation Update image')
    data = json.loads(data)
    print(data)

    conn.close()
Example #5
0
def get_image(location, user): #localización base de datos, nombre de usuario como identificador
    #Disposición de Headers
    token = tokens.server_token().get_tokenDB()
    headers['Authorization'] = 'Bearer ' + token['Data']['id_token']
    
    #Petición get a la base de datos
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
    conn.request('GET', config['URL_FHIR']+location, headers=headers)
    r = conn.getresponse()
    header = r.getheaders()
    #print(header)
    data = r.read()
    print(r.status, r.reason, 'DB_FHIR Operation GET image')
    data = json.loads(data)
    #print(data)
    
    conn.close()
    
    #La imagen está codificada en base64
    imagen = base64.b64decode(data['content']['data'])
    
    #La imagen se almacena para su tratamiento
    file = open('imagenes/' + user + '/reciv.jpg','wb')
    #file = open('imagenes/'+user+'.jpg','wb')#para pruebas
    file.write(imagen)
    file.close()
    return data
Example #6
0
    def change_user_data(self, user_number, data_user):
        # It checks expiration time of the token
        tokens.server_token().exp_token()

        # POST message to send
        data_user = json.dumps(data_user)
        data_user = data_user.replace('"','\"')
        
        # It obtains the token
        token = tokens.server_token().get_tokenDB()
        
        # Connection with the API gateway
        resp = requests.post(self.config['DB_REQUEST'], json={"url": "users/_update", "data": "criteria={\"id_signal\": "
                                "\""+user_number+"\"}&newobj="+data_user},
                                headers={'Authorization': 'Bearer ' + token['Data']['id_token']}, verify=
                                self.config['RUTA_CERT'])
        print(resp)
Example #7
0
def do_get(url):
    token_p = tokens.server_token().get_tokenDB()

    r = requests.get(
        url,
        headers={'Authorization': 'Bearer ' + token_p['Data']['id_token']},
        verify=config['RUTA_CERT'])
    if debug <= 0:
        print(r.status_code, 'Get Mensaje recibido')

    return r
    def register(self):
        # It checks expiration time of the token
        tokens.server_token().exp_token()

        # It obtains the token
        token = tokens.server_token().get_tokenDB()

        # It adds the functionality in the database
        data = requests.post(
            self.config['NEW_FUNCTIONALITY'],
            json={
                "client_id": self.config['CLIENT_ID'],
                "message": self.config['MESSAGE'],
                "menu": self.config['MENU'],
                "address": self.config['ADDRR'],
                "canUse": [self.config['CANUSE']]
            },
            headers={'Authorization': 'Bearer ' + token['Data']['id_token']},
            verify=self.config['RUTA_CERT'])

        print('Registration: ', data.content)
    def deregister(self):
        # Comprobar expiración del token
        tokens.server_token().exp_token()

        # Mensaje post a enviar
        payload = "{\"client_id\":\"" + self.config['CLIENT_ID'] + "\"}"

        # Disposición de Headers
        token = tokens.server_token().get_tokenDB()

        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + token['Data']['id_token'],
            'Content-length': str(len(payload))
        }

        # Conexión con el dispatcher
        data = client.peticion("DELETE", self.config['HOSTNAME'],
                               self.config['PORT'],
                               self.config['DELETE_FUNCTIONALITY'], payload,
                               headers, self.config['RUTA_CERT'])
        print(data)
Example #10
0
def do_post_reenviar(url, body):

    token_p = tokens.server_token().get_tokenDB()

    payload = bytes(json.dumps(body), 'utf-8')
    header = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + token_p['Data']['id_token'],
        'Content-length': str(len(payload))
    }
    r = requests.post(url,
                      json.dumps(body),
                      headers=header,
                      verify=config['RUTA_CERT'])
    if debug <= 0:
        print(r.status_code, 'Mensaje enviado')
    if not str(r.status_code).startswith('2'):
        print(r.content)
        print('URL', r.url)
    return r
Example #11
0
def do_post(url, body, attachment, data):
    token_p = tokens.server_token().get_tokenDB()

    # It avoids errors with the URL (% and +)
    body = urllib.parse.quote(body.encode('UTF-8'))

    AppResp = message.AppResp
    if not body:
        AppResp['message']['body'] = None
    else:
        AppResp['message']['body'] = body
    if not attachment:
        AppResp['message']['attachments'] = None
    else:
        AppResp['message']['attachments'] = attachment

    AppResp['user'] = data['user']
    AppResp['platform'] = data['platform']
    AppResp['message']['timestamp'] = int(time.time())
    payload = bytes(json.dumps(AppResp), 'utf-8')
    header = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + token_p['Data']['id_token'],
        'Content-length': str(len(payload))
    }
    try:
        r = requests.post(url,
                          json.dumps(AppResp),
                          headers=header,
                          verify=config['RUTA_CERT'])
    except:
        print('ERROR AL ENVIAR MENSAJE')
        return '400'
    else:
        if debug <= 0:
            print(r.status_code, 'Mensaje enviado')
        if not str(r.status_code).startswith('2'):
            print(r.content)
            print('URL', r.url)
    return r
Example #12
0
def device_update_DB(estado): #active, inactive
    #Disposición de Headers
    token = tokens.server_token().get_tokenDB()
    headers['Authorization'] = 'Bearer ' + token['Data']['id_token']

    #Mensajes a enviar
    ##Device
    payload = {"resourceType": "Device",
               #"id": "776", #sujeto a cambios en el DB
               "identifier": [{ "use": "temp",
                                "value": "Procesado_imagen",
                                "assigner": "UNIZAR"
                                }],
               "status": estado,# active | inactive | entered-in-error | unknown
               "type" : { "coding": [{"system": "http://snomed.info/sct",
                                      "code": "701654001",
                                      "display": "Self-care monitoring web-based application software"
                                      }],
                          "text": "Aplicación móvil de monitoirzación"
                          },
               "version": "1.0",
               "contact": [{ "system": "email",
                             "value": "*****@*****.**"
                             }],
               "url": "https://procesado.ehealthz.es",
               "note": [{"authorString" : "Daniel Vicente Moya",
                         "time" : "2018-04-25T13:52:07+02:00",
                         "text": "Device en estado de desarrollo y pruebas"
                         }]
               }
    payload = json.dumps(payload)
    
    ##DeviceMetric
    if estado == "active":
        status = "on"
    elif estado == "inactive":
        status = "off"
    else:
        status = "entered-in-error"
    
    payload2 = {"resourceType" : "DeviceMetric",
                #"id": "777", #sujeto a cambios en el DB
                "identifier" : {"use": "temp",
                                "value": "Procesado_imagen_Metric",
                                "assigner": "UNIZAR"
                                },
                "type" : {"coding":[{"system": "urn:iso:std:iso:11073:10101",
                                     "code": "_BSA",
                                     "display": "Body Surface Area"
                                     }],
                          "text": "Área superficie del cuerpo"
                          },
                "unit" : {"coding":[{"system": "http://unitsofmeasure.org",
                                     "code": "cm2",
                                     "display": "square centimeter"
                                     }],
                          "text": "centímetros cuadrados"
                          },
                "source" : {"identifier": { "use": "temp",
                                            "value": "Procesado_imagen",
                                            "assigner": "UNIZAR"
                                            }},
                #"parent" : {"reference": "Procesado_imagen_Component"},
                "operationalStatus" : status, # on | off | standby | entered-in-error
                "color" : "red",
                "category" : "measurement"
                }
    payload2 = json.dumps(payload2)

    #Petición put a la base de datos para actualizar recursos
    ##Device
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
    conn.request('PUT', config['URL_FHIR']+"Device?identifier:value=Procesado_imagen", payload, headers)#La id del Device puede estar sujeta a cambios (se recomienda comporbaren el DB)
    r = conn.getresponse()
    header = r.getheaders()
    data = r.read()
    print(r.status, r.reason, 'DB_FHIR Update Device')
    data = json.loads(data)
    print(data)

    ##DeviceMetric
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
    conn.request('PUT', config['URL_FHIR']+"DeviceMetric?identifier:value=Procesado_imagen_Metric", payload2, headers) #La id del DeviceMetric puede estar sujeta a cambios (se recomienda comporbaren el DB)
    r = conn.getresponse()
    header = r.getheaders()
    data = r.read()
    print(r.status, r.reason, 'DB_FHIR Update DeviceMetric')
    data = json.loads(data)
    print(data)
    
    conn.close()
Example #13
0
def post_data(data, user, patient_id):
    #Disposición de Headers
    token = tokens.server_token().get_tokenDB()
    headers['Authorization'] = 'Bearer ' + token['Data']['id_token']

    #Mensaje a enviar
    file = open('imagenes/' + user + '/contour.jpg','rb')
    image = file.read()    
    size_image = len(image)
    image = base64.b64encode(image) #paso archivo imagen a base 64
    image = str(image, 'utf-8')
    file.close()

    file = open('imagenes/' + user + '/datosDB.dat','rb')
    data_file = file.read()    
    size_data_file = len(data_file)
    data_file = base64.b64encode(data_file) #paso archivo imagen a base 64
    data_file = str(data_file, 'utf-8')
    file.close()
    
    payload = {"resourceType": "Observation",
               "basedOn": [{"identifier" : {"use": "temp",
                                            "value": "Monitorizacion_Psoriasis",
                                            "assigner": "UNIZAR"
                                            }},
                           {"identifier" : {"use": "temp",
                                            "value": "Procedure_Monitorizacion_Psoriasis",
                                            "assigner": "UNIZAR"
                                            }}
                           ],
               "status": "registered", #"preliminary"
               "code": {"coding": [{"system": "http://loinc.org",
                                    "code": "10206-1",
                                    "display": "Physical findings of Skin Narrative"
                                    },
                                   {"system": "http://unitsofmeasure.org",
                                     "code": "cm2",
                                     "display": "square centimeter"
                                     }],
                        "text": "Hallazgos fisicos sobre la piel"
                        },
               "subject": {"reference": "Patient/"+patient_id},
               "valueString": data,
               "device": {"identifier": { "use": "temp",
                                          "value": "Procesado_imagen",
                                          "assigner": "UNIZAR"
                                          }},
               "component": [{"code": {"coding": [{"system": "http://loinc.org",
                                                   "code": "10206-1",
                                                   "display": "Physical findings of Skin Narrative"
                                                   },
                                                  {"system": "http://hl7.org/fhir/digital-media-type",
                                                   "code": "photo",
                                                   "display": "Photo"
                                                   }],
                                       "text": "Hallazgos fisicos sobre la piel"
                                       },
                              "valueAttachment": {"contentType": "image/jpeg",
                                                  "data": image,
                                                  "size": size_image,
                                                  "creation": time.strftime("%Y-%m-%d"+"T"+"%I:%M:%S"+"+02:00")
                                                  },
                              },
                             {"code": {"coding": [{"system": "http://loinc.org",
                                                   "code": "10206-1",
                                                   "display": "Physical findings of Skin Narrative"
                                                   },
                                                  {"system": "http://unitsofmeasure.org",
                                                   "code": "cm2",
                                                   "display": "square centimeter"
                                                   }],
                                       "text": "Hallazgos fisicos sobre la piel"
                                       },
                              "valueAttachment": {"contentType": "application/octet-stream'",
                                                  "data": data_file,
                                                  "size": size_data_file,
                                                  "creation": time.strftime("%Y-%m-%d"+"T"+"%I:%M:%S"+"+02:00")
                                                  }
                              }]
               }
    payload = json.dumps(payload)

    #Petición post a la base de datos
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
    conn.request('POST', config['URL_FHIR']+"Observation", payload, headers)
    r = conn.getresponse()
    header = r.getheaders()
    #print(header)
    data = r.read()
    print(r.status, r.reason, 'DB_FHIR Operation Save Data')
    data = json.loads(data)
    print(data)
    
    conn.close()
def enviar(data, attach, body):
    if attach != None:
        #Codificado de la imagen en base 64
        file = open(attach, 'rb')
        data_file = file.read()
        length_image = int(len(data_file))
        data_file = base64.b64encode(data_file)
        data_file = str(data_file, 'utf-8')
        file.close()

        attachment = {}
        attachment['contentType'] = "image/jpeg"
        attachment['data'] = data_file
        attachment['size'] = length_image

        # Mensaje a enviar
        payload = {}
        payload['message'] = {}
        payload['user'] = data['user']
        payload['platform'] = data['platform']
        payload['message']['timestamp'] = int(time.time())
        payload['message']['body'] = body
        payload['message']['attachments'] = attachment
        payload = json.dumps(payload)

        payload = bytes(payload, 'utf-8')

        # Disposición de Headers
        token = tokens.server_token().get_tokenDB()
        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + token['Data']['id_token'],
            'Content-length': str(len(payload))
        }

        resp = client.peticion('POST', config['HOSTNAME'], config['PORT'],
                               config['URL_ATTACHMENT'], payload, headers,
                               config['RUTA_CERT'])
        print(resp)

    else:
        attachment = None

        # Mensaje a enviar
        payload = {}
        payload['message'] = {}
        payload['user'] = data['user']
        payload['platform'] = data['platform']
        payload['message']['timestamp'] = int(time.time())
        payload['message']['body'] = body
        payload['message']['attachments'] = attachment
        payload = json.dumps(payload)
        payload = bytes(payload, 'utf-8')

        # Disposición de Headers
        token = tokens.server_token().get_tokenDB()
        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + token['Data']['id_token'],
            'Content-length': str(len(payload))
        }

        resp = client.peticion('POST', config['HOSTNAME'], config['PORT'],
                               config['URL_MESSAGE'], payload, headers,
                               config['RUTA_CERT'])
        print(resp)
Example #15
0
def DB_procedure_request_creation():
    #Disposición de Headers
    token = tokens.server_token().get_tokenDB()
    headers['Authorization'] = 'Bearer ' + token['Data']['id_token']

    #Se comprueba si esta creado
    #Petición get a la base de datos
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
    conn.request('GET', config['URL_FHIR']+"ProcedureRequest?identifier:value=Procedure_Monitorizacion_Psoriasis", headers=headers)
    r = conn.getresponse()
    header = r.getheaders()
    #print(header)
    data = r.read()
    print(r.status, r.reason, 'DB_FHIR Operation GET ProcedureRequest')
    data = json.loads(data)
    print(data)
    
    conn.close()

    if int(data['total']) != 0:
        pass           #Si ya está creado no lo vuelve a crear.
    else:
        #Mensaje a enviar
        payload = {"resourceType": "ProcedureRequest",
                   #"id": "800",
                   "identifier" : [{"use": "temp",
                                    "value": "Procedure_Monitorizacion_Psoriasis",
                                    "assigner": "UNIZAR"
                                    }],
                   "replaces" : [{"identifier" : {"use": "temp",
                                                  "value": "Monitorización_Psoriasis",
                                                  "assigner": "UNIZAR"
                                                  }}],
                   "status" : "active",
                   "intent" : "proposal",
                   #"priority" : "routine",
                   "code": {"coding": [{"system": "http://snomed.info/sct",
                                        "code": "701654001",
                                        "display": "Self-care monitoring web-based application software"
                                        }],
                            },
                   "subject" : {"identifier": { "use": "temp",
                                                "value": "Procesado_imagen",
                                                "assigner": "UNIZAR"
                                                }},
                   "authoredOn" : time.strftime("%Y-%m-%d"+"T"+"%I:%M:%S"+"+02:00"),
                   "reasonCode" : [{"coding": [{"system": "http://snomed.info/sct",
                                                "code": "9014002",
                                                "display": "psoriasis"
                                                }]
                                    }]
                   }
        payload = json.dumps(payload)

        #Petición post a la base de datos para crear recurso
        context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
        conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
        conn.request('POST', config['URL_FHIR']+"ProcedureRequest", payload, headers)
        r = conn.getresponse()
        header = r.getheaders()
        data = r.read()
        print(r.status, r.reason, 'DB_FHIR Create ProcedureRequest')
        data = json.loads(data)
        print(data)

        conn.close()
Example #16
0
def run(server_class=http.server.HTTPServer,
        handler_class=HTTPServer_RequestHandler):
    print('Starting server...')

    # Server Configuration from file config.cfg
    config = {}
    cfg = configparser.ConfigParser()
    if not cfg.read(["config.cfg"]):
        print("File does not exist")
    if cfg.has_option("net", "ip"):  #ip
        config['ip'] = cfg.get("net", "ip")
    else:
        print("Config file need to have ip field")
    #if cfg.has_option("net", "name"): #host_name
    #    config['host_name'] = cfg.get("net", "name")
    #else:
    #    print ("Config file need to have name field")
    if cfg.has_option("net", "port"):  #port
        config['port'] = int(cfg.get("net", "port"))
    else:
        print("Config file need to have port field")
    if cfg.has_option("net", "file_key"):  #file_key
        config['file_key'] = cfg.get("net", "file_key")
    else:
        print("Config file need to have file_key field")
    if cfg.has_option("net", "file_cert"):  #file_key
        config['file_cert'] = cfg.get("net", "file_cert")
    else:
        print("Config file need to have file_cert field")
    #if cfg.has_option("net", "max_conect"): #max_conect
    #    max_conexiones = int(cfg.get("net", "max_conect"))
    #else:
    #    print ("Config file need to have max_conect field")

    # Create the kernel and learn AIML files for bot response
    bot.initialize()

    # Server settings
    server_address = (config['ip'], config['port'])
    httpd = server_class(server_address, handler_class)
    #httpd.socket.listen(max_conexiones) #Límite de clientes conectados

    # Seguridad https
    httpd.socket = ssl.wrap_socket(
        httpd.socket,
        keyfile=config['file_key'],  #keyfile = RUTA_KEY,
        certfile=config['file_cert'],  #certfile = RUTA_CERT,
        server_side=True,
    )

    # Authentication token
    tokens.server_token().get_token()

    # Registro en el dispatcher
    reg = registration.registration()
    reg.register()

    # Creación de recursos en la base FHIR si no existen
    fhir_client.DB_device_creation()
    fhir_client.DB_device_request_creation()
    fhir_client.DB_procedure_request_creation()

    # Cambio estado Device
    fhir_client.device_update_DB("active")

    # Run and Stop server
    #while True:
    try:
        #Ejecución del servidor
        httpd.serve_forever()
        #httpd.handle_request() #handle one request (while loop needed)
        print('Running server...')
        print('Server port:', port)

    except KeyboardInterrupt:
        print('Keyboard interrupt received: EXITING')

    finally:
        #Desregistro en el dispatcher
        dereg = deregistration.deregistration()
        dereg.deregister()

        #Cambio estado Device
        fhir_client.device_update_DB("inactive")

        #Apagado del servidor
        httpd.shutdown()
        httpd.server_close()
        print('Server stopped')
        return
Example #17
0
    def do_POST(self):
        # Escuchar mensajes que llegan a /message
        if self.path == "/message":
            #Conprobación del token
            decodedtoken = auth.auth_jwt(self.headers['Authorization'])
            if decodedtoken == None:
                self.send_error(401, 'Unauthorized')
                return

            #Extrae headers
            #print(self.headers)

            #Comprobación del tamaño del mensaje (evita bloqueos al recivir imágenes no deseadas)
            if int(self.headers['Content-Length']) > 500:
                self.send_error(431, 'Request Header Fields Too Large')
                return

            #Extracción del mensaje
            try:
                content_length = int(
                    self.headers['Content-Length'])  # Get data size
                post_data = self.rfile.read(int(content_length))  # Get data
                #print(post_data)

            except:
                self.send_error(411, 'Length Required')
                return

            # Operaciones si el mensaje contiene un json
            if self.headers['Content-Type'] == self.mimetypes["json"]:
                #Descompresión del json
                data = json.loads(post_data)
                #print(data)

                #Respuesta del bot
                aux = data['message']['body']
                aux = aux.split('/')

                [responsebot, microservice, tarea] = bot.response(aux[0])

                #Datos usuario para cambiar funcionalidad conectada
                user = datos_user.userDB()
                user_data = user.get_user_data(data['user'])
                #print(user_data)

                # Operación de eliminar vello
                if tarea == 'Pelo':
                    an.quitar_pelo('imagenes/' + data['user'] + '/recort.jpg',
                                   'imagenes/' + data['user'] + '/limpia.jpg')

                    #Se guarda que se hizo este proceso
                    dat_p.guardar_datos(data['user'], None, 'Pelo', None)

                elif tarea == 'No_Pelo':
                    #Se guarda que se hizo este proceso
                    dat_p.guardar_datos(data['user'], None, 'No_Pelo', None)

                #Análisis según tipo
                elif tarea == 'Gota' or tarea == 'Placa':
                    #Se cargan los datos de las operaciones realizadas
                    [area_t, pelo,
                     area_marcador] = dat_p.cargar_datos(data['user'])

                    if pelo == 'Pelo':  #Si se realizó la operación de eliminar vello
                        [area_t, area, puntos, v_pixels] = an.analisis(
                            tarea, 'imagenes/' + data['user'] + '/limpia.jpg',
                            'imagenes/' + data['user'] + '/recort.jpg',
                            'imagenes/' + data['user'] + '/keypoint.jpg',
                            'imagenes/' + data['user'] + '/contour.jpg')

                    elif pelo == 'No_Pelo':  #Si no se realizó la operación de eliminar vello
                        [area_t, area, puntos, v_pixels] = an.analisis(
                            tarea, 'imagenes/' + data['user'] + '/recort.jpg',
                            'imagenes/' + data['user'] + '/recort.jpg',
                            'imagenes/' + data['user'] + '/keypoint.jpg',
                            'imagenes/' + data['user'] + '/contour.jpg')

                    #Se guardan los datos obtenidos
                    dat_p.guardar_datosDB(data['user'], area, puntos, v_pixels)
                    dat_p.guardar_datos(data['user'], str(area_t), None, None)

                    #Se cargan los datos de las operaciones realizadas
                    [area_t, pelo,
                     area_marcador] = dat_p.cargar_datos(data['user'])

                    #Se calcula el area se psoriasis
                    #area_marcador=17000 #Para pruebas
                    area_detec = an.calc_area(area_t, area_marcador, tarea)

                    #Envio de imagenes al cliente
                    #client_m.enviar(data,'imagenes/'+data['user']+'/keypoint.jpg',None)
                    client_m.enviar(
                        data,
                        'imagenes/' + data['user'] + '/contour.jpg',
                        #'El área total detectada es:'+str(area_t))
                        'El área total detectada es:' + str(area_detec) +
                        'cm2')

                #Almacenado de datos
                elif tarea == 'Guardar':
                    #Se cargan los datos de las operaciones realizadas
                    [area_t, pelo,
                     area_marcador] = dat_p.cargar_datos(data['user'])

                    #Se calcula el area se psoriasis
                    #area_marcador=17000 #Para pruebas
                    area_detec = an.calc_area(area_t, area_marcador, tarea)

                    #Envío de datos a la base de datos
                    fhir_client.post_data(area_detec, data['user'],
                                          user_data['id'])

                # Operaciones entrada microservicio
                if microservice == 'Procesado_imagen':
                    #Envío de cambios en el perfil de usuario
                    user_data['runningFunctionality'] = 'Procesado_imagen'
                    user.change_user_data(data['user'], user_data)

                    #Creación de directorio para manejo de las imágenes de procesado del usuario
                    try:
                        os.mkdir('imagenes/' + data['user'])
                    except FileExistsError:  #Si ya existe no lo crea de nuevo y salta el mensaje de error
                        pass

                    #Obtención de la imagen a analizar
                    dt_im = fhir_client.get_image(data['message']['body'],
                                                  data['user'])
                    fhir_client.update_image(data['message']['body'], dt_im)

                    #Recorte área marcadores
                    try:
                        area_marcador = an.recorte(
                            'imagenes/' + data['user'] + '/reciv.jpg',
                            'imagenes/' + data['user'] + '/recort.jpg')
                        dat_p.guardar_datos(data['user'], None, None,
                                            str(area_marcador))
                        #print(area_marcador)
                        client_m.enviar(
                            data, 'imagenes/' + data['user'] + '/recort.jpg',
                            'Si el recorte no salió bien, puede salir y repetir.'
                        )
                    except:
                        client_m.enviar(
                            data, None,
                            'No se detectaron bien los marcadores. Salir y repetir la foto.'
                        )
                        pass

                # Operación de salida del microservicio
                elif microservice == 'Salir':
                    #Envío de cambios en el perfil de usuario
                    user_data['runningFunctionality'] = None
                    user.change_user_data(data['user'], user_data)

                    #Eliminación del directorio de imágenes del usuario
                    shutil.rmtree('imagenes/' + data['user'])

                # Mensaje a enviar
                payload = {}
                payload['message'] = {}
                payload['user'] = data['user']
                payload['platform'] = data['platform']
                payload['message']['timestamp'] = int(time.time())
                #payload['message']['body'] = "Hola"
                payload['message']['body'] = responsebot
                payload['message']['attachments'] = None
                payload = json.dumps(payload)
                payload = bytes(payload, 'utf-8')

                # Send response status code
                self.send_response(200)  #OK

                # Send headers
                token = tokens.server_token().get_tokenDB()
                self.send_header('Authorization',
                                 'Bearer ' + token['Data']['id_token'])
                self.send_header('Content-Type', self.mimetypes["json"])
                self.send_header('Content-Length', str(len(payload)))
                self.send_header('Last-Modified',
                                 self.date_time_string(time.time()))
                self.end_headers()

                # Send response
                self.wfile.write(payload)

            else:
                self.send_error(415, 'Unsupported Media Type')
                return

        else:
            # Send response status code
            self.send_response(204)  #No content
            return
def handle_message(*args, **kwargs):
    # It checks the token
    tokenHeader = request.headers.get('Authorization')
    decodedtoken = auth.auth_jwt(tokenHeader)

    AppResp = {"user": "******",
               "platform": "",
               "message":
                   {"timestamp": 0,
                    "attachments": None,
                    "body": "Default"}
               }

    if not decodedtoken:
        # Security Error; unauthorized
        abort(401)
        resp = '401'
        print('Unauthorized')

    else:
        if request.headers['Content-Type'] == 'application/json':

            # It obtains the json
            data={}
            data = json.loads(request.data.decode('utf-8'))

            # It obtains the user information in the database, passing the id (phone number)
            user = datos_user.userDB()
            user_data = user.get_user_data(data['user'])
            # It adds 'user' in the response
            AppResp['user'] = data['user']

            # Message sent by the user
            aux = data['message']['body']

            # It prevents the content of the input message from being wrong; only special characters
            aux = normalize('NFC', aux)
            aux = aux.replace('.', ' ').replace('?', ' ').replace('!', ' ')
            m = re.match('^[^a-zA-Z0-9ñ]*$', aux)
            if m:
                mensaje = 'Vaya, no te he entendido. Repítemelo por favor'
                AppResp['message']['body'] = mensaje
                resp = app.make_response(json.dumps(AppResp))
                user_data['runningFunctionality'] = config['client_id']
                user.change_user_data(data['user'], user_data)
                return resp
            if debug <= -1:
                print('NUEVA CONEXIÓN: ENTRADA', aux)
            # A log is generated with the user and the input message
            logger.info('- Origen: ' + data['user'] + ' Destino: Chatbot Message: ' + str(aux))

            # Bot response
            try:
                # It sends the input message to the AIML
                respuesta = str(kernel.respond(str(aux), data['user'])).replace('\\n', '\n').replace('\\t', '   ')
            except Warning as err:
                if debug <= 0:
                    print(err)
                # There is no match for the input message
                logger_error.exception(err)
                respuesta = 'Ups, parece que ha habido un error 😅Vuelve a intentarlo;'
                user_data['runningFunctionality'] = None
                user.change_user_data(data['user'], user_data)
            except Exception as err:
                if debug <= 0:
                    print(err)
                logger_error.exception(err)
                respuesta = 'Ups, parece que ha habido un error 😅Vuelve a intentarlo;'
                user_data['runningFunctionality'] = None
                user.change_user_data(data['user'], user_data)

            # It checks the value of the kernel task variable (indicates the function to be performed)
            oob = kernel.getPredicate('oob', data['user'])
            # If there is a tasks to be performed oob!=null
            contador_maximo = 8
            while oob and oob != 'null':
                try:
                    add_response = operacion_kernel(oob, kernel, data, logger_error)
                except Exception as err:
                    if debug <= 0:
                        print(err)
                    logger_error.exception(err)
                    respuesta = 'Ups, parece que ha habido un error 😅Vuelve a intentarlo;'
                    kernel.setPredicate('oob', '', data['user'])
                    user_data['runningFunctionality'] = None
                    user.change_user_data(data['user'], user_data)

                else:
                    respuesta = respuesta + add_response
                    respuesta = respuesta.replace('Uso interno', '')
                oob = kernel.getPredicate('oob', data['user'])
                contador_maximo = contador_maximo - 1  # To prevent errors
                if contador_maximo == 0:
                    break

            if debug <= -1:
                print('RESPUESTA KERNEL + OOB: ' + respuesta)
            # Log of the response
            logger.info('- Origen: Chatbot Destino: ' + data['user'] + ' Message: ' + str(respuesta))

            # If the message contains ';' it marks the separation between several messages
            # It sends several messages to the user
            aux = respuesta.split(';')
            token = tokens.server_token().get_tokenDB()
            for position, mensaje in enumerate(aux):
                # It sends a message to url_message
                AppResp['message']['body'] = mensaje
                # It only sends here. If there is more than one message, the last one is not sent yet
                if position + 1 is not len(aux):
                    attachment = ''
                    r = send.do_post(config['url_message'], mensaje, attachment, data)
                    time.sleep(2)
            # The last reply message is generated
            AppResp['message']['body'] = urllib.parse.quote(AppResp['message']['body'])

            # It obtains the value of the microservice variable from the kernel; used to indicate what
            # microservice the user has to run
            microservicio = kernel.getPredicate('microservicio', data['user'])

            # It changes the user functionality based on the bot response
            if microservicio == 'null':
                if debug <= 0:
                    print('Salir del microservicio')
                user_data['runningFunctionality'] = None
                # It prevents the message from being sent empty
                if not AppResp['message']['body']:
                    AppResp['message']['body'] = 'Vale, salimos.'
            else:
                user_data['runningFunctionality'] = config['client_id']
                # It prevents the message from being sent empty
                if not AppResp['message']['body']:
                    AppResp['message']['body'] = 'Ups, parece que ha habido un error 😅Vuelve a intentarlo'
                    user_data['runningFunctionality'] = None
                    if debug <= -5:
                        print(data)
                        print(AppResp['message']['body'])
                        print(AppResp['user'])

            # It changes the values of the user in the database
            user.change_user_data(data['user'], user_data)
            # It generates the response and the headers
            resp = app.make_response(json.dumps(AppResp))
            if debug <= -5:
                print(resp.data)
            resp.headers['Access-Control-Allow-Origin'] = '*'
            resp.headers['Content-Type'] = 'application/json'
            resp.headers['Authorization'] = 'Bearer ' + token['Data']['id_token']
            # It sends the response
        else:
            abort(415, 'Unsupported Media Type')
            resp = '415'
            print('Unsupported Media Type')

    return resp
    # It creates a log for connections, which stores a maximum of 60 days
    file_handler = logging.handlers.TimedRotatingFileHandler(filename, when='midnight', interval=1, encoding='utf-8',
                                                             backupCount=60)
    formatter = logging.Formatter('%(asctime)-15s %(levelname)-8s %(message)s')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)

    # Events log (errors)
    logger_error = logging.getLogger('Errors')
    fh = logging.handlers.RotatingFileHandler('logs/errors.log', maxBytes=200 * 1024, backupCount=5)
    fh.setFormatter(formatter)
    logger_error.propagate = False
    logger_error.addHandler(fh)

    # Authentication token
    tokens.server_token().get_token()

    # API gateway registration; it keeps trying until it gets an answer
    while True:
        try:
            tokens.server_token().get_token()
            # Register in the API gateway
            reg = registration.registration()
            reg.register()
            break
        except:
            time.sleep(4)
            pass
    signal.signal(signal.SIGTERM, sigterm_handler)
    logger_error.error('Server Starting...')
    try:
Example #20
0
def DB_device_creation():
    #Disposición de Headers
    token = tokens.server_token().get_tokenDB()
    headers['Authorization'] = 'Bearer ' + token['Data']['id_token']

    #Se comprueba si esta creado
    ##Device
    #Petición get a la base de datos
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
    conn.request('GET', config['URL_FHIR']+"Device?identifier:value=Procesado_imagen", headers=headers)
    r = conn.getresponse()                  #776
    header = r.getheaders()
    #print(header)
    data = r.read()
    print(r.status, r.reason, 'DB_FHIR Operation GET Device')
    data = json.loads(data)
    print(data)
    
    conn.close()

    if int(data['total']) != 0:
        pass           #Si ya está creado no lo vuelve a crear.
    else:
        #Mensajes a enviar
        ##Device
        payload = {"resourceType": "Device",
                   #"id": "776", #Se establece id fija (cambiar si está ocupada en el DB)
                   "identifier": [{ "use": "temp",
                                    "value": "Procesado_imagen",
                                    "assigner": "UNIZAR"
                                    }],
                   "status": "inactive",# active | inactive | entered-in-error | unknown
                   "type" : { "coding": [{"system": "http://snomed.info/sct",
                                          "code": "701654001",
                                          "display": "Self-care monitoring web-based application software"
                                          }],
                              "text": "Aplicación móvil de monitoirzación"
                              },
                   "version": "1.0",
                   "contact": [{ "system": "email",
                                 "value": "*****@*****.**",
                                 }],
                   "url": "https://procesado.ehealthz.es",
                   "note": [{"authorString" : "Daniel Vicente Moya",
                             "time" : "2018-04-25T13:52:07+02:00",
                             "text": "Device en estado de desarrollo y pruebas"
                             }]
                   }
        payload = json.dumps(payload)

        #Petición post a la base de datos para crear recursos
        ##Device
        context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
        conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
        conn.request('POST', config['URL_FHIR']+"Device", payload, headers)
        r = conn.getresponse()
        header = r.getheaders()
        data = r.read()
        print(r.status, r.reason, 'DB_FHIR Creation Device')
        data = json.loads(data)
        print(data)

        conn.close()

    #Se comprueba si esta creado
    ##DeviceMetric
    #Petición get a la base de datos
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
    conn.request('GET', config['URL_FHIR']+"DeviceMetric?identifier:value=Procesado_imagen_Metric", headers=headers)
    r = conn.getresponse()              #777
    header = r.getheaders()
    #print(header)
    data = r.read()
    print(r.status, r.reason, 'DB_FHIR Operation GET DeviceMetric')
    data = json.loads(data)
    print(data)
    
    conn.close()

    if int(data['total']) != 0:
        pass           #Si ya está creado no lo vuelve a crear.
    else:
        ##DeviceMetric
        payload2 = {"resourceType" : "DeviceMetric",
                    #"id": "777", #Se establece id fija (cambiar si está ocupada en el DB)
                    "identifier" : {"use": "temp",
                                    "value": "Procesado_imagen_Metric",
                                    "assigner": "UNIZAR"
                                    },
                    "type" : {"coding":[{"system": "urn:iso:std:iso:11073:10101",
                                         "code": "_BSA",
                                         "display": "Body Surface Area"
                                         }],
                              "text": "Área superficie del cuerpo"
                              },
                    "unit" : {"coding":[{"system": "http://unitsofmeasure.org",
                                         "code": "cm2",
                                         "display": "square centimeter"
                                         }],
                              "text": "centímetros cuadrados"
                              },
                    "source" : {"identifier": { "use": "temp",
                                                "value": "Procesado_imagen",
                                                "assigner": "UNIZAR"
                                                }},
                    #"parent" : {"reference": "Procesado_imagen_Component"},
                    "operationalStatus" : "off", # on | off | standby | entered-in-error
                    "color" : "red",
                    "category" : "measurement"
                    }
        payload2 = json.dumps(payload2)

        #Petición post a la base de datos para crear recursos
        ##DeviceMetric
        context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
        conn = http.client.HTTPSConnection(config['HOSTNAME'], config['PORT'], context=context)
        conn.request('POST', config['URL_FHIR']+"DeviceMetric", payload2, headers)
        r = conn.getresponse()
        header = r.getheaders()
        data = r.read()
        print(r.status, r.reason, 'DB_FHIR Creation DeviceMetric')
        data = json.loads(data)
        print(data)
    
        conn.close()