суббота, 6 февраля 2016 г.

Конфигурирование voCore и работа с USB-устройствами

VoCore по сути являет собой плату, где распаян чип Ralink RT5350F и 32Мб SDRAM (+ по-мелочи). Чип в свою очередь это целый готовый роутер (SoC), в котором есть вайфай 802.11n, 5-портовый Ethernet-свитч, USB Host/Device, куча интерфейсов, любимых в узких кругах (SPI/I2S/I2C/PCM/UART), GPIO и все это дополняется процессором на 360МГц. Стоит штучка 20 зеленых единиц.
Попробую сделать с ней что-то полезное.
Жаль греется дофига, при этом в комплекте нет радиатора.

Я купил пару таких и решил один пустить под проект удаленного видеонаблюдения.
Проект имеет целью создание автономного черного ящика с тремя USB портами, куда втыкается 2 веб-камеры и 3G/4G USB-модем от предпочтительного сотового оператора (либо USB свисток, ежели WiFi с инетом рядом есть). Ну еще разъемчик для подключения ИК подсветки ночного режима, и еще возможно доп.разъемчики для двух датчиков движения (по одному на камеру, для двух зон).
Работать будет от солнечных батарей, заряжающих несколько аккумуляторов Li-ion 18650, все с алиэкспресс.

Ви-таки можете спросить, а шо IP-вебку купить не проще ли?
Ой вэй, только давайте без этого! Если бы я откладывал по шекелю каждый раз, когда на форумах советуют "лучше купи"..

Самая дешевая со встроенным 3G, что я нашел, это 6500р, в основном попадается в районе 10000р, а надо две, а если брать обычные (без 3G), то дешевле, но тогда еще и 3G-модем нужен, и как то разделить этот модем на 2 камеры, вот хз как, с ходу не знаю! а потом станет ясно, что проброс портов из интернета через 3G-модем это ни разу не тривиальная задача, и хорошо бы иметь свой сервер в интернете, куда камеры могли бы коннектиться по ВПН, а там уже и проброс настраивать, вот она наркомания-то где!

Вся идея зародилась с желания применить где-то ненужный смартфон. У него и камер две, и управляющий софт написать можно, и мобильный интернет на борту.. не помню, почему я от нее отказался..
Может потому, что не выйдет направить обе камеры отдельно друг от друга, а также придется вникать в программирование под андроид, плюс к тому неясно, как подключить датчики движения и освещения, а еще ИК-прожектор подсветки, да и камеры надо переделывать в режим ночного видения. Кстати забавная тема, там надо удалить ИК фильтр и обычная вебкамера начинает видеть в темноте, при наличии ИК подсветки, конечно же. Я попробовал - реально работает! В инете достаточно инфы по этому вопросу.

Ну и в итоге значит решил я все-таки делать на VoCore. О самом проекте я как-нибудь напишу отдельно, а здесь будет в основном описана работа с самим мини-пк.

Не лишним будет обзавестись UART-адаптером, на али можно искать "USB TTL CH340", стоит всего 50-70 рублей. Может пригодиться, если вдруг потеряется связь с vocore по WiFi.

Распиновка vocore тут http://vonger.cn/upload/vocore.manual.pdf
Для начала, используя упомянутый адаптер, цепляю питание +5V и GND к соответствующим пинам GND и "3.5-6.0V" voCore. Загорается светодиод, немного ожидания и появляется открытая WiFi сеть voCore. Присоединяюсь к ней, открываю putty и захожу в консоль voCore под логином-паролем "root / vocore".

Обновление прошивки voCore

Поскольку выяснилось, что прошивка стоит довольно староватая, решаю обновиться.
Тут можно выбрать прошивку https://downloads.openwrt.org/ - "dev snapshot" или один из релизов. Решаю ставить релиз Chaos Calmer 15.
Качаю https://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/openwrt-15.05-ramips-rt305x-vocore-squashfs-sysupgrade.bin

Способ первый

