¿cuanta gente a visto el blog?

Enviar datos a la Base de datos con una llamada

 /etc/asterisk/pjsip.conf


[1001] type=endpoint context=odbc_test ; Asegúrate de usar el contexto definido en extensions.conf


sudo systemctl restart asterisk


sudo nano /etc/asterisk/extensions.conf


[odbc_test]

exten => 100,1,NoOp(Leyendo valor desde la base de datos)

 same => n,Set(ODBC_RESULT=${ODBC_IVAST(SELECT numero FROM ultnum WHERE id=1)})

 same => n,NoOp(Valor obtenido: ${ODBC_RESULT})

 same => n,Hangup()


exten => 101,1,NoOp(Insertando un nuevo valor en la base de datos)

 same => n,Set(ODBC_INSERT=${ODBC_IVAST(INSERT INTO ultnum (numero) VALUES (42))})

 same => n,NoOp(Valor insertado con éxito)

 same => n,Hangup()



sudo asterisk -rx "dialplan reload"

con menu

sudo nano /etc/asterisk/extensions.conf

[ivr_menu]
exten => s,1,Answer()
 same => n,Background(welcome) ; Reproduce un audio inicial (reemplaza 'welcome' con tu archivo .wav)
 same => n,WaitExten(10) ; Espera 10 segundos para recibir una entrada del usuario
 same => n,Hangup()

; Opción 1 - Establecer número en la base de datos a 1
exten => 1,1,NoOp(Opción 1 seleccionada)
 same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=1 WHERE id=1)})
 same => n,Playback(option-1) ; Reproduce un mensaje indicando que se seleccionó la opción 1
 same => n,Hangup()

; Opción 2 - Establecer número en la base de datos a 2
exten => 2,1,NoOp(Opción 2 seleccionada)
 same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=2 WHERE id=1)})
 same => n,Playback(option-2) ; Reproduce un mensaje indicando que se seleccionó la opción 2
 same => n,Hangup()

; Opción 3 - Establecer número en la base de datos a 3
exten => 3,1,NoOp(Opción 3 seleccionada)
 same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=3 WHERE id=1)})
 same => n,Playback(option-3) ; Reproduce un mensaje indicando que se seleccionó la opción 3
 same => n,Hangup()

; Manejo de entradas inválidas
exten => i,1,Playback(invalid) ; Reproduce un mensaje de opción inválida
 same => n,Goto(ivr_menu,s,2) ; Regresa al inicio del menú

; Manejo de tiempo agotado sin respuesta
exten => t,1,Playback(goodbye) ; Reproduce un mensaje de despedida
 same => n,Hangup()


 


sudo nano /etc/asterisk/pjsip.conf


[1001]
type=endpoint
context=ivr_menu ; Cambia al contexto del menú IVR

que solo funcione el celular para eso

[ivr_menu]
exten => s,1,Answer()
 same => n,Background(vm-intro) ; Reproduce la introducción del correo de voz
 same => n,WaitExten(10) ; Espera 10 segundos para recibir entrada del usuario
 same => n,Hangup()

; Opción 1
exten => 1,1,NoOp(Opción 1 seleccionada)
 same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=1 WHERE id=1)})
 same => n,Playback(demo-thanks) ; Agradece por seleccionar la opción 1
 same => n,Hangup()

; Opción inválida
exten => i,1,Playback(invalid) ; Reproduce mensaje de opción inválida
 same => n,Goto(ivr_menu,s,1) ; Regresa al menú

; Tiempo agotado
exten => t,1,Playback(vm-intro) ; Reproduce el mismo mensaje inicial
 same => n,Hangup()


sudo asterisk -rx "dialplan reload"

menu 774

sudo nano /etc/asterisk/extensions.conf

[default]
exten => 774,1,Answer()
 same => n,Playback(demo-thanks) ; Reproduce un audio corto por defecto
 same => n,Goto(ivr_menu,s,1) ; Entra al menú IVR

[ivr_menu]
exten => s,1,NoOp(Ingreso al menú IVR)
 same => n,Background(vm-intro) ; Reproduce un mensaje (puedes usar cualquier archivo por defecto)
 same => n,WaitExten(10) ; Espera 10 segundos para recibir entrada del usuario

