极客 | 树莓派能做什么?

树莓派能做什么?关于此命题,最直观感受就是看看树莓派实验室整理的一些案例,相信你心目中会有答案的。例如,打造一个家庭媒体中心 ( KODI )、配置无线路由器、搭建 BT 下载服务器、搭建代码托管服务 ( SVN、GIt )、搭建网站服务器、搭建 Shadowsocks 服务器、用 HomeKit + Siri 声控家里电器等。

这一过程,就好比操作系统 ( Linux ) 赋予硬件生命,编程 ( Python、Java )、程序灌入灵魂,借助树莓派低能耗、移动便携性、GPIO 等特性,很多想法不是不可能,相信树莓派会带给你不一样的惊喜!

其中,需要说明的是本文将围绕两大方面去探索树莓派,即基础应用和解决方案两大部分,也可理解为基础到进阶的过程。

  • 基础应用:介绍使用树莓派必须的应用或组件,这些应用和组件主要作用是:一方面是增强系统功能,另一方面则是为解决方案建立软件基础。
  • 解决方案:诸如引言中谈及的,搭建服务器、智能家居控制中心等,即针对某部分需求集成为服务,学术说法称其为某某即服务 ( XaaS )。

更新进度

  • 2019.01.21:完成初稿,形成笔记的整体框架;

教学资源

基础应用

TeamViewer 远程控制

引言

访问树莓派有多种方式,如直连显示器交互使用、通过 SSH 远程登录访问、通过软件实现控制使用等。其中,TeamViewer 是通过软件方式实现对树莓派的远程控制,其拥有有以下几种特性:

  • 可穿透局域网,支持外网连接;
  • 实时 GUI 界面显示;
  • 支持文件双向传输。

配置

在本节,则单独介绍 TeamViewer 的配置与使用,当然教程是参考文章 [5][6] 整理而得。

删除 TeamViewer

删除 TeamViewer,用于安装出错时,清理残留软件包,方便从头再来。😂

此步骤是非必要执行的步骤。

1
2
3
4
5
sudo apt-get remove teamviewer-host
# 清除所有已删除包的残余配置文件
# 若报错误 dpkg: –purge needs at least one package name argument
# 证明你的系统中没有残留配置文件了
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
安装 TeamViewer

Step.01:进入 官方下载,在「TeamViewer Host for Raspberry Pi」模块,复制安装包地址,接着正式开始安装:

1
2
3
4
5
6
7
8
9
10
11
12
# 通过 wget 在线下载安装包
wget https://download.teamviewer.com/download/linux/teamviewer-host_armhf.deb
# 安装本地软件包,但不解决依赖关系
sudo dpkg -i teamviewer-host_armhf.deb
# 修复损坏的软件包,尝试卸载出错的包,重新安装正确版本的
sudo apt-get -f install

# 若提示未找到依赖包,可安装 Gdebi,通过 Gdebi 安装解决依赖问题
# 使用 Gdebi 可代替软件中心接管 deb 软件包的安装
# 它会根据软件仓库这一实用的特性来解算依赖关系
sudo apt-get install gdebi
sudo gdebi teamviewer-host_armhf.deb
配置 TeamViewer

Step.02:因为我们烧写的系统有图形界面,默认 TeamViewer 要在图形界面进行配置,如远程控制的账号、密码设置等。若有条件支持,可移步图形化界面操作,即可忽略此步骤。

  • 没有图形界面,则我们需要在命令行下配置。使用 raspi-config 配置 Raspbian 仅命令行模式运行。

    1
    2
    3
    4
    5
    6
    sudo raspi-config

    # 命令模式的操作界面
    # 依次选择操作 ( 同理,还原桌面模式也是类似操作 )
    # Boot Options -> Desktop / CLI -> Console AutoLogin ->
    # Finished
  • 配置保存后,树莓派会自动重启,那么重新远程登录继续操作。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sudo teamviewer setup
    # 1. Accept License Agreement? (y/n) y
    # 2. 输入用户名和密码的步骤无法跳过,没有账号请移步「官网完成注册」
    # 注册地址:https://login.teamviewer.com/LogOn
    # Please enter your e-mail / username: kofe
    # Please enter your password: ******
    # 3. 然后 TeamViewer 会发一份设备授权邮件,请移步「邮箱处理」
    # 4. 重新输入用户名和密码登录,提示分组信息,点击 y:
    # Adding this machine as 'raspberrypi' to ...
    # Do you want to continue? (y/n) [n] y
    # 5. 提示 "Successfully...." 即表示已经完成配置工作了
  • 完成初始化配置后,只需设置远程控制密码即可使用了。

    1
    2
    3
    4
    # 查看本机 ID
    teamviewer info
    # 设置本机密码
    sudo teamviewer passwd [你的密码]
  • 当然,我们还需要把 Raspbian 还原为图形化操作界面。

    1
    2
    3
    sudo raspi-config
    # Boot Options -> Desktop / CLI -> Desktop AutoLogin ->
    # Finished

