MYCSS

12 березня 2020 р.

Аналіз протоколу обміну метеорологічної станції з зовнішніми бездротовими сенсорами

Придбав собі таку метеорологічну станцію, для аналізу погоди, температури і вологості.
Weather station
Для реалізацій функцій розумного дому я вирішив використовувати ті датчики що вже є, тобто зовнішній сенсор від погодної станції.
Але як з'ясувати у якому форматі і на якій частоті передає данні цей сенсор до станції.
Розібравши сенсор я заміряв розмір антени : довжина 22мм,  діаметр 4.5мм. За документацією на антени, знайшов що подібні працюють на частоті 433MHz.
Розміри антени передавача
Надалі побачив який кварцовий резонатор  встановлено : це 13.533 MHz.
За попередніми підрахунками робоча частот має бути : Кварц 13.533 MHz * 32 = 433.056 MHz.

Аналізатор RTL-SDR


USB  RTL-SDR v3.0 на базі чіпів RTL2838U та R820T2
Використовуючи аналізатор RTL-SDR і розмістивши сенсор не далеко від антени RTL-SDR, я натискав клавішу "ТХ" на бездротовому сенсорі і зміг визначити робочу частоту сенсор це 434.002MHz, за потужним і синхронним за натисканням клавіші "ТХ" сигналом .

Пошук частоти за допомогою RTL-SDR

Декодування

Надалі використовуючи програму rtl_433 виконав аналіз передаваних даних з сенсора .
rtl_433 -f 434.002M -R91 -vvv
rtl_433 version 20.02 branch  at 202002171252 inputs file rtl_tcp RTL-SDR
Use -h for usage help and see https://triq.org/ for documentation.
Trying conf file at "C:\ProgramData\rtl_433\rtl_433.conf"...
Registered 1 out of 149 device decoding protocols
Found 1 device(s)

trying device  0:  Realtek, RTL2838UHIDIR, SN: 00000001
Found Rafael Micro R820T tuner
Using device 0: Generic RTL2832U OEM
Exact sample rate is: 250000.000414 Hz
[R82XX] PLL not locked!
Sample rate set to 250000 S/s.
Bit detection level set to 0 (Auto).
Tuner gain set to Auto.
Reading samples in async mode...
Tuned to 434.002MHz.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time      : 2020-03-11 22:41:14
model     : inFactory-TH ID        : 95
Channel   : 1            Temperature: 81.60 ┬░F    Humidity  : 29 %
pulse_demod_ppm(): inFactory, FreeTec NC-3982-913 temperature humidity sensor
bitbuffer:: Number of rows: 2
[00] { 4} 00             : 0000
[01] {40} 5f d0 6b 42 91 : 01011111 11010000 01101011 01000010 10010001
Pulse data: 46 pulses
[  0] Pulse:  179, Gap:  251, Period:  430
[  1] Pulse:  254, Gap:  251, Period:  505
[  2] Pulse:  251, Gap:  251, Period:  502
[  3] Pulse:  255, Gap:  251, Period:  506
[  4] Pulse:  144, Gap: 1971, Period: 2115
[  5] Pulse:  142, Gap:  472, Period:  614
[  6] Pulse:  146, Gap: 1014, Period: 1160
[  7] Pulse:  145, Gap:  465, Period:  610
[  8] Pulse:  146, Gap: 1038, Period: 1184
[  9] Pulse:  142, Gap:  995, Period: 1137
[ 10] Pulse:  142, Gap: 1016, Period: 1158
[ 11] Pulse:  146, Gap: 1015, Period: 1161
[ 12] Pulse:  143, Gap: 1039, Period: 1182
[ 13] Pulse:  144, Gap:  992, Period: 1136
[ 14] Pulse:  146, Gap: 1015, Period: 1161
[ 15] Pulse:  143, Gap:  466, Period:  609
[ 16] Pulse:  145, Gap: 1037, Period: 1182
[ 17] Pulse:  146, Gap:  442, Period:  588
[ 18] Pulse:  145, Gap:  465, Period:  610
[ 19] Pulse:  146, Gap:  466, Period:  612
[ 20] Pulse:  143, Gap:  491, Period:  634
[ 21] Pulse:  142, Gap:  446, Period:  588
[ 22] Pulse:  141, Gap: 1018, Period: 1159
[ 23] Pulse:  142, Gap: 1015, Period: 1157
[ 24] Pulse:  146, Gap:  489, Period:  635
[ 25] Pulse:  144, Gap:  991, Period: 1135
[ 26] Pulse:  146, Gap:  467, Period:  613
[ 27] Pulse:  142, Gap: 1015, Period: 1157
[ 28] Pulse:  146, Gap: 1037, Period: 1183
[ 29] Pulse:  146, Gap:  443, Period:  589
[ 30] Pulse:  143, Gap: 1015, Period: 1158
[ 31] Pulse:  146, Gap:  464, Period:  610
[ 32] Pulse:  146, Gap:  489, Period:  635
[ 33] Pulse:  143, Gap:  445, Period:  588
[ 34] Pulse:  142, Gap:  467, Period:  609
[ 35] Pulse:  145, Gap: 1015, Period: 1160
[ 36] Pulse:  143, Gap:  492, Period:  635
[ 37] Pulse:  141, Gap:  993, Period: 1134
[ 38] Pulse:  146, Gap:  466, Period:  612
[ 39] Pulse:  144, Gap:  467, Period:  611
[ 40] Pulse:  142, Gap: 1040, Period: 1182
[ 41] Pulse:  143, Gap:  444, Period:  587
[ 42] Pulse:  143, Gap:  467, Period:  610
[ 43] Pulse:  143, Gap:  467, Period:  610
[ 44] Pulse:  143, Gap: 1024, Period: 1167
[ 45] Pulse:  156, Gap: 2551, Period: 2707