Если установлен веб-интерфейс LuCI, то прошиться можно через него. Для этого нужно зайти на IP vocore (192.168.61.1) по HTTP, т.е. открыть браузером. Далее пройти в меню System - Flash Firmware, выбрать скачанный файл прошивки и залить через форму.
Но использование LuCI - спорное решение. Вот тут http://vocore.io/wiki/index прямо рекомендуется:
Note3: LuCI has many bugs for now, DO NOT use it to setup your VoCore.
В переводе: LuCI имеет много багов, НЕ используйте его для настройки VoCore.
Однако функция прошивки работает.
После прошивки рекомендуется перезагрузить железку. Иначе, возможно будут проблемы со входом по SSH, у меня чего-то пароль root / vocore не подходил. В веб-админке пароля для root не было, поставил, На вход по SSH это не повлияло, ребутнул, помогло. пароль vocore.

Способ второй

На случай, если веб-админки LuCI нет, но на voCore уже есть интернет (например он подключен как клиент WiFi к вашему роутеру), то вот еще простой способ обновления: скачать прошивку по прямой ссылке и запустить команду обновления (в /tmp кстати много места! целых 14Мб)
cd /tmp
wget http://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/openwrt-15.05-ramips-rt305x-vocore-squashfs-sysupgrade.bin
root@OpenWrt:/tmp# sysupgrade -v -i openwrt-15.05-ramips-rt305x-vocore-squashfs-sysupgrade.bin
я запустил в интерактивном режиме, утилита задала пару вопросов
Keep config files over reflash (Y/n): y
Edit config file list (y/N):
Saving config files...
etc/config/dhcp
etc/config/dropbear
etc/config/firewall
etc/config/fstab
etc/config/mjpg-streamer
etc/config/network
etc/config/network.bk
etc/config/openvpn
etc/config/rpcd
etc/config/system
etc/config/uhttpd
etc/config/uhttpd-opkg
etc/config/wireless
etc/dnsmasq.conf
etc/dropbear/dropbear_dss_host_key
etc/dropbear/dropbear_rsa_host_key
etc/group
etc/hosts
etc/inittab
etc/opkg.conf
etc/passwd
etc/profile
etc/protocols
etc/rc.local
etc/services
etc/shadow
etc/shells
etc/sysctl.conf
etc/sysupgrade.conf
killall: watchdog: no process killed
Sending TERM to remaining processes ... odhcpd ntpd udhcpc dnsmasq udhcpc
консоль отвалилась, началось ожидание.. посидел я, повтыкал минут с 10, чето не возвращается железка к жизни. ни wifi сети "voCore" нету, ни как клиента я его не вижу. Думал придется к Serial TTY цепляться, но все же для начала ребутнул - и все загрузилось.
Лучше конечно по Serial TTY делать, там хоть все видно.
Когда в следующий раз пришлось перепрошивать этим способом (для чистовой проверки написанного в статье), я сразу подцепился к консоли и стало ясно, что прошивка занимает меньше минуты, и поскольку в этот раз я не использовал опцию "сохранить настройки", то после загрузки была доступна только проводная сеть с IP 192.168.1.1, а о WiFi в ifconfig не было никакого упоминания.

Способ третий

Если все плохо и все сломалось, прошивку скачать и подсунуть никак, можно сделать HARD RESET vocore. Для этого придется подключиться к Serial Console через USB-TTL адаптер (выводы RXD2 и TXD2 на voCore), скорость 57600 бод, 8n1. Пароль на вход там не нужен; кстати, если вдруг не удается войти, то через эту консоль можно сменить пароль рута.
Далее надо просто выполнить команду firstboot. Она поинтересуется, удалить ли все изменения к чертям, включая конфиги и установленные пакеты?
This will erase all settings and remove any installed packages. Are you sure? [N/y]
Говорим да! Отработало все за какие то 5 секунд.. 

Другие способы

способ описан тут http://vonger.cn/?p=780. не пробовал. точнее пытался, не получилось. Там надо подцепиться к serial console, при загрузке нажать "x", выйти в какой то boot-режим, но поскольку я под виндой, то я даже kermit не осилил найти и поставить.
Еще есть способ по tftp. Однако для этого должен быть распаян Ethernet разъем (ну или потребуется купить voCore Dock), и, само собой, tftp-сервер в сети.
Можно еще сюда заглянуть http://vocore.io/wiki/index/id:14

