The Things Network

De Wiki Hackerspace San Salvador
Saltar a: navegación, buscar

The Things Network es la iniciativa global para convertir todas las ciudades del mundo en ciudades inteligentes con ayuda y participación de la comunidad utilizando las tecnologías LoRa y LoRaWAN. El Hackerspace San Salvador es el impulsor de The Things Network para el área metropolitana de San Salvador.

Esta entrada de la Wiki contiene detalles técnicos de la implementación de The Things Network.

Para unirse a la comunidad y conocer más sobre la iniciativa puede visitar la página oficial de la comunidad.

Frecuencias de operación[editar]

Marco regulatorio[editar]

Según el Cuadro Nacional de Asignación de Frecuencias LoRaWAN puede trabajar en la frecuencia ISM de 915MHz.

La banda 915 - 928 MHz, puede ser utilizada en servicio Fijo para aplicaciones industriales, científicas y médicas (ICM), bajo las siguientes condiciones:
  a) La potencia efectiva radiada del transmisor no debe exceder los 3.98 W.
  b) No se ofrecerá protección contra interferencias perjudiciales a quienes utilicen esta banda.

Una explicación más detallada sobre la elección de esta banda para The Things Network puede ser encontrada en la página oficial de la comunidad.

Región LoRaWAN[editar]

Según la documentación de la Alianza LoRa los parámetros regionales de LoRaWAN coinciden con la región de Australia 915-928Mhz.

Canales de subida (64+8):
  * 64 canales numerados de 0 hasta 63 utilizando un ancho de banda para LoRa de 125kHz, con velocidad de datos desde DR0 hasta DR4, codificación 4/5 iniciando en 95.2MHz e incrementando linealmente por 200KHz hasta 927.8MHz.
  * 8 canales numerados 64 a 71 utilizando un ancho de banda para LoRa de 500kHz, con velocidad de datos DR6 iniciando a 915.9MHz e incrementando linealmente por 1.6MHz a 927.1MHz

Canales de bajada:
  * 8 canales numerados desde 0 a 7 utilizando un ancho de banda para LoRa de 500kHz con velocidad de datos entre DR8 y DR13 iniciando a 923.3MHz e incrementando linealmente por 600kHz hasta 927.5MHz

Para simplificar el uso del plan de frecuencias se suele dividir la asignación en 8 sub-bandas dividiendo los 64 canales en grupos de 8+1 canales y se numeran desde 0 a 7.

Frecuencias utilizadas por The Things Network[editar]

Los concentradores y dispositivos conectados a The Things Network no utilizan todos los canales disponibles para la región Australia 915-928 sino únicamente de la primera sub-banda de la siguiente manera:

Canales de subida (8+1):
  * 8 canales (BW 125kHz): 916.8, 917.0, 917.2, 917.4, 917.6, 917.8, 918.0, 918.2 (MHz)
  * 1 canal (BW 500kHz): 917.5MHz

Canales de bajada (8): Igual a la especificación para la región Australia 915-928

Nota: Implementaciones privadas de LoRaWAN no están limitadas a esta sub-banda. Simplemente se ha elegido por común acuerdo la sub-banda 1 para la red pública TTN.

Hardware Probado[editar]

Esta es una lista corta de los dispositivos probados por el Hackerspace San Salvador para conectarse a The Things Network o para el establecimiento de Puntos de Acceso.

Los rangos obtenidos son dependientes del entorno realizado para las pruebas. La cobertura puede ser muy inferior a la mostrada aquí dependiendo de las características del terreno.

Nodos LoRa[editar]

B-L072Z-LRWAN1 LoRa®/Sigfox™ Discovery kit[editar]

Página del fabricante

Características:

  • Microcontrolador: STM32L072CZ
  • Radio: SX1276
  • Rango máximo obtenido*: 15.84Km

Código utilizado: GitHub

Notas: Las pruebas con este módulo fueron realizadas con una versión personalizada del STM32Cube. Se agrego un Makefile para poder compilar con GCC desde la línea de comandos. Este es el módulo con el que se ha logrado obtener mayor alcance. Es importante considerar que por temas de regulaciones la región de Australia 915-928 requiere que los dispositivos utilicen al menos 10 canales, se ha tenido que modificar la implementación de referencia para utilizar como mínimo 8 canales y así no tener problemas de pérdida de paquetes cuando la tableta se conecta a The Things Network.

SparkFun LoRa Gateway - 1-Channel (ESP32)[editar]

Página del fabricante

Características

  • Microcontrolador: ESP32 (WiFi + Bluetooth)
  • Radio: HopeRF RF95W
  • Rango máximo obtenido*: 800m

