¿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"




Llamar a Asterist desde Zoiper5

sudo nano /etc/asterisk/sip.conf 

[zoiper_user]

type=friend

username=zoiper_ivan

secret=admin

host=dynamic

context=default

nat=yes

canreinvite=no

disallow=all

allow=ulaw

allow=alaw

qualify=yes


sudo systemctl restart asterisk

2. Configurar Zoiper 5

En Zoiper:

  1. Crea una nueva cuenta SIP.


  2. Introduce los siguientes datos:

    • Domain: 10.10.10.138.
    • Username: 1002.
    • Password: admin.

  3. Guarda los cambios e intenta registrar la cuenta.








sudo asterisk -rvvv
sip show peers

 sudo nano /etc/asterisk/pjsip.conf
[1002]
type=endpoint
transport=transport-udp
context=default
disallow=all
allow=ulaw
auth=auth1002
aors=1002

[auth1002]
type=auth
auth_type=userpass
username=1002
password=admin

[1002]
type=aor
max_contacts=1

sudo asterisk -rx "pjsip reload"

sudo asterisk -rx "pjsip show endpoint 1002"

sudo asterisk -rx "pjsip show endpoints"

¡Perfecto! El endpoint 1002 aparece como NonQual, lo cual indica que está registrado correctamente en el servidor Asterisk. Ahora puedes realizar llamadas entre extensiones o probar el sistema configurado en tu extensions.conf.


1. Llamar a otra Extensión

Si tienes otra extensión configurada (por ejemplo, 1001), puedes llamarla directamente desde Zoiper:

  1. Abre el teclado numérico de Zoiper.
  2. Marca el número de la otra extensión (por ejemplo, 1001).
  3. Presiona el botón de llamada.

Si todo está configurado correctamente, deberías escuchar que la otra extensión comienza a sonar.



sudo nano /etc/asterisk/extensions.conf
[default]
exten => 1001,1,Dial(PJSIP/1001)
exten => 1001,n,Hangup()

exten => 1002,1,Dial(PJSIP/1002)
exten => 1002,n,Hangup()

sudo asterisk -rx "dialplan reload"

sudo asterisk -rvvv



Para celular

sudo nano /etc/asterisk/pjsip.conf
[1003]
type=endpoint
transport=transport-udp
context=default
disallow=all
allow=ulaw
auth=auth1003
aors=1003

[auth1003]
type=auth
auth_type=userpass
username=1003
password=admin

[1003]
type=aor
max_contacts=1

sudo asterisk -rx "pjsip reload"

3. Configurar el Usuario en Zoiper para Celular

En tu aplicación Zoiper en el celular:

  1. Crea una nueva cuenta SIP.
  2. Introduce los siguientes datos:
    • Domain: 192.168.0.2 (la dirección IP de tu servidor Asterisk en tu red local).
    • Username: 1003.
    • Password: admin.
    • Port: 5060 (puerto SIP predeterminado).
    • Transport: UDP.
sudo asterisk -rx "pjsip show endpoints"





sudo nano /etc/asterisk/extensions.conf

exten => 1001,1,Dial(PJSIP/1001)
exten => 1001,n,Hangup()

exten => 1002,1,Dial(PJSIP/1002)
exten => 1002,n,Hangup()

exten => 1003,1,Dial(PJSIP/1003)
exten => 1003,n,Hangup()
sudo asterisk -rx "dialplan reload"

sudo asterisk -rx "pjsip show endpoints"