Работа в консоли voCore

Посмотреть версию системы - cat /etc/openwrt_version
Посмотреть более подробно - cat /etc/openwrt_release

Пробуем работать с репозиторием. Сначала обновим
opkg update
Пусто, нет вывода, смотрим источники
в /var/opkg-lists/ - пусто
в /etc/opkg/ только файл customfeeds.conf с закомментированными строками
ладно, добавляем в него репы
src/gz chaos_calmer_base https://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/packages/base
src/gz chaos_calmer_luci https://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/packages/luci
src/gz chaos_calmer_management https://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/packages/management
src/gz chaos_calmer_packages https://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/packages/packages
src/gz chaos_calmer_routing https://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/packages/routing
src/gz chaos_calmer_telephony https://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/packages/telephony
Пробуем еще раз opkg update
получаем множество
wget: can't execute 'openssl': No such file or directory
wget: error getting response: Connection reset by peer
меняем https на http в ссылках выше, и наконец обновляемся.

Но так было до обновления прошивки. Я не записал, какая стояла изначально, но вайфай там был. После же обновления источники были прописаны в /etc/opkg.conf правильно, но проблема теперь была с ненастроенным WiFi.

Настройка WiFi на voCore

после перепрошивки в "logread | grep radio" можно заметить
user.emerg syslog: 'radio0' is disabled
смотрим в /etc/config/wireless, а там однако 
config wifi-device  radio0
        option type     mac80211
        option channel  11
        option hwmode   11g
        option path     '10180000.wmac'
        option htmode   HT20
        # REMOVE THIS LINE TO ENABLE WIFI:
        option disabled 1
ну ок, убираем. /etc/init.d/network restart. поднялась сеть OpenWrt. А нам надо бы выступить клиентом к домашнему роутеру.
короче еще некоторое время я пытался угадать правильные настройки, применяя различные советы с форумов. в итоге конфиг такой
cat /etc/config/network
config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'
config globals 'globals'
        option ula_prefix 'fdfa:9b8a:3181::/48'
config interface 'lan'
        option ifname 'eth0.1'
        option force_link '1'
        option macaddr 'b8:d8:12:66:11:50'
        option type 'bridge'
        option proto 'dhcp'
config switch
        option name 'switch0'
        option reset '1'
        option enable_vlan '1'
config switch_vlan
        option device 'switch0'
        option vlan '1'
        option ports '0 4 6t'
config interface wlan
        option proto 'dhcp'
# 3G modem, добавлен позже
config interface 'wwan'
        option ifname 'usb0'
        option proto 'dhcp'
cat /etc/config/wireless
config wifi-device  radio0
        option type     mac80211
        option channel  11
        option hwmode   11n
        option path     '10180000.wmac'
        option htmode   HT20
config wifi-iface
        option device   radio0
        option network  wlan
        option mode     sta
        option ssid     '<SSID>'
        option encryption psk2
        option key      <KEY>

ребут, ifconfig, все на месте, пинг есть

Обрисуем список задач

  1. поддержка USB-флешек
  2. поддержка USB-вебкамер
  3. выход в интернет через 3G-модем
  4. (бонус) выход в интернет через Yota-модем
Для всего этого есть прекрасный сборник HOWTO https://wiki.openwrt.org/doc/howto/usb.overview

Поддержка USB-flash