За результатами роботи з'ясував який  формат  підходить для даних:
pulse_demod_ppm(): inFactory, FreeTec NC-3982-913 temperature humidity sensor
За кодом програми аналізую безпосередньо бінарний формат:
r_device infactory = {
        .name        = "inFactory, FreeTec NC-3982-913 temperature humidity sensor",
        .modulation  = OOK_PULSE_PPM,
        .short_width = 1850,
        .long_width  = 4050,
        .gap_limit   = 4000, // Maximum gap size before new row of bits [us]
        .reset_limit = 8500, // Maximum gap size before End Of Message [us].
        .tolerance   = 1000,
};
inFactory Outdoor sensor transmits data temperature, humidity.
Also NC-3982-913 from Pearl (for FWS-686 station).
Transmissions also includes an id. The sensor transmits
every 60 seconds 6 packets.
    0000 1111 | 0011 0000 | 0101 1100 | 1110 0111 | 0110 0001
    xxxx xxxx | cccc cccc | tttt tttt | tttt hhhh | hhhh ??nn
- x: ID // changes on battery switch
- c: Unknown Checksum (changes on every transmit if the other values are different)
- h: Humidity // BCD-encoded, each nibble is one digit
- t: Temperature   // in °F as binary number with one decimal place + 90 °F offset
- n: Channel // Channel number 1 - 3
Usage:
    # rtl_433 -f 434052000 -R 91 -F json:log.json
Payload looks like this:
    [00] { 4} 00             : 0000
    [01] {40} 0f 30 5c e7 61 : 00001111 00110000 01011100 11100111 01100001
First row is actually the preamble part. This is added to make the signal more unique.

Тепер спроба декодувати вручну сирі бінарні дані: 

Сирі данні:
00             : 0000
5f d0 6b 42 91 : 01011111 11010000 01101011 01000010 10010001
Аналіз:
0000
4 bits of preamble is 0

