IP Kamera Xiaomi

Dostala sa mi do rúk IP kamera pod označením „Xiaomi Mijia Dafang Portable HD Smart Home IP Camera“ Nie som vlastníkom tejto kamery, ale kolega ma poprosil aby som sa na ňu pozrel a zistil čo sa dá s touto kamerou spraviť. Túto kameru je možné kúpiť napr. na DXdealextreme

Po vybalení tejto IP kamery je potrebné naskénovať QR kód, ktorý sa nachádza na zadnej strane kamery. Link v smartfóne nás nasmeruje na aplikáciu, ktorá bude s kamerou spolupracovať. Kolega mi tvrdil, že kamera niekoľko týždňov fungovala a potom aplikácia zahlásila:

Regional Restriction

Use only in mainland China
This product in only used in mainland China

Po chvíli googlenia som sa dostal na GitHub a začal som kameru pripravovať na flash nového alternativního firmwaru.

Nahratie FW

Flashovanie nie je zložité. Potrebujeme k tomu MicroSD kartu a potrebné balíky ktoré si stiahneme z GitHubu.

CFW je rozdelený na 2 časti

  • Custom-firmware (len pre boot z MicroSD karty (bootloader))
  • CWF subory s vlastnym FirmWare

Najprv si pripravíme MicroSD kartu, ktorú naformátujeme na FS FAT32.

  • stiahneme z GitHubu binarku bootloader  (cca 11,1 MB)
  • premenujeme ju na „demo.bin“
  • nakopírujeme ju na MicroSD kartu
  • odpojíme kameru od napájania
  • MicroSD kartu vložíme do slotu na kamere
  • stlačíme na kamere setup (reset) a stále ho držíme
  • zapneme kameru na napájanie (reset stále držíme)
  • ak na kamere zasvieti modrá LED, tlačidlo (reset) uvoľníme
  • počkáme pokiaľ sa FW flashuje (niekoľko minut)
  • ak sa začne kamera otáčať, môžeme ju odpojit od napájania
  • vyberieme z kamery MicroSD kartu a vložíme ju do PC

V pc na MicroSD kartu nakopírujeme do koreňového adresára obsah z adresára Xiaomi-Dafang-Hacks-master.zip

/Xiaomi-Dafang-Hacks-master/firmware_mod/

ktorý sme už pred tým stiahli z GitHubu (ak používame operačný systém Linux, tak môžeme použiť príkaz git clone).

Konfigurácia siete

Na MicroSD karte mame teraz uloženy alternatívny FW v ktorom musíme nakonfigurovať sieťové pripojenie. Konfiguračný súbor najdeme v

/config/wpa_supplicant.conf.dist

upravíme ho následovne

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1
 
network={
        ssid="SSID_nasej_wifi_siete"
        # Uncomment to connect to Hidden SSIDs
        #scan_ssid=1 
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        psk="heslo_do_nasej_wifi_siete"
        priority=2
}

Musíme zadať SSID našej wifi siete a tak isto aj heslo do našej wifi siete. Viac informácii ohľadom sieťového pripojenia najdeme na wpa_supplicant.conf. My budeme používat to najjednoduchšie pripojenie s WPA/2 šifrovaním. Ak správne nastavíme SSID a heslo do wifi siete, tak súbor uložíme a premenujeme ho na

/config/wpa_supplicant.conf

MicroSD kartu bezpečným spôsobom vysunieme z PC a zasunieme ju do slotu vypnutej kamery. Kameru následne zapneme a bootovanie začne s MicroSD karty. Ak máme v domácej sieti správne nastaveny DHCP server, tak do niekoľkých sekund sa kamera prípoji na wifi sieť pod IP adresou, ktorú jej DHCP server pridelí. To akú IP adresu dostala kamera si zistíme v DHCP servery nášho routera. Keď som testoval kameru ja, tak pridelená IP adresa pre kameru bola 192.168.1.15 (ďalej v článku budem vždy používať túto IP adresu). Komunikácia medzi kamerou a webovím rozhraním je šifrovaná pomocou zabezpečeného https.

Prihlasenie do web-interface

Software v kamere okrem SSH a FTP servera disponuje aj web serverom, ktorý nás bude asi zaujímať najviac. Čiže ak do url nášho web prehliadača zadáme IP adresu našej kamery, dostaneme sa na web, kde máme možnosť konfigurovať a manažovať kameru ručne. Prístupové údaje do web (FTP a SSH) rozhrania kamery:

