Things 네트워크를 통해 데이터를 앞뒤로 보내려면 바이트를 사용해야합니다. 이 가이드는 가능한 한 작은 바이트로 다른 유형의 데이터를 인코딩하는 데 도움이됩니다.
전례 없는 범위의 LoRaWAN 기술에 건축하는 비용에 관해서는 낮은 대역폭이 제한된 방(수 번 패키지 크기를 보내). 다행히도,당신은 비울 필요가있는 그 똑똑한 차고 빈의 그림이 필요하지 않습니다. 심지어 단일 비트
1
할 것입니다!,
What is byte?
바이트는 8 비트의 그룹입니다. 비트는 가장 기본적인 단위이며 1 또는 0 일 수 있습니다. 바이트는 0 과 1 사이의 8 개의 값이 아니라01010101
에서11111111
에 이르는 256(28)다른 조합(오히려 순열)입니다. 따라서 1 바이트는 0(00)과 255 사이의 십진수를 나타낼 수 있습니다.나는 이것이 어떻게 작동하는지 잘 모르겠습니다. 3 개의 십진수는 또한 0 과 9 사이의 3 개의 값이 아니라 0(00)에서 999 까지의 1000(103)순열을 의미한다는 것을 기억하십시오.,
재료 작동 방식에 대한 자세한 내용:비트 및 바이트 작동 방식 및 Arduino Bit Math 자습서는 자세한 내용을 설명합니다.
바이트 버퍼 란 무엇입니까?
버퍼를 배열,목록에 대한 또 다른 단어로 생각하십시오. 바이트가 8 비트 그룹 인 것처럼 버퍼는 미리 정의 된 바이트 수의 그룹입니다. 만약 우리가 그룹은 3 개의 바이트 수이 하나 나타내 3 사이의 값은 0 에서 255 이지만,또한 하나의 사이의 값을 0 16777216(는 2,563).
패턴을 참조하십시오?, 숫자의 선택에 따 위치(n)전원의 위치를(r)은 순열:nr. 에 자세히 알아보십시오 MathIsFun.com.
어떤 육?
종종,당신은 그룹을 참조하십시오의 바이트로 표시됩니다.
FF F0 0F 11
지 않았 바이트 그룹의 80
s1
s?, 🤔당신이 완전히 맞,그럼 우리는 이미 우리가 보았다는11111111
로 변환 255 에 좋은 오래 된 소수 시스템에,우리는 또한 번역을 FF 수 시스템에 각각 위치가 16 일(0-9A-F)가능한 값입니다. 장점은 최대 값에 대해 더 짧고 명시 적이라는 것입니다(257 은 옵션이 아닙니다).,
위의 예제로 번역 소수 시스템을 위해 패딩 가독성이 될 것이다:
255 240 015 017
다는 것을 나타내는 것을 의미는11
에서 육지 두 비트 또는 수 십,접두사 당신은 그것과 함께0x
포맷. 그것을 말하면 이진 사용B
를 의미합니다.,h>Code
11
0x11
B11
An example for Arduino:
Yeah, I know… 0x
kind of blows the shorter-to-write advantage of hex., 🙃
얼마나 많은 바이트를 보낼 수 있습니까?
기술적으로 51 바이트를 보낼 수 있습니다. 하지만,더 많은 바이트를 보내고,더 많은 방송 패키지 비용을 것입니다 당신은 빨리 당신의 최대습니다. 그래서 요구하지 않 자신이 할 수있는 방법을 많이 볼 수있는 가능성이 보내지만 오히려 어떻게 묻는 몇 가지 일을 할 수 있다.
큰 숫자를 보내는 방법?
더 나은 질문은 255 보다 큰 범위를 보내는 방법입니다.
Index
경우에는 가능한 한 당신이 원하는 값을 지원할 필요가 없는 0 에서 시작하고 당신이 알고 있는 최소값을,시작하여 인덱싱에는 숫자입니다.,예를 들어 3400 에서 3600 사이의 값을 기대한다고 상상해보십시오.,
장치에 우리가 인코딩이:
int myVal = 3450;const int myBase = 3400;byte payload = { myVal - myBase };
그 응용 프로그램에서 페이로드 기능이 마:
var myBase = 3400;decoded.myVal = bytes + myBase;
다른 방법으로,주변 응용 프로그램에서 인코더 페이로드 기능을 우리는 것:
var myVal = 3450;var myBase = 3400;var bytes = ;
그리고 장치에 디코딩이:
int myBase = 3400;int myVal = payload + myBase;
당신이 볼 수있는만큼 최소 값을 알려져 있으며 이 범위의 값은 256,우리는 여전히 사용할 수 있는 단일 바이트됩니다., 불쾌한 버그를 방지하기 위해 값이 3655 보다 크지 않은지 확인해야합니다.😅
Round
이제 범위가 256 보다 크면 어떨까요? 다음 질문은 정확한 값을 알아야하는 경우입니다. 센서의 범위가 400 이고 오류 마진이 2 인 경우 값을 반올림하여 의미를 잃지 않습니다. 299 와 300 은 모두 150 으로 반올림되며 괜찮습니다.
장치에 우리가 인코딩이:
int myVal = 300;int errorMargin = 2byte payload = { round(myVal / errorMargin) };
그 응용 프로그램에서 페이로드 기능이 마:
var errorMargin = 2;decoded.myVal = bytes * errorMargin;
당신은 아이디어를 얻을 위한 다른 방법이다.,
단어를 사용
단어는 2 바이트(제외하고 때문에,영와 유사한 보드 그것은 4 개의 바이트),는 이미 당신을 얻는 거대한 범위의 65536(2562). Int 데이터 유형 단어입니다하고 아두이노와 함께 제공highByte()
및lowByte()
추출하려면 왼쪽과 오른쪽에서 바이트 단어입니다. 이렇게하면 인코딩 및 디코딩이 정말 쉽습니다.
인코딩(Arduino):
int myVal = 20000;byte payload;payload = highByte(myVal);payload = lowByte(myVal);
Decode(페이로드 가능):
decoded.myVal = (bytes << 8) + bytes;
무엇인지 궁금
<<
에 대해입니까?, 이 왼쪽은 첫 번째 바이트 8 위치의 8 비트를 왼쪽으로 이동시킵니다. 혼란 스럽습니까? 는 방법에 대해 생각할 수 있는 우리를 인코딩 11 번으로 두 개의 1 의 디코딩 이동하여 상기 제 1 하나의 위기(10)추가하기 전에 다른합니다. 다음에 비트 시프 팅에 대해 더 자세히 이야기하겠습니다.
인코딩(페이로드 가능):
var myVal = 20000;var bytes = ;bytes = (myVal & 0xFF00) >> 8;bytes = (myVal & 0x00FF);
본
&
이 방법을 사용하기 전에? 이것은 비트 단위와., 이런 식으로 사용 식의 오른쪽은 우리가 단지 다른 하나와 함께 작업 할 수 있도록 한 바이트를 제로로 마스크 역할을합니다.
Decode(Arduino):
int myVal = ((int)(payload) << 8) + payload;
비트 시프트
경우의 범위가 예상되는 값 보다 더 큰 65536 우리가 사용할 수 있습니다. 유일한 차이점은 페이로드 기능에서했던 것처럼 Arduino 에서 인코딩 할 때 수동으로 비트를 이동해야한다는 것입니다.
4294967296 까지의 범위에 대해 4 바이트를 사용하는 long 을 인코딩해야한다고 가정 해 봅시다.,
인코딩(Arduino):
Decode(페이로드 가능):
decoded.myVal = ((long)(bytes) << 24) + ((long)(bytes) << 16) + ((long)(bytes) << 8) + ((long)(bytes));
보내는 방법을 부정 번호?
-100 과 100 의 차이를 말하려면 서명 된 데이터 유형이 필요합니다. 이들은 가장 높은(가장 왼쪽)비트를1
로 설정하여 음수임을 나타냅니다. 이것은 예를 들어 한 마디에서 16 비트 중 15 비트 만 실제 숫자에 사용할 수 있다는 것을 의미하며 범위를 65536 에서 32768 로 제한합니다.,
Index,round 및 shift
지금까지 사용한 데이터 유형은 모두 서명되어있어 모든 트릭이 음수 값에서도 잘 작동합니다. 그냥 최대 값을 알고 있어야합니다.
부호 없는 데이터의 유형
경우 예상하지 않는 부정적인 숫자가 필요하고 더 큰 범위가 명시적으로 사용하는unsigned int
또는unsigned long
.
소수를 보내는 방법?
지금까지 우리는 둥근 숫자 만 다루었습니다. 더 정밀도가 필요하다면 어떨까요? 대답은 우리가 큰 숫자를 색인하거나 반올림하는 방법과 매우 유사합니다., 단순히 인코딩 및 디코딩으로 값을 여러 개 나누고 나눕니다.
인코딩(Arduino):
float myVal = 1.22;byte payload;payload = round(myVal * 100);
Decode(페이로드 가능):
decoded.myVal = bytes / 100;
인코딩(페이로드 가능):
bytes = Math.round(1.22 * 100);
Decode(Arduino):
float myVal = payload / 100.00;
보내는 방법을 여러 번호?
많은 경우 단일 메시지로 여러 값을 보내고 싶을 것입니다. 각 개별 번호를 바이트 버퍼로 인코딩 한 다음 단일 버퍼로 결합하여 시작하십시오.,
인코딩(Arduino):
너는 왜
memcpy()
지payload + sizeOfPayloadA
보이는 대로🍏및🍊. 생각은 그것의 명령으로 복사하는payload
버퍼지만,이동한 후에 지점을 그것은 사본으로,길이의 페이로드를 추가했습니다.,
Decode(페이로드를 함수)
decoded.myValA = bytes.slice(0, 2);decoded.myValB = bytes.slice(2, 5);// Decode both byte arrays as we did before
인코딩(페이로드를 함수)
// Encode both values as we did beforevar bytes = bytesA.concat(bytesB);
Decode(Arduino):
var payloadA;var payloadB;memcpy(payloadA,
는 방법을 보내는 텍스트가 있습니까?
짧은 대답은:하지 마십시오.Text 는 많은 바이트를 사용합니다. 유니 코드는 128000 개 이상의 문자를 정의하므로 문자 당 3 바이트가 소요됩니다! 어쩌면 일부 사용자 입력을 전송하는 것 외에도 숫자 대신 텍스트를 사용하는 좋은 이유는 거의 없습니다., 대부분의 시간에만 영숫자 문자를 충분에서는 경우에 당신은 멀리 얻을 수 있습니다 ASCII 문자를 사용하여 사용하는 하나의 바이트별 문자입니다. 모든 문자열은 문자열이 종료되었음을 나타 내기 위해 NULL(0x00,’\0′)문자로 종료되어야합니다.
을 듣지 않에서 그것을 나에게,하지만 다음과 같은 방법으로 당신을 인코딩하는 문자열
는 디코딩을 가진다.
decoded.myVal = String.fromCharCode.apply(null, bytes);