使用

  • 一般情况下,我们主要是通过命令模式访问树莓派、配置 TeamViewer。当然也可以通过图形界面完成配置操作,按照文字提示操作即可,这里就不详细阐述了。附上 TeamViewer 常用的命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 查看帮助信息
    teamviewer help
    # 查看本机 ID
    teamviewer info
    # 设置本机密码
    sudo teamviewer passwd [你的密码]
    # 启动 TeamViewer 服务
    sudo teamviewer --daemon start
    # 开启 TeamViewer 服务随机启动
    sudo teamviewer --daemon enable
  • 最后,关于图形化界面显示方面,可能还有分辨率调整与存在黑边的问题,详细可参考以下文章解决问题:

MySQL 数据库

引言

数据库的用途毋庸置疑,若在树莓派上跑脚本、程序、网站系统等,少不了数据的交互,为此我们需要一款数据库作为数据储存的媒介。MySQL,是一款开源免费的数据库,也是关系型数据库管理系统,支持多种存储引擎 $^{[1, 2]}$,对于个人开发和日常使用足矣。

以下将介绍,在树莓派 Raspbian 上安装 Mysql 服务,并开启远程访问。

安装 MySQL

  • 删除 MySQL:安装前,确保系统没有旧版的 MySQL。

    1
    2
    3
    4
    5
    6
    7
    sudo apt-get autoremove --purge mysql-server
    sudo apt-get remove mysql-common

    # 清除所有已删除包的残馀配置文件
    # 若报错误 dpkg: –purge needs at least one package name argument
    # 证明你的系统中没有残留配置文件了
    dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
  • 安装 MySQL:

    1
    2
    3
    sudo apt-get install mysql-server
    sudo apt-get install mysql-client
    sudo apt-get install python-mysqldb # 安装 Python 接口的 MySQL

配置 MySQL

  • 命令行安装,默认是不用配置用户和密码信息,故我们首先配置登录信息 $^{[3]}$:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo mysql -u root # 无密码登录 MySQL
    use mysql;

    # 加密方式选择,系统默认是 'unix_socket',这里暂为空
    UPDATE user SET plugin='' WHERE user='root';

    UPDATE user SET password=PASSWORD('你自己的密码') WHERE user='root';

    flush privileges; # 清空缓存
    exit;
  • 操作数据库 ( 配置完信息,重启 MySQL 以让设置生效 )

    1
    2
    3
    4
    5
    6
    # sudo /etc/init.d/mysql status/start/stop/restart
    sudo /etc/init.d/mysql restart

    # 当然可通过 systemctl 命令管理系统服务
    # sudo systemctl restart mysql # 重启系统服务
    # sudo systemctl status mysql # 查看系统状态

开启远程访问

以上配置工作完成后,即可本地使用 MySQL 数据库了。若需要开启远程访问服务,我们还需要实现以下工作:防火墙与访问规则配置和远程登录的账号配置。

外网访问

若在树莓派下测试,让数据库允许外网访问,注意得关闭防火墙或添加规则允许某端口的访问权限 $^{[4]}$。

  • Case.01:本机和服务器端 ( 树莓派 ) 互相 Ping 对方 IP,以检验网络是否畅通、是否拒绝访问。
  • Case.02:若网络畅通、没有拒绝访问,还要留意对应端口是否有权限访问,通过 nc -vz IP 端口检验,返回 Succeeded 即成功。

    1
    2
    3
    4
    5
    # MacOS:nc -vz IP地址 端口号
    nc -vz 192.168.x.x 3306
    # Windows:telnet IP地址 端口号
    telnet 192.168.x.x 22 # SSH 远程访问
    telnet 192.168.x.x 3306 # MySQL 数据库
防火墙与访问规则

针对上述两种情况,则可通过关闭防火墙或者添加端口的访问规则,以授权 IP 和相关端口接受访问。

  • 配置防火墙:

    1
    2
    3
    4
    5
    6
    7
    8
    # 安装 ufw ( 已安装忽略 )
    sudo apt-get install ufw
    # 设置默认规则为 allow,除指明打开的端口,所有端口默认关闭
    ufw default deny
    # 启用 /关闭 ufw
    ufw enable/disable
    # 查看防火墙状态
    ufw status
  • 配置访问规则:

    1
    2
    3
    4
    # 例如:打开 SSH 远程登录
    sudo ufw allow 22
    # 删除添加过的规则
    sudo ufw delete allow 22
远程登录的账号

最后,我们还需要设置可远程登录的账号。

  • 修改 MySQL 配置:

    1
    2
    3
    sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
    # 找到 bind-address 这行注释掉,然后重启
    sudo systemctl restart mysql
  • 修改 MySQL 账号信息:在配置 登录信息 时已授权,此项可日后用作远程登录账号的配置。

    1
    2
    3
    4
    mysql -u root -p
    use mysql;
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root账号密码' WITH GRANT OPTION;
    flush privileges;

解决方案

参考资料