Log in Register

Login to your account

Username
Password *
Remember Me

Create an account

Fields marked with an asterisk (*) are required.
Name
Username
Password *
Verify password *
Email *
Verify email *
Captcha *
Welcome, Guest
Username: Password: Remember me

TOPIC: [Résolu] trame xpl utiliser plus d'un caractere

trame xpl utiliser plus d'un caractere 20 Nov 2014 12:16 #1

bonjour

avec mon code a la réception de la trame xpl je n'utilise qu'un seul caractere

pour passer la pin 8 a l'état haut ou bas

je me décale d'une case pour utiliser n pour on f pour off

j'aimerais utiliser le résultat de device pour pouvoir conserver ma commande on off

et commander les autre pins en ne changeant que le numero de la device

pouvez vous m'aider svp

merci

les commandes
xpl-sender -m xpl-cmnd -c lighting.basic command=on device=8


xpl-sender -m xpl-cmnd -c lighting.basic command=off device=8

la reception arduino

192.168.0.17:44950 [xpl-cmnd/lighting.basic: bnz-sender.raspberrypi -> * on/8]
lighting.basic
{
command=on
device=8
}

mon code
#include <SPI.h>       
#include <Ethernet.h>
#include <EthernetUdp.h>

#include "xPL.h"

xPL xpl;
char value; // creation de value
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0D, 0xF0, 0xF5 };
IPAddress ip(192, 168, 0, 177);
IPAddress broadcast(192, 168, 0, 255);
EthernetUDP Udp;
 
void SendUdPMessage(char *buffer)
 
{
  Udp.beginPacket(broadcast, xpl.udp_port);
  Udp.write(buffer);
  Udp.endPacket();
}
 
void AfterParseAction(xPL_Message * message)
{
  if (xpl.TargetIsMe(message))
  {
    if (message->IsSchema_P(PSTR("lighting"), PSTR("basic")))
    {
      Serial.println(PSTR("is lighting.basic"));
 
    }
 
 
}
 
 
  // show message     
  Serial.println(message->toString());
  // quand on receptionne un message, on sauvegarde la 'value'
 // de la commande (1) le deuxieme caractere n pour on f pour off
  value = message->command->value[1];
 
}
 
void setup()
{
  Serial.begin(115200);
  Ethernet.begin(mac,ip);
  Udp.begin(xpl.udp_port);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT); 
 
  xpl.SendExternal = &SendUdPMessage;  // pointer to the send callback
  xpl.AfterParseAction = &AfterParseAction;  // pointer to a post parsing action callback
  xpl.SetSource_P(PSTR("xpl"), PSTR("arduino"), PSTR("test")); // parameters for hearbeat message
 
}
 
void loop()
{
  xpl.Process();  // heartbeat management
 
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    char xPLMessageBuff[XPL_MESSAGE_BUFFER_MAX];
 
    // read the packet into packetBufffer
    Udp.read(xPLMessageBuff, XPL_MESSAGE_BUFFER_MAX);       
 
    // parse message
    xpl.ParseInputMessage(xPLMessageBuff);
 
    Serial.println(value);
 
    if (value == 'n')
    {
 
      digitalWrite(8,HIGH);
    }
    if (value == 'f')
    {
 
      digitalWrite(8,LOW);
    }
 
    {
 
 
    }
 
    {
 
 
    }
  }
}
Last Edit: 20 Nov 2014 20:21 by gromain. Reason: balise [code]
The administrator has disabled public write access.

trame xpl utiliser plus d'un caractere 20 Nov 2014 20:32 #2

salut,

plutôt que de lire le Xème caractère, tu peux comparer la chaine complète au moyen de l'instruction strcmp.

Exemple:
!strcmp(message -> command.value,"on") // renvoie 0 si value vaut "on"
ou encore
!strcmp(message -> command.value,"off") // renvoie 0 si value vaut "off"

en espérant que ça t'aide Smile

Gromain
  • gromain
  • Avatar 2013 01 07
  • OFFLINE
  • Administrateur
  • Administrateur
  • Posts: 153
  • Thank you received: 10
  • Karma: 3