Начинаем настраивать USB с обеспечения поддержки basic support, проверяем, какие модули установлены
opkg list-installed | grep usb
у меня вышло так, что базовые модули уже установлены. Если же нет, просто выполняем
opkg install kmod-usb-core kmod-usb2 usbutils
lsmod выдает и usbcore, и ehci_hcd. подключаем флешку, смотрим в dmesg
[  346.300000] usb 1-1: new high-speed USB device number 2 using ehci-platform
[  346.460000] usb 1-1: no of_node; not parsing pinctrl DT
Что ж. флешка как устройство обнаружилась, однако как накопитель не распознана, пока с ней ничего сделать нельзя.
Отключаем флешку, идем дальше - установка модуля USB storage.
opkg install kmod-usb-storage kmod-fs-vfat kmod-fs-ntfs
Пробуем втыкать флешку еще раз, смотрим dmesg, определилась, диск /dev/sda1, монтируем командой mount /dev/sda1 /mnt/flash (сначала создать папку для монтирования командой mkdir /mnt/flash), получаем
mount: mounting /dev/sda1 on /mnt/flash/ failed: Invalid argument
смотрю dmesg, вижу
[ 1907.280000] FAT-fs (sda1): codepage cp437 not found
кодировки надо поставить, не вопрос, ставлю, затем снова пробую монтировать
opkg install kmod-nls-cp437
теперь получаю такое
[ 1997.890000] FAT-fs (sda1): IO charset iso8859-1 not found
повторяю итерацию с новой кодировкой..
наконец примонтировалось, но русские символы видны как "???????"
попробую доустановить кодировки
opkg find kmod-nls*
# берем utf8, cp1251, cp866
opkg install kmod-nls-utf8 kmod-nls-cp1251 kmod-nls-cp866
не помогло, смотрю mount, а там 
/dev/sda1 on /mnt/flash type vfat (...,codepage=437,iocharset=iso8859-1,..)
думаю это неверно, пробую указать iocharset=utf8 при монтировании
mount -o iocharset=utf8 /dev/sda1 /mnt/flash/
теперь хорошо

Поддержка вебкамеры в voCore

Итак, флешка видна. пробую вебкамеру Logitech C100, dmesg
[ 2551.820000] usb 1-1: new high-speed USB device number 34 using ehci-platform
[ 2552.090000] usb 1-1: no of_node; not parsing pinctrl DT
Знакомая картина, отключаю, перехожу к USB Video Support
ставлю
opkg install kmod-video-uvc
в dmesg появляется
[ 2690.670000] Linux video capture interface: v2.00
[ 2691.120000] usbcore: registered new interface driver uvcvideo
[ 2691.130000] USB Video Class driver (1.1.1)
подключаю камеру
[ 2729.760000] usb 1-1: new high-speed USB device number 35 using ehci-platform
[ 2730.030000] usb 1-1: no of_node; not parsing pinctrl DT
[ 2730.040000] uvcvideo 1-1:1.0: no of_node; not parsing pinctrl DT
[ 2730.040000] uvcvideo: Found UVC 1.00 device <unnamed> (046d:0817)
[ 2730.090000] input: UVC Camera (046d:0817) as /devices/101c0000.ehci/usb1/1-1/1-1:1.0/input/input0
похоже все нормально
теперь софт для трансляции. попробую mjpg-streamer. Как оказалось далее - это самый компактный софт для организации трансляции. FFmpeg со всеми своими зависимостями при попытке установки затребовал практически все оставшееся место
opkg install mjpg-streamer
строка запуска
mjpg_streamer -i "input_uvc.so -d /dev/video0 -f 5 -r SVGA" -o "output_http.so -w /www/webcam"
идем на http://192.168.61.1:8080/ и видим картинку с камеры - бинго!
но это камера Logitech C100, плохонькая. Пробую Logitech B910 HD.
разрешение захвата задается так -i "input_uvc.so -r XGA"
чтобы посмотреть все доступные параметры, можно задать кривой параметр и будет выведен хелп, либо так -i "input_uvc.so  --help".
Захват на SXGA (1280x1024) это просто слайдшоу, на XGA (1024x768) так же. Задание пониженного фпс явно (параметр -f) делает картинку постабильнее 
Доступные режимы QSIF QCIF CGA QVGA CIF VGA SVGA XGA SXGA