; Opción 1: Establecer el último número de la tabla como 1
exten => 1,1,NoOp(Opción 1 seleccionada)
 same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=1 WHERE id=1)})
 same => n,Playback(demo-thanks) ; Agradece al usuario
 same => n,Goto(ivr_menu,s,1) ; Regresa al menú

; Opción 2: Establecer el último número de la tabla como 0
exten => 2,1,NoOp(Opción 2 seleccionada)
 same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=0 WHERE id=1)})
 same => n,Playback(demo-thanks) ; Agradece al usuario
 same => n,Goto(ivr_menu,s,1) ; Regresa al menú

; Opciones no válidas: Volver al menú
exten => i,1,Playback(invalid) ; Reproduce un mensaje indicando que la opción no es válida
 same => n,Goto(ivr_menu,s,1) ; Regresa al menú

; Tiempo agotado: Reproduce un mensaje y vuelve al menú
exten => t,1,Playback(vm-intro) ; Reproduce un mensaje
 same => n,Goto(ivr_menu,s,1) ; Regresa al menú

sudo nano /etc/asterisk/pjsip.conf


[1001]
type=endpoint
context=default
disallow=all
allow=ulaw
auth=auth1001
aors=1001





llamada condicional por tabla 

isql -v ivast
 
CREATE TABLE ultemp (
    id INT AUTO_INCREMENT PRIMARY KEY,
    valor INT NOT NULL
);

INSERT INTO ultemp (valor) VALUES (0);
SELECT * FROM ultemp;



sudo nano /etc/asterisk/extensions.conf

[check_ultemp]
exten => s,1,NoOp(Comprobando el valor de ultemp)
 same => n,Set(ULTEMP=${ODBC_READ(SELECT valor FROM ultemp WHERE id=1)})
 same => n,NoOp(Valor actual de ultemp: ${ULTEMP})

; Si el valor es mayor a 1000, llama al 1002
 same => n,GotoIf($[${ULTEMP} > 1000]?call_1002,1)

; Si el valor es menor o igual a 1000, cuelga cualquier llamada activa
 same => n,Hangup()

[call_1002]
exten => 1,1,NoOp(Llamando al 1002 porque ultemp es mayor a 1000)
 same => n,Dial(PJSIP/1002,10) ; Llama al 1002 durante 10 segundos
 same => n,Hangup()

sudo nano /root/check_ultemp.sh
#!/bin/bash

while true; do
    # Ejecuta la comprobación en Asterisk
    asterisk -rx "channel originate Local/s@check_ultemp extension s@check_ultemp"
    sleep 5 # Espera 5 segundos antes de volver a comprobar
done


chmod +x /root/check_ultemp.sh 

./root/check_ultemp.sh



isql -v ivast


UPDATE ultemp SET valor=1500 WHERE id=1;

 sudo nano llamadacontinua1001.py 

import socket
import time

# Configuración de Asterisk Manager Interface (AMI)
ASTERISK_HOST = '127.0.0.1'  # Dirección IP del servidor Asterisk
ASTERISK_PORT = 5038         # Puerto de AMI
ASTERISK_USER = 'admin'      # Usuario definido en manager.conf
ASTERISK_SECRET = 'admin'    # Contraseña definida en manager.conf

def iniciar_llamada():
    try:
        # Crear socket para conexión AMI
        ami_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ami_socket.connect((ASTERISK_HOST, ASTERISK_PORT))

        # Login en AMI
        login = (
            f"Action: Login\r\n"
            f"Username: {ASTERISK_USER}\r\n"
            f"Secret: {ASTERISK_SECRET}\r\n"
            f"\r\n"
        )
        ami_socket.sendall(login.encode())
        time.sleep(1)

        # Comando Originate para iniciar llamada
        originate = (
            f"Action: Originate\r\n"
            f"Channel: PJSIP/1001\r\n"
            f"Context: default\r\n"  # Cambia si usas otro contexto
            f"Exten: 1001\r\n"       # Extensión destino
            f"Priority: 1\r\n"       # Prioridad definida en extensions.conf
            f"CallerID: Modo Continuo <1003>\r\n"
            f"\r\n"
        )
        ami_socket.sendall(originate.encode())
        print("Llamada enviada a 1001. Esperando respuesta...")

        # Leer la respuesta de Asterisk
        while True:
            data = ami_socket.recv(1024).decode()
            print(data)
            if "Hangup" in data or "answered" in data.lower():
                print("La llamada fue contestada o finalizada.")
                break

        ami_socket.close()
    except Exception as e:
        print(f"Error: {e}")

