Libelium is offering new technical support channels, to contact with de Technical Support team to solve any issue our doubt please contact with your sales agent or visit our contact site



Post a new topicPost a reply Page 1 of 3   [ 26 posts ]
Go to page 1, 2, 3  Next
Author Message
 Post subject: Librería LoRaWAN arduino
PostPosted: Tue Oct 18, 2016 8:12 am 

Joined: Tue Oct 18, 2016 8:05 am
Posts: 13
Buenos días,

Estoy usando un módulo LoRaWAN para Arduino con el multiprotocol radio shield.
Para poder enviar un ACK al recibir un mensaje de la estación Kerlink (downlink) se tiene que activar el parámetro AR (Automatic Reply) en el módulo LoRaWAN pero veo que en la librería para arduino no hay ningún método que lo permita, ¿hay alguna nueva versión de la librería o tenéis pensado añadirlo?

Gracias, un saludo.


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Wed Oct 19, 2016 7:41 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hola Javi Marin,
Antes de que acabe el año vamos a actualizar la librería de LoRaWAN con estos cambios.
Hasta entonces puedes añadir estas nuevas funciones a tu actual librería:

arduinoLoRaWAN.c

Code:
línea 118, añadir:
 const char command_81[]   PROGMEM   =    "mac set ar %s\r\n";
 const char command_82[]   PROGMEM   =    "mac get ar\r\n";

línea 205, insertar:
    command_81,
    command_82

línea 4860, añadir:
/*!
 * @brief   This function is used to set the automatic reply status from module
 *
 * @param   char* state: "on"/"off"
 *
 * @return      
 *    @arg   '0' if OK
 *    @arg   '1' if error
 *    @arg   '2' if no answer
 *  @arg   '7' if input parameter error
 */
uint8_t arduinoLoRaWAN::setAR(char* state)
{
   uint8_t status;
   char ans1[15];
   char ans2[15];

   // check state
   if ((strcmp(state, "on")) && (strcmp(state, "off"))) return LORAWAN_INPUT_ERROR;
   
   memset(_command,0x00,sizeof(_command));
   memset(ans1,0x00,sizeof(ans1));
   memset(ans2,0x00,sizeof(ans2));
   
   // create "mac set ar" command
   sprintf_P(_command,(char*)pgm_read_word(&(table_LoRaWAN_COMMANDS[81])),state);
   // create "ok" answer
   sprintf_P(ans1,(char*)pgm_read_word(&(table_LoRaWAN_ANSWERS[0])));
   // create "invalid_param" answer
   sprintf_P(ans2,(char*)pgm_read_word(&(table_LoRaWAN_ANSWERS[1])));
   
   //send command and wait for ans
   status = sendCommand(_command,ans1,ans2,500);
      
   if (status == 1)
   {
      if (strcmp(state, "on")  == 0) _ar = true;
      if (strcmp(state, "off") == 0) _ar = false;      
      return LORAWAN_ANSWER_OK;
   }
   else if (status == 2)
   {
      return LORAWAN_ANSWER_ERROR;
   }
   else
   {
      return LORAWAN_NO_ANSWER;
   }
}


/*!
 * @brief   This function is used to get the automatic reply status from module
 *
 * @param   char* state: "on"/"off"
 *
 * @return      
 *    @arg   '0' if OK
 *    @arg   '1' if error
 *    @arg   '2' if no answer
 *     @arg   '7' if input parameter error
 */
uint8_t arduinoLoRaWAN::getAR()
{
   uint8_t status;
   char ans1[15];
   char ans2[15];
   char ans3[15];

   memset(_command,0x00,sizeof(_command));
   memset(ans1,0x00,sizeof(ans1));
   memset(ans2,0x00,sizeof(ans2));
   memset(ans2,0x00,sizeof(ans3));
   
   // create "mac get ar" command
   sprintf_P(_command,(char*)pgm_read_word(&(table_LoRaWAN_COMMANDS[82])));
   sprintf_P(ans1,(char*)pgm_read_word(&(table_LoRaWAN_ANSWERS[9])));
   sprintf_P(ans2,(char*)pgm_read_word(&(table_LoRaWAN_ANSWERS[10])));
   // create "invalid_param" answer
   sprintf_P(ans3,(char*)pgm_read_word(&(table_LoRaWAN_ANSWERS[1])));
   
   //send command and wait for ans
   status = sendCommand(_command,ans1,ans2,ans3,500);
   
   if (status == 1)
   {
      _ar = true;
      return LORAWAN_ANSWER_OK;
   }
   else if (status == 2)
   {
      _ar = false;
      return LORAWAN_ANSWER_OK;
   }
   else if (status == 3)
   {
      return LORAWAN_ANSWER_ERROR;
   }
   else
   {
      return LORAWAN_NO_ANSWER;
   }
}


