itoutline.me

 

Rigol 1054Z i dekodowanie SPI

Ciągnie mnie do “podsłuchiwania”, tym razem padło na protokół SPI. W moim wypadku jest tak, że podejrzenie pakietów czy przebiegu prądu w czasie i zobaczenie jak to wygląda od środka daje olbrzymią satysfakcję. A skoro oscyloskop, który umożliwia to drugie kosztuje ok. 1500 zł nie było na co czekać.

Źródło sygnału SPI

Źródłem sygnału jest Arduino UNO, bez podłączonego żadnego odbiornika SPI. Wyjścia MOSI i MISO są po prostu ze sobą połączone co tworzy lokalną pętlę (loopback).

Program, który będzie generował ciąg znaków “itoutline.me”:

spi_test.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <SPI.h>

char outByte [13] = "itoutline.me";
int i = 0;
const int slaveSelectPin = 10;

void setup()
{
  pinMode (slaveSelectPin, OUTPUT);
  SPI.begin();
  delay(100);
}

void loop()
{
  digitalWrite(slaveSelectPin,LOW);
  for(i = 0; outByte [i] != '\0'; i ++)
  {
    SPI.transfer(outByte [i]);
  }
  digitalWrite(slaveSelectPin,HIGH);
  delay(1000);
}

Nazewnictwo portów w SPI zbyt mocno regulowane nie jest (jak podaje Wikipedia):

“Oficjalnie” Można spotkać
SCLK SCK, CLK
MOSI SIMO, SDO (for master devices), SDI(for slave devices), DO, DOUT, SI, MTSR
MISO SOMI, SDO (for slave devices ), SDI(for master devices), DI, DIN, SO, MRST
SS nCS, CS, CSB, CSN, nSS, STE, SYNC


Konfiguracja pinów jest następująca:

  • pin 10 - SS (Slave Select) - CH2 (CS) niebieski
  • pin 11 (MOSI) i 12 (MISO) są ze sobą połączone - CH1 (DATA) żółty
  • pin 13 - SCK (Serial Clock) - CH3 (CLK) różowy

Podłączone sondy do Arduino:

Jak to widać ?

Piękny oscylogram, ze zdekodowanym SPI. Widać cykle zegara, dane które są wysyłane tylko w cyklach i zmianę stanu SS/CS podczas transmisji:

Widok “EventTable”:

“EventTable” niestety wyświetla tylko to co jest widoczne na ekranie. Jeśli mamy dużo danych w pojedynczym komunikacie to niekoniecznie rozciągniemy go na ekranie tak, żeby zadziałał dekoder SPI (potrzebna jest do tego zmiana stanu SS/CS widoczna na ekranie). Np. wysyłając 25 bajtów (“itoutline.me_itoutline.me”).

Zobaczymy za mało miejsca, żeby wyświetlić na zielonej linii dekodera dane. Niestety tabela raczej nie podaje ich do końca poprawnie bo widać, że w trzecim bajcie mamy “.” zamiast “o”.

Wracając do tego, że jest potrzebna widoczna zmiana SS/CS na ekranie w celu zdekodowania SPI. Mamy długi komunikat, widać tylko jego 15 bajtów i zmianę SS/CS:

Gdybyśmy chcieli zobaczyć co jest dalej i przesunęli przebieg w lewo, tracąc jednocześnie zmianę SS/CS z pola widzenia:

Jest problem.

Na poniższym zrzucie zamieściłem wszystkie ustawienia dekodera SPI jakie zastosowałem do jego wykonania:

No i najważniejsze rozłożenie pojedynczego bajtu na bity :) 0b01101001 = 0x69 = “i” ASCII

Ostateczna kontrola ołówkiem:

Wykorzystuje oscyloskop bardzo mocno amatorsko ale potencjał tego urządzenia jest naprawdę imponujący. Oczywiście zakup oscyloskopu tylko dla dekodowania SPI to bardzo średni pomysł zważywszy na obecność analizatorów logicznych za 30 zł, no ale to dopiero początek :)

Raspberry Pi i podsłuchiwanie ruchu