The administrator has disabled public write access.

trame xpl utiliser plus d'un caractere 22 Nov 2014 07:32 #3

salut

la je suis perdu

je cherche comment faire
if (value == 'on8')
{

digitalWrite(8,HIGH);
}
if (value == 'off8')
{

digitalWrite(8,LOW);
}
a la réception de la trame xpl
xpl-cmnd
{
hop=1
source=bnz-send.raspberrypi
target=*
}
lighting.basic
{
command=on
device=8
}

if (value == 'on7') pour la pin 7

recuperer la valeur de devise avec command=on ou off

si je remplace

value = message->command->value[1];

par

!strcmp (message->command->value,"on");

Serial.println(value); (me retourne rien)

Serial.println(!strcmp);(me retourne 0 pour toutes les trames reçues)
Last Edit: 22 Nov 2014 07:43 by jeanphilippe.
The administrator has disabled public write access.

trame xpl utiliser plus d'un caractere 22 Nov 2014 13:22 #4

ok, il faut que tu modifies un poil ton approche du problème Wink

il faut que tu traites l'action à la suite du parsing, comme ça tu travailles directement avec le contenu du message.
#include <SPI.h>       
#include <Ethernet.h>
#include <EthernetUdp.h>

#include "xPL.h"

xPL xpl;
 
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0D, 0xF0, 0xF5 };
IPAddress ip(192, 168, 0, 177);
IPAddress broadcast(192, 168, 0, 255);
EthernetUDP Udp;
 
void SendUdPMessage(char *buffer)
 
{
  Udp.beginPacket(broadcast, xpl.udp_port);
  Udp.write(buffer);
  Udp.endPacket();
}
 
void AfterParseAction(xPL_Message * message)
{
	if (xpl.TargetIsMe(message))
	{
		if (message->IsSchema_P(PSTR("lighting"), PSTR("basic")))
		{
		  Serial.println(PSTR("is lighting.basic"));
 
			if(!strcmp(message -> command[0].name,"command")){ // on vérifie que la première ligne est "command"
 
				if(!strcmp(message -> command[1].name,"device")){ // si ok on vérifie que la deuxieme ligne est "device"
 
					int valeur=0; // contiendra le n° de pin extrait par sscanf (device=)
 
					if(sscanf(message -> command[1].value, "%d", &valeur)){ // on recupere le n° de device et verifie qu'il est valable (c'est un nombre)
 
						Serial.print(PSTR("pin="));
						Serial.println(valeur);
 
						if(!strcmp(message -> command[1].value,"on")){ // si "on" alors...
							digitalWrite(valeur,HIGH);
						} else if(!strcmp(message -> command[1].value,"off")){ // si "off" alors...
							digitalWrite(valeur,LOW);
						} else {
							Serial.println(PSTR("commande inconnue"));
						}
 
					}
				} else {
					Serial.println(PSTR("device non valide"));
				}
 
			}
 
		}
	}
 
	// show message     
	Serial.println(message->toString());
 
 
}
 
void setup()
{
  Serial.begin(115200);
  Ethernet.begin(mac,ip);
  Udp.begin(xpl.udp_port);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT); 
 
  xpl.SendExternal = &SendUdPMessage;  // pointer to the send callback
  xpl.AfterParseAction = &AfterParseAction;  // pointer to a post parsing action callback
  xpl.SetSource_P(PSTR("xpl"), PSTR("arduino"), PSTR("test")); // parameters for hearbeat message
 
}
 
void loop()
{
  xpl.Process();  // heartbeat management
 
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    char xPLMessageBuff[XPL_MESSAGE_BUFFER_MAX];
 
    // read the packet into packetBufffer
    Udp.read(xPLMessageBuff, XPL_MESSAGE_BUFFER_MAX);       
 
    // parse message
    xpl.ParseInputMessage(xPLMessageBuff);
 
  }
}

à tester mais ça devrait fonctionner moyennant quelques retouches.

Romain
  • gromain
  • Avatar 2013 01 07
  • OFFLINE
  • Administrateur
  • Administrateur
  • Posts: 153
  • Thank you received: 10
  • Karma: 3
