Raspberry Pi 3 удобен для модного сейчас понятия "Internet of Things" Предлагаю вниманию Пошаговые инструкции, в виде набора лабораторных работ. К лабораторным работам прилагаются готовые скрипты и короткие клипы без звука. Пояснения в тексте. Смотрите как выполнять команды, копируйте и вставляйте. Темы: Установка и первый запуск Управляем светодиодом Считываем кнопку Веб сервер с поддержкой PHP crontab - исполняем команды или скрипты по времени. Воспроизводим звуковые файлы Настройка OpenVPN клиента Сетевое хранилище. Подключаем внешний диск USB. Samba. Общий каталог - создание, совместный доступ, подключение ProFTPd (FTP - сервер) Яндекс.диск Подключаем Веб-камеру и смотрим на сайте 74HC595 - множим выходы Подключение к Raspberry удаленных датчиков и средств автоматики Wi-Fi - подключение к роутеру, точка доступа, сам роутер Asterisk — свободное решение компьютерной телефонии Управляем на сайте через PHP (по мере готовности будут добавляться) Прошу не писать в эту тему вопросы или комментарии, а заводить отдельные.
Установка и первый запуск Видеоролик можно скачать по адресу: Заходим https://www.raspberrypi.org/downloads/raspbian/ скачиваем Raspbian Jessie Lite Minimal image based on Debian Jessie https://downloads.raspberrypi.org/raspbian_lite_latest Обращаю внимание, что использую не desktop, а чисто серверный вариант, без графики. В нашем случае это более подходит, занимает меньше места и не тратит лишние ресурсы В интернете много примеров для записи образа, например на базе Win32DiskImager Покажу как это делал в Linux Код (Bash): [root@dom pi3]# fdisk -l [root@dom pi3]# umount /dev/sdb1 [root@dom pi3]# ls 2017-03-02-raspbian-jessie-lite.img [root@dom pi3]# dd if=2017-03-02-raspbian-jessie-lite.img of=/dev/sdb bs=1M 1329+0 записей получено 1329+0 записей отправлено скопировано 1393557504 байта (1,4 GB), 139,811 c, 10,0 MB/c [root@dom pi3]# sync [root@dom pi3]# blkid /dev/sdb1: LABEL="boot" UUID="70CD-BC89" TYPE="vfat" PARTUUID="b2455b06-01" /dev/sdb2: UUID="8a9074c8-46fe-4807-8dc9-8ab1cb959010" TYPE="ext4" PARTUUID="b2455b06-02" Устр-во Загрузочный начало Конец Секторы Размер Идентификатор Тип [root@dom pi3]# fdisk -l /dev/sdb1 8192 137215 129024 63M c W95 FAT32 (LBA) /dev/sdb2 137216 2721791 2584576 1,2G 83 Linux Корректно извлекаем карту и вставляем CD-карту в Raspberry Pi 3. Подключаем устройство к локальной сети, в которой настройки DHCP раздаются автоматически. Также подключаем монитор, клавиатуру и блок питания. Мышь не нужна. Всего четыре провода. Включаем. Видим приглашение Код (Bash): Login: Набираем pi нажимаем "Ввод" Видим приглашение Пароль Код (Bash): password: raspberry нажимаем "Ввод" Получаем приглашение: Код (Bash): pi@raspberrypi:~ $ Запускаем сервис ssh для удаленного доступа Код (Bash): pi@raspberrypi:~ $sudo service ssh start Узнаем IP адрес Код (Bash): pi@raspberrypi:~ $ ip a Смотрим какой адрес получил сервер обычно это типа 192.168.1.100 На этом работа с самим устройством заканчивается. Само устройство пока не выключаем. Переходим на нашу рабочую станцию, любой виндос или линукс компьтер, за которым мы обычно работаем. В виндос используем консольную программу PuTTY У меня станция линукс. Итак заходим по ssh с любой удаленной рабочей станции в этой же локальной сети У меня это [vova@dom ~]$ ssh pi@172.16.5.40 у вас другой адрес ( тот что вы узнали набрав команду ip a Код (Bash): pi@172.16.5.40's password: набираем в темную raspberry дальше возможно будет набрать yes получаем приглашение Код (Bash): pi@raspberrypi:~ $ Задаем пароль суперпользователю root Код (Bash): pi@raspberrypi:~ $ sudo passwd меняем пароль пользователя pi Код (Bash): pi@raspberrypi:~ $ sudo passwd pi Ставим ssh в автозагрузку Код (Bash): pi@raspberrypi:~ $ sudo systemctl enable ssh Заходим root`ом Код (Bash): pi@raspberrypi:~ $ su -l Обновляем сведения о пакетах для apt-get Код (Bash): root@raspberrypi:~# apt-get update подгружаем пару полезных программ Код (Bash): root@raspberrypi:~# apt-get install mc htop Для сервера важно понятие время, иначе могут не работать некоторые сервисы Выставляем часовой пояс Код (Bash): root@raspberrypi:~# dpkg-reconfigure tzdata Синхронизируем время Код (Bash): root@raspberrypi:~# apt-get install ntp Код (Bash): root@raspberrypi:~# service ntp stop;ntpd -gq;service ntp start ntpd: time slew +0.002628s Проверяем Код (Bash): root@raspberrypi:~# date Знакомимся с монитором процессов Код (C++): pi@raspberrypi:~ $ htop Узнать температуру Код (Bash): pi@raspberrypi:~ $ /opt/vc/bin/vcgencmd measure_temp temp=52.6'C Знакомимся с файловым менеджером с текстовым интерфейсом, с файловой системой Код (Bash): root@raspberrypi:~# mc Если хотим, можем прописать статический IP адрес Открываем файл Код (Bash): root@raspberrypi:~# mcedit /etc/dhcpcd.conf и в самый конец файла дописываем строки с данными своей локальной сети Код (Bash): interface eth0 static ip_address=192.168.1.138/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 Если хотим, можем поменять имя сервера Открываем и правим два файла: Код (Bash): root@raspberrypi:~# mcedit /etc/hostname root@raspberrypi:~# mcedit /etc/hosts в этих файлах слово raspberrypi заменяем на любое ваше, но с маленькой буквы, без пробелов и специальных символов Перегружаем сервер Код (Bash): root@raspberrypi:~# reboot Проверяем возможность удаленного управления сервером по ssh Если все нормально, отсоединяем монитор и клавиатуру. Сервер корректно выключается удаленно командой от простого пользователя Код (Bash): pi@raspberrypi:~# sudo poweroff от рута Код (Bash): root@raspberrypi:~# poweroff Устройство можно переносить в любое удобное место. Подключать только блок питания и сеть интернет.
Управляем светодиодом Видеоролик можно скачать по адресу: По поисковой фразе raspberry pi 3 gpio находим картинку расположения gpio Подсоединяем светодиод через сопротивление 330 ом к 39 (GND) и 40 (CPIO21) ногам ( самые крайние со стороны USB порта) Собираем схемку: Скачиваем готовый архив Код (Bash): pi@raspberrypi:~ $ wget -r --no-parent http://salomatin.ru/salomatin.tar --2017-04-02 14:41:46-- http://salomatin.ru/salomatin.tar Resolving salomatin.ru (salomatin.ru)... 94.24.254.74 Connecting to salomatin.ru (salomatin.ru)|94.24.254.74|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 20480 (20K) [application/x-tar] Saving to: ‘salomatin.ru/salomatin.tar’ salomatin.ru/salomatin.tar 100%[============================================>] 20.00K --.-KB/s in 0.002s 2017-04-02 14:41:46 (9.73 MB/s) - ‘salomatin.ru/salomatin.tar’ saved [20480/20480] FINISHED --2017-04-02 14:41:46-- Total wall clock time: 0.07s Downloaded: 1 files, 20K in 0.002s (9.73 MB/s) Распаковываем Код (Bash): pi@raspberrypi:~ $ tar -xvf salomatin.ru/salomatin.tar salomatin/ salomatin/p.py salomatin/e2.py salomatin/pik.py salomatin/e5.py salomatin/e3.py salomatin/off.py salomatin/offhtml.py salomatin/blink.py salomatin/e1.py salomatin/on.py salomatin/onhtml.py salomatin/e4.py Смотрим содержание файла ( аналог маячка для arduino) Набираем Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/blink.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time, os GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(21, GPIO.OUT) while True : GPIO.output(21,True), time.sleep(0.5) GPIO.output(21,False), time.sleep(1) Запускаем скрипт командой: Код (Bash): pi@raspberrypi:~ $ /home/pi/salomatin/blink.py Светодиод начинает мигать. Если не мигает, возможно ошиблись полярностью. Ничего не сгорит. Спокойно разворачиваем светодиод в другую сторону. Чтобы остановить исполнение скрипта нажимаем одновременно Ctrl + с Скрипт останавливается в момент нажатия (светодиод может гореть или погаснуть) вываливается сообщение: Код (Bash): ^CTraceback (most recent call last): File "/home/pi/salomatin/blink.py", line 15, in <module> time.sleep(1) KeyboardInterrupt то есть момент, когда был остановлен Включение светодиода Смотрим содержание файла включения светодиода командой: Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/on.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time, os GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(21, GPIO.OUT) GPIO.output(21,True), print('21' + ' on ') Включаем светодиод Код (Bash): pi@raspberrypi:~ $ /home/pi/salomatin/on.py 21 on Светодиод включился Выводится сообщение, что 21 on то есть светодиод включили (сообщение не стандартное, придуманное автором) Смотрим содержание скрипта выключения светодиода командой: Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/off.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time, os GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(21, GPIO.OUT) GPIO.output(21,False), print('21' + ' off ') Выключаем светодиод Код (Bash): pi@raspberrypi:~ $ /home/pi/salomatin/off.py 21 off Включаем светодиод и записываем сообщение в файл Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/onhtml.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time, os from datetime import datetime GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(21, GPIO.OUT) GPIO.output(21,True), print('21' + ' on ') f1 = "/home/pi/a2.html" a2 = open(f1, 'a') now = datetime.now() a2 = open(f1, 'a') a2.write('<br />' + '21' + ' on ' + str(now) + '\n'), a2.close() pi@raspberrypi:~ $ /home/pi/salomatin/onhtml.py 21 on Появился файл, а нем строка Код (Bash): pi@raspberrypi:~ $ cat /home/pi/a2.html <br />21 on 2017-04-02 15:16:07.458861 <br /> символ кода html для просмотра на сайте, далее дата и время в миллисекундах Аналогично выключение Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/offhtml.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time, os from datetime import datetime GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(21, GPIO.OUT) GPIO.output(21,False), print('21' + ' off ') f1 = "/home/pi/a2.html" a2 = open(f1, 'a') now = datetime.now() a2 = open(f1, 'a') a2.write('<br />' + '21' + ' off ' + str(now) + '\n'), a2.close() pi@raspberrypi:~ $ /home/pi/salomatin/offhtml.py 21 off pi@raspberrypi:~ $ cat /home/pi/a2.html <br />21 on 2017-04-02 15:16:07.458861 <br />21 off 2017-04-02 15:18:26.147152 Тестируем
Считываем кнопку Видеоролик можно скачать по адресу: Подсоединяем кнопку к CPIO19 , второй провод на GND Смотрим скрипт Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/e1.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(19, GPIO.IN) GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) # подтяжка к питанию p19 = GPIO.input(19) print(p19), Исполнение скрипта выводит 0 или 1, состояние кнопки. Нажата или отжата. Код (Bash): pi@raspberrypi:~ $ /home/pi/salomatin/e1.py 1 pi@raspberrypi:~ $ /home/pi/salomatin/e1.py 0 Следующий скрипт выводит уже номер контакта и время Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/e2.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time from datetime import datetime GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(19, GPIO.IN) GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) # подтяжка к питанию now = datetime.now() if (GPIO.input(19)) == 0: print('19' + ' on ' + str(now) + '\n'), if (GPIO.input(19)) == 1: print('19' + ' off ' + str(now) + '\n'), pi@raspberrypi:~ $ /home/pi/salomatin/e2.py 19 off 2017-04-02 15:56:20.495889 pi@raspberrypi:~ $ /home/pi/salomatin/e2.py 19 on 2017-04-02 15:56:25.215933 Тоже самое но записью в файл Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/e3.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time from datetime import datetime GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(19, GPIO.IN) GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) # подтяжка к питанию f1 = "/home/pi/a2.html" a2 = open(f1, 'a') now = datetime.now() if (GPIO.input(19)) == 0: a2 = open(f1, 'a') a2.write('<br />' + '19' + ' on ' + str(now) + '\n'), a2.close() print('19' + ' on ' + str(now) + '\n'), if (GPIO.input(19)) == 1: a2 = open(f1, 'a') a2.write('<br />' + '19' + ' off ' + str(now) + '\n'), a2.close() print('19' + ' off ' + str(now) + '\n'), pi@raspberrypi:~ $ /home/pi/salomatin/e3.py 19 off 2017-04-02 15:58:13.287239 pi@raspberrypi:~ $ cat /home/pi/a2.html <br />21 on 2017-04-02 15:33:52.795120 <br />21 off 2017-04-02 15:34:20.846578 <br />21 on 2017-04-02 15:34:43.948453 <br />21 off 2017-04-02 15:34:48.754141 <br />21 on 2017-04-02 15:34:51.673439 <br />21 off 2017-04-02 15:34:55.654782 <br />19 off 2017-04-02 15:58:13.287239 Скрипт каждую секунду считывает состояние кнопки и записывает в файл Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/e4.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time from datetime import datetime GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(19, GPIO.IN) GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) # подтяжка к питанию f1 = "/home/pi/a2.html" a2 = open(f1, 'a') while True : now = datetime.now() if (GPIO.input(19)) == 0: a2 = open(f1, 'a') a2.write('<br />' + '19' + ' on ' + str(now) + '\n'), a2.close() print('19' + ' on ' + str(now) + '\n'), if (GPIO.input(19)) == 1: a2 = open(f1, 'a') a2.write('<br />' + '19' + ' off ' + str(now) + '\n'), a2.close() print('19' + ' off ' + str(now) + '\n'), time.sleep(1) pi@raspberrypi:~ $ /home/pi/salomatin/e4.py 19 off 2017-04-02 16:00:06.652762 19 off 2017-04-02 16:00:07.654152 19 on 2017-04-02 16:00:08.655448 19 on 2017-04-02 16:00:09.656726 19 off 2017-04-02 16:00:10.658155 19 off 2017-04-02 16:00:11.659946 ^CTraceback (most recent call last): File "/home/pi/salomatin/e4.py", line 30, in <module> a2.write('<br />' + '19' + ' off ' + str(now) + '\n'), KeyboardInterrupt pi@raspberrypi:~ $ cat /home/pi/a2.html <br />21 on 2017-04-02 15:33:52.795120 <br />21 off 2017-04-02 15:34:20.846578 <br />21 on 2017-04-02 15:34:43.948453 <br />21 off 2017-04-02 15:34:48.754141 <br />21 on 2017-04-02 15:34:51.673439 <br />21 off 2017-04-02 15:34:55.654782 <br />19 off 2017-04-02 15:58:13.287239 <br />19 off 2017-04-02 16:00:06.652762 <br />19 off 2017-04-02 16:00:07.654152 <br />19 on 2017-04-02 16:00:08.655448 <br />19 on 2017-04-02 16:00:09.656726 <br />19 off 2017-04-02 16:00:10.658155 <br />19 off 2017-04-02 16:00:11.659946 Скрипт выводит только сам момент изменения состояния кнопки и записывает его в файл Код (Bash): pi@raspberrypi:~ $ cat /home/pi/salomatin/e5.py #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time from datetime import datetime GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(19, GPIO.IN) GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) # подтяжка к питанию f1 = "/home/pi/a2.html" a2 = open(f1, 'a') b19=0 while True : now = datetime.now() if (GPIO.input(19)) == 0: if b19 == 1: a2 = open(f1, 'a') a2.write('<br />' + '19' + ' on ' + str(now) + '\n'), a2.close() print('19' + ' on ' + str(now) + '\n'), b19=0 if (GPIO.input(19)) == 1: if b19 == 0: a2 = open(f1, 'a') a2.write('<br />' + '19' + ' off ' + str(now) + '\n'), a2.close() print('19' + ' off ' + str(now) + '\n'), b19=1 time.sleep(0.1) pi@raspberrypi:~ $ /home/pi/salomatin/e5.py 19 off 2017-04-02 16:02:15.899399 19 on 2017-04-02 16:02:18.904095 19 off 2017-04-02 16:02:19.104583 19 on 2017-04-02 16:02:20.707408 19 off 2017-04-02 16:02:20.908200 ^CTraceback (most recent call last): File "/home/pi/salomatin/e5.py", line 41, in <module> time.sleep(0.1) KeyboardInterrupt pi@raspberrypi:~ $ cat /home/pi/a2.html <br />21 on 2017-04-02 15:33:52.795120 <br />21 off 2017-04-02 15:34:20.846578 <br />21 on 2017-04-02 15:34:43.948453 <br />21 off 2017-04-02 15:34:48.754141 <br />21 on 2017-04-02 15:34:51.673439 <br />21 off 2017-04-02 15:34:55.654782 <br />19 off 2017-04-02 15:58:13.287239 <br />19 off 2017-04-02 16:00:06.652762 <br />19 off 2017-04-02 16:00:07.654152 <br />19 on 2017-04-02 16:00:08.655448 <br />19 on 2017-04-02 16:00:09.656726 <br />19 off 2017-04-02 16:00:10.658155 <br />19 off 2017-04-02 16:00:11.659946 <br />19 off 2017-04-02 16:02:15.899399 <br />19 on 2017-04-02 16:02:18.904095 <br />19 off 2017-04-02 16:02:19.104583 <br />19 on 2017-04-02 16:02:20.707408 <br />19 off 2017-04-02 16:02:20.908200 Тестируем
Выводим состояние кнопки и светодиода на веб сайте nginx и php5-fpm для запуска PHP скриптов Видеоролик можно скачать по адресу: Обновляем сведения о пакетах Код (Bash): root@raspberrypi:~# apt-get update Устанавливаем Код (Bash): root@raspberrypi:~# apt-get install nginx php5 php5-fpm php5-mysql php5-cgi Включаем в автозагрузку Код (Bash): root@raspberrypi:~# systemctl enable nginx;systemctl enable php5-fpm; Правим файл /etc/nginx/sites-available/default Вставляем туда кусок Код (Bash): root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name _; location / { autoindex on; autoindex_exact_size off; autoindex_localtime on; charset utf-8; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } Привожу полный текст исправленного файла Код (Bash): root@raspberrypi:~# mcedit /etc/nginx/sites-available/default root@raspberrypi:~# cat /etc/nginx/sites-available/default ## # You should look at the following URL's in order to grasp a solid understanding # of Nginx configuration files in order to fully unleash the power of Nginx. # http://wiki.nginx.org/Pitfalls # http://wiki.nginx.org/QuickStart # http://wiki.nginx.org/Configuration # # Generally, you will want to move this file somewhere, and start with a clean # file but keep this around for reference. Or just disable in sites-enabled. # # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. ## # Default server configuration # server { listen 80 default_server; listen [::]:80 default_server; # SSL configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Self signed certs generated by the ssl-cert package # Don't use them in a production server! # # include snippets/snakeoil.conf; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name _; location / { autoindex on; autoindex_exact_size off; autoindex_localtime on; charset utf-8; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # Virtual Host configuration for example.com # # You can move that to a different file under sites-available/ and symlink that # to sites-enabled/ to enable it. # #server { # listen 80; # listen [::]:80; # # server_name example.com; # # root /var/www/example.com; # index index.html; # # location / { # try_files $uri $uri/ =404; # } #} В файле Код (Bash): root@raspberrypi:~# mcedit /etc/php5/fpm/php.ini находим строку 771 , убираем комментарий впереди и заменяем единицу на ноль Код (Bash): cgi.fix_pathinfo=0 создаем файл Код (Bash): root@raspberrypi:~# cat > /var/www/html/index.php с единственной строкой Код (Bash): <?php phpinfo(); ?> Должно получится так Код (Bash): root@raspberrypi:~# cat /var/www/html/index.php <?php phpinfo(); ?> Перегружаем сервисы Код (Bash): root@raspberrypi:~# service nginx restart;service php5-fpm restart по адресу нашего устройства должно появиться в браузере красочная таблица http://172.16.5.38/ Создаем каталог Код (Bash): root@raspberrypi:~# mkdir /var/www/html/foto;chmod 777 /var/www/html/foto Делаем символическую ссылку Код (Bash): root@raspberrypi:~# ln -s /home/pi/a2.html /var/www/html/foto/a2.html и по адресу http://172.16.5.38/foto/a2.html видим наш файл с данными состояния кнопки и светодиода ( адрес у вас будет другой) Apache2 и php5 для запуска PHP скриптов Останавливаем предыдущий веб сервер Код (Bash): root@raspberrypi:~# service nginx stop Убираем из автозапуска Код (Bash): root@raspberrypi:~# systemctl disableenable nginx; Подгружаем Код (Bash): root@raspberrypi:~# apt-get install apache2 libapache2-mod-php5 Перегружаем Код (Bash): root@raspberrypi:~# service apache2 restart ставим в автозагрузку Код (Bash): systemctl enable apache2 по адресу нашего устройства смотрим в браузере красочную таблицу http://172.16.5.38/index.php помним что создали до этого файл Код (Bash): root@raspberrypi:~# cat /var/www/html/index.php <?php phpinfo(); ?>
crontab Исполняем команды или скрипты по времени. набираем Код (Bash): pi@raspberrypi:~ $ crontab -e получаем вывод Код (Bash): pi@raspberrypi:~ $ crontab -e no crontab for pi - using an empty one /usr/bin/select-editor: 1: /usr/bin/select-editor: gettext: not found 'select-editor'. 1. /bin/ed /usr/bin/select-editor: 1: /usr/bin/select-editor: gettext: not found 2. /bin/nano <---- 3. /usr/bin/mcedit 4. /usr/bin/vim.tiny /usr/bin/select-editor: 32: /usr/bin/select-editor: gettext: not found 1-4 [2]: выбираем 3 и открывается для редактирования файл вставляем строку Код (Bash): */1 * * * * date >> /home/pi/crintab.txt в конце обязательно нажимаем клавишу ENTER, так называемая "пустая строка", чтобы скрипт понимал, что предыдущая строка закончена полностью дальше F2 сохранить и F10 выходим Каждую минуту в файл /home/pi/crintab.txt будет вписывать вывод команды date исполнять любой скрипт, который исполняется данным пользователем просто в командной строке Например: Код (Bash): 10 9 13 * 5 /home/pi/salomatin/on.py в 9 часов 10 минут каждую пятницу 13 числа загадочным образом будет загораться светодиод Подробнее формат команды man crontab или поиском по инету.
По команде воспроизводим звуковой файл. Из файлов составляем фразы. Включаем по расписанию, по нажатию кнопки и по времени. Транслируем интернет-радио. Становимся рутом Код (Bash): pi@raspberrypi:~ $ su -l Обновляем сведения о пакетах Код (Bash): root@raspberrypi:~# apt-get update Устанавливаем два самых простых плеера Код (Bash): root@raspberrypi:~# apt-get install mpg123 mpg321 выходим Код (Bash): root@raspberrypi:~# exit и уже от имени рядового пользователя скачиваем любой звуковой файл Код (Bash): pi@raspberrypi:~ $ wget salomatin.ru/klen.mp3 HTTP request sent, awaiting response... 200 OK Length: 3304503 (3.2M) [audio/mpeg] Saving to: ‘klen.mp3’ klen.mp3 100%[============================================>] 3.15M 9.76MB/s in 0.3s 2017-04-15 20:36:41 (9.76 MB/s) - ‘klen.mp3’ saved [3304503/3304503] Воспроизводим Код (Bash): pi@raspberrypi:~ $ mpg123 klen.mp3 High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3 version 1.20.1; written and copyright by Michael Hipp and others free software (LGPL) without any warranty but with best wishes Playing MPEG stream 1 of 1: klen.mp3 ... MPEG 1.0 layer III, 128 kbit/s ABR, 44100 Hz joint-stereo Title: Mr. Credo - Êëåí Artist: Mr. Credo Comment: Album: Year: Genre: Other ^C [0:44] Decoding of klen.mp3 finished. Уровень звука настраиваем Код (Bash): pi@raspberrypi:~ $ alsamixer нажимаем F6 и стрелочкой курсора выставляем нужную громкость Для примера некоторые интернет-станции Код (Bash): pi@raspberrypi:~ $ mpg123 http://nbn.101.ru:4000/ar_74_01 pi@raspberrypi:~ $ mpg123 http://air.radiorecord.ru:8102/mdl_128 pi@raspberrypi:~ $ mpg123 http://ep128server.streamr.ru:8030/ep128
Настройка OpenVPN клиента Высовываем наш Raspberry в интернет. Для этого подключаем его через сервис OpenVPN к серверу со статическим IP адресом ( Например хостинг-провайдер, где крутится ваш сайт) Ваш Raspberry получит локальный адрес, например 10.83.0.26, тогда хостинг-провайдер директивой nginx примерно такого типа: Код (Bash): location ~* /foto { proxy_pass http://10.83.0.26; } будет отправлять запросы на ваш Raspberry Итак На рабочей станции под любой удобной для вас операционной системой настраиваем клиента OptnVPN . Проверяем соединение с сервером. В результате получаем три файла (ключи и сертификат) и IP адрес сервера. Копируем файлы на Raspberry в моем примере Код (Bash): [root@dom private]# scp t5.key pi@172.16.5.38:/home/pi [root@dom certs]# scp ca-root.pem pi@172.16.5.38:/home/pi [root@dom certs]# scp t5.cert pi@172.16.5.38:/home/pi Заходим на наш Raspberry и ставим Код (Bash): root@raspberrypi:~# apt-get install openvpn Берем готовый файл и его правим Код (Bash): root@raspberrypi:~# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/ root@raspberrypi:~# mcedit /etc/openvpn/client.conf 43 строка вместо Код (Bash): ;remote my-server-1 1194 записываем IP адрес нашего OpenVPN сервера Код (Bash): remote 37.37.37.37 1194 строка 89, вместо Код (Bash): ###ca ca.crt ###cert client.crt ###key client.key ca /etc/openvpn/ca-root.pem cert /etc/openvpn/t5.cert key /etc/openvpn/t5.key ставим комментарий Код (Bash): #ns-cert-type server копируем файлы Код (Bash): root@raspberrypi:~# cp /home/pi/ca-root.pem /etc/openvpn/ root@raspberrypi:~# cp /home/pi/t5.cert /etc/openvpn/ root@raspberrypi:~# cp /home/pi/t5.key /etc/openvpn/ Запускаем клиента Код (Bash): root@raspberrypi:~# service openvpn start Проверяем появилось ли соединение Код (Bash): root@raspberrypi:~# ip a 8: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.83.0.26 peer 10.83.0.25/32 scope global tun0 valid_lft forever preferred_lft forever Останавливаем Код (Bash): root@raspberrypi:~# service openvpn stop Проверяем, соединение исчезло Как дополнительная опция: Если в конец файла вставить /etc/openvpn/client.conf Код (Bash): redirect-gateway и перезапустить клиента, то все пакеты будут ходить только через сервер OpenVPN
Сетевое хранилище Подключаем внешние жесткие диски Подгружаем Код (Bash): root@raspberrypi:~# apt-get install ntfs-3g Подключаем по USB внешний диск. Находим под каким именем он появился Код (Bash): root@raspberrypi:~# fdisk -l у меня он Код (Bash): Device Boot Start End Sectors Size Id Type /dev/sda1 63 976768064 976768002 465.8G 7 HPFS/NTFS/exFAT Создаем точку монтирования Код (Bash): root@raspberrypi:~# mkdir /mnt/usb1 root@raspberrypi:~# chmod 777 /mnt/usb1 Монтируем диск Код (Bash): root@raspberrypi:~# mount -t ntfs-3g /dev/sda1 /mnt/usb1 -o force Видим его Код (Bash): root@raspberrypi:~# mount -t ntfs-3g /dev/sda1 /mnt/usb1 -o force root@raspberrypi:~# ls /mnt/usb1/ EE System Volume Information Размонтировать можно командой Код (Bash): root@raspberrypi:~# umount /dev/sda1 /mnt/usb1 Проверяем Код (Bash): root@raspberrypi:~# ls /mnt/usb1/ root@raspberrypi:~# Для автоматического монтирования правим файл открываем его Код (Bash): root@raspberrypi:~# mcedit /etc/fstab и добавляем строчку /dev/sda1 /mnt/usbdrive ntfs-3g defaults,rw 0 1 Код (Bash): proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 /dev/sda1 /mnt/usbdrive ntfs-3g defaults,rw 0 1 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that перегружаем Код (Bash): root@raspberrypi:~# reboot Проверяем Код (Bash): pi@raspberrypi:~ $ ls /mnt/usb1/ EE System Volume Information Осторожно с функцией автомонтирования. Для работы можно дать команду и вручную. После того как вы внесли изменения в файл /etc/fstab, вы уже не сможете просто так перегрузить устройство при отсутсnвии диска USB. Надо будет подключать. В крайнем случае можно вынуть CD карту, открыть ее на рабочей станции, найти файл и убрать строчку. Таким же образом подключаем диски 2, 3, 4
Samba. Общий каталог - создание, совместный доступ, подключение Обновляем сведения о пакетах Код (Bash): root@raspberrypi:~# apt-get update Подгружаем Код (Bash): root@raspberrypi:~# apt-get install samba создаем каталог с правами общего доступа Код (Bash): root@raspberrypi:~# mkdir /home/public;chmod 777 /home/public сохраняем оригинал конфигурационного файла Код (Bash): root@raspberrypi:~# mv /etc/samba/smb.conf /etc/samba/smb.conf.old создаем новый файл Код (Bash): root@raspberrypi:~# mcedit /etc/samba/smb.conf вставляем туда Код (Bash): [global] dos charset = CP866 unix charset = utf8 display charset = cp1251 workgroup = WORKGROUP server string = Raspberry security = USER map to guest = Bad User [Public] path = /home/public read only = Yes guest ok = Yes browseable = yes writable = yes create mask = 0777 force create mask = 0777 directory mask = 0777 Перегружаем Код (Bash): root@raspberrypi:~# systemctl restart smbd.service;systemctl restart nmbd.service Заходим как обычно "Сетевое окружение", находим наше устройство в сети и видим каталог Public . Вставляем и скачиваем файлы как обычно. Всем можно все. Если укажем общим каталогом наш внешний диск usb1 из нашей прошлой лабораторной, то получаем удобное сетевое хранилище. Включаем в автозагрузку Код (Bash): root@raspberrypi:~# systemctl enable smbd.service;systemctl enable nmbd.service
ProFTPd (FTP - сервер) Подгружаем Код (Bash): apt-get install proftpd программа начнет устанавливаться выскочит менюшка, выбрать standalone Сразу после установки все работает. Любым FTP -клиентом заходим на Raspberry по его IP адресу Входное имя pi пароль ваш для pi Попадаем в корень файловой системы В домашний каталог можем скачивать и закачивать файлы Открываем Код (Bash): root@raspberrypi:~# mcedit /etc/proftpd/proftpd.conf строка 34 снимаем комментарий перед Код (Bash): DefaultRoot ~ перегружаем Код (Bash): root@raspberrypi:~# service proftpd restart с этого момента попадаем сразу в домашний каталог и ограничены на сервере только рамками домашнего каталога Для входа анонимных пользователей открываем Код (Bash): root@raspberrypi:~# mcedit /etc/proftpd/proftpd.conf начиная со стоки 147 убираем комментарии вначале каждой строки получаем Код (Bash): <Anonymous ~ftp> User><------><------><------>ftp Group<------><------><------><------>nogroup # We want clients to be able to login with "anonymous" as well as "ftp" UserAlias<--><------><------>anonymous ftp # Cosmetic changes, all files belongs to ftp user DirFakeUser<>on ftp DirFakeGroup on ftp RequireValidShell<--><------>off # Limit the maximum number of anonymous logins MaxClients<-><------><------>10 # We want 'welcome.msg' displayed at login, and '.message' displayed # in each newly chdired directory. DisplayLogin><------><------>welcome.msg DisplayChdir><------>.message # Limit WRITE everywhere in the anonymous chroot <Directory *> <Limit WRITE> # DenyAll AllowAll </Limit> </Directory> # # Uncomment this if you're brave. # # <Directory incoming> # # # Umask 022 is a good standard umask to prevent new files and dirs # # # (second parm) from being group and world writable. # # Umask<-><------><------><------>022 022 # # <Limit READ WRITE> # # DenyAll # # </Limit> # # <Limit STOR> # # AllowAll # # </Limit> # # </Directory> </Anonymous> # Include other custom configuration files Include /etc/proftpd/conf.d/ Обратите внимание поставлен комментарий и добавлено слово Код (Bash): # DenyAll AllowAll Код (Bash): root@raspberrypi:~# service proftpd restart Любым FTP клиентом входим чисто по IP адресу, без имени попадаем на сервер, специальный раздел для анонимных пользователей /srv/ftp/ там видим любой закаченный нами до этого файл Подробнее читаем руководства по ProFTPd
Яндекс.Диск Обновляем сведения о пакетах Код (Bash): root@raspberrypi:~# apt-get update Подгружаем Код (Bash): root@raspberrypi:~# apt-get install davfs2 спросит про разрешиение непривилегированным пользователям монтировать папку. На вопрос отвечаем Yes. Выходим из рута Код (Bash): root@raspberrypi:~# exit и от имени пользователя pi создаем точку монтирования Код (Bash): pi@raspberrypi:~ $ mkdir /home/pi/ya.disk;chmod -R 777 /home/pi/ya.disk Возвращаемся Код (Bash): pi@raspberrypi:~ $ su -l Password: монтируем Код (Bash): mount -t davfs https://webdav.yandex.ru /home/pi/ya.disk -o uid=pi,gid=pi,rw,file_mode=0777,dir_mode=0777 попросят ввести логин и пароль от аккаунта Яндекс.Диск проверяем Код (Bash): root@raspberrypi:~# ls /home/pi/ya.disk/ Видим файлы вашего яндекс.диска. Командой или исполняя скрипт можно добавлять туда файлы Размонтировать Код (Bash): root@raspberrypi:~# umount https://webdav.yandex.ru /home/pi/ya.disk /sbin/umount.davfs: waiting while mount.davfs (pid 1542) synchronizes the cache .. OK umount: /home/pi/ya.disk: not mounted Для того чтобы больше не спрашивало логин и пароль открываем Код (Bash): root@raspberrypi:~# mcedit /etc/davfs2/secrets и в конец файла добавляем одну строку с вашим логином и паролем Код (Bash): https://webdav.yandex.ru Ваш_логин Ваш_пароль проверяем Код (Bash): mount -t davfs https://webdav.yandex.ru /home/pi/ya.disk -o uid=pi,gid=pi,rw,file_mode=0777,dir_mode=0777 Добавим пользователя в группу davfs2 (в данном примере, наш пользователь это pi): Код (Bash): root@raspberrypi:~# usermod -aG davfs2 pi Для авто монтирования открываем Код (Bash): root@raspberrypi:~# mcedit /etc/fstab и вписываем строку Код (Bash): proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 https://webdav.yandex.ru /home/pi/ya.disk davfs rw,noexec,auto,user,async,_netdev,uid=pi,gid=pi 0 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that еще раз предупреждаю, что надо поосторожней с /etc/fstab Теперь фотографии с камеры или любые другие файлы вы можете посмотреть на вашем яндекс.диске в любом мобильном приложении. Надо только скриптом их скопировать в раздел /home/pi/ya.disk/
Подключаем Веб-камеру и смотрим на сайте Видеоролик можно скачать по адресу: Обновляем сведения о пакетах Код (Bash): root@raspberrypi:~# apt-get update Устанавливаем Код (Bash): root@raspberrypi:~# apt-get install winff Подключаем через USB веб-камеру далее командой отправляем снимок в каталог, который нам виден на сайте Код (Bash): pi@raspberrypi:~ $ avconv -t 1 -f video4linux2 -s 1920x1080 -r 2 -i /dev/video0 /var/www/html/foto/%03d.jpg; rm -rf 001.jpg 1920x1080 расширение моей камеры, у вас может быть другое avconv делает два снимка, первый удаляет, второй под именем 002.jpg сохраняет в каталоге foto ссылке http://172.16.5.38/foto/002.jpg Видим снимок с нашей камеры повторяем команду Код (Bash): pi@raspberrypi:~ $ avconv -t 1 -f video4linux2 -s 1920x1080 -r 2 -i /dev/video0 /var/www/html/foto/%03d.jpg; rm -rf 001.jpg Видим обновленное фото
74HC595 - множим выходы Классический маячок: Собираем схемку: Код: Код (Python): #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time, os LATCH = 16 # Pin Latch clock CLK = 12 # Pin shift clock dataBit = 21 # Pin A GPIO.setmode(GPIO.BCM) GPIO.setwarnings (False) GPIO.setup(LATCH, GPIO.OUT) GPIO.setup(CLK, GPIO.OUT) GPIO.setup(dataBit, GPIO.OUT) GPIO.output(LATCH, 0) GPIO.output(CLK, 0) def pulseCLK(): GPIO.output(CLK, 1) # time.sleep(.01) GPIO.output(CLK, 0) return def serLatch(): GPIO.output(LATCH, 1) # time.sleep(.01) GPIO.output(LATCH, 0) return # MSB out first! def ssrWrite(value): for x in range(0,8): temp = value & 0x80 if temp == 0x80: GPIO.output(dataBit, 1) # data bit HIGH else: GPIO.output(dataBit, 0) # data bit LOW pulseCLK() value = value << 0x01 # shift left serLatch() # output byte return # convert an 8-bit number to a binary string def convBinary(value): binaryValue = '0b' for x in range(0,8): temp = value & 0x80 if temp == 0x80: binaryValue = binaryValue + '1' else: binaryValue = binaryValue + '0' value = value << 1 return binaryValue while True : ssrWrite(1) time.sleep(0.5) ssrWrite(0) time.sleep(0.5) Тестируем Мигаем всеми выходами и по разному: Код (Python): #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time, os LATCH = 16 # Pin Latch clock CLK = 12 # Pin shift clock dataBit = 21 # Pin A GPIO.setmode(GPIO.BCM) GPIO.setwarnings (False) GPIO.setup(LATCH, GPIO.OUT) GPIO.setup(CLK, GPIO.OUT) GPIO.setup(dataBit, GPIO.OUT) GPIO.output(LATCH, 0) GPIO.output(CLK, 0) def pulseCLK(): GPIO.output(CLK, 1) # time.sleep(.01) GPIO.output(CLK, 0) return def serLatch(): GPIO.output(LATCH, 1) # time.sleep(.01) GPIO.output(LATCH, 0) return # MSB out first! def ssrWrite(value): for x in range(0,8): temp = value & 0x80 if temp == 0x80: GPIO.output(dataBit, 1) # data bit HIGH else: GPIO.output(dataBit, 0) # data bit LOW pulseCLK() value = value << 0x01 # shift left serLatch() # output byte return # convert an 8-bit number to a binary string def convBinary(value): binaryValue = '0b' for x in range(0,8): temp = value & 0x80 if temp == 0x80: binaryValue = binaryValue + '1' else: binaryValue = binaryValue + '0' value = value << 1 return binaryValue t=0.5 while True : #мигаем 1 ssrWrite(1) time.sleep(t) ssrWrite(0) time.sleep(t) ssrWrite(1) time.sleep(t) ssrWrite(0) time.sleep(t) #сдвиг по одному ssrWrite(1) time.sleep(t) ssrWrite(0) ssrWrite(2) time.sleep(t) ssrWrite(0) ssrWrite(4) time.sleep(t) ssrWrite(0) ssrWrite(8) time.sleep(t) ssrWrite(0) ssrWrite(16) time.sleep(t) ssrWrite(0) ssrWrite(32) time.sleep(t) ssrWrite(0) ssrWrite(64) time.sleep(t) ssrWrite(0) ssrWrite(128) time.sleep(t) ssrWrite(0) # Все одновременно ssrWrite(255) time.sleep(t) ssrWrite(0) time.sleep(t) ssrWrite(255) time.sleep(t) ssrWrite(0) Две 74HC595 Код (Python): #! /usr/bin/env python # coding: utf-8 import RPi.GPIO as GPIO import time, os LATCH = 16 # Pin Latch clock CLK = 12 # Pin shift clock dataBit = 21 # Pin A dataBit1= 25 GPIO.setmode(GPIO.BCM) GPIO.setwarnings (False) GPIO.setup(LATCH, GPIO.OUT) GPIO.setup(CLK, GPIO.OUT) GPIO.setup(dataBit, GPIO.OUT) GPIO.setup(dataBit1, GPIO.OUT) GPIO.output(LATCH, 0) GPIO.output(CLK, 0) def pulseCLK(): GPIO.output(CLK, 1) # time.sleep(.01) GPIO.output(CLK, 0) return def serLatch(): GPIO.output(LATCH, 1) # time.sleep(.01) GPIO.output(LATCH, 0) return # MSB out first! def ssrWrite(value): for x in range(0,8): temp = value & 0x80 if temp == 0x80: GPIO.output(dataBit, 1) # data bit HIGH else: GPIO.output(dataBit, 0) # data bit LOW pulseCLK() value = value << 0x01 # shift left serLatch() # output byte return def ssrWrite1(value): for x in range(0,8): temp = value & 0x80 if temp == 0x80: GPIO.output(dataBit1, 1) # data bit HIGH else: GPIO.output(dataBit1, 0) # data bit LOW pulseCLK() value = value << 0x01 # shift left serLatch() # output byte return # convert an 8-bit number to a binary string def convBinary(value): binaryValue = '0b' for x in range(0,8): temp = value & 0x80 if temp == 0x80: binaryValue = binaryValue + '1' else: binaryValue = binaryValue + '0' value = value << 1 return binaryValue t=0.5 while True : #мигаем 1 ssrWrite(1) time.sleep(t) ssrWrite(0) time.sleep(t) ssrWrite(1) time.sleep(t) ssrWrite(0) time.sleep(t) #мигаем 2 ssrWrite1(1) time.sleep(t) ssrWrite1(0) time.sleep(t) ssrWrite1(1) time.sleep(t) ssrWrite1(0) time.sleep(t) #сдвиг по одному ssrWrite(1) time.sleep(t) ssrWrite(0) ssrWrite(2) time.sleep(t) ssrWrite(0) ssrWrite(4) time.sleep(t) ssrWrite(0) ssrWrite(8) time.sleep(t) ssrWrite(0) ssrWrite(16) time.sleep(t) ssrWrite(0) ssrWrite(32) time.sleep(t) ssrWrite(0) ssrWrite(64) time.sleep(t) ssrWrite(0) ssrWrite(128) time.sleep(t) ssrWrite(0) ssrWrite1(1) time.sleep(t) ssrWrite1(0) ssrWrite1(2) time.sleep(t) ssrWrite1(0) ssrWrite1(4) time.sleep(t) ssrWrite1(0) ssrWrite1(8) time.sleep(t) ssrWrite1(0) ssrWrite1(16) time.sleep(t) ssrWrite1(0) ssrWrite1(32) time.sleep(t) ssrWrite1(0) ssrWrite1(64) time.sleep(t) ssrWrite1(0) ssrWrite1(128) time.sleep(t) ssrWrite1(0) # Все одновременно ssrWrite(255) ssrWrite1(255) time.sleep(t) ssrWrite(0) ssrWrite1(0) time.sleep(t) ssrWrite(255) ssrWrite1(255) time.sleep(t) ssrWrite(0) ssrWrite1(0) Тестируем.
Подключение к Raspberry удаленных датчиков и средств автоматики Для подключения удаленных датчиков и средств автоматики лучше использовать оптронную развязку, поднять напряжение вторичной цепи и увеличить силу тока. Так мы получим устойчивую и надежную работу. Сохраним Raspberry, в случае замыканий на линии. Для 12 вольт подойдет следующая схема: Для выполнения лабораторных работ Управляем светодиодом Считываем кнопку Теперь можно разнести управление нагрузкой и считывание датчика на большое расстояние. Замените лампочку на нагрузку, а кнопку на удаленный датчик.
Wi-Fi - подключение к роутеру, точка доступа, сам роутер Настройка WiFi через командную строку Подключение к домашней сети Wi-Fi Сканируем на доступность сеть WI-Fi Код (Bash): pi@raspberrypi:~ $ iwlist wlan0 scan видим название знакомой нам сети в строчке ESSID:"myinet" а также другие доступные сети и много иной полезной информации. Открываем Код (Bash): root@raspberrypi:~# mcedit /etc/wpa_supplicant/wpa_supplicant.conf вставляем в конец файла Код (Bash): country=GB ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="myinet" psk="11111111" } через несколько секунд, Rasppberry попытается подключиться к сети. Если нет, то перезапустите интерфейс с помощью команды Код (Bash): root@raspberrypi:~# wpa_cli reconfigure вы можете узнать IP адрес Код (Bash): root@raspberrypi:~# ip a Если все нормально и вы видите что сетевой интерфейс wlan0 получил сетевой адрес, то можете выдергивать проводную витую пару и общаться со своим Raspberry через сеть Wi-Fi Если сеть, к которой вы подключаетесь, не использует пароль: Код (Bash): network={ ssid="myinet" key_mgmt=NONE } Мы можем сами раздавать интернет Точка доступа: Подключаемся сотовым телефоном, буком или гаджетом напрямую к Raspberry (удаляем предыдущее соединение домашней сети, освобождая интерфейс wlan0) Обновляем сведения о пакетах Код (Bash): root@raspberrypi:~# apt-get update устанавливаем Код (Bash): root@raspberrypi:~# apt-get install hostapd добавляем Код (Bash): root@raspberrypi:~# mcedit /etc/default/hostapd строчку Код (Bash): DAEMON_CONF="/etc/hostapd/hostapd.conf" в файле Код (Bash): root@raspberrypi:~# mcedit /etc/hostapd/hostapd.conf записываем Код (Bash): interface=wlan0 ssid=Raspberrypi hw_mode=g channel=6 auth_algs=1 wmm_enabled=0 перегружаемся Код (Bash): root@raspberrypi:~# reboot и видим нашу сеть Raspberrypi, но подключиться пока не можем Ставим Код (Bash): root@raspberrypi:~# apt-get install isc-dhcp-server Присваиваем адрес Код (Bash): root@raspberrypi:~# ip addr add 192.168.11.1/24 dev wlan0 Удаляем все содержимое и открываем пустой файл Код (Bash): root@raspberrypi:~# echo -n > /etc/dhcp/dhcpd.conf root@raspberrypi:~# mcedit /etc/dhcp/dhcpd.conf вставляем Код (Bash): subnet 192.168.11.0 netmask 255.255.255.0 { option routers 192.168.11.1; option domain-name-servers 8.8.8.8; option domain-name "localdomain"; default-lease-time 3600; max-lease-time 3600; range 192.168.11.100 192.168.11.150; } перегружаем сервисы Код (Bash): root@raspberrypi:~# service isc-dhcp-server restart service hostapd restart Подключаемся без пароля. Если мы выполнили до этого Веб сервер с поддержкой PHP то можем c любого переносного устройства открыть страничку http://192.168.11.1/index.php или выполнили ProFTPd (FTP - сервер) то можем установить приложение FTP-клиент и скачивать или закачивать файлы напрямую. Для того чтобы работало после перезагрузки Raspberry Открываем Код (Bash): root@raspberrypi:~# mcedit /etc/dhcpcd.conf в конец записываем Код (Bash): interface wlan0 static ip_address=192.168.11.1/24 также ставим в автозагрузку Код (Bash): root@raspberrypi:~# service isc-dhcp-server restart root@raspberrypi:~# systemctl enable isc-dhcp-server перегружаемся Код (Bash): root@raspberrypi:~# reboot Тестируем. Убеждаемся что wlan0 получил IP адрес Код (Bash): pi@raspberrypi:~ $ ip a и там есть строчка Код (Bash): inet 192.168.11.1/24 brd 192.168.11.255 scope global wlan0 Роутер Разрешаем трансляцию пакетов заходим Код (Bash): root@raspberrypi:~# mcedit /etc/sysctl.conf находим и снимаем знак # Код (Bash): net.ipv4.ip_forward=1 создаем файл Код (Bash): root@raspberrypi:~# mcedit /root/iptables записываем туда Код (Bash): #!/bin/bash /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE /sbin/iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT /sbin/iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT сохраняем и делаем исполняемым chmod g+rx Код (Bash): root@raspberrypi:~# chmod g+rx /root/iptables добавляем для исполнения сразу после загрузки Код (Bash): root@raspberrypi:~# crontab -e строку Код (Bash): @reboot /root/iptables & и в конце пустую строку сохраняем перегружаемся Тестируем.
Asterisk — свободное решение компьютерной телефонии Может многое. Звонить по событию, принимать звонки. Также как мигать светодиодом, для начала научимся самому простому - звонить на Raspberry и прослушивать звуковой файл. Обновляем сведения о пакетах Код (Bash): root@raspberrypi:~# apt-get update Подгружаем Код (Bash): root@raspberrypi:~# apt-get install asterisk Переименовываем Код (Bash): root@raspberrypi:~# mv /etc/asterisk/sip.conf /etc/asterisk/sip.conf.old;mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.old создаем Код (Bash): root@raspberrypi:~# mcedit /etc/asterisk/sip.conf вставляем следующий текст: Код (Bash): [general] language=ru callgroup=1 pickupgroup=1 qualify=yes canreinvite=no [LOCAL-USERS](!) type=friend host=dynamic insecure=invite context=mysip disallow=all allow=alaw,ulaw nat=force_report,comedia directmedia=nonat [3001](LOCAL-USERS) username = 3001 secret=333 [3002](LOCAL-USERS) username = 3002 secret=333 Перезапускаем сервер Код (Bash): root@raspberrypi:~# service asterisk restart заходим в консоль Asteriskа Код (Bash): root@raspberrypi:~# asterisk -r и уже там Код (Bash): raspberrypi*CLI> sip show peers видим, что Asterisk готов принимать клиентов Код (Bash): Name/username Host Dyn Forcerport Comedia ACL Port Status Description 3001/3001 (Unspecified) D No Yes 0 UNKNOWN 3002/3002 (Unspecified) D No Yes 0 UNKNOWN Для подключения клиента используем следующие данные: Хост: 172.16.5.46 (это у меня IP адрес Raspberry) логин: 3001 ( в примере еще 3002) пароль: 333 Далее типовая задача по подключению sip телефона. Берем клиента, IP телефон, которые имеют по нескольку линий, либо любой смартфон, компьютер, на который скачиваем приложение по поисковому слову SIP client. Заполняем три поля и добиваемся того, чтобы клиент вывел сообщение "Зарегистрирован" Заходим в консоль Asteriskа и проверяем Код (Bash): raspberrypi*CLI> sip show peers Name/username Host Dyn Forcerport Comedia ACL Port Status Description 3001/3001 172.16.5.34 D No Yes 46849 OK (4 ms) 3002/3002 (Unspecified) D No Yes 0 UNKNOWN На моем примере видим подключение сотового телефона, который получил IP по wi-fi 172.16.5.34 Диалплан В качестве первого Диаплана используем такую конструкцию: exten =>_XXXX,1,Answer() ; снять трубку exten =>_XXXX,n,MP3Player(/var/lib/asterisk/test.mp3) ; проиграть звуковой файл exten =>_XXXX,n,Hangup() ; отключиться Переходим к самому Диаплану Код (Bash): root@raspberrypi:~# mcedit /etc/asterisk/extensions.conf вставляем Код (Bash): [mysip] exten =>_XXXX,1,Answer() exten =>_XXXX,n,MP3Player(/var/lib/asterisk/test.mp3) exten =>_XXXX,n,Hangup() Загружаем плеер Код (Bash): root@raspberrypi:~# apt-get install mpg123 закачаем на Raspberry тестовый файл Код (Bash): scp test.mp3 pi@172.16.5.36:/home/pi копируем для доступа asterisk Код (Bash): root@raspberrypi:~# cp /home/pi/test.mp3 /var/lib/asterisk/test.mp3 разрешаем чтение Код (Bash): root@raspberrypi:~# chmod go+r /var/lib/asterisk/test.mp3 Перезапускаем сервер Код (Bash): root@raspberrypi:~# service asterisk restart Звоним по любому 4-х значному номеру и слышим воспроизведение нашего тестового файла. После окончания происходит отбой. Поэтому для теста не используйте длинный проигрыш. После [mysip] добавляем и получаем Код (Bash): [mysip] exten => _XXXX,1,Dial(SIP/${EXTEN},,m) exten =>_5555,1,Answer() exten =>_5555,n,MP3Player(/var/lib/asterisk/test.mp3) exten =>_5555,n,Hangup() exten =>_5556,1,Answer() exten =>_5556,n,MP3Player(/var/lib/asterisk/test1.mp3) exten =>_5556,n,Hangup() Перезапускаем сервер Код (Bash): root@raspberrypi:~# service asterisk restart Регистрируем второго абонента под номером 3002 Звоним друг другу, разговариваем как по обычному телефону. А если позвоним по номеру 5555, то получим воспроизведение звукового ролика. Звуковые файлы скриптом Rassberry может подменять. Таким образом вы можете узнать изменение состояние события. А если позвоним по номеру 5556, то получим воспроизведение другого звукового ролика, то есть другого события. Для связи по всему миру с вашим Raspberry лучше использовать IAX2 — Inter-Asterisk eXchange protocol — протокол обмена VoIP данными. Наиболее приспособлен к трансляции сетевых адресов NAT, в отличие от SIP и H.323 использует только один порт 4569 протокола UDP. Поэтому достаточно перебросить всего один порт и можете звонить из любой точки инета. Настройки там аналогичные sip. Таким образом никаких симок 3G/4G. Связь чисто по интернету или совместим с IP телефонией. Ваш Raspberry подключается как добавочный номер.
Здорово спасибо ! У меня робот катается с pi хочу звонить на динамики робота микрофон от webcam можно использовать. 1) авто-снятье трубки при звонке консольный sip клиент без интерфейса 2) звонок на указанный номер при нажатие на роботе можно дописать статью для SIP asterisk для моей задачи!