en "Radio Functions" arduinoLoRaWAN.h
Code:
      uint8_t setAR(char* state);
      uint8_t getAR();


Una vez insertados estos dos nuevos métodos ya puedes utilizar:
Code:
LoRaWAN.setAR(estado);
LoraWAN.getAR();

en tu código.

Un saludo.


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Fri Jan 27, 2017 10:33 am 

Joined: Tue Oct 18, 2016 8:05 am
Posts: 13
Buenos días,

Hemos podido implementarlo correctamente con una arduino Uno pero con una Leonardo nos da problemas, ¿hay incompatibilidad con algunos modelos?

Gracias, saludos.


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Mon Jan 30, 2017 8:44 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hola Javi Marin,
La librería ha sido probada con Arduino UNO y si utilizas la librería en otras placas asegurate que el bus I2C, la UART y los pines digitales están en el mismo sitio que en el Arduino UNO. Por lo que veo, parece que Arduino Leonardo tiene el bus I2C en otros pines.
Saludos.


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Tue Mar 07, 2017 2:19 pm 

Joined: Tue Oct 18, 2016 8:05 am
Posts: 13
Buenos días,

Probando de nuevo el módulo LoRawan con multiprotocol radio y Arduino Uno hemos comprobado que efectivamente recibimos el downlink (AR está en ON), pero la estación no recibe el ACK de dicho downlink.

Es un error persistente, no hemos conseguido que lo reciba en ninguna ocasión.

Saludos,


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Wed Mar 08, 2017 8:28 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hola Javi Marin,

¿Has probado los ejemplos "LoRaWAN_03_join_abp_send_confirmed" o "LoRaWAN_09_join_otaa_send_confirmed"?.

¿Tienes configurado tu concentador y/o backend para enviar ACK? (consulta tu proveedor de servicios o en el foro del backend para configurarlo correctamente)

Copia en este post el programa que estás utilizando así como la salida (de la terminal) que obtienes al ejecutarlo.

Sube también alguna foto de tu configuración Hardware para inspeccionarla visualmente y comprobar que todo está bien configurado.

Regards.


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Thu Jun 29, 2017 7:24 pm 

Joined: Tue Oct 18, 2016 8:05 am
Posts: 13
Buenas tardes,

Respecto al tema anterior se arregló activando el parámetro Automatic Reply cada vez en el loop en vez de solo en la función setup:

error = LoRaWAN.ON(socket);
error = LoRaWAN.setAR("on");
error = LoRaWAN.joinABP();

Usando vuestros productos también hemos comprobado que al utilizar la función getUpCounter() no se actualiza el valor de la variable LoRaWAN._upCounter y siempre vale 0, por lo que no nos es posible desarrollar un código que mantenga el mismo valor si no recibe ACK:

uint32_t = cntr;
error = LoRaWAN._getUpCounter;
if (error==0){
cntr = LoRaWAN._upCounter;
}
error = LoRaWAN.sendConfirmed(3, data);
if (error!=0){
LoRaWAN.setUpCounter(cntr);
}

La variable cntr vale siempre 0, pese a que en el backend (SPN de Kerlink) va aumentando.
¿A qué se debe que no se actualice?

Un saludo.


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Fri Jun 30, 2017 10:11 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hola Javi Marin,

¿puedes indicarnos que ejemplo estás utilizando para visualizar lo que comentas? Así intentamos replicar lo mismo con el mismo código.

Gracias!

Saludos.


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Mon Jul 10, 2017 8:31 am 

Joined: Tue Oct 18, 2016 8:05 am
Posts: 13
Buenos días,