Нарыл еще одну вебкамеру - SPC230NC
пробую
opkg install kmod-usb-uhci kmod-video-pwc kmod-video-gspca-core
хер
в логе только
[ 1232.010000] usb 1-1.2: new full-speed USB device number 8 using ehci-platform
[ 1232.130000] usb 1-1.2: no of_node; not parsing pinctrl DT
контроллер PAC7302, подсмотрел тут http://webcam-osx.sourceforge.net/cameras/
в списке есть только PAC7311, пробую kmod-video-gspca-pac7311
хер..
opkg install kmod-video-cpia2 kmod-i2c-core kmod-video-gspca-ov519 kmod-video-gspca-pac207 kmod-video-gspca-spca561
хер
В общем, не всякая камера согласится работать, и у меня нет ответа, как перед покупкой понять, будет ли камера работать с voCore или нет.

Поддержка и настройка 3G модема в voCore

Модем у меня с логотипом Билайна, а фактически ZTE MF823D. Первое включение, смотрим логи
[  130.350000] usb 1-1: new high-speed USB device number 2 using ehci-platform
[  130.770000] usb 2-1: new full-speed USB device number 2 using ohci-platform
[  130.990000] usb 2-1: not running at top speed; connect to a high speed hub
[  131.030000] usb 2-1: no of_node; not parsing pinctrl DT
[  131.050000] usb-storage 2-1:1.0: no of_node; not parsing pinctrl DT
[  131.050000] usb-storage 2-1:1.0: USB Mass Storage device detected
[  131.080000] scsi host0: usb-storage 2-1:1.0
[  132.110000] scsi 0:0:0:0: CD-ROM            CWID     USB SCSI CD-ROM  2.31 PQ: 0 ANSI: 2
[  132.120000] sd 0:0:0:0: no of_node; not parsing pinctrl DT
[  137.140000] usb 2-1: USB disconnect, device number 2
[  137.640000] usb 1-1: new high-speed USB device number 3 using ehci-platform
[  137.820000] usb 1-1: no of_node; not parsing pinctrl DT
[  137.860000] usb-storage 1-1:1.2: no of_node; not parsing pinctrl DT
[  137.860000] usb-storage 1-1:1.2: USB Mass Storage device detected
[  137.870000] scsi host1: usb-storage 1-1:1.2
[  138.880000] scsi 1:0:0:0: CD-ROM            CWID     USB SCSI CD-ROM  2.31 PQ: 0 ANSI: 2
[  138.890000] sd 1:0:0:0: no of_node; not parsing pinctrl DT
[  146.260000] usb 1-1: USB disconnect, device number 3
[  146.560000] usb 1-1: new high-speed USB device number 4 using ehci-platform
[  146.980000] usb 2-1: new full-speed USB device number 3 using ohci-platform
[  147.200000] usb 2-1: not running at top speed; connect to a high speed hub
[  147.240000] usb 2-1: no of_node; not parsing pinctrl DT
[  147.270000] usb-storage 2-1:1.2: no of_node; not parsing pinctrl DT
[  147.270000] usb-storage 2-1:1.2: USB Mass Storage device detected
[  147.300000] scsi host2: usb-storage 2-1:1.2
[  148.310000] scsi 2:0:0:0: CD-ROM            CWID     USB SCSI CD-ROM  2.31 PQ: 0 ANSI: 2
[  148.330000] sd 2:0:0:0: no of_node; not parsing pinctrl DT
определяется как CD-ROM, под виндой, кстати, тоже. На сидюке предоставляются драйвера для установки, после установки сидиром превращается в модем :) удобный вариант, раньше такого не видел. Итак, надо сделать usb modeswitch, чтобы из сидирома сделать модем. А еще определиться, какой драйвер ставить. их много (opkg find kmod-usb-net*). Кстати об "opkg find": периодически видимо чистится кэш в /tmp и opkg find не выводит ничего, хотя вроде вот пару минут назад выводило. В общем надо перед find делать opkg update.