0101 1111 | 1101 0000 | 0110 1011 | 0100 0010 | 1001 0001
xxxx xxxx | cccc cccc | tttt tttt | tttt hhhh | hhhh ??nn

xxxx xxxx = 0x5F (95) = ID
cccc cccc = 0xD0 (208) = Unknown Checksum
tttt tttt tttt = 0x6B4

b[2]= 6B
b[3]= 42 
temp_raw = (b[2] << 4) | (b[3] >> 4
temp_raw = 0x6B4
float(0x6B4)=1716

temp_f   = (float)temp_raw * 0.1 -90
1716*0.1=171.6-90=81.6 Temperature, F

hhhh hhhh = bx0010 bx1001 = 0x29 = Humidity
nn = bx01 = 01 = Channel

ID: 95, Channel: 1,Temperature: 81.6F, Humidity: 29%


Так як є датчик розряду батареї на екрані станції, то можливо десь і передається ще рівень стану батареї сенсора.
Бездротовий сенсор посилає дані до метеорологічної станції з інтервалами до 1 хвилини по 6 спроб, можливо таким чином вирішується верифікація даних.

В цілому готово.
Наступне завдання прочитати данні що передаються бездротовим сенсором за допомогою  мікроконтролера і плати CC1101 і переслати через MQTT до брокера.



У допомоги для роботи СС1101 , запустимо програму rtl_433 з виконав більш детального аналізу -A
rtl_433 -f 434.002M -R0 -vvv -A
rtl_433 version 20.02 branch  at 202002171252 inputs file rtl_tcp RTL-SDR
Use -h for usage help and see https://triq.org/ for documentation.
Trying conf file at "C:\ProgramData\rtl_433\rtl_433.conf"...
Registered 1 out of 149 device decoding protocols
Found 1 device(s)

trying device  0:  Realtek, RTL2838UHIDIR, SN: 00000001
Found Rafael Micro R820T tuner
Using device 0: Generic RTL2832U OEM
Exact sample rate is: 250000.000414 Hz
[R82XX] PLL not locked!
Sample rate set to 250000 S/s.
Bit detection level set to 0 (Auto).
Tuner gain set to Auto.
Reading samples in async mode...
Tuned to 434.002MHz.
Detected OOK package    2020-03-13 00:51:41
Pulse data: 46 pulses
[  0] Pulse:  257, Gap:  253, Period:  510
[  1] Pulse:  250, Gap:  253, Period:  503
[  2] Pulse:  251, Gap:  252, Period:  503
[  3] Pulse:  252, Gap:  250, Period:  502
[  4] Pulse:  148, Gap: 1972, Period: 2120
[  5] Pulse:  138, Gap:  475, Period:  613
[  6] Pulse:  143, Gap: 1015, Period: 1158
[  7] Pulse:  146, Gap:  466, Period:  612
[  8] Pulse:  143, Gap: 1038, Period: 1181
[  9] Pulse:  144, Gap:  992, Period: 1136
[ 10] Pulse:  147, Gap: 1013, Period: 1160
[ 11] Pulse:  147, Gap: 1014, Period: 1161
[ 12] Pulse:  144, Gap: 1038, Period: 1182
[ 13] Pulse:  145, Gap:  442, Period:  587
[ 14] Pulse:  146, Gap: 1016, Period: 1162
[ 15] Pulse:  142, Gap:  466, Period:  608
[ 16] Pulse:  146, Gap: 1037, Period: 1183
[ 17] Pulse:  144, Gap:  443, Period:  587
[ 18] Pulse:  146, Gap:  464, Period:  610
[ 19] Pulse:  147, Gap:  464, Period:  611
[ 20] Pulse:  146, Gap: 1035, Period: 1181
[ 21] Pulse:  147, Gap:  443, Period:  590
[ 22] Pulse:  143, Gap: 1018, Period: 1161
[ 23] Pulse:  141, Gap:  468, Period:  609
[ 24] Pulse:  143, Gap: 1037, Period: 1180
[ 25] Pulse:  147, Gap:  991, Period: 1138
[ 26] Pulse:  145, Gap: 1016, Period: 1161
[ 27] Pulse:  143, Gap: 1016, Period: 1159
[ 28] Pulse:  146, Gap:  485, Period:  631
[ 29] Pulse:  147, Gap:  992, Period: 1139
[ 30] Pulse:  146, Gap:  464, Period:  610
[ 31] Pulse:  146, Gap:  464, Period:  610
[ 32] Pulse:  146, Gap:  486, Period:  632
[ 33] Pulse:  147, Gap:  442, Period:  589
[ 34] Pulse:  146, Gap: 1042, Period: 1188
[ 35] Pulse:  139, Gap:  443, Period:  582
[ 36] Pulse:  146, Gap:  486, Period:  632
[ 37] Pulse:  147, Gap:  993, Period: 1140
[ 38] Pulse:  142, Gap:  467, Period:  609
[ 39] Pulse:  143, Gap:  468, Period:  611
[ 40] Pulse:  143, Gap: 1038, Period: 1181
[ 41] Pulse:  144, Gap:  443, Period:  587
[ 42] Pulse:  146, Gap:  464, Period:  610
[ 43] Pulse:  147, Gap: 1015, Period: 1162
[ 44] Pulse:  143, Gap:  471, Period:  614
[ 45] Pulse:  156, Gap: 2571, Period: 2727
Analyzing pulses...
Total count:   46,  width: 156.60 ms            (39151 S)
Pulse width distribution:
 [ 0] count:    4,  width: 1008 us [1000;1028]  ( 252 S)
 [ 1] count:   42,  width:  580 us [552;624]    ( 145 S)
Gap width distribution:
 [ 0] count:    4,  width: 1008 us [1000;1012]  ( 252 S)
 [ 1] count:    1,  width: 7888 us [7888;7888]  (1972 S)
 [ 2] count:   21,  width: 1848 us [1768;1944]  ( 462 S)
 [ 3] count:   19,  width: 4072 us [3964;4168]  (1018 S)
Pulse period distribution:
 [ 0] count:   25,  width: 2360 us [2008;2528]  ( 590 S)
 [ 1] count:    1,  width: 8480 us [8480;8480]  (2120 S)
 [ 2] count:   19,  width: 4652 us [4544;4752]  (1163 S)
Level estimates [high, low]:  15989,     23
RSSI: -0.1 dB SNR: 28.4 dB Noise: -28.5 dB
Frequency offsets [F1, F2]:   18750,      0     (+71.5 kHz, +0.0 kHz)



За процедурою pulse_demod_ppm() визначено ти модуляції  OOK_PULSE_PPM

Форма сигналу

За допомогою програми urh  (Universal Radio Hacker), записав форми сигналу:
6 послідовних пакетів від сенсору
Один пакет. Згідно з попереднім аналізом мусить бути 46 імпульсів
Більш детально початок пакету, мусить бути преамбула 0000
Спроба накласти синусоїдний сигнал
Спроба декодувати за довжиною паузи (Gap) після короткого імпульсу (Pulse) (Pulse Position Modulation)

Reference

Hochschule f ̈ur Technik und Wirtschaft des Saarlandes, Saarbr ̈uckenFakult ̈at f ̈ur IngenieurwissenschaftenBachelor ElektrotechnikTutor: Prof. Dr. Martin BuchholzBachelor ThesisImplementation of EnOcean protocol inmicrocontroller and CC1101 transceiver

OOK modualtion:
On-off keying (OOK) denotes the simplest form of amplitude-shift keying (ASK) modulation that represents digital data as the presence or absence of a carrier wave.
OOK - On-Off Keying - Simple Binary Modulation – One Bit at a Time
  
PPM (Pulse position modulation)
Pulse Position Modulation (PPM) is an analog modulating scheme in which the amplitude and width of the pulses are kept constant, while the position of each pulse, with reference to the position of a reference pulse varies according to the instantaneous sampled value of the message signal.
The transmitter has to send synchronizing pulses (or simply sync pulses) to keep the transmitter and receiver in synchronism. These sync pulses help maintain the position of the pulses. The following figures explain the Pulse Position Modulation.

Pulse Position Modulation 
Videos:




triq.org

Допомога в аналізі сигналу:  https://triq.org/pdv - I/Q Spectrogram & Pulsedata

Опис infactory

>rtl_433  -R91 -A

Detected OOK package 2020-12-17 03:09:21 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ time : 2020-12-17 03:09:21 model : inFactory-TH ID : 25 Channel : 1 Battery OK: 1 Temperature: 31.60 F Humidity : 92 % Integrity : CRC Analyzing pulses... Total count: 46, width: 145.55 ms (36387 S) Pulse width distribution: [ 0] count: 4, width: 984 us [980;992] ( 246 S) [ 1] count: 42, width: 540 us [516;560] ( 135 S) Gap width distribution: [ 0] count: 4, width: 1032 us [1028;1040] ( 258 S) [ 1] count: 1, width: 7928 us [7928;7928] (1982 S) [ 2] count: 26, width: 1896 us [1828;1984] ( 474 S) [ 3] count: 14, width: 4104 us [4028;4180] (1026 S) Pulse period distribution: [ 0] count: 30, width: 2380 us [2016;2532] ( 595 S) [ 1] count: 1, width: 8472 us [8472;8472] (2118 S) [ 2] count: 14, width: 4644 us [4548;4724] (1161 S) Pulse timing distribution: [ 0] count: 8, width: 1008 us [980;1040] ( 252 S) [ 1] count: 42, width: 540 us [516;560] ( 135 S) [ 2] count: 1, width: 7928 us [7928;7928] (1982 S) [ 3] count: 26, width: 1896 us [1828;1984] ( 474 S) [ 4] count: 14, width: 4104 us [4028;4180] (1026 S) [ 5] count: 1, width: 10004 us [10004;10004] (2501 S) Level estimates [high, low]: 1000, 16 RSSI: -12.1 dB SNR: 18.0 dB Noise: -30.1 dB Frequency offsets [F1, F2]: 844, 0 (+3.2 kHz, +0.0 kHz) Guessing modulation: Pulse Width Modulation with multiple packets view at https://triq.org/pdv/#AAB013060103F0021C1EF8076810082714808080809255+AAB037060103F0021C1EF8076810082714939393949493939493949494939394939394939394949393939393939493939493939493939393949555 Attempting demodulation... short_width: 540, long_width: 984, reset_limit: 7932, sync_width: 0 Use a flex decoder with -X 'n=name,m=OOK_PWM,s=540,l=984,r=7932,g=1988,t=178,y=0' pulse_demod_pwm(): Analyzer Device bitbuffer:: Number of rows: 16 [00] { 5} 08 : 00001 [01] { 4} f0 : 1111 [02] { 1} 80 : 1 [03] { 3} e0 : 111 [04] { 2} c0 : 11 [05] { 1} 80 : 1 [06] { 1} 80 : 1 [07] { 3} e0 : 111 [08] { 3} e0 : 111 [09] { 3} e0 : 111 [10] { 1} 80 : 1 [11] { 7} fe : 1111111 [12] { 3} e0 : 111 [13] { 3} e0 : 111 [14] { 5} f8 : 11111 [15] { 1} 80 : 1

Результат аналізу хибний PWM  536:1044

Візуальний результат за посиланням https://triq.org/pdv/#AAB01.... але PWM


 Результат аналізу PPM  4100:1900 за заднім фронтом

Візуальний результат за посиланням https://triq.org/pdv/#AAB01.... але PPM

 Результат аналізу PPM  4100:1900 більш детальніше

Візуальний результат за посиланням https://triq.org/pdv/#AAB01.... але PPM zoomed


Немає коментарів:

Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready