martes, 18 de febrero de 2025

Error 15 (Lookup error.) en libmosquittopp

        He estado programando un app para monitorear una flotilla usando MQTT. Todo iba muy bien estaba programando en ubuntu 24 LTS y Qt Creator, pero a la hora de querer probarla en windows no se conectaba al broker, esto era muy raro ya que en Linux estaba funcionando perfectamente.

        Depurando encontre que mosqpp::mosquittopp::connect_async estaba retornando 15, un "Lookup error", en vez de cero que seria lo optimo, estuve googleando y no encontraba ningun caso igual, probe montones de cosas, como por ejemplo:

  • Compilar diferente version de mosquitto
  • Usar la distribucion binaria
  • Conectar a otros brokers
  • Usar la ip publica del broker directamente
  • Cambiar el DNS de windows
  • Cambiar la configuracion de red de Windows
        Despues empece a leer el codigo fuente de mosquitto y vi que el codigo de error MOSQ_ERR_EAI (15) era retornado mucho despues de fallar una llamada a getaddrinfo() entonces decidi poner una llamada a  getaddrinfo() para saber de que se trataba. 
        La invocacion de la funcion fallo pero dio un mensaje de error interesante: "Either the application has not called WSAStartup, or WSAStartup failed."
        Ya con esa informacion sospeche de la solucion correcta: algo no estaba inicializado y asi era hacia falta llamar mosqpp::lib_init(), asi que agregue al inicio del programa:

mosqpp::lib_init();
atexit([](){mosqpp::lib_cleanup();});

miércoles, 28 de febrero de 2024

Wifi en poky

        El layer estándar para Rasperry pi "meta-raspberrypi" incluye WiFi en la imagen core-image-base, pero no se inicia automáticamente en la configuración predeterminada. Aquí te cuento como iniciarlo:

  1. Inicia el servicio de red con el comando service network start
  2. Edita el archivo /etc/wpa_supplicant.conf para que incluya tu país de WiFi, nombre de red y contraseña de red
  3. Activa la interfaz de WiFi ejecutando `ifup wlan0`
        Con eso ya debería estar disponible la red, pero encaso de que wpa_supplicant no se active correctamente estos comandos pueden funcionar
  1. `wpa_supplicant -iwlan0 -c /etc/wpa_supplicant.conf`
  2. `wpa_cli -iwlan0 reconfigure`
Aqui te dejo un ejemplo del archivo /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1
country=US

network={
        ssid="Internet"
        psk="contraseñasecreta"
}