Welcome to Our Website

aprenda

para enviar dados para trás e para a frente através da rede de coisas que você precisará usar bytes. Este guia irá ajudá-lo a codificar diferentes tipos de dados em o menor bytes possível.

The unprecedented range of the LoRaWAN technology we build on comes at the cost of low bandwidth and limited airtime (the number times size of packages you send). Felizmente, não precisas de uma foto daquela garagem inteligente que precisa de ser esvaziada. Mesmo um único bit 1 faria!,

o que é um byte?

um byte é um grupo de 8 bits. Um pouco é a unidade mais básica e pode ser 1 ou 0. Um byte não é apenas 8 valores entre 0 e 1, mas 256 (28) combinações diferentes (permutações) variando de 00000000 via e.g. 01010101 a 11111111. Assim, um byte pode representar um número decimal entre 0 (00) e 255.

intrigado? Lembre-se que 3 números decimais também não representam apenas 3 valores entre 0 e 9, mas 1000 (103) permutações de 0(00) a 999.,

Saiba mais sobre como as coisas funcionam: como os Bits e Bytes funcionam e o tutorial de matemática Arduino Bit para aprender mais sobre isso.o que é um buffer de bytes?

pense em buffer como Apenas mais uma palavra para uma matriz, lista, o que quer que ressoa com a sua experiência de programação. Como um byte é um grupo de 8 bits, um buffer é um grupo de um número pré-definido de bytes. Se tivermos um grupo de 3 bytes, isto pode representar 3 valores entre 0 e 255, mas também um único valor entre 0 e 16777216 (2563).

ver o padrão?, O número de opções por posição (n) para a potência do número de posições (r) é o número de permutações: nr. Saiba mais sobre MathIsFun.com.

What the hex?

muitas Vezes, você vai ver um grupo de bytes apresentada como:

FF F0 0F 11

não Foi um byte de um grupo de 8 0s e 1s?, 🤔 Você está totalmente certo, mas, como já vimos 11111111 converte para 255 no bom e velho sistema decimal, também podemos traduzi-lo para a FF em hexadecimal sistema onde cada posição tem 16 (0-9 A-F) valores possíveis. A vantagem é que é mais curto e explícito sobre o valor máximo (257 não é uma opção).,

O exemplo acima traduzido para o sistema decimal e acolchoado para facilitar a leitura seria:

255 240 015 017

Para indicar que você quer dizer 11 em hex e não dois bits ou o número onze, você prefixo com o 0x formatador. Para lhe dizer que significa uso binário B.,h>Code

Byte value Decimal value Hexadecimal value 11 00001011 11 B 0x11 00010001 17 11 B11 00000011 3 3

An example for Arduino:

Yeah, I know… 0x kind of blows the shorter-to-write advantage of hex., quantos bytes posso enviar?tecnicamente, pode enviar 51 bytes. Mas, quanto mais bytes você enviar, mais tempo de antena o pacote vai custar-lhe e mais cedo você vai atingir o seu tempo máximo atribuído. Então, não se pergunte quantos você pode enviar, mas sim como poucos podem fazer o trabalho.

Como enviar números grandes?

uma pergunta melhor seria como enviar intervalos maiores que 255.

Índice

Se os valores possíveis que você precisa suportar não começar em 0 e você sabe o valor mínimo, comece por indexar sobre esse número.,por exemplo, imagine que seria de esperar valores entre 3400 e 3600.,

Sobre o dispositivo que teria codificar esta como:

int myVal = 3450;const int myBase = 3400;byte payload = { myVal - myBase };

E na aplicação de carga funções de:

var myBase = 3400;decoded.myVal = bytes + myBase;

O outro caminho de volta, na aplicação do encoder de carga função teríamos:

var myVal = 3450;var myBase = 3400;var bytes = ;

E no dispositivo de decodificação esta com:

int myBase = 3400;int myVal = payload + myBase;

Como você pode ver, enquanto o valor mínimo é conhecido e o intervalo de nosso valor é de 256 ou menos, podemos ainda utilizar um único byte, sem quebrar um suor., Certifique-se de verificar o seu valor não é maior que 3655 para evitar bugs desagradáveis.😅

Round

Now what if the range is bigger than 256? A próxima pergunta seria se você precisa saber o valor exato. Se o seu sensor tem um alcance de 400 e uma margem de erro de 2, Você não perderia qualquer significado arredondando o valor. Tanto 299 como 300 seriam 150, o que é bom.

Sobre o dispositivo que teria codificar esta como:

int myVal = 300;int errorMargin = 2byte payload = { round(myVal / errorMargin) };

E na aplicação de carga funções de:

var errorMargin = 2;decoded.myVal = bytes * errorMargin;

Você vai ficar com a ideia para a outra maneira ao redor.,

Use palavras