Recursos útiles:

Código utilizado:

Notas: Seguir las siguientes instrucciónes para conectar a The Things Network San Salvador.

Modificar el archivo lmic_project_config.h dentro de la carpeta project_config de la librería arduino-lmic

// project-specific definitions
//#define CFG_eu868 1
//#define CFG_us915 1
#define CFG_au921 1
//#define CFG_as923 1
// #define LMIC_COUNTRY_CODE LMIC_COUNTRY_CODE_JP       /* for as923-JP */
//#define CFG_in866 1
#define CFG_sx1276_radio 1
//#define LMIC_USE_INTERRUPTS
#define LMIC_DEBUG_LEVEL 2

Dentro del Sketch de Arduino se debe agregar/reemplazar la siguiente configuración:

// Configuración de pines para el Radio LoRa (ESP32)
const lmic_pinmap lmic_pins = {
  .nss = 16,
  .rxtx = LMIC_UNUSED_PIN,
  .rst = 5,
  .dio = {26, 33, 32},
};

En el Sketch antes de comenzar cualquier transmisión. Habilitar únicamente la sub-banda 1.

for(int b=0; b<8; ++b) {
  LMIC_disableSubBand(b);
}
LMIC_selectSubBand(1);

Si se está utilizando un gateway experimental de un solo canal. Utilizar el siguiente código:

for(int b=0; b<8; ++b) {
  LMIC_disableSubBand(b);
}
LMIC_enableChannel(0);

SparkFun Pro RF - LoRa, 915MHz (SAMD21)[editar]

Página del fabricante

  • Microcontrolador: SAMD21
  • Radio: HopeRF RF95W
  • Rango máximo obtenido*: 800m

Código utilizado:

Recursos útiles:

Notas: Seguir las siguientes instrucciónes para conectar a The Things Network San Salvador.

Modificar el archivo lmic_project_config.h dentro de la carpeta project_config de la librería arduino-lmic

// project-specific definitions
//#define CFG_eu868 1
//#define CFG_us915 1
#define CFG_au921 1
//#define CFG_as923 1
// #define LMIC_COUNTRY_CODE LMIC_COUNTRY_CODE_JP       /* for as923-JP */
//#define CFG_in866 1
#define CFG_sx1276_radio 1
//#define LMIC_USE_INTERRUPTS
#define LMIC_DEBUG_LEVEL 2

Dentro del Sketch de Arduino se debe agregar/reemplazar la siguiente configuración:

// Configuración de pines para el Radio LoRa (SAMD21)
const lmic_pinmap lmic_pins = {
    .nss = 12,//RFM Chip Select
    .rxtx = LMIC_UNUSED_PIN,
    .rst = 7,//RFM Reset
    .dio = {6, 10, 11}, //RFM Interrupt, RFM LoRa pin, RFM LoRa pin
};

En el Sketch antes de comenzar cualquier transmisión. Habilitar únicamente la sub-banda 1.

for(int b=0; b<8; ++b) {
  LMIC_disableSubBand(b);
}
LMIC_selectSubBand(1);

Si se está utilizando un gateway experimental de un solo canal. Utilizar el siguiente código:

for(int b=0; b<8; ++b) {
  LMIC_disableSubBand(b);
}
LMIC_enableChannel(0);

Gateways[editar]

SparkFun LoRa Gateway - 1-Channel (ESP32)[editar]

Este es un gateway WiFi-Lora experimental de 1 canal para The Things Network. Este debe ser usado únicamente con propositos de prueba. El rango y el número de dispositivos que se pueden conectar a este gateway es limitado.

Página del fabricante

Código fuente: GitLab

Importante: Para poder utilizar este gateway deberá de instalar todas las bibliotecas que se mencionan en la sección "Getting Started" del repositorio en GitLab.

Luego deberá de editar el archivo ESP-sc-gway.h del Sketch ESP-sc-gway. Al final del archivo deberá agregar la información de autenticación de su red WiFi.

wpas wpa[] = {
	{ "" , "" },  // Reserved for WiFi Manager
	{ "ACCESS_POINT", "CLAVE" } // <-- Agregar nombre de AP y clave entre las comillas
};

Utilice el monitor serie para obtener la dirección MAC del módulo que utilizará para registrarlo en The Things Network.

RAK831 + Raspberry Pi[editar]

