¿cuanta gente a visto el blog?

Conectar ESP32 con Alma Linux

 #include <WiFi.h>

#include <WiFiClient.h>

// Configuración WiFi
const char* ssid = "RED";
const char* password = "clave";

// Configuración del servidor (AlmaLinux)
const char* serverIP = "192.168.0.2"; // Reemplaza con la IP de tu servidor AlmaLinux
const uint16_t serverPort = 12345;   // Puerto donde el servidor escuchará

WiFiClient client;

void setup() {
  Serial.begin(115200); // Inicia el puerto serie para depuración
  WiFi.begin(ssid, password);

  Serial.println("Conectando a WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nConexión WiFi establecida");
  Serial.print("Dirección IP: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  // Intentar conectar al servidor
  if (!client.connected()) {
    Serial.println("Conectando al servidor...");
    if (client.connect(serverIP, serverPort)) {
      Serial.println("Conexión al servidor exitosa");
    } else {
      Serial.println("Error al conectar al servidor");
      delay(5000); // Espera antes de intentar reconectar
      return;
    }
  }

  // Generar y enviar un número aleatorio
  int randomValue = random(0, 100); // Número aleatorio entre 0 y 99
  client.print(String(randomValue) + "\n");

  // Imprimir en el puerto serie
  Serial.print("Enviado: ");
  Serial.println(randomValue);

  delay(5000); // Enviar datos cada 5 segundos
}



sudo nano tcp_server.py

import socket


# Configuración del servidor

HOST = '0.0.0.0'  # Escuchar en todas las interfaces

PORT = 12345      # Puerto para escuchar


# Crear socket TCP

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.bind((HOST, PORT))

server_socket.listen(5)


print(f"Servidor escuchando en {HOST}:{PORT}")


while True:

    client_socket, client_address = server_socket.accept()

    print(f"Conexión establecida con {client_address}")

    

    while True:

        data = client_socket.recv(1024).decode()

        if not data:

            break

        print(f"Recibido: {data.strip()}")

    

    client_socket.close()

    print(f"Conexión cerrada con {client_address}")

python3 tcp_server.py


sudo firewall-cmd --add-port=12345/tcp --permanent
sudo firewall-cmd --reload

intento 2

#include <WiFi.h>
#include <WiFiClient.h>

// Configuración WiFi
const char* ssid = "DIAZ";
const char* password = "clave";

// Configuración del servidor (AlmaLinux)
const char* serverIP = "192.168.0.2"; // Reemplaza con la IP de tu servidor AlmaLinux
const uint16_t serverPort = 12345;   // Puerto donde el servidor escuchará

WiFiClient client;

// Configuración del pin analógico
#define LM35_2 35  // Pin analógico para el LM35 (voltaje simulado)

void setup() {
  Serial.begin(115200); // Inicia el puerto serie para depuración
  WiFi.begin(ssid, password);

  Serial.println("Conectando a WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nConexión WiFi establecida");
  Serial.print("Dirección IP: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  // Intentar conectar al servidor
  if (!client.connected()) {
    Serial.println("Conectando al servidor...");
    if (client.connect(serverIP, serverPort)) {
      Serial.println("Conexión al servidor exitosa");
    } else {
      Serial.println("Error al conectar al servidor");
      delay(5000); // Espera antes de intentar reconectar
      return;
    }
  }

  // Leer el valor del LM35 en bits
  int analogValue = analogRead(LM35_2);
 
  // Enviar el valor al servidor
  client.print(String(analogValue) + "\n");

  // Imprimir en el puerto serie
  Serial.print("Enviado: ");
  Serial.println(analogValue);

  // Verificar si el valor supera 1000 (en binario)
  if (analogValue > 1000) {
    Serial.println("Valor supera 1000 en binario. Activando llamada a 1001...");
    llamarAsterisk();
  }

  delay(5000); // Enviar datos cada 5 segundos
}

void llamarAsterisk() {
  WiFiClient asteriskClient;
  const char* asteriskIP = "192.168.0.2"; // IP del servidor Asterisk
  const uint16_t asteriskPort = 5038;    // Puerto de Asterisk AMI (predeterminado)

  if (asteriskClient.connect(asteriskIP, asteriskPort)) {
    // Login a AMI (Asterisk Manager Interface)
    asteriskClient.print("Action: Login\r\n");
    asteriskClient.print("Username: admin\r\n"); // Ajustar según tu configuración
    asteriskClient.print("Secret: admin\r\n");   // Ajustar según tu configuración
    asteriskClient.print("\r\n");

    delay(100);

    // Comando para iniciar llamada
    asteriskClient.print("Action: Originate\r\n");
    asteriskClient.print("Channel: SIP/1001\r\n");
    asteriskClient.print("Context: default\r\n");
    asteriskClient.print("Exten: 1001\r\n");
    asteriskClient.print("Priority: 1\r\n");
    asteriskClient.print("CallerID: Alerta LM35 <1003>\r\n");
    asteriskClient.print("\r\n");

    delay(100);
    asteriskClient.stop();
    Serial.println("Llamada a 1001 enviada.");
  } else {
    Serial.println("Error al conectar con Asterisk.");
  }
}





sudo nano /etc/asterisk/manager.conf


[admin]
secret = admin
read = all
write = all

sudo systemctl restart asterisk

Llamar a 1001 a voluntad

sudo nano call_1001.py
import socket

# 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 llamar_a_1001():
    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
        ami_socket.sendall(b"Action: Login\r\n")
        ami_socket.sendall(f"Username: {ASTERISK_USER}\r\n".encode())
        ami_socket.sendall(f"Secret: {ASTERISK_SECRET}\r\n".encode())
        ami_socket.sendall(b"\r\n")
        
        # Comando Originate para iniciar llamada
        ami_socket.sendall(b"Action: Originate\r\n")
        ami_socket.sendall(b"Channel: PJSIP/1001\r\n")

        ami_socket.sendall(b"Context: default\r\n")
        ami_socket.sendall(b"Exten: 1001\r\n")
        ami_socket.sendall(b"Priority: 1\r\n")
        ami_socket.sendall(b"CallerID: Prueba <1003>\r\n")
        ami_socket.sendall(b"\r\n")
        
        print("Llamada a 1001 enviada.")
        ami_socket.close()
    except Exception as e:
        print(f"Error al conectar con Asterisk: {e}")

# Ejecutar la función para llamar a 1001
if __name__ == "__main__":
    llamar_a_1001()

sudo nano /etc/asterisk/manager.conf
sudo systemctl restart asterisk


sudo nano /etc/asterisk/manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0

[admin]
secret = admin
read = all
write = all

sudo systemctl restart asterisk


sudo netstat -tuln | grep 5038


python3 call_1001.py

Intento continuo

sudo nano continuous_call.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
        ami_socket.sendall(b"Action: Login\r\n")
        ami_socket.sendall(f"Username: {ASTERISK_USER}\r\n".encode())
        ami_socket.sendall(f"Secret: {ASTERISK_SECRET}\r\n".encode())
        ami_socket.sendall(b"\r\n")
        time.sleep(1)

        # Comando Originate para iniciar llamada
        ami_socket.sendall(b"Action: Originate\r\n")
        ami_socket.sendall(b"Channel: SIP/1001\r\n")
        ami_socket.sendall(b"Context: default\r\n")
        ami_socket.sendall(b"Exten: 1001\r\n")
        ami_socket.sendall(b"Priority: 1\r\n")
        ami_socket.sendall(b"CallerID: Modo Continuo <1003>\r\n")
        ami_socket.sendall(b"\r\n")
        
        print("Llamada enviada a 1001. Esperando respuesta...")
        
        # Leer la respuesta de Asterisk
        while True:
            data = ami_socket.recv(1024).decode()
            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.")

python3 continuous_call.py



#include <WiFi.h>
#include <WiFiClient.h>

// Configuración WiFi
const char* ssid = "DIAZ1";       // Nombre de la red WiFi
const char* password = "clave"; // Contraseña de la red WiFi

// Configuración del servidor (AlmaLinux)
const char* serverIP = "192.168.0.2"; // Reemplaza con la IP de tu servidor AlmaLinux
const uint16_t serverPort = 12345;    // Puerto donde el servidor escuchará

WiFiClient client;

// Configuración del pin analógico
#define LM35_2 35  // Pin analógico para el LM35 (voltaje simulado)

// Variables de control
int delayLow = 500;  // Delay en ms para valores menores a 1000
int delayHigh = 2000; // Delay en ms para valores mayores a 1000

void setup() {
  Serial.begin(115200); // Inicia el puerto serie para depuración
  WiFi.begin(ssid, password);

  Serial.println("Conectando a WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nConexión WiFi establecida");
  Serial.print("Dirección IP: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  // Intentar conectar al servidor
  if (!client.connected()) {
    Serial.println("Conectando al servidor...");
    if (client.connect(serverIP, serverPort)) {
      Serial.println("Conexión al servidor exitosa");
    } else {
      Serial.println("Error al conectar al servidor");
      delay(5000); // Espera antes de intentar reconectar
      return;
    }
  }

  // Leer el valor del LM35 en bits
  int analogValue = analogRead(LM35_2);
  String binValue = String(analogValue, BIN); // Convertir a binario

  // Enviar el valor al servidor
  client.print(binValue + "\n");

  // Imprimir en el puerto serie
  Serial.print("Enviado: ");
  Serial.print(analogValue);
  Serial.print(" (binario: ");
  Serial.print(binValue);
  Serial.println(")");

  // Ajustar el delay según el valor
  if (analogValue > 1000) {
    delay(delayHigh);
  } else {
    delay(delayLow);
  }
}

sudo nano call_control.py
import socket
import subprocess

# Configuración del servidor TCP
HOST = '0.0.0.0'  # Escuchar en todas las interfaces
PORT = 12345      # Puerto para escuchar

# Variables de control
llamada_activa = False
proceso_llamada = None

def iniciar_llamada():
    global llamada_activa, proceso_llamada
    if llamada_activa:
        return  # No iniciar otra llamada si ya está en progreso

    try:
        # Ejecutar el script continuous_call.py
        print("Iniciando llamada al 1001...")
        proceso_llamada = subprocess.Popen(['python3', 'continuous_call.py'])
        llamada_activa = True
    except Exception as e:
        print(f"Error al iniciar la llamada: {e}")

def detener_llamada():
    global llamada_activa, proceso_llamada
    if not llamada_activa:
        return  # No hay llamada en progreso

    try:
        # Terminar el proceso de continuous_call.py
        print("Deteniendo llamada al 1001...")
        if proceso_llamada:
            proceso_llamada.terminate()
            proceso_llamada = None
        llamada_activa = False
    except Exception as e:
        print(f"Error al detener la llamada: {e}")

# Servidor para recibir datos del ESP32
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen(5)

print(f"Servidor escuchando en {HOST}:{PORT}")

while True:
    client_socket, client_address = server_socket.accept()
    print(f"Conexión establecida con {client_address}")
    
    while True:
        try:
            data = client_socket.recv(1024).decode().strip()
            if not data:
                break

            # Validar que el dato recibido es binario válido
            try:
                decimal_value = int(data, 2)  # Convertir de binario a decimal
                print(f"Recibido: {data} (decimal: {decimal_value})")

                # Lógica para iniciar o detener la llamada
                if decimal_value > 1000:
                    iniciar_llamada()
                else:
                    detener_llamada()
            except ValueError:
                print(f"Dato inválido recibido: {data}")
        
        except Exception as e:
            print(f"Error: {e}")
            break
    
    client_socket.close()
    print(f"Conexión cerrada con {client_address}")



phyton3 call_control.py



sudo nano led_on.py 
import socket

ESP_IP = "192.168.0.102"  # Dirección IP del ESP32
ESP_PORT = 12345         # Puerto del ESP32

# Crear conexión TCP con el ESP32
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((ESP_IP, ESP_PORT))
    s.sendall(b"1\n")  # Enviar el comando "1" para encender el LED
    print("Comando enviado: 1 (LED ENCENDIDO)")

sudo nano led_off.py
import socket

ESP_IP = "192.168.0.102"  # Dirección IP del ESP32
ESP_PORT = 12345         # Puerto del ESP32

# Crear conexión TCP con el ESP32
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((ESP_IP, ESP_PORT))
    s.sendall(b"0\n")  # Enviar el comando "0" para apagar el LED
    print("Comando enviado: 0 (LED APAGADO)")


python3 led_on.py
python3 led_off.py

sudo nano /etc/asterisk/extensions.conf

[ivr_menu]
exten => 777,1,Answer()
    same => n,Playback(welcome) ; Reproduce un audio de bienvenida (cámbialo por tu archivo)
    same => n,WaitExten(10)    ; Espera 10 segundos para recibir una entrada

exten => 1,1,NoOp(Opción 1 seleccionada)
    same => n,System(python3 /ruta/a/led_on.py) ; Ejecuta el script para encender el LED
    same => n,Playback(led-on)  ; Mensaje de confirmación (opcional)
    same => n,Goto(ivr_menu,777,1) ; Regresa al menú

exten => 2,1,NoOp(Opción 2 seleccionada)
    same => n,System(python3 /ruta/a/led_off.py) ; Ejecuta el script para apagar el LED
    same => n,Playback(led-off) ; Mensaje de confirmación (opcional)
    same => n,Goto(ivr_menu,777,1) ; Regresa al menú

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

exten => t,1,Playback(timeout) ; Si el usuario no presiona nada
    same => n,Goto(ivr_menu,777,1) ; Regresa al menú


sox tu-audio.wav -r 8000 -c 1 welcome.gsm


sudo mv welcome.gsm /var/lib/asterisk/sounds/
sudo mv led-on.gsm /var/lib/asterisk/sounds/
sudo mv led-off.gsm /var/lib/asterisk/sounds/

sudo asterisk -rx "dialplan reload"
sudo nano /etc/asterisk/pjsip.conf

[1001]
type = endpoint
context = ivr_menu ; Este contexto debe coincidir con el configurado en extensions.conf
auth = auth1001
aors = 1001



sudo asterisk -rx "pjsip reload"



sudo nano /etc/asterisk/extensions.conf

[ivr_menu]
exten => 777,1,Answer()
    same => n,Playback(welcome) ; Audio de bienvenida
    same => n,WaitExten(10)    ; Espera 10 segundos para entrada

exten => 1,1,NoOp(Opción 1 seleccionada)
    same => n,System(python3 /root/led_on.py) ; Ejecuta el script para encender el LED
    same => n,Playback(led-on)  ; Mensaje de confirmación (opcional)
    same => n,Goto(ivr_menu,777,1) ; Regresa al menú

exten => 2,1,NoOp(Opción 2 seleccionada)
    same => n,System(python3 /root/led_off.py) ; Ejecuta el script para apagar el LED
    same => n,Playback(led-off) ; Mensaje de confirmación (opcional)
    same => n,Goto(ivr_menu,777,1) ; Regresa al menú


exten => i,1,Playback(invalid)
    same => n,Goto(ivr_menu,777,1)

exten => t,1,Playback(timeout)
    same => n,Goto(ivr_menu,777,1)
ls /var/lib/asterisk/sounds/




sudo asterisk -rx "dialplan reload"

sudo nano /etc/asterisk/asterisk.conf


[options]
execincludes = yes
chmod +x /root/led_on.py
chmod +x /root/led_off.py
ps aux | grep asterisk

exten => 1,1,NoOp(Opción 1 seleccionada)
    same => n,System(python3 /usr/local/bin/led_on.py)
    same => n,Playback(prueba)
    same => n,Goto(ivr_menu,777,1)

exten => 2,1,NoOp(Opción 2 seleccionada)
    same => n,System(python3 /usr/local/bin/led_off.py)
    same => n,Playback(prueba)
    same => n,Goto(ivr_menu,777,1)

sudo asterisk -rx "dialplan reload"




No hay comentarios.:

Publicar un comentario