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