Czasami zdarza się, że istnieje potrzeba sprawdzenia co się dzieje w dłuższym okresie czasu na danym urządzeniu jeśli chodzi o ruch sieciowy jaki przez nie przechodzi. Rpi nadaje się do tego całkiem nieźle. Do podsłuchania i zapisania ruchu wystarczyłby w zupełności tcpdump lub tsharkale zdecydowałem, że uruchomię wiresharka na Rpi i będę co jakiś czas podglądał pakiety. Stąd też instalacja serwera VNC w postaci tightvncserver.

Architektura

W moim wypadku wyglądało to tak, że modem DSL (który nie przydzielał adresów IP) miał być podłączony przez router do badanego urządzenia - Device-A. Pech chciał, że nie miałem pod ręka wolnego routera a testy trzeba było zacząć już. W związku z czym Rpi pełniło jednocześnie funkcje serwera DHCP, routera, sniffera i sieciowej konsoli ponieważ Device-A miał port szeregowy. Dodatkowo dla wygody, Rpi było podłączone do sieci Wifi z której mogłem sobie podglądać co tam się “wyrabia” ;)

Oprogramowanie

sudo apt-get update
sudo apt-get install dnsmasq wireshark picocom tightvncserver
  • dnsmasq - serwer DHCP/TFTP i DNS proxy
  • wireshark - podsłuchiwanie ruchu
  • picocom - konsola do połączeń szergowych
  • tightvncserver - serwer VNC

Konfiguracja Rpi

  • Konfiguracja /etc/network/interfaces
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
auto lo
iface lo inet loopback

#Interfejs WAN
auto eth0
iface eth0 inet static
      address xxx.xxx.xxx.xxx
      netmask 255.255.255.0
      gateway xxx.xxx.xxx.xxx

#Interfejs LAN
auto eth1
iface eth1 inet static
      address 192.168.11.1
      network 255.255.255.0
      gateway 192.168.11.1

allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
        wpa-ssid "SID_WIFI"
        wpa-psk "Haslo_WIFI"