The administrator has disabled public write access.

trame xpl utiliser plus d'un caractere 04 Dec 2014 11:33 #5

salut

on peut pas faire une comparaison char value et int valeur ?

j'arrive a avoir les deux valeurs celle de value (n)si on ou (f) si off
value = message->command->value[1];

celle de valeur c'est le numèro de la pin qui doit être (HIGH) ou (LOW)
if(sscanf(message -> command[1].value, "%d" ,&valeur))


ça donne a la reception de la trame
xpl-cmnd
{
hop=1
source=bnz-send.raspberrypi
target=*
}
lighting.basic
{
command=on
device=8
}
 
n
8

maintenant j'aimerai en admettant que se soit possible

si value==n et valeur==8 (digitalWrite(8,HIGH)Wink

si value==n et valeur==7 (digitalWrite(7,HIGH)Wink

une idée sur la question Sad

j'ais tester avec if && et plains d'autres mais ?
/*
 * xPL.Arduino v0.1, xPL Implementation for Arduino
 *
 * This code is parsing a xPL message stored in 'received' buffer
 * - isolate and store in 'line' buffer each part of the message -> detection of EOL character (DEC 10)
 * - analyse 'line', function of its number and store information in xpl_header memory
 * - check for each step if the message respect xPL protocol
 * - parse each command line
 *
 * Copyright (C) 2012 johan@pirlouit.ch, olivier.lebrun@gmail.com
 * Original version by Gromain59@gmail.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 2
 * 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, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
 
#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <stdio.h>
#include "xPL.h"

xPL xpl;
char value;//contiendra une lettre n pour( on)  f pour (off )
int valeur; // contiendra le n° de pin extrait par sscanf (device=)
 
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x0D, 0xF0, 0xF5 };
IPAddress ip(192, 168, 0, 177);
IPAddress broadcast(192, 168, 0, 255);
EthernetUDP Udp;
 
void SendUdPMessage(char *buffer)
 
{
  Udp.beginPacket(broadcast, xpl.udp_port);
  Udp.write(buffer);
  Udp.endPacket(); 
}
 
void AfterParseAction(xPL_Message * message)
{
  if (xpl.TargetIsMe(message))
  {
    if (message->IsSchema_P(PSTR("lighting"), PSTR("basic")))
    {
      Serial.println(PSTR("is lighting.basic"));
 
    }
 
 
  }
 
 
  // show message     
  Serial.println(message->toString());
  // quand on receptionne un message, on sauvegarde la 'value'
  // de la commande (1) le deuxieme caractere n pour on f pour off
  value = message->command->value[1];
 
// on recupere le n° de device et verifie qu'il est valable(c'est un nombre)
  if(sscanf(message -> command[1].value, "%d" ,&valeur)){ 
 
 
 
  }
}
void setup()
{
  Serial.begin(115200);
  Ethernet.begin(mac,ip);
  Udp.begin(xpl.udp_port);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);  
 
  xpl.SendExternal = &SendUdPMessage;  // pointer to the send callback
  xpl.AfterParseAction = &AfterParseAction;  // pointer to a post parsing action callback 
  xpl.SetSource_P(PSTR("xpl"), PSTR("arduino"), PSTR("test")); // parameters for hearbeat message
 
}
 
void loop()
{
  xpl.Process();  // heartbeat management
 
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    char xPLMessageBuff[XPL_MESSAGE_BUFFER_MAX];
 
    // read the packet into packetBufffer
    Udp.read(xPLMessageBuff, XPL_MESSAGE_BUFFER_MAX);        
 
    // parse message
    xpl.ParseInputMessage(xPLMessageBuff);
 
 
 
    Serial.println(value);
 
    Serial.println(valeur);
 
   if ()
 
 
    {
 
      digitalWrite(8,HIGH);
    }
    if ( )
    {
 
      digitalWrite(8,LOW);
    }
    if ()
    {
 
      digitalWrite(7,HIGH);
    }
    if ( )
    {
 
      digitalWrite(7,LOW);
    }
  }
}
 
 
 

merci

je regarde aussi ce que je peux faire avec ton script gromain
Last Edit: 04 Dec 2014 14:05 by gromain.
The administrator has disabled public write access.

trame xpl utiliser plus d'un caractere 04 Dec 2014 14:08 #6

salut,

je pense que le code que je t'ai filé répond à ton besoin Wink

gromain
  • gromain
  • Avatar 2013 01 07
  • OFFLINE
  • Administrateur
  • Administrateur
  • Posts: 153
  • Thank you received: 10
  • Karma: 3
The administrator has disabled public write access.

trame xpl utiliser plus d'un caractere 06 Dec 2014 17:08 #7

salut

merci gromain ça fonctionne

tu as repondu a mes questions Smile
j'aimerais utiliser le résultat de device pour pouvoir conserver ma commande on off

et commander les autres pins en ne changeant que le numero de la device

if(sscanf(message -> command[1].value, "%d" ,&valeur)) Whistling
 
#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <stdio.h>
#include "xPL.h"

xPL xpl;
char value;//contiendra une lettre n pour on  f pour off 
int valeur; // contiendra le n° de pin extrait par sscanf (device=)
 
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x0D, 0xF0, 0xF5 };
IPAddress ip(192, 168, 0, 177);
IPAddress broadcast(192, 168, 0, 255);
EthernetUDP Udp;
 
void SendUdPMessage(char *buffer)
 
{
  Udp.beginPacket(broadcast, xpl.udp_port);
  Udp.write(buffer);
  Udp.endPacket(); 
}
 
void AfterParseAction(xPL_Message * message)
{
  if (xpl.TargetIsMe(message))
  {
    if (message->IsSchema_P(PSTR("lighting"), PSTR("basic")))
    {
      Serial.println(PSTR("is lighting.basic"));
 
    }
 
 
  }
 
 
  // show message     
  Serial.println(message->toString());
  // quand on receptionne un message, on sauvegarde la 'value'
  // de la commande (1) le deuxieme caractere n pour on f pour off
  value = message->command->value[1];
 
// on recupere le n° de device et verifie qu'il est valable(c'est un nombre)
  if(sscanf(message -> command[1].value, "%d" ,&valeur)){ 
 
 
 
  }
}
void setup()
{
  Serial.begin(115200);
  Ethernet.begin(mac,ip);
  Udp.begin(xpl.udp_port);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);  
 
  xpl.SendExternal = &SendUdPMessage;  // pointer to the send callback
  xpl.AfterParseAction = &AfterParseAction;  // pointer to a post parsing action callback 
  xpl.SetSource_P(PSTR("xpl"), PSTR("arduino"), PSTR("test")); // parameters for hearbeat message
 
}
 
void loop()
{
  xpl.Process();  // heartbeat management
 
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    char xPLMessageBuff[XPL_MESSAGE_BUFFER_MAX];
 
    // read the packet into packetBufffer
    Udp.read(xPLMessageBuff, XPL_MESSAGE_BUFFER_MAX);        
 
    // parse message
    xpl.ParseInputMessage(xPLMessageBuff);
 
 
 
    Serial.println(value);
 
    Serial.println(valeur);
 
    if (value == 'n')
    {
 
      digitalWrite(valeur,HIGH);
    }
    if (value == 'f')
    {
 
      digitalWrite(valeur,LOW);
    }
    if (value == 'n')
    {
 
      digitalWrite(valeur,HIGH);
    }
    if (value == 'f')
    {
 
      digitalWrite(valeur,LOW);
    }
  }
}
 
 
 
 
 
 
Last Edit: 06 Dec 2014 17:29 by gromain.
The administrator has disabled public write access.

[Résolu] trame xpl utiliser plus d'un caractere 06 Dec 2014 17:08 #8

Ce topic a été indiqué comme résolu
The administrator has disabled public write access.

trame xpl utiliser plus d'un caractere 06 Dec 2014 17:30 #9

et bavala Smile
  • gromain
  • Avatar 2013 01 07
  • OFFLINE
  • Administrateur
  • Administrateur
  • Posts: 153
  • Thank you received: 10
  • Karma: 3
The administrator has disabled public write access.
Backtotop