树莓派玩耍记

这篇文章是自己入手树莓派之后的一些使用记录 前些天看 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','WeatherController@getWeather');
  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添加定时任务130 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文件,并赋予执行权限 1 2touch ./frp_start.sh chmod +x ./frp_start.sh
  2. 写入命令 1 2 3 4 5 6 7 8 9 10 11 12#!/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/目录 1ln -s frp客户端所在目录/frp_start.sh /etc/init.d/frp_start
  4. 在/etc/init.d/使用update-rc.d命令进行配置 1sudo update-rc.d frp_start defaults 99
  5. 配置成功后可以在/etc/rc[对应的系统运行级别].d/目录中看到frp_start

未完待续…

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落影的专栏

iOS近距离实时通信解决方案

前言 最近研究iOS设备间的近距离实时通信,对其解决方案进行了解,整理如下: ? 其中AirDrop常用于iOS/OS X系统间分享图片、视频等,但实...

3784
来自专栏程序你好

微服务和传统中间件平台

微服务与部署在中间件平台(esb、应用服务器)上的传统服务有何不同?什么是微服务体系结构模式,它解决了什么问题?本文将讨论所有这些重要的主题,并描述如何管理、管...

1102
来自专栏技巅

linux内核崩溃问题排查过程总结

4044
来自专栏FreeBuf

如何利用Microsoft Edge漏洞获取本地文件?

在2015年,微软发布了Edge浏览器。当它最初被开发时,它被命名为Project Spartan。

1062
来自专栏编程一生

《两地书》--Kubernetes(K8s)基础知识(docker容器技术)

  大家都知道历史上有段佳话叫“司马相如和卓文君”。“皑如山上雪,皎若云间月”。卓文君这么美,却也抵不过多情女儿薄情郎。

2244
来自专栏编程一生

《两地书》--Kubernetes(K8s)基础知识(docker容器技术)

1624
来自专栏张善友的专栏

zookeeper 分布式锁服务

分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那一层来挡。当大量的行锁、表锁、事务充斥着数据库的时候。一般web应用很多的瓶颈都在数据库上,...

2148
来自专栏数据和云

DBA生存警示:误关闭生产库案例及防范建议

编辑手记:对于资深的老DBA们,他们在漫长的职业生涯中养成了很多稀奇古怪的守则,以在复杂多变的环境中“幸存”,这源于无数血泪的教训,我曾经在《数据安全警示录》...

3457
来自专栏FreeBuf

反入侵之发现后门利用mount-bind将进程和端口信息隐匿

0x00. 前言 作为一名安全工程师,日常工作中会经常遇到网站遭遇入侵,甚至被植入后门,如何去发现后门,进而对入侵进行调查取证都是一名优秀的安全工程师必备功课,...

3556
来自专栏美丽应用

树莓派折腾记:纯手机+数据线连接树莓派

2112

扫码关注云+社区

领取腾讯云代金券