Este es un gateway basado en el chip sx1301. Los gateways implementados con este chip son las versiones de "referencia" de Semtech para gateways multicanal. Normalmente incluyen el chip sx1301 que funciona como un scanner de paquetes + uno o dos radios sx7612/16 para la comunicación con los nodos LoRa. Aunque el KIT está orientado a desarrolladores este es uno de los KITs más populares para la creación de Gateways Multicanal desde cero.

Página del fabricante

Software utilizado:

Instrucciones de configuración[editar]

Se asume que tiene a la mano el KIT completo y ensamblado con el módulo RAK831 + módulo GPS + Raspberry Pi con Raspbian instalado y que puede acceder remotamente a la Raspberry Pi vía SSH y que ya se tiene compilado el Packet Forwarder multi-protocolo.

Cree el archivo de configuración global global_config.json con el siguiente contenido:

{
	"SX1301_conf": {
		"lorawan_public": true,
		"clksrc": 1,
		"clksrc_desc": "radio_1 provides clock to concentrator for most devices except MultiTech. For MultiTech set to 0.",
		"antenna_gain": 6,
		"antenna_gain_desc": "antenna gain, in dBi",
		"radio_0": {
			"enable": true,
			"type": "SX1257",
			"freq": 917200000,
			"rssi_offset": -166.0,
			"tx_enable": true,
			"tx_freq_min": 915000000,
			"tx_freq_max": 928000000
		},
		"radio_1": {
			"enable": true,
			"type": "SX1257",
			"freq": 917900000,
			"rssi_offset": -166.0,
			"tx_enable": false
		},
		"chan_multiSF_0": {
			"desc": "Lora MAC, 125kHz, all SF, 916.8 MHz",
			"enable": true,
			"radio": 0,
			"if": -400000
		},
		"chan_multiSF_1": {
			"desc": "Lora MAC, 125kHz, all SF, 917.0 MHz",
			"enable": true,
			"radio": 0,
			"if": -200000
		},
		"chan_multiSF_2": {
			"desc": "Lora MAC, 125kHz, all SF, 917.2 MHz",
			"enable": true,
			"radio": 0,
			"if": 0
		},
		"chan_multiSF_3": {
			"desc": "Lora MAC, 125kHz, all SF, 917.4 MHz",
			"enable": true,
			"radio": 0,
			"if": 200000
		},
		"chan_multiSF_4": {
			"desc": "Lora MAC, 125kHz, all SF, 917.6 MHz",
			"enable": true,
			"radio": 1,
			"if": -300000
		},
		"chan_multiSF_5": {
			"desc": "Lora MAC, 125kHz, all SF, 917.8 MHz",
			"enable": true,
			"radio": 1,
			"if": -100000
		},
		"chan_multiSF_6": {
			"desc": "Lora MAC, 125kHz, all SF, 918.0 MHz",
			"enable": true,
			"radio": 1,
			"if": 100000
		},
		"chan_multiSF_7": {
			"desc": "Lora MAC, 125kHz, all SF, 918.2 MHz",
			"enable": true,
			"radio": 1,
			"if": 300000
		},
		"chan_Lora_std": {
			"desc": "Lora MAC, 500kHz, SF8, 917.5 MHz",
			"enable": true,
			"radio": 0,
			"if": 300000,
			"bandwidth": 500000,
			"spread_factor": 8
		},
		"chan_FSK": {
			"desc": "disabled",
			"enable": false
		},
		"tx_lut_0": {
			"desc": "TX gain table, index 0",
			"pa_gain": 0,
			"mix_gain": 8,
			"rf_power": -6,
			"dig_gain": 0
		},
		"tx_lut_1": {
			"desc": "TX gain table, index 1",
			"pa_gain": 0,
			"mix_gain": 10,
			"rf_power": -3,
			"dig_gain": 0
		},
		"tx_lut_2": {
			"desc": "TX gain table, index 2",
			"pa_gain": 0,
			"mix_gain": 12,
			"rf_power": 0,
			"dig_gain": 0
		},
		"tx_lut_3": {
			"desc": "TX gain table, index 3",
			"pa_gain": 1,
			"mix_gain": 8,
			"rf_power": 3,
			"dig_gain": 0
		},
		"tx_lut_4": {
			"desc": "TX gain table, index 4",
			"pa_gain": 1,
			"mix_gain": 10,
			"rf_power": 6,
			"dig_gain": 0
		},
		"tx_lut_5": {
			"desc": "TX gain table, index 5",
			"pa_gain": 1,
			"mix_gain": 12,
			"rf_power": 10,
			"dig_gain": 0
		},
		"tx_lut_6": {
			"desc": "TX gain table, index 6",
			"pa_gain": 1,
			"mix_gain": 13,
			"rf_power": 11,
			"dig_gain": 0
		},
		"tx_lut_7": {
			"desc": "TX gain table, index 7",
			"pa_gain": 2,
			"mix_gain": 9,
			"rf_power": 12,
			"dig_gain": 0
		},
		"tx_lut_8": {
			"desc": "TX gain table, index 8",
			"pa_gain": 1,
			"mix_gain": 15,
			"rf_power": 13,
			"dig_gain": 0
		},
		"tx_lut_9": {
			"desc": "TX gain table, index 9",
			"pa_gain": 2,
			"mix_gain": 10,
			"rf_power": 14,
			"dig_gain": 0
		},
		"tx_lut_10": {
			"desc": "TX gain table, index 10",
			"pa_gain": 2,
			"mix_gain": 11,
			"rf_power": 16,
			"dig_gain": 0
		},
		"tx_lut_11": {
			"desc": "TX gain table, index 11",
			"pa_gain": 3,
			"mix_gain": 9,
			"rf_power": 20,
			"dig_gain": 0
		},
		"tx_lut_12": {
			"desc": "TX gain table, index 12",
			"pa_gain": 3,
			"mix_gain": 10,
			"rf_power": 23,
			"dig_gain": 0
		},
		"tx_lut_13": {
			"desc": "TX gain table, index 13",
			"pa_gain": 3,
			"mix_gain": 11,
			"rf_power": 25,
			"dig_gain": 0
		},
		"tx_lut_14": {
			"desc": "TX gain table, index 14",
			"pa_gain": 3,
			"mix_gain": 12,
			"rf_power": 26,
			"dig_gain": 0
		},
		"tx_lut_15": {
			"desc": "TX gain table, index 15",
			"pa_gain": 3,
			"mix_gain": 14,
			"rf_power": 27,
			"dig_gain": 0
		}
	}
}