El código utilizado es LoRaWAN_03_join_abp_send_confirmed ligeramente modificado (al encender el módulo en la función loop) utilizando los métodos getUpCounter y setUpCounter:

Code:
/*
 *  ------ LoRaWAN Code Example --------
 *
 *  Explanation: This example shows how to configure the module
 *  and all general settings related to back-end registration
 *  process.
 *
 *  Copyright (C) 2015 Libelium Comunicaciones Distribuidas S.L.
 *  http://www.libelium.com
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  Version:           1.3
 *  Design:            David Gascon
 *  Implementation:    Luismi Marti
 *  Ported to Arduino: Ruben Martin
 */

#include <Wire.h>

// Cooking API libraries
#include <arduinoUART.h>
#include <arduinoUtils.h>

// LoRaWAN library
#include <arduinoLoRaWAN.h>

// Pin definition for LoRaWAN module error LED:
const int error_led =  13;

//////////////////////////////////////////////
uint8_t socket = SOCKET1;
//////////////////////////////////////////////

// Device parameters for Back-End registration
////////////////////////////////////////////////////////////
char DEVICE_EUI[]  = "0102030405060708";
char DEVICE_ADDR[] = "05060708";
char NWK_SESSION_KEY[] = "01020304050607080910111213141516";
char APP_SESSION_KEY[] = "000102030405060708090A0B0C0D0E0F";
////////////////////////////////////////////////////////////

// Define port to use in Back-End: from 1 to 223
uint8_t PORT = 3;

// Define data payload to send (maximum is up to data rate)
char data[] = "0102030405060708090A0B0C0D0E0F";

// variable
uint8_t error;

uint32_t seqNo = 0;


void setup()
{
  //LoRaWAN example - Send Confirmed packets (with ACK)
  pinMode(error_led, OUTPUT);
  digitalWrite(error_led, LOW);

  //------------------------------------
  //Module configuration
  //------------------------------------

  //////////////////////////////////////////////
  // 1. Switch on
  //////////////////////////////////////////////
  error = LoRaWAN.ON(socket);

  // Check status
  if( error == 0 )
  {
    //1. Switch ON OK
    digitalWrite(error_led, LOW);
  }
  else
  {
    //1. Switch ON error
    digitalWrite(error_led, HIGH);
  }

  //////////////////////////////////////////////
  // 2. Set Device EUI
  //////////////////////////////////////////////
  error = LoRaWAN.setDeviceEUI(DEVICE_EUI);

  // Check status
  if( error == 0 )
  {
    //2. Device EUI set OK
    digitalWrite(error_led, LOW);
  }
  else
  {
    //2. Device EUI set error
    digitalWrite(error_led, LOW);
  }

  //////////////////////////////////////////////
  // 3. Set Device Address
  //////////////////////////////////////////////
  error = LoRaWAN.setDeviceAddr(DEVICE_ADDR);

  // Check status
  if( error == 0 )
  {
    //3. Device address set OK
    digitalWrite(error_led, LOW);
  }
  else
  {
    //3. Device address set error
    digitalWrite(error_led, HIGH);
  }

  //////////////////////////////////////////////
  // 4. Set Network Session Key
  //////////////////////////////////////////////
  error = LoRaWAN.setNwkSessionKey(NWK_SESSION_KEY);

  // Check status
  if( error == 0 )
  {
    //4. Network Session Key set OK
    digitalWrite(error_led, LOW);
  }
  else
  {
    //4. Network Session Key set error
    digitalWrite(error_led, HIGH);
  }

  //////////////////////////////////////////////
  // 5. Set Application Session Key
  //////////////////////////////////////////////
  error = LoRaWAN.setAppSessionKey(APP_SESSION_KEY);

  // Check status
  if( error == 0 )
  {
    //5. Application Session Key set OK
    digitalWrite(error_led, LOW);
  }
  else
  {
    //5. Application Session Key set error
    digitalWrite(error_led, HIGH);
  }

  //////////////////////////////////////////////
  // 6. Save configuration
  //////////////////////////////////////////////
  error = LoRaWAN.saveConfig();

  // Check status
  if( error == 0 )
  {
    //6. Save configuration OK
    digitalWrite(error_led, LOW);
  }
  else
  {
    //6. Save configuration error
    digitalWrite(error_led, HIGH);
  }

  //------------------------------------
  //Module configured
  //------------------------------------
 
  LoRaWAN.getDeviceEUI();
  //Device EUI in LoRaWAN._devEUI
 
  LoRaWAN.getDeviceAddr();
  //Device Addres in LoRaWAN._devAddr
}