Я пробовал модем ставить под виндой, в диспетчере там появилось устройство, в названии которого присутствовало "...RNDIS...". поэтому я решил попробовать драйвер kmod-usb-net-rndis
opkg install kmod-usb-net-rndis
он сам подтянул следующие зависимости
Configuring kmod-mii.
Configuring kmod-usb-net.
Configuring kmod-usb-net-cdc-ether.
Configuring kmod-usb-net-rndis.
в dmesg увидел
[  882.170000] cdc_ether 2-1:1.0: no of_node; not parsing pinctrl DT
[  882.190000] cdc_ether 2-1:1.0 usb0: register 'cdc_ether' at usb-101c1000.ohci-1, CDC Ethernet Device, 36:4b:50:b7:ef:2d
[  882.210000] usbcore: registered new interface driver cdc_ether
[  882.430000] usbcore: registered new interface driver rndis_host
теперь осталось переключить в режим модема. для этого нужен usb-modeswitch
opkg install usb-modeswitch
usbmode -s
хотя по-моему ничего не произошло. после ребута в логе есть такие строки
[  299.500000] rndis_host 1-1:1.0: no of_node; not parsing pinctrl DT
[  299.510000] rndis_host 1-1:1.0 usb0: register 'rndis_host' at usb-101c0000.ehci-1, RNDIS device, 36:4b:50:b7:ef:2d
похоже мой модем это устройство usb0, я дописал в /etc/config/network
config interface 'wwan'
        option ifname 'usb0'
        option proto 'dhcp'
затем ifup wwan и вуаля! Пробую перезагрузиться - все прекрасно поднялось.
Теперь дело за малым, настройка доступа извне

Но и тут не обошлось без минного поля из коровьих лепешек.. Касается это доступа к мини-пк извне, но об этом потом, а сейчас еще один пример - настройка модема Yota. Пользоваться я им не планировал, но интересно было поковыряться и я взял погонять на пару дней.

(бонус) Настройка Yota-модема в voCore

Драйвер все тот же
opkg install kmod-usb-net-rndis
Проверка, что модем определился нормально
cat /sys/kernel/debug/usb/devices - модем присутствует, среди прочего
T:  Bus=01 Lev=02 Prnt=02 Port=02 Cnt=01 Dev#=  4 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1076 ProdID=8002 Rev= 1.00
S:  Manufacturer=GCT SEMICONDUCTOR Inc
S:  Product=Modem Yota
C:* #Ifs= 2 Cfg#= 1 Atr=80 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=e0(wlcon) Sub=01 Prot=03 Driver=rndis_host
E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=1ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
в dmesg на этот раз вместо usb0 - eth1, в остальном все так же
[   50.160000] rndis_host 1-1:1.0 eth1: unregister 'rndis_host' usb-101c0000.ehci-1, RNDIS device
что-то намекает на eth1, правда никакого eth1 ifconfig не показывает. попробуем подсунуть.
пишу в /etc/config/network
config interface 'wwan'
  option ifname 'eth1'
  option proto 'dhcp'
(Разумеется это вместо того wwan, который был выше для 3G-модема) Затем команда ifup wwan и все работает.

После загрузки компика интерфейс eth1 поднялся, IP 10.0.0.10, делаю
route del default gw 172.30.0.1 wlan0
route add default gw 10.0.0.10 eth1
ping ya.ru
и хер..
nslookup, что интересно, работает
Чет я ступил, IP гейта не тот!
route add default gw 10.0.0.1 eth1
работает!
wget -q https://api.ipify.org -O -
wget: can't execute 'openssl': No such file or directory
wget: error getting response: Connection reset by peer
да чтоб тебя, на, жри
opkg install openssl-util
wget -q https://api.ipify.org -O -
109.188.124.73
йесс! кстати этот openssl нехило места сожрал! так что рекомендую воздерживаться от установки изо всех сил.
теперь и dyndns можно обновлять, чтоб не потерять железку на просторах инета. когда она в чистом поле будет на солнечных батареях работать в 300км от меня
хаха, доступа к ней извне все равно не будет! об этом в следующий раз

ИТОГИ

Все оборудование опробовано и сконфигурировано.
Статья итак вышла довольно объемной, так что прервемся тут. продолжение следует.
В следующем выпуске:
1. доступ к voCore через 3G-модем извне
2. автономизация питания, энергосбережение
3. скрипты, трансляция, логика, расчет и экономия трафика
4. проба проекта в поле

1 комментарий:

  1. прикольно, а я так и не смог придумать, куда же применить мои vocore.

    ОтветитьУдалить