这篇文章是自己入手树莓派之后的一些使用记录
前些天看 v2ex 上有人讨论树莓派,于是出于好奇在淘宝上淘了一只树莓派来玩玩

体积超级小…

一个板子,一个塑料盒子装上完工

刚开始的时候尝试了一下官方的NOOBS工具安装raspbian系统,这个系统是为树莓派定制的基于Debian的 linux 系统,但不知什么原因总是间歇性卡死,加之个人偏好 ubuntu 一点,于是安装了Ubuntu_MATE

系统安装基本步骤:

  1. 下载系统镜像
  2. 将下载的ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img镜像解压后使用dd命令将镜像写入到 sd 卡中(我的环境为 macOS),注意写入完成后一定要使用unmount将 sd 卡推出,然后拔出 sd 卡
  3. 将 sd 卡插入树莓派,并连接好所有外设后开机,然后像安装 QQ 一样完成了Ubuntu_MATE的安装过程

简易播报系统:

当时冒出一个想法:写一个每天定时播放未来两天天气预报的小程序(非彼小程序),涉及的功能点:天气预报接口;一个基于轻量级的 api 框架实现的 api;一个定时任务;一个文字转语音脚本;一个音频文件播放器;当然还需要一个外接小音箱…

于是安装了 lnmp 环境(当下没有用到 mysql),mplayer,git,文字转音频使用的百度sdk(php),通过 git 安装了lumen

接口开发

  1. 路由
$router->get('/get_weather','[email protected]');
  1. 控制器WeatherController.php
<?php

namespace App\Http\Controllers;

use GuzzleHttp\Client;
use Illuminate\Support\Facades\Cache;

class WeatherController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    //基于树莓派的简易天气预报系统
    public function getWeather()
    {
        //获取天气信息
        $client = new Client();  // 实例化
        $city = '成都';
        $city_code = urlencode($city);
        $aqi = [
            '好',
            '中等',
            '不适于敏感人群',
            '不健康',
            '非常不健康',
            '危险',
        ];

        if (Cache::has('report') === false) {
            $url = 'https://www.sojson.com/open/api/weather/json.shtml?city=' . $city_code;    // 设置一个可访问的 url
            $http = $client->request('GET', $url);  // 执行

            // 判断 http 状态码为 200 的时候,执行成功
            $aqi_content = '未知';
            if ($http->getStatusCode() == 200) {
                $weather = json_decode($http->getBody()->getContents(), true);
                if ($weather['data']['forecast'][0]['aqi'] <= 50) {
                    $aqi_content = $aqi[0];
                } else if ($weather['data']['forecast'][0]['aqi'] <= 100) {
                    $aqi_content = $aqi[1];
                } else if ($weather['data']['forecast'][0]['aqi'] <= 150) {
                    $aqi_content = $aqi[2];
                } else if ($weather['data']['forecast'][0]['aqi'] <= 200) {
                    $aqi_content = $aqi[3];
                } else if ($weather['data']['forecast'][0]['aqi'] <= 300) {
                    $aqi_content = $aqi[4];
                } else if ($weather['data']['forecast'][0]['aqi'] <= 500) {
                    $aqi_content = $aqi[5];
                } else {

                }
                //拼装字符串
                $report = '现在预报,' . $city . '未来两天天气情况,' . $city . ',' . date('Y年m月', time()) . $weather['data']['forecast'][1]['date'] . ',天气情况,' . $weather['data']['forecast'][1]['high'] . ',' . $weather['data']['forecast'][1]['low'] . ',' . $weather['data']['forecast'][1]['type'] . ',' . $weather['data']['forecast'][1]['fx'] . ',风力,' . $weather['data']['forecast'][1]['fl'] . ',日出时间,' . $weather['data']['forecast'][1]['sunrise'] . ',日落时间,' . $weather['data']['forecast'][1]['sunset'] . ',空气污染指数,' . $aqi_content;
                $report .= ',' . $city . ',' . date('Y年m月', time()) . $weather['data']['forecast'][2]['date'] . ',天气情况,' . $weather['data']['forecast'][2]['high'] . ',' . $weather['data']['forecast'][2]['low'] . ',' . $weather['data']['forecast'][2]['type'] . ',' . $weather['data']['forecast'][2]['fx'] . ',风力,' . $weather['data']['forecast'][2]['fl'] . ',日出时间,' . $weather['data']['forecast'][2]['sunrise'] . ',日落时间,' . $weather['data']['forecast'][2]['sunset'] . ',空气污染指数,' . $aqi_content;
                Cache::add('report', $report, 60);
            }
        }
        $report = Cache::get('report');
        generate_audio($report);
    }
}

以上的generate_audio()即是自行封装后的百度的文字转语音sdk

定时任务

  1. 创建一个目录/data/weather_reports/用于保存mp3临时文件
  2. crontab -e添加定时任务
    30 19 * * * curl http://localhost/get_weather && /usr/bin/mplayer /data/weather_reports/weather_forecast.mp3 > /dev/null 2>&1
    

    以上是每天19点30分使用curl命令请求本地的api并使用mplayer打开位于/data/weather_reports/目录的weather_forecast.mp3文件,并将标准输出&错误输出重定向到空文件中

简易播报系统完成

至此,一个定时播报小程序已完成,同时还可以利用内网穿透开放公网对该树莓派的ssh访问,实现远程遥控播放😋
为了进一步方便操作(因为除了第一次安装系统,其他时候都希望直接通过命令行操作树莓派而不是外接一个显示器,资源有限…),将frp客户端的连接命令加入了开机启动

开机启动步骤

  1. frp客户端所在目录新建sh文件frp_start.sh文件,并赋予执行权限
    touch ./frp_start.sh
    chmod +x ./frp_start.sh
    
  2. 写入命令
    #!/bin/bash
    ### BEGIN INIT INFO
    # Provides:          lestat
    # Required-Start:    $local_fs $network
    # Required-Stop:     $local_fs
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: start frp service
    # Description:       start frp service
    ### END INIT INFO
    cd frp客户端所在目录
    nohup ./frpc -c ./frpc.ini &
    
  3. 将文件连接到/etc/init.d/目录
    ln -s frp客户端所在目录/frp_start.sh /etc/init.d/frp_start
    
  4. /etc/init.d/使用update-rc.d命令进行配置
    sudo update-rc.d frp_start defaults 99
    
  5. 配置成功后可以在/etc/rc[对应的系统运行级别].d/目录中看到frp_start

未完待续…