iface default inet dhcp
  • Włączenie przekazywania ruchu IPV4 pomiędzy interfejsami sieciowymi

      sysctl -w net.ipv4.ip_forward=1`
    
  • Włączenie “maskarady”

      sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
      sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
    

Gdybyśmy chcieli, żeby zmiana przetrwała restart Rpi, zapisujemy tablice

    sudo bash -c 'iptables-save > /etc/network/iptables'

Dodanie do /etc/network/interfaces linijki zaczytującej tablice

    sudo bash -c 'echo "pre-up iptables-restore < /etc/network/iptables" >> /etc/network/interfaces'
  • Konfiguracja tightvncserver

    • Konfiguracja hasła do VNC

        tightvncserver
      
    • Uruchomienie serwera VNC

        vncserver :0 -geometry 1200x800 -depth 16
      
  • Konfiguracja wireshark

    • Nadanie użytkownikowi “pi” uprawnień do przechwytywania ruchu (oczywiście można uruchomić wiresharka na koncie root ale wyrabianie dobrych nawyków zawsze w cenie)

        sudo dpkg-reconfigure wireshark-common
      

      W oknie, które się pojawi wybieramy “Yes” a następnie dodajemy “pi” do grupy “wireshark”

        sudo usermod -a -G wireshark pi
      

      Żeby powyższa operacja stała się aktywna konieczne jest ponowne zalogowanie się (ewentualnie restart Rpi)

  • Konfiguracja dnsmasq /etc/dnsmasq.conf

1
2
3
4
interface=eth1
dhcp-range=192.168.11.140,192.168.11.150,255.255.255.0,12h
log-queries
log-dhcp

dnsmasq jest naprawdę ok, w sumie dwie pierwsze linijki wystarczają do skonfigurowania go jako serwer DHCP. interface=eth1 to interfejs na którym nasłuchuje serwer DHCP. log-queries i log-dhcp spowodują, że w /var/log/syslog pojawią się zapytania DNS i DHCP wysyłane przez klientów. Może to być przydatne gdyby były jakieś kłopoty.

Podsumowując

  • Należy uważać na ilość zbieranych danych, jeśli wiadomo, że interesuje nas ruch tylko z udziałem konkretnego adresu IP można dodać filtr na wejściu (Capture Filter): host 192.168.0.1. Specyficznego portu: port 80. Kombinacja: host 192.168.0.1 and port 80.

  • Instalacja wiresharka i tightvncserver może być czasami nadmiarowa i spokojnie wystarczy tcpdump (Instalacja sudo apt-get install tcpdump). Przechwytywanie całych pakietów na interfejsie eth0 do pliku zrzut.pcap o maksymalnym rozmiarze 100MB, powstanie 10 takich plików i będą po kolei nadpisywane po przekroczeniu 1GB w sumie:

      sudo tcpdump -i eth0 -C100M -W10 -s0 -w /home/pi/zrzut.pcap &
    

Trzeba pamiętać o uruchomieniu tcpdump w tle & dzięki temu rozłaczenie sesji ssh nie zakończy działania programu. Po ponownym zalogowaniu, kończymy działanie programu:

    killall tcpdump
  • Nic gorszego niż “zawieszenie się” Rpi podczas sesji trwającej kilka dni. Żeby nie było “jak krew w piach”, dla bezpieczeństwa można co jakiś czas pobierać przechwytywany ruch za pomocą np. scp. Wireshark zapisuje tymczasowe pliki w katalogu /tmp pod nazwą w takim formacie wireshark_eth1_20140911192644_X8aumU. Bez problemu można je pobrać i analizować w innym miejscu.

      scp pi@raspberrypi:/tmp/wireshark_eth1_20140911192644_X8aumU zrzut.pcap
    

Octopress - pierwsze wrażenia ⇒

Zmieniłem platformę blogową na Octopress-a i muszę przyznać, że jak na razie jest bardzo ok. Nie to żebym miał coś do Wordpress-a, po prostu nie potrzebuje takiego “kombajna”. Podstawowe zalety Octopress-a wg. mnie:

  • Generuje statyczne pliki html.
  • Obsługuje bezproblemowo Markdown-a, pisanie tekstu w html-u to męczarnia a pisząc w edytorze wizualnym zawsze miałem wrażenie utraty kontroli nad tym co się ostatecznie pojawi w html-u.
  • Obrazki wrzucam do jednego katalogu i to wszytko.
  • Natywnie bardzo fajnie obsługuje wklejanie fragmentów kodu.

Oczywiście są też pewne minusy:

  • Jest mało kustomizowalny, oczywiście można sobie zmienić w nim wszystko no ale to już wieksza ingerencja w kod.
  • Skoro to statyczne strony to brak systemu do komentarzy (to mozna obejść wykorzystując np. Disqus).
  • Nie działa natywnie funkcjonalność “linked list” a niby powinna.

Zapewne jednych i drugich jest znacznie więcej ale to już wyjdzie w trakcie “prania”. “Linked list” już sobie naprawiłem ;)

Vim - intro

Wszystko wskazuje na to, że przerzucę się zupełnie na vim-a. Od tylu lat szukam edytora “idealnego” a on cały czas czaił się w tle. Chyba największy problem jeśli chodzi o jego popularność to “krzywa uczenia się”, niestety lekko nie jest ale kiedy już człowiek zacznie się wciągać to szybko zorientuje się jak potężnym i wygodnym narzędziem jest vim. Oceniam moją znajomość tego edytora na jakieś 15%. Mam plan dojścia do 50% ;).

Tryby

Operacja Kroki
Insert Mode W tym trybie edytujemy dokument przechodzimy do niego za pomocą klawisza i, wychodzimy do trybu “Normal Mode” - Esc
Normal Mode W tym trybie wciskane klawisze są traktowane jako polecenia. Powinien to być domyślny tryb pracy z vim-em
Visual Mode Tryb w którym dokonujemy zaznaczania tekstu

Poruszanie

Operacja Kroki
Góra, dół, lewo, prawo k, j, h, l
Początek linii 0
Koniec linii $
Wyraz do przodu w
Wyraz wstecz b
Dół W przypadku pojedyczej linii, zajmującej kilka linii ekranu gj
Góra W przypadku pojedynczej linii, zajmującej kilka linii ekranu gk
Początek pliku :0 lub gg
Koniec pliku :$ lub G
Przejście do miejsca ostatniej edycji gi

Wprowadzanie tekstu

Operacja Kroki
Połączenie dwóch linii tekstu J
Copy/Cut/Paste Przechodzimy do trybu “visual” v lub V jeśli chcemy od razu zaznaczać całe linie i zaznaczamy interesujący nas tekst, y (skopiowanie) d (wycięcie), przechodzimy do miejsca w którym ma się pojawić skopiowany/wycięty tekst,p wklejenie za kursorem P wklejenie od miejsca w którym jest kursor
Wcięcia Wyłącznie automatycznych wcięć przy wklejaniu :set paste, włączenie :set nopaste
Dodanie linii Poniżej kursora o, powyżej O

Usuwanie

Operacja Kroki
Pojedynczego znaku pod kursorem x. W trybie edycji działają również Delete, Backspace
Cała linia dd
Od miejsca w którym jest kursor do początku linii d0
Od miejsca w którym jest kursor do końca linii d$
Od miejsca w którym jest kursor do początku pliku dgg
Od miejsca w którym jest kursor do końca pliku dG
Usunięcie fragmentu tekstu Zaznaczamy od którego miejsca ma być usunięty tekst ma, przechodzimy kursorem do końca fragmentu który chcemy usunąć i wpisujemy da
Usuwanie w trybie blokowym Tryb edycji blokowej jest przydatny kiedy np. w akapicie na początku linii są niepotrzebne odstępy. Można je usunąć za jednym razem, przechodząc do trybu blokowego Ctrlv i zaznaczyć kursorem kolejne linie, następnie d lub x
Usuwanie w trybie liniowym Włączamy tryb zaznaczania liniowego Shiftv, kursorem zaznaczamy linie do usunięcia a następnie usuwamy d lub x

Wyszukiwanie

Operacja Kroki
* Wyszukanie kolejnego wyrazu znajdującego się w miejscu kursora
# Wyszukanie poprzedniego wyrazu znajdującego się w miejscu kursora

Zamiana

Zakładki

Operacja Kroki
Otwarcie nowej zakładki :tabnew
Poruszanie się pomiedzy zakładkami gt
Przywrócenie przypadkowo zamkniętej zakładki :ls - wyświetlnie bufora a następnie :tabnew +Xbuf gdzie X to numer pod którym plik jest w buforze

Tips&Tricks

Operacja Kroki
Mini Kalkulator W trybie “insert”, Ctrlr=, wpisujemy równanie po wciśnięciu Enter wynik pojawi się w miejscu kursora

.vimrc

Wpis Opis
paste mode Umożliwi włączanie/wyłączanie automatycznego ustawiania odstępów za pomocą klawisza F2. Zamiast zabawy z :set paste i :set nopaste

Jump Desktop i Centos

Jump Desktop to naprawdę przyjemny klient RDP i VNC na OSX, IOS i Androida. Zaczynamy od sprawdzenia czy server VNC jest zainstalowany:

rpm -qa \*vnc\*

Jeśli nie będzie pakietu tigervnc-server, instalujemy go:

yum install tigervnc-server

Konfiguracje serwera VNC na Centos 6.5 rozpoczynamy od edycji pliku sudo vi /etc/sysconfig/vncservers:

VNCSERVERS="1:itoutline"
VNCSERVERARGS[1]="-geometry 1280x900 -localhost"

W zmiennej VNCSERVERS podajemy identyfikator ekranu i nazwę użytkownika a w VNCSERVERARGS parametry połączenia. -localhost powoduje, że możliwe będzie tylko nawiązywanie połaczeń lokalnych (z wykorzytaniem tunelu SSH). W sumie zdalny dostęp za pomocą “czystego” VNC jest mało rozsądny.

Airplay Everywhere

Doczekałem się. W końcu znalazłem/jest aplikacja na Androida, która poprawnie strumieniuje dźwięk w trybie Airplay zarówno do RPi jak i AppleTv. Mowa o Airplay on Android AOA Service Założę się, że nie na każdej wersji Androida powyżej 4.0 i telefonu będzie działać ale na moich obu urządzeniach (Sony Acro S - Cyanogenmod 10 i Nexus 7 - Cyanogenmod 10.1) w końcu nie ma z nią problemu. Na telefonie zaczeła działać poprawnie dopiero po ostatniej aktualizacji, wcześniej była straszna “sieczka”.

Lirc i Raspberry Pi

Po dłuższym okresie czasu postanowiłem odkurzyć Harmony 900, od kiedy przesiadłem się na ATV zostałem przy natywnym pilocie do tego urządzenia. Trochę niesamowite jak fajny jest pilot do Apple Tv, jedyne czego mu brakuje to możliwość regulacji głośności. Przy okazji pomyślałem, że sprawdzę jak wygląda sytuacja z Lirc-em na RPi i okazuje się, że jest bardzo dobrze.

Podłączenie odbiornika IR

W swoim “magazynku” znalazłem czujnik TSOP34836 i przyznam, że wykorzystałem ten bo akurat taki miałem… Działa na zalecanym napięciu 3V (od 2,7 do 5,5V) i maksymalnie pobiera 3mA (w trakcie moich testów nie przekroczył 1,25mA), czyli nie powinien być żadnym problemem dla portu GPIO.

Podłączyłem go w następujący sposób:

  • Pin 1 - Pin 16 (GPIO 23 RPi)
  • Pin 2 - Pin 14 (GND RPi)
  • Pin 3 - Pin 1 (3,3V RPi)

Typy plików obsługiwane przez XBMC

Mam w swoim archiwum pliki z rozszerzeniem .f4v, niezbyt ich dużo dlatego problem z wyświetlaniem ich podczas przeglądania zakładki Video nie pojawiał się zbyt często.

Okazuje się, że dodanie/usunięcie nowych rozszerzeń obsługiwanych przez XBMC jest bardzo proste (oczywiście format pliku musi być przede wszystkim “zjadliwy” dla XBMC). W pliku advancedsettings.xml (w przypadku ATV2 plik ten należy stworzyć w katalogu /private/var/mobile/Library/Preferences/XBMC/userdata) dodajemy następującą sekcję:

1
2
3
4
5
<advancedsettings>
    <videoextensions>
       <add>.f4v</add>
    </videoextensions>
</advancedsettings>

W pliku advancedsettings.xml można spersonalizować o wiele więcej ustawień. Szczegóły: http://wiki.xbmc.org/index.php?title=Userdata/advancedsettings.xml

Połączenie konsolowe Rasberry Pi

Ostatnio zakupiłem kabelek USB => RS TTL, pracujący na napięciu 3.3V. Wygląda on tak:

Dzięki niemu możemy podłączyć się do Rpi za pomocą konsoli. Ma to ten plus, że nie potrzebujemy monitora, klawiatury, sieci a i tak wiadomo co się dzieje od samego początku czyli podłączenia zasilania do Rpi.

Kabelek podłączamy w taki sposób:

Oczywiście musimy mieć zainstalowe sterowniki do chipsetu PL2303 (jak to zrobić na OSX). Następnie wydając polecenie:

picocom -b 115200 /dev/cu.PL2303-00001014

podłączamy się do konsoli Rpi. Konsola jest skonfigurowana w dystrybucji Raspbian “wheezy” (Ostatnia linia w /etc/inittab). W Arch Linux, trzeba ją ustawić (btw odpuściłem Arch-a na razie;)

To wszystko, jesteśmy zalogowani przez ttyAMA0:

Wyłączenie Dashboard-a na OSX

Chyba nie przekonam się nigdy do tego rozwiązania. W każdym bądź razie wyłączam je permanentnie:

defaults write com.apple.dashboard mcx-disabled -boolean YES
killall Dock

Gdybym jednak kiedyś zmienił zdanie:

defaults write com.apple.dashboard mcx-disabled -boolean NO
killall Dock