uma palavra é de 2 bytes (exceto em tábuas devidas, Zero e semelhantes, onde é de 4 bytes), o que já lhe dá uma enorme gama de 65536 (2562). O tipo de dados int é uma palavra e Arduino vem com highByte() e lowByte() para extrair o byte esquerdo e direito de uma palavra. Isso torna muito fácil de codificar e descodificar.

Encode (Arduino):

int myVal = 20000;byte payload;payload = highByte(myVal);payload = lowByte(myVal);

Decodificar (payload funções):

decoded.myVal = (bytes << 8) + bytes;

se Perguntando o que o << é sobre?, Esta esquerda muda os 8 bits do primeiro byte 8 posições para a esquerda. Confuso? Pense em como poderíamos codificar o número 11 como dois 1’s e decodificar, deslocando o primeiro 1 para cima uma posição (tornando-o 10) antes de adicionar o outro. Vamos falar mais sobre a mudança de bitcoins a seguir.

Encode (payload funções):

var myVal = 20000;var bytes = ;bytes = (myVal & 0xFF00) >> 8;bytes = (myVal & 0x00FF);

Nunca vi & usado desta forma antes? Isto é um pouco imprudente., Usado desta forma, o lado direito da expressão irá agir como uma máscara para zero fora um byte para que possamos trabalhar com apenas o outro.

Decode (Arduino):

int myVal = ((int)(payload) << 8) + payload;

Shift bits

Se a gama de valores esperados for maior que 65536 podemos usar o mesmo truque. A única diferença é que temos que deslocar manualmente bits quando codificamos no Arduino, assim como fizemos na função de carga útil.digamos que precisamos codificar um longo que usa 4 bytes para um intervalo até 4294967296.,

Encode (Arduino):

Decode (funções de carga útil):

decoded.myVal = ((long)(bytes) << 24) + ((long)(bytes) << 16) + ((long)(bytes) << 8) + ((long)(bytes));

Como enviar números negativos?

para dizer a diferença entre -100 e 100 você vai precisar de um tipo de dados assinado. Estes definem o bit mais alto (mais à esquerda) para 1 para indicar que é um número negativo. Isto significa que, por exemplo, em uma palavra apenas 15 dos 16 bits estão disponíveis para o número real, limitando a gama de 65536 a 32768.,

Index, round and shift

os tipos de dados que usamos até agora são todos assinados, o que significa que todos os truques funcionam bem para valores negativos. Apenas esteja ciente do valor máximo.

tipos de dados sem sinal

Se não espera números negativos e não necessita de um intervalo maior, use explicitamente unsigned int ou unsigned long.como enviar casas decimais?

até agora só lidamos com números arredondados. E se precisar de mais precisão? A resposta é muito semelhante à forma como indexamos ou arredondamos grandes números., Simplesmente múltiplo e dividir o valor à medida que você o codificar e descodificar.

Encode (Arduino):

float myVal = 1.22;byte payload;payload = round(myVal * 100);

Decodificar (payload funções):

decoded.myVal = bytes / 100;

Encode (payload funções):

bytes = Math.round(1.22 * 100);

Decodificar (Arduino):

float myVal = payload / 100.00;

Como enviar vários números?

em muitos casos você vai querer enviar vários valores em uma única mensagem. Comece codificando cada número individual para um buffer de bytes e depois combine-os em um único buffer.,

Encode (Arduino):

Você pode se perguntar por memcpy() aceita payload + sizeOfPayloadA como eles parecem 🍏 e 🍊. Pense nisso como uma instrução para copiar para o buffer payload, mas depois de mover o ponto que irá copiar para, com o comprimento das cargas que adicionamos até agora.,

Decodificar (payload funções)

decoded.myValA = bytes.slice(0, 2);decoded.myValB = bytes.slice(2, 5);// Decode both byte arrays as we did before

Encode (carga de função)

// Encode both values as we did beforevar bytes = bytesA.concat(bytesB);

Decodificar (Arduino):

var payloadA;var payloadB;memcpy(payloadA, 

Como enviar o texto?

a resposta curta é: não. o texto usa muitos bytes. Unicode define mais de 128000 caracteres, de modo que levaria 3 bytes por caractere! Há raramente boas razões para usar texto em vez de números, além de talvez transmitir algumas entradas do Usuário., Na maioria das vezes apenas os caracteres alfanuméricos bastam, nesse caso você pode escapar usando caracteres ASCII que só usam um único byte por caractere. Todas as cadeias de caracteres devem ser terminadas com um carácter nulo (0x00, ‘\0’) para indicar que a cadeia de caracteres terminou.

Você não ouviu isso de mim, mas aqui está como você gostaria de codificar uma cadeia de caracteres:

o Que você faria decodificar com:

decoded.myVal = String.fromCharCode.apply(null, bytes);

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *