Enviar string entre ESPs

Bom dia.

Tenho ESP8266+LoraMesh como gateway e nos nós também.
Preciso que os nós enviem uma string para o gateway e eventualmente recebam também strings.
Não vou usar o LoraMesh para ler nem acionar suas portas, pois isso será feito pelo ESP.
Tem algum código de exemplo para isso?

Grato.

  Para enviar uma String deve-se usar os comandos de aplicação, ou seja, no byte[2] colocar um comando com valor maior que 12 e menor que 128.

Obs.: O ID 2047 é o ID de broadcast (todos os rádios da rede que “ouvirem” o pacote irão trará-lo)

exemplo enviando uma string para o ID 1 usando o comando 0x10:

ASCII: <1><\0><16>Radioenge_payload+_LoRaMESH<\0>V?
HEX: 01 00 10 52 61 64 69 6F 65 6E 67 65 5F 70 61 79 6C 6F 61 64 2B 5F 4C 6F 52 61 4D 45 53 48 00 56 A8

Usando o exemplo do ESP32 … inclua a função (declare o protótipo da função e cole a função no final do código):
char CMD_aplicacao(int id, char cmd, String mensagem);

    String s_msg="Radioenge_payload+_LoRaMESH";
    char c_cmd_app = 0x10; // qualquer valor de comando acima de 0x0B e menor que 0x7F
    int i_id= 0x01;
    CMD_aplicacao(i_id, c_cmd_app, s_msg);

//====================== Comando de Aplicação = Envio de string ====================
char CMD_aplicacao(int id, char cmd, String mensagem)
{
char id_lsb = id&0xFF; //separando o ind em dois bytes para enviar no pacote; &0xFF pega somente os 8 bits menos significativos
char id_msb = (id>>8)&0xFF;//bitwise desloca os 8 bits mais signficativos e pega somente a parte msb do int
char comando = cmd; // comando referente a GPIO
int tamanho = mensagem.length()+1;//inclui o fim de string 0x00
char payload[tamanho];
mensagem.toCharArray(payload, tamanho);
char pacote[tamanho+5]; // 03 bytes do cabeçalho (id_lsb, id_msb e comando) e 2 bytes do crc
pacote[0] = id_lsb;
pacote[1] = id_msb;
pacote[2] = cmd;
int count = 0;
for (count=3; count<(tamanho+3); count++)
{
pacote[count] = payload[count-3];
}
int crc = CalculaCRC(pacote, tamanho+3);
pacote[tamanho+3] = crc&0xFF;
pacote[tamanho+4]= ((crc>>8)&0xFF);
SWSerial.write(pacote,tamanho+5);
Serial.print(“Envio string para o ID: “);//somente para aparecer no monitor serial do Arduino
Serial.print(id);
Serial.println(” — — —”);
return(1);
}

//==========================================================================

Exemplo modificado no github

Bom dia, estou usando o ESP32, eu segui um exemplo disponibilizado pelo Fábio.
Considerando o ESP8266 e o uso da serial por software:
#define LoRaWANport 85
char mensagem[50] = {0};
sprintf(mensagem,"AT+SEND=%d:field1=%.2f;field2=%.2f \n", LoRaWANport,(LoRaWANport, varFloat1, varFloat2 );
SWSerial.print(mensagem);

Ajustei da seguinte forma para enviar duas strings na mesma mensagem:
#include <HardwareSerial.h>
void setup(){
Serial2.begin(9600, SERIAL_8N1, 16, 17); //usando RX2 e TX2 do ESP, GPIO16 e 17
}
void transmissao_lora(String a, String b) {
char mensagem[100] = {0};
char a2[50];
a.toCharArray(a2, 49);//convertendo a String para char, algumas strings enviadas ficam com caracteres ilegíveis, 49 é o tamanho final, o último caractere indica final
sprintf(mensagem, "AT+SEND=1:%s-%s\n", a2, b);//porta 1, formato a2-b, pode usar uma função decoder na TTN para separar as strings pelo caractere -
Serial2.write(mensagem);//envia a mensagem pela porta serial do módulo
}
void loop(){
transmissao_lora(string1, string2);
}

Muito obrigado Fabio e Cleiton, consegui fazer os envios com o auxílio de vocês.
Abraço!

1 Curtida