void loop()
{
  //////////////////////////////////////////////
  // 1. Switch on
  //////////////////////////////////////////////
  error = LoRaWAN.ON(socket);

  // Check status
  if( error == 0 )
  {
    //1. Switch ON OK
    digitalWrite(error_led, LOW);

    // cambiar seqNo manualmente
    error = LoRaWAN.getUpCounter();
    if (error == 0){
      seqNo = LoRaWAN._upCounter;
      error = LoRaWAN.setUpCounter(seqNo);
    }
  }
  else
  {
    //1. Switch ON errorans2,
    digitalWrite(error_led, HIGH);
  }
 
  //////////////////////////////////////////////
  // 2. Join network
  //////////////////////////////////////////////
  error = LoRaWAN.joinABP();

  // Check status
  if( error == 0 )
  {
    //2. Join network OK
    digitalWrite(error_led, LOW);

  //////////////////////////////////////////////
  // 3. Send unconfirmed packet
  //////////////////////////////////////////////
    error = LoRaWAN.sendConfirmed(PORT, data);
 
    // Error messages:
    /*
     * '6' : Module hasn't joined a network
     * '5' : Sending error
     * '4' : Error with data length
     * '2' : Module didn't response
     * '1' : Module communication error
     */
    // Check status
    if( error == 0 )
    {
      //3. Send Unconfirmed packet OK
      if (LoRaWAN._dataReceived == true)
      {
        //There's data on
        //port number: LoRaWAN._port
        //and Data in: LoRaWAN._data
        digitalWrite(error_led, LOW);
      }
    }
    else
    {
      //3. Send Confirmed packet error
      digitalWrite(error_led, HIGH);
    }
  }
  else
  {
    //2. Join network error
    digitalWrite(error_led, HIGH);
  }

  //////////////////////////////////////////////
  // 4. Switch off
  //////////////////////////////////////////////
  error = LoRaWAN.OFF(socket);

  // Check status
  if( error == 0 )
  {
    //4. Switch OFF OK
    digitalWrite(error_led, LOW);
  }
  else
  {
    //4. Switch OFF error
    digitalWrite(error_led, HIGH);
  }
 
  delay(20000);
}


Y esta es la salida obtenida:

Code:
sys get ver
mac get upctr
mac set upctr 1
mac save
mac join abp
mac tx cnf 3 0102030405060708090A0B0C0D0E0F
mac save
sys get ver
mac get upctr
mac set upctr 1
mac save
mac join abp
mac tx cnf 3 0102030405060708090A0B0C0D0E0F
mac save
sys get ver
mac get upctr
mac set upctr 1
mac save
mac join abp
mac tx cnf 3 0102030405060708090A0B0C0D0E0F
mac save
sys get ver
mac get upctr
mac set upctr 1
mac save
mac join abp
mac tx cnf 3 0102030405060708090A0B0C0D0E0F
mac save


Teóricamente upctr debería ir incrementándose pero siempre es 1.

Saludos.


Top
 Profile  
 
 Post subject: Re: Librería LoRaWAN arduino
PostPosted: Tue Jul 11, 2017 7:29 am 

Joined: Mon Sep 28, 2009 12:06 pm
Posts: 11366
Hola Javi Marin,

¿puede eliminar de tu código el setupcounter?

No te hace falta configurarlo ya que va cogiéndolo del módulo.

Prueba y nos dices.

Saludos


Top
 Profile  
 
Display posts from previous:  Sort by  
Post a new topicPost a reply Page 1 of 3   [ 26 posts ]
Go to page 1, 2, 3  Next


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
cron


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Libelium theme based on 610nm Style by Daniel St. Jules of http://www.gamexe.net


© Libelium Comunicaciones Distribuidas S.L. | Terms of use.