Descubriendo socat

¿Qué es socat, y para qué sirve?

Socat es una herramienta que nos permite, básicamente, trabajar como si fuéramos una telefonista de tiempos remotos, esas que vemos en algunas películas en las que mujeres se pasaban el día conectando cables en las centralitas, lo que ocurre es que, en este caso, en lugar de líneas telefónicas nos permite conectar diversos puertos y protocolos de nuestro ordenador.

Centralita telefónica, pricipios siglo XX

Socat funciona como una centralitaa de las antiguas… más o menos…

Llevo un tiempo desarrollando una pequeña aplicación para registrar las posiciones geográficas de las maniobras de pesca. Es tan simple como hacer click sobre un botón y registrar las coordenadas, el tiempo o la sonda a partir de las sentencias NMEA que te llegan desde diversos lugares (UDP, TCP o puertos serie). Esto sería sencillo, hasta cierto punto, en un barco, pues sólo tendría que haber conectado la fuente de datos a mi ordenador y leerlo. Pero en casa, sin un GPS a mano, me resulta indispensable usar un emulador de GPS. En mi caso he empleado gpsfeed+, que funciona perfectamente, pues entre otras cosas permite no sólo simular las sentencias NMEA más habituales (GGA, ZDT, RMC…) sino que, además, nos permite simular nuestras propias señales, con lo cual también es posible simular sondas, por ejemplo. El problema es que, para emular GPS por puerto serie, gpsfeed bloquea el puerto donde emite y no es posible acceder a él para leerlo. La solución me vino empleando socat para crear un puerto virtual en el que volcar la simulación GPS y luego creando otro puerto virtual enlazado con éste.

¿Cómo se puede usar socat?

Yo me he quedado de piedra viendo la cantidad de cosas que se pueden hacer. Hay páginas con montones de one-liners y ejemplos de uso de socat, como en este enlace. Pero, básicamente, lo que hacemos es conectar dos sockets (en sentido amplio) entre sí y comunicarlos, de manera que lo que se escribe en uno sale por el otro y viceversa: En mi caso, el comando es:

Donde lo que indico es que cree dos sockets tipo pty (terminales), con enlaces simbólicos (ya que los suele crear en /dev/pts/) a /dev/ttyV0 y /dev/ttyS0. Ambos flujos son de tipo raw, ordeno que haga la conversión de fin de línea donde proceda con crnl y establezco los permisos de los sockets creados a 666 (todos pueden leer y escribir) Este primer uso es sencillo, aunque, como podréis ver en los enlaces que os he pasado, los usos son infinitos. Por ejemplo, el comando que uso para “poner en red” las balanzas marinas y poder capturar los pesos desde las aplicaciones que uso para muestrear (a bordo o en el laboratorio), es el siguiente:

En este caso, conectamos /dev/ttyUSB0 (habitual cuando se usan conversores USB/serie) y creamos un socket que queda a la espera de conexiones en el puerto 23000. Si conectamos a ese socket y facilitamos los comandos apropiados, podemos interactuar a través de la red con las balanzas y solicitar pesos, tararlas, etc. Los parámetros reuseaddr y fork sirven para que no se pierda la conexión una vez cerrada desde un cliente y para permitir conexiones múltiples. Un comando como el anterior puede servir para, por ejemplo, pasar el flujo NMEA desde puertos serie a la red, igualmente.

¡Disfrutadlo! Saludos desde la Bahía de Algeciras, a bordo del B/O Ramón Margalef .

Custom cursor in QGIS plugin

Custom cursor showing bearing

Last january I developed QGIS plugin called Transectizer. Fortunately it was catalogued and sent to the box (or, who knows if a coffin) of the expermiental plugins.

Custom cursor showing bearing

A custom, chatty QGIS plugin cursor showing the bearing of the rubberband being drawn.

Yes, I said fortunately, because that prompted me towards changing some features of the plugin. One of these features is the ability of the plugin of give some feedback to the user about the bearing of a line drawn in the canvas, to make possible to interactively choose a certain parameter that is needed for the plugin to work.

In the first version of the plugin (the second is upcoming, see below), it just updates the text of a LineEdit widget inside the QGIS plugin dialog. This is a relatively simple task, Continue reading

Crosstabs in PostgreSQL: PivotMyTable

Crosstabs in PostgreSQL: PivotMyTable

PivotMyTable is a PL/Python function for use in PostgreSQL servers. Its aim is to get crosstab  tables in PostgreSQL in a more friendly way that PostgreSQL module tablefunc does with its crosstab series functions and in fact it behaves ,at last, as a proxy for tablefunc functions.

PivotMyTable makes possible to create crosstabs in PostgreSQL in the same way that other available solutions, automating the creation of the queries that the tablefunc crosstab functions need to work.

Continue reading