meno: root
heslo: ismart12

On-Line video z kamery môžeme sledovať priamo cez web rozhranie, alebo cez VLC prehrávač (protokol rtsp). Vo VLC prehrávači otvoríme Stream v sieti, alebo použijeme klávesovú skratku Ctrl +N a zadáme link

rtsp://192.168.1.15:8554/unicast

Ako sa pripojiť z WAN

Ak nedisponujeme verejnou IPv4 adresou, tak na kameru sa z WAN strany nedostaneme. Jednou z možností je objednať si u poskytovateľa internetu verejnú IPv4 adresu. Ďalšou z možností je objednať si na nejakom cloude VPS službu a tam si nasadiť vlastný VPN server. Všetky tieto pripojenia sú o peniazoch. Najlepšie riešenie je mať vlastnú IPv4 adresu od poskytovateľa, tak máme úplnu kontrolu nad kamerou (kdežto VPS je už tretia strana, ale vždy lepšie ako Čínska app s Čínskou IP adresou).

Zaznam z kamery

Zatiaľ som prišiel na to, že ak chceme spraviť z kamery video záznam, tak cez web-iface musíme v

System --> Video

nastavit veľkosť videa na 640×360 (ak je väčšie rozlíšenie, záznam sa nevytvorí). Testovací skript pre záznam z kamery vyzerá nasledovne

avconv -rtsp_transport tcp -y -i rtsp://name:password@192.168.1.15:8554/unicast -vcodec copy -c:a copy -t 30 /system/sdcard/DCIM/`date +%Y-%m-%d_%H-%M-%S`.mp4

pokec ku skriptu (prip. avconv –help, alebo viď dokumentácia k avconv)

name --> meno
password --> heslo
192.168.1.15 --> IP adresa
-t --> čas trvania záznamu v sekundách
date --> názov souboru - rok-mesiac-den-hodina-minuta-sekunda
/system/sdcard/DCIM/ --> cesta k súboru

Záznam z kamery je možné spustiť aj cez web rozhranie

Services --> Services

a v sekcii recording klikneme na button Start, analogicky môžeme záznam zrušiť buttonom stop

Záznam pri detekcii pohybu

Kamera je stále on-line, keď si zobrazíme stream, cez VLC, alebo webovú stránku, tak vidíme čo sa v snímanom priestore deje. Ako som naznačil vyššie, záznam je možné spraviť cez CLI, alebo priamo cez web-iface. Ak potrebujeme spraviť záznam pri detekcii pohybu, tak postupujeme následovne. Najprv si vytvoríme súbor:

vi /system/sdcard/record.sh

do ktorého vložíme následujúci skript

#!/bin/sh

#Only record between those hours
#HOUR=`date +"%H"`
#if [ "$HOUR" -lt 1 ] || [ "$HOUR" -gt 11 ]; then
#  exit 1
#fi

# Delete anything that is not from today
DAY=`date +"%d"`
/system/sdcard/bin/busybox find /system/sdcard/DCIM/ -type f -not -name "`date +%Y-%m-`${DAY}*" -delete

STATUSFILE=/system/sdcard/recordstatus.txt
if [ -f $STATUSFILE ]; then
  echo "currently recording" >> "$STATUSFILE"
else
  echo "recording" >> "$STATUSFILE"
  /system/sdcard/bin/avconv -flags low_delay -fflags nobuffer -probesize 32 -i rtsp://0.0.0.0:8554/unicast -strict experimental -t 10 -y -vcodec copy -an /system/sdcard/DCIM/`date +%Y-%m-%d_%H.%M.%S`.h264
  echo "Recording `date +%Y-%m-%d_%H.%M`" >> /system/sdcard/recordlogs.txt
  rm "$STATUSFILE"
fi

skript spravíme spustiteľným

chmod 755 /system/sdcard/record.sh

Ďalej si otvoríme skript detectionOn.sh na editovanie

vi /system/sdcard/scripts/detectionOn.sh

a na začiatok vložíme

./system/sdcard/record.sh &

takže začiatok skriptu bude vyzerať následovne

# Source your custom motion configurations
. /system/sdcard/config/motion.conf
. /system/sdcard/scripts/common_functions.sh
. /system/sdcard/record.sh & 