Cree el archivo de configuración global local_config.json con el siguiente contenido y reemplaze los guiones por lo que se pide en los comentarios:

{
    "gateway_conf": {
        "gateway_ID": "------",
        "contact_email": "-----", // Ingresar email
        "description": "-----", // Ingresar password
        "beacon": true,
	"beacon_period": 128,
        "gps": true,
        "gps_tty_path": "/dev/ttyAMA0",
        "fake_gps": false,
        "ref_latitude": --------, // Ingresar latitud
        "ref_longitude": ------, // Ingresar longitud
        "ref_altitude": ----, // Ingresar altitud
        "servers": [
            {
                "serv_enabled": true,
                "server_address": "router.us.thethings.network",
                "serv_port_up": 1700,
                "serv_port_down": 1700
            }
        ],
        "forward_crc_valid": true,
        "forward_crc_error": false,
        "forward_crc_disabled": true
    }
}

No olvide eliminar los comentarios antes de guardar el archivo.

Cree el archivo update_gwid.sh

#!/bin/sh

# This script is a helper to update the Gateway_ID field of given
# JSON configuration file, as a EUI-64 address generated from the 48-bits MAC
# address of the device it is run from.
#
# Usage examples:
#       ./update_gwid.sh ./local_conf.json

iot_sk_update_gwid() {
    # get gateway ID from its MAC address to generate an EUI-64 address
    GWID_MIDFIX="FFFE"
    GWID_BEGIN=$(ip link show eth0 | awk '/ether/ {print $2}' | awk -F\: '{print $1$2$3}')
    GWID_END=$(ip link show eth0 | awk '/ether/ {print $2}' | awk -F\: '{print $4$5$6}')

    # replace last 8 digits of default gateway ID by actual GWID, in given JSON configuration file
    sed -i 's/\(^\s*"gateway_ID":\s*"\).\{16\}"\s*\(,\?\).*$/\1'${GWID_BEGIN}${GWID_MIDFIX}${GWID_END}'"\2/' $1

    echo "Gateway_ID set to "$GWID_BEGIN$GWID_MIDFIX$GWID_END" in file "$1
}

if [ $# -ne 1 ]
then
    echo "Usage: $0 [filename]"
    echo "  filename: Path to JSON file containing Gateway_ID for packet forwarder"
    exit 1
fi 

iot_sk_update_gwid $1

exit 0

Cambie los permisos del archivo a ejecutable y corralo sobre el archivo local_config.json

chmod 755 update_gwid.sh
./update_gwid.sh local_config.json

Para arrancar el gateway solo ejecute el comando (puede que tenga que especificar la ruta completa):

mp_pkt_fwd

Importante: El Gateway ID en el archivo local_conf.json es el que tendrá que utilizar para configurar el gateway en al consola de The Things Network.