if __name__ == "__main__":
    try:
        while True:
            iniciar_llamada()
            time.sleep(1)  # Espera un segundo antes de intentar otra llamada
    except KeyboardInterrupt:
        print("\nModo continuo finalizado. No se realizarán más llamadas.")

  • Revisa manager.conf:

    Asegúrate de que manager.conf contenga algo similar a esto: 

    [admin] secret = admin read = system,call,log,verbose,command,agent,user write = system,call,log,verbose,command,agent,user

    Reinicia Asterisk después de cualquier cambio: 

    sudo systemctl restart asterisk
  • Verifica el canal PJSIP:

    Comprueba que el canal PJSIP/1001 esté registrado: 

    sudo asterisk -rx "pjsip show endpoints"

  • python3 llamadacontinua1001.py

    pip3 install pymysql

    sudo nano check_ultemp.py

    import socket
    import pymysql
    import time

    # Configuración de Asterisk Manager Interface (AMI)
    ASTERISK_HOST = '127.0.0.1'  # Dirección IP del servidor Asterisk
    ASTERISK_PORT = 5038         # Puerto de AMI
    ASTERISK_USER = 'admin'      # Usuario definido en manager.conf
    ASTERISK_SECRET = 'admin'    # Contraseña definida en manager.conf

    # Configuración de la base de datos
    DB_HOST = 'localhost'
    DB_USER = 'root'
    DB_PASSWORD = 'admin'
    DB_NAME = 'ivast'
    DB_TABLE = 'ultemp'

    # Variable para rastrear el estado de la llamada
    llamada_activa = False

    def iniciar_llamada():
        try:
            global llamada_activa
            # Crear socket para conexión AMI
            ami_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            ami_socket.connect((ASTERISK_HOST, ASTERISK_PORT))

            # Login en AMI
            login = (
                f"Action: Login\r\n"
                f"Username: {ASTERISK_USER}\r\n"
                f"Secret: {ASTERISK_SECRET}\r\n"
                f"\r\n"
            )
            ami_socket.sendall(login.encode())
            time.sleep(1)

            # Comando Originate para iniciar llamada
            originate = (
                f"Action: Originate\r\n"
                f"Channel: PJSIP/1001\r\n"
                f"Context: default\r\n"  # Cambia si usas otro contexto
                f"Exten: 1001\r\n"       # Extensión destino
                f"Priority: 1\r\n"       # Prioridad definida en extensions.conf
                f"CallerID: Alerta <1003>\r\n"
                f"\r\n"
            )
            ami_socket.sendall(originate.encode())
            print("Llamada iniciada a 1001.")
            llamada_activa = True

            ami_socket.close()
        except Exception as e:
            print(f"Error al iniciar la llamada: {e}")

    def finalizar_llamada():
        try:
            global llamada_activa
            # Crear socket para conexión AMI
            ami_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            ami_socket.connect((ASTERISK_HOST, ASTERISK_PORT))

            # Login en AMI
            login = (
                f"Action: Login\r\n"
                f"Username: {ASTERISK_USER}\r\n"
                f"Secret: {ASTERISK_SECRET}\r\n"
                f"\r\n"
            )
            ami_socket.sendall(login.encode())
            time.sleep(1)

            # Comando Hangup para finalizar la llamada
            hangup = (
                f"Action: Hangup\r\n"
                f"Channel: PJSIP/1001\r\n"
                f"\r\n"
            )
            ami_socket.sendall(hangup.encode())
            print("Llamada finalizada.")
            llamada_activa = False

            ami_socket.close()
        except Exception as e:
            print(f"Error al finalizar la llamada: {e}")

    def verificar_valor():
        try:
            global llamada_activa
            # Conexión a la base de datos
            conexion = pymysql.connect(
                host=DB_HOST,
                user=DB_USER,
                password=DB_PASSWORD,
                database=DB_NAME
            )
            cursor = conexion.cursor()

            # Consultar el valor actual de la tabla ultemp
            cursor.execute(f"SELECT valor FROM {DB_TABLE} ORDER BY id DESC LIMIT 1;")
            resultado = cursor.fetchone()

            if resultado:
                valor = resultado[0]
                print(f"Valor actual: {valor}")
                if valor > 1000 and not llamada_activa:
                    iniciar_llamada()
                elif valor <= 1000 and llamada_activa:
                    finalizar_llamada()
            else:
                print("No se encontró ningún dato en la tabla.")

            cursor.close()
            conexion.close()
        except Exception as e:
            print(f"Error al verificar el valor: {e}")

    if __name__ == "__main__":
        try:
            while True:
                verificar_valor()
                time.sleep(2)  # Intervalo de verificación en segundos
        except KeyboardInterrupt:
            print("\nScript detenido por el usuario.")



    python3 check_ultemp.py



    isql -v ivast

    UPDATE ultemp SET valor = 1500 WHERE id = 1;

    UPDATE ultemp SET valor = 900 WHERE id = 1;




    Consultar de la base de datos con ESP32

    ip a


    #include <WiFi.h>
    #include <HTTPClient.h>

    const char* ssid = "RED";  
    const char* password = "clave";

    // http://192.168.0.104/consulta_ultnum.php
    // Definir el pin para el LED
    #define LED_PIN 2  // Pin GPIO2 del ESP32 (G2)

    void setup() {
      // Inicializar el LED como salida
      pinMode(LED_PIN, OUTPUT);
      digitalWrite(LED_PIN, LOW); // Apagar el LED inicialmente
     
      Serial.begin(115200);
     
      // Conexión a la red WiFi
      Serial.println("Conectando a WiFi...");
      WiFi.begin(ssid, password);
     
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
     
      Serial.println("\nConexión establecida!");
      Serial.print("IP asignada: ");
      Serial.println(WiFi.localIP());
    }

    void loop() {
      if (WiFi.status() == WL_CONNECTED) {
        HTTPClient http;
        String serverUrl = "http://192.168.0.104/consulta_ultnum.php";
       
        Serial.println("Conectando al servidor...");
        http.begin(serverUrl);
        int httpCode = http.GET();

        if (httpCode > 0) { // Si el servidor responde
          String payload = http.getString();
          Serial.print("Respuesta recibida: ");
          Serial.println(payload);
         
          // Convertir la respuesta a entero
          int valor = payload.toInt();
         
          // Controlar el LED según el valor
          if (valor == 1) {
            Serial.println("Encendiendo el LED...");
            digitalWrite(LED_PIN, HIGH); // Encender LED
          } else if (valor == 0) {
            Serial.println("Apagando el LED...");
            digitalWrite(LED_PIN, LOW); // Apagar LED
          } else {
            Serial.println("Valor desconocido recibido.");
          }
        } else {
          Serial.print("Error en la conexión HTTP: ");
          Serial.println(httpCode);
        }

        http.end();
      } else {
        Serial.println("WiFi desconectado!");
      }
     
      delay(500); // Esperar 5 segundos antes de realizar otra consulta
    }

    sudo nano /var/www/html/consulta_ultnum.php
    <?php
    $servername = "localhost"; // Cambia si no usas localhost
    $username = "root";
    $password = "admin";
    $dbname = "ivast";

    // Crear conexión
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Verificar conexión
    if ($conn->connect_error) {
        die("Conexión fallida: " . $conn->connect_error);
    }

    // Consulta SQL
    $sql = "SELECT numero FROM ultnum WHERE id = 1";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        // Obtener el valor
        $row = $result->fetch_assoc();
        echo $row['numero'];
    } else {
        echo "No se encontraron resultados.";
    }

    $conn->close();
    ?>


    http://10.10.10.138/consulta_ultnum.php



    Subir datos desde la esp 

    sudo nano envia_valor.php
    <?php
    $servername = "localhost";
    $username = "root";
    $password = "admin";
    $dbname = "ivast";

    // Conexión a la base de datos
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("Conexión fallida: " . $conn->connect_error);
    }

    // Obtener los datos enviados por la ESP32
    $id = $_POST['id'];
    $valor = $_POST['valor'];

    // Actualizar el valor en la tabla ultemp
    $sql = "UPDATE ultemp SET valor = $valor WHERE id = $id";

    if ($conn->query($sql) === TRUE) {
        echo "Valor actualizado con éxito";
    } else {
        echo "Error al actualizar: " . $conn->error;
    }

    $conn->close();
    ?>



     

    No hay comentarios.:

    Publicar un comentario