Teraz keď detektor pohybu zaznamená pohyb, tak sa spusti nahrávanie na 10 sekund. Problem je v tom, že vždy sa pri nahrávaní vytvoria 2 súbory. Prvý ma cca 2MB a 10 sekund a druhy cca 900KB a tiež 10 sekund. Pripadá mi to tak, že pohybový senzor zaznamená pohyb a spusti nahrávanie a keď zaznamená další pohyb, tak následne po tom prvom 10 sek. zázname spusti další záznam atď. To znamená, že ak senzor zaznamená v prvých 10 sekundách 15 pohybov, tak nahrá dalších 15, 10-sekundových záznamov, na ktorých nebude nič k videniu.

Snapshot na Telegram

Ak pohybový senzor zaznamená pohyb, kamera dokáže vygenerovať snapshot a odošle nám ho do telegramu. Dá sa povedať, že je to niečo podobné ako foto pasca. Nastavenie nie je triviálne, ale je možne to nastavit.

Najprv si cez web-iface nastavime v Camera controls Motion-Send Telegram na enabled

upravime skript

/system/sdcard/bin/telegram

Ktorý bude obsahovať následující kód

#!/bin/sh
what="$1"
shift
data="$@"
CURL="/system/sdcard/bin/curl"
 
# Add your Telegram credentials here (those are just examples) 
apiToken="210200102:BJLyUNXzxh_rGrHYpZ9yn0EqShW2UzZXabc"
userChatId="122055421"
 
sendMessage() {
  text="$(echo "${@}" | sed 's:\\n:\n:g')"
  echo "Sending messgaae: $text"
 
  $CURL -s \
    -X POST \
    https://api.telegram.org/bot$apiToken/sendMessage \
    --data-urlencode "text=$text" \
    -d "chat_id=$userChatId"
}
 
sendFile() {
  echo "Sending file: $1"
  $CURL -s \
    -X POST \
    https://api.telegram.org/bot$apiToken/sendDocument \
    -F chat_id="$userChatId" \
    -F document=@"$1"
}
 
sendPhoto() {
  caption="$(hostname)-$(date +"%d%m%Y_%H%M%S")"
  echo "Sending Photo: $1 $caption" >> /tmp/telegram.log
  $CURL -s \
    -X POST \
    https://api.telegram.org/bot$apiToken/sendPhoto \
    -F chat_id="$userChatId" \
    -F photo="@${1}" \
    -F caption="${caption}" 
}
 
[ "$what" == "m" ] && sendMessage $data
[ "$what" == "f" ] && sendFile $data
[ "$what" == "p" ] && sendPhoto $data
[ -z "$what" ] && echo -e "$0 <m|f|p> <data>\n m: message\n f: file\n p: picture"

Najdôležitejšie je upraviť riadky 8 a 9, čiže musíme získať „apiToken“ a „userChatId“

apiToken získame jednoduchým spôsobom. V telegrame vyhľadáme robota, ktorý nám pomôže pri vytváraní nášho vlastného robota. Čiže vyhľadáme robota s menom

BotFather

Najprv sa robota opýtame ako nám vie pomôcť a potom začneme vytvárať našeho vlastného robota.

/help
/newbot

Ďalej sa riadime podľa inštrukcii, ktoré nám robot zasiela. Po úspešnom vytvorení robota, nám BotFather zagratuluje aj s vygenerovaným apiTokenom.

UserChatID ziskame na tomto linku. Keď sme úspešne získali obidva hodnoty, môžeme ich zapísať do riadku 8 a 9, súbor uzavrieme a priradíme mu práva +x. Ešte si môžeme overiť či robot správne funguje odoslaním jednoduchej správy

chmod +x /system/sdcard/bin/telegram
/system/sdcard/bin/telegram m hello this is a message

teraz zapíšeme prostredníctvom príkazu echo do súboru, že povoľujeme posielanie správ cez telegram.

echo  sendtelegram=true >> /system/sdcard/config/motion.conf

Ak senzor v kamere zaznamená pohyb, tak do telegramu nám bot zašle snapshot. Obrázky sa ukladajú aj na MicroSD kartu do adresára

/media/motion/stills

Záver

Čo sa týka alternovaného FW, tak stále je vo vývoji a dolaďujú sa niektoré nedostatky. Napr. nefungovalo nahrávanie pri väčšom rozlíšení ako je 640×360 px. Automaticky záznam na popud senzora síce funguje aj pri rozlišení 1280×720, ale výsledný obraz sa rozpadáva. Pozitívne je zase to, že kamera vie pri zachytení pohybu, poslať na telegram správu s aktuálnou fotografiou a my si následne vieme cez web rozhranie otvoriť on-line video


Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *