/etc/asterisk/pjsip.conf
[1001]
type=endpoint
context=odbc_test
[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
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:
Reinicia Asterisk después de cualquier cambio:
Verifica el canal PJSIP:
Comprueba que el canal PJSIP/1001
esté registrado:
python3 llamadacontinua1001.py
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
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