用树莓派做 RTMP 流直播服务器,可推送至斗鱼直播

在《用树莓派DIY共享鱼缸,支持微信远程喂鱼》一文中,使用了树莓派来做直播服务器。通过安装在树莓派上的摄像头采集实时视频数据流,推送至 RTMP 监听服务器。同时,其他的客户端访问这个 RTMP 服务器就可以观看视频了。下面我们来详细介绍这个模块如何搭建,文末还将给出将直播视频推送至斗鱼直播平台的方法。

需要用的东西和软件说明:

树莓派主板(本文使用树莓派 Zero W 套件,该套件附带一款完美安装摄像头的外壳)
兼容摄像头(本文使用官方摄像头模块,其他 USB 兼容摄像头亦可)
软件方面:
avconv 和 GStreamer 用于采集摄像头捕获的视频流并推送到 RTMP 服务
NGINX 和 RTMP 模块,用于接收视频流,同时提供视频发布功能
Strobe Media Playback,一款基于 Flash 的网页视频播放器

一、配置摄像头

无论是树莓派官方摄像头模块还是其他兼容的USB摄像头,连接好摄像头之后,运行命令去启用摄像头:

sudo raspi-config

编辑系统模块文件。

sudo nano/etc/modules

在这个文件的最后添加一行

bcm2835-v4l2

保存。建议配置好之后重启一下树莓派。然后测试摄像头是否正常工作。

vcgencmd get_camera

输出如图所示表示被识别到。进一步测试拍照。

raspistill -t 2000 -o 1.jpg

执行上面的指令之后,会你用摄像头拍照,并将照片保存在当前目录下,名为 1.jpg。

如果一切正常,恭喜!可以开始下面的步骤了!

二、网络配置

如果你的树莓派使用有线网络的话可以忽略这一步。笔者用的树莓派是 Zero W 版本,没有有线网口,所以必须手动配置无线网络。

sudo nano/etc/network/interfaces

将配置修改为:

auto lo

iface lo inet loopback

allow-hotplug wlan0

auto wlan0

iface wlan0 inet dhcp

        wpa-ssid "WIFISSID"

        wpa-psk "WIFIPASSWORD"

WIFISSID 和 WIFIPASSWORD 分别替换为你的 WIFI 的 SSID 和密码。

网络配置方法可以参考树莓派实验室的其他文章,例如这篇《树莓派 Raspberry Pi 设置无线上网》。

三、安装 NGINX 和 RTMP

我们用 nginx 加上 nginx-rtmp-module 模块作为 RTMP 服务端。这里先安装 nginx 然后再移除它,目的是利用这个过程吧 nginx 相关的依赖安装好并设定好系统环境。这个通过 apt 安装的 nginx 并不能直接使用,因为他并不包含我们需要的 RTMP 模块,所以将它移除。而后我们手工下载 nginx 和 nginx-rtmp-module 模块源码来手工编译安装,以获得我们最终需要的服务端。

sudo apt-get update

#安装 nginx

sudo apt-get -y<span> </span>install nginx

#移除 nginx

sudo apt-get -y remove nginx

sudo apt-get clean

#清空 nginx 的配置文件

sudo rm -rf<span> </span>/etc/nginx/*

#安装编译用的模块

sudo apt-get<span> </span>install -y curl build-essential libpcre3 libpcre3-dev libpcre++-dev zlib1g-dev libcurl4-openssl-dev libssl-dev

#创建存放网页的目录给 nginx 使用

sudo mkdir -p<span> </span>/var/www

#创建编译用的目录

mkdir -p ~/nginx_src

cd ~/nginx_src

#下载 nginx 源码包

wget http://nginx.org/download/nginx-1.11.8.tar.gz

#下载 nginx-rtmp-module 源码包

wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

tar -zxvf nginx-1.11.8.tar.gz

unzip master.zip

cd nginx-1.11.8

#设定编译参数

./configure --prefix=/var/www --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module --without-http_proxy_module --add-module=/home/pi/nginx_src/nginx-rtmp-module-master

#开始编译安装

make

sudo make install

比较漫长的等待之后,编译安装结束。这时可以测试 nginx 是否安装好。

nginx -v

正常的話,會顯示 nginx 的版本。

配置 nginx。

/etc/nginx/nginx.conf

在末尾添加如下配置:

rtmp {

    server {
        listen 1935;
        chunk_size 4096;
        application live {
            live on;
            record off;
        }<br>}

重启 nginx 服务。

sudo service nginx start

没有错误提示就表示成功了。
到这里 nginx 和 RTMP 模块都准备好了。

四、安装 avconv 和 GStreamer

安装的组件比较多,如果操作的时候因为软件源的问题总是出现错误难以完成,建议更换软件源试试。笔者用的是清华大学软件源安装的。

sudo nano/etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

deb-src https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

开始安装

sudo apt-get update

sudo apt-get<span> </span>install libav-tools

#安装 GStreamer

sudo apt-get<span> </span>install gstreamer1.0-tools

#安装 GStreamer 扩展组件

sudo apt-get <span> </span>install libgstreamer1.0-0 libgstreamer1.0-0-dbg libgstreamer1.0-dev liborc-0.4-0 liborc-0.4-0-dbg liborc-0.4-dev liborc-0.4-doc gir1.2-gst-plugins-base-1.0 gir1.2-gstreamer-1.0 gstreamer1.0-alsa gstreamer1.0-doc gstreamer1.0-omx gstreamer1.0-plugins-bad gstreamer1.0-plugins-bad-dbg gstreamer1.0-plugins-bad-doc gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-base-dbg gstreamer1.0-plugins-base-doc gstreamer1.0-plugins-good gstreamer1.0-plugins-good-dbg gstreamer1.0-plugins-good-doc gstreamer1.0-plugins-ugly gstreamer1.0-plugins-ugly-dbg gstreamer1.0-plugins-ugly-doc gstreamer1.0-pulseaudio gstreamer1.0-tools gstreamer1.0-x libgstreamer-plugins-bad1.0-0 libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-base1.0-0 libgstreamer-plugins-base1.0-dev

这里安装了 avconv 和 GStreamer 两套视频采集组件。 avconv 的使用方式是:

avconv -f video4linux2 -r 24 -i<span> </span>/dev/video0 -f flv rtmp://localhost:1935/live

avconv 采用软编码实现,因此 CPU 消耗比较高,推荐用 GStreamer,GStreamer 的采集使用如下命令:

gst-launch-1.0 -v v4l2src device=/dev/video0 !<span> </span>'video/x-raw, width=1024, height=768, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://树莓派的IP地址/live live=1'

如果希望在后台运行这两个命令可以在命令后面添加&,例如:

gst-launch-1.0 -v v4l2src device=/dev/video0 !<span> </span>'video/x-raw, width=1024, height=768, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://树莓派的IP地址/live live=1' &

device=/dev/video0 这个参数可以省去,除非在有多个摄像头的时候,希望指定视频采集自某个指定的摄像头才需要这个参数。
采集的视频怎么播放呢?请看下面介绍。

五、实时视频的呈现

有多种方式呈现直播视频画面:
1、使用 RTMP 播放器播放视频流
例如 VLC 等播放器(桌面版和手机版均有)支持 RTMP 视频流播放,填入 rtmp://树莓派的IP地址/live即可播放。不过这个软件有数十秒的缓冲延迟,需要设定缓冲时间来缩短延迟。

2、使用 Strobe Media Playback 创建播放页面,通过网页播放视频流
这个是在树莓派上创建一个带有播放功能的网页,播放器选用 Strobe Media Playback,当然你也可以选择其他支持 RTMP 的播放器控件。播放的时候用浏览器打开 http://树莓派的IP地址/index.html 进入播放界面。下面介绍这个播放页面的创建方法。

mkdir -p ~/strobe_src
cd ~/strobe_src
wget http://downloads.sourceforge.net/project/smp.adobe/Strobe%20Media%20Playback%201.6%20Release%20%28source%20and%20binaries%29/StrobeMediaPlayback_1.6.328-full.zip
unzip StrobeMediaPlayback_1.6.328-full.zip
sudo cp -rfor\ Flash\ Player\ 10.1/var/www/html/strobe
sudo nano/var/www/html/index.html

填入如下内容,记得把下面的“树莓派的IP地址”替换成你的树莓派实际的IP地址。IP地址可以通过 ifconfig 命令查看。

<!DOCTYPE html><br><br><html><br><br><head><br><br><title>Live Streaming</title><br><br><!-- strobe --><br><br><script type="text/javascript" src="strobe/lib/swfobject.js"></script><br><br><script type="text/javascript"><br><br>  var parameters = { <br><br>     src: "rtmp://{pi_address}/rtmp/live"<span class="s1">,</span> <br><br>     autoPlay: false<span class="s1">,</span> <br><br>     controlBarAutoHide: false<span class="s1">,</span> <br><br>     playButtonOverlay: true<span class="s1">,</span> <br><br>     showVideoInfoOverlayOnStartUp: true<span class="s1">,</span> <br><br>     optimizeBuffering : false<span class="s1">,</span> <br><br>     initialBufferTime : 0.1<span class="s1">,</span> <br><br>     expandedBufferTime : 0.1<span class="s1">,</span> <br><br>     minContinuousPlayback : 0.1<span class="s1">,</span> <br><br>     poster: "images/poster.png" <br><br>  }<span class="s1">;</span> <br><br>  swfobject.embedSWF<span class="s1">(</span><br><br>    "strobe/StrobeMediaPlayback.swf"<br><br>    <span class="s1">,</span> "StrobeMediaPlayback"<br><br>    <span class="s1">,</span> 1024<br><br>    <span class="s1">,</span> 768<br><br>    <span class="s1">,</span> "10.1.0"<br><br>    <span class="s1">,</span> "strobe/expressInstall.swf"<br><br>    <span class="s1">,</span> parameters<br><br>    <span class="s1">,</span> {<br><br>      allowFullScreen: "true"<br><br>    }<br><br>    <span class="s1">,</span> {<br><br>      name: "StrobeMediaPlayback"<br><br>    }<br><br>  <span class="s1">);</span><br><br></script><br><br></head><br><br><body><br><br><div id="StrobeMediaPlayback"></div><br><br></body><br><br></html>

播放的时候用浏览器打开 http://树莓派的IP地址/index.html 进入播放界面。

3、推送至斗鱼直播平台观看
你可能注意到了 GStreamer 这个命令中有 location 这个参数。这个参数是设定采集到的视频流推向哪里,通过设定这个参数可以将视频流推向任何支持 RTMP 协议的服务器。

gst-launch-1.0 -v v4l2src device=/dev/video0 !'video/x-raw, width=1024, height=768, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://树莓派的IP地址/live live=1'

斗鱼平台同样采用了 RTMP 协议传输直播视频,以斗鱼平台为例来说明一下推流到斗鱼的方法。

首先获取斗鱼的 RTMP 推流地址。开启了直播室之后可以获得推流码。注意,斗鱼的推流码是有时限的,取到推流码需要尽快使用以免过期。

把这两个参数组合起来(中间加上/)。修改之后的命令例如:

gst-launch-1.0 -v v4l2src device=/dev/video0 !'video/x-raw, width=1024, height=768, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://send1.douyu.com/live/1372rSOMdcBJ8UHD?wsSecret=96d2k4ecdf267d17b8e8c38b6a4a6efd&wsTime=59f92e2e&wsSeek=off live=1'

然后就可以开播了。

打个小广告,欢迎大家关注我的斗鱼直播间~
https://www.douyu.com/1372
这里不定期直播宠物鱼。
应用以上技术实现的远程喂鱼项目:
http://maker.quwj.com/program/nature-aquarium

总体上三种播放方式都有一定延迟,其中网页 Strobe Media Playback 播放延迟最小,大概在1秒左右。VLC 延迟比较固定默认约20秒,个别平台的版本是可以设置延迟数值的笔者没有亲力尝试。然后是斗鱼平台,斗鱼随着播放时间变长延迟也越来越长,需要刷新直播间页面才会同步。

搭建过程有问题请在树莓派实验室原文下面留言,转载请保证文章内容完整、注明出处并附带原文链接~

本文来自:http://shumeipai.nxez.com/2017/11/01/build-rtmp-stream-live-server-with-raspberry-pi.html

树莓派3B 爬虫蓝牙播放器

  

一直没有尝试使用一下树莓派3B 的蓝牙功能,今天特别想试试,于是就烧录了最新的raspbian镜像,然后接上5寸GPIO触摸屏和键盘鼠标,开始了调试,网上看了看其他人的教程,发现都很老了,有的还不能用。所以就诞生了这篇我自己能用的文章,算是做个记录吧。

首先你需要做的准备工作:

  1. 树莓派3B  如果你是2B ,那么你还需要一个USB 的蓝牙接收器(马云家可买)
  2. 树莓派电源5v/2A
  3. 8GB TF 卡一张,读卡器1个
  4. 树莓派外壳(可选) 为了好看和防尘, 还可以选择散热片和风扇,更加专业.
  5. 小米蓝牙小音箱.
  6. 无线网络环境.
  7. 去官方网站下载最新的 Raspbian 系统并且通过 win32_diskimager 烧录到你的 TF卡

好了,万事俱备, 只欠500万,接下来直接进入主题,插上电源,等待RPI开机后,系统中通过点选 wifi 图标先连入网络,然后打开一个终端,执行下面的命令进行更新和安装蓝牙软件:

sudo apt-get  update

sudo apt-get  -y  install  –no-install-recommends bluetooth

sudo service bluetooth status

检查是否有蓝牙服务,如果没有就再重启一下设备。或者用下面的命令尝试扫描一下:

hcitool scan

我之前还尝试了使用blueman,那个在图形上设置更加方便。

sudo apt-get  -y  install  bluetooth  bluez  blueman

但是我更倾向于这样设置:

蓝牙配对

如果看不清楚就看这里:

sudo  bluetoothctl

然后进入bluetooth的交互界面输入

agent  on

default-agent

然后开始扫描

scan on

当找到你的蓝牙设备后,执行配对就好了。

pair  B8:78:2E:12:0F:29   #这里要根据你实际情况选择.

这里输入你的蓝牙的MAC地址,就是类似B8:78:2E:12:0F:29这种

如果要用蓝牙音箱,记得使用blueman,那个有图形界面可以在图形上选择audio的输出方式,可以找到你的蓝牙设备,然后选择成为输出设备,然后就可以用我写好的python爬虫来进行音乐的搜索和播放了。

git  clone   https://github.com/yoyojacy/52Pi.git

cd  52Pi/

python   music.py

第一次执行的时候可能时间比较长,因为在更新系统和安装mplayer,不用担心,通过后就可以看到提示了,输入歌名或者歌手的名字就可以听到歌曲了。如果还想调整一下音量大小可以用:

alsamixer

然后按上下键调整就好了,最后记得ESC退出。

最后,转发的童鞋请注明出处! 谢谢~

树莓派开箱配置之更改键盘布局

树莓派用了几次后,发现键盘老是按错,一些字符打不出来或打错。这个问题,折腾我半天。还是把心得分享一下吧~

上网查,发现是键盘布局不对,树莓派(raspberry pi)是英国产品,默认键盘布局是英国(GB),我们用的键盘布局一般是美国(US)的。

更改键盘布局,命令如下:

sudo dpkg-reconfigure keyboard-configuration

进入后,选通用的101键PC键盘。

按tab键,到OK,按Enter确定。

在键盘layout选择中,选Other。

按tab键,到OK,按Enter确定。

然后在选项中,选English(US)。

按tab键,到OK,按Enter确定。

再选English(US, alternative international)。

按tab键,到OK,按Enter确定。

然后一路按OK。

退出后,重启系统。

sudo reboot

重新启动时,由于修改了键盘布局,在读取键盘布局的阶段会比平常慢一些。

OK了, 终于可以打出所有字符了。

本文来自:http://shumeipai.nxez.com/2017/11/13/raspberry-pi-change-the-keyboard-layout.html

自行移植树莓派64位内核系统的方法介绍

不久前我们推荐了 chainsx 的《树莓派 Ubuntu 64位系统玩家体验版》。作者进一步提供了自行编译上述系统并制作镜像文件的方法,分别介绍了如何通过交叉编译和在树莓派上直接编译,授人以渔啦~

你可以通过ubuntu16.04交叉编译,也可以直接在树莓派上编译。
我们遵循树莓派官方的内核编译引导
这里,感谢bamarni的思路提供。

在电脑上交叉编译

构建内核
你需要一个Ubuntu16.04的64位版本。
安装交叉编译环境

apt-get update
apt-get install -y bc build-essential gcc-aarch64-linux-gnu git unzip

获取源码

gitclone–depth=1-b rpi-4.8.y https://github.com/raspberrypi/linux.git

接下来,开始你的构建,分别运行以下命令:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

这时,你可以去泡杯茶,看看电视,或者吃鸡。。。。
因为这要一点时间。
准备一个系统
这里,我拿raspbian做例子(有些数字你要自己改,不要太死板)。
先从官网下载raspbian(建议下载lite)。
解压后得到img文件。
然后,我们用下面的命令审查:

fdisk- l raspbian-jessie-lite.img
Diskraspbian-jessie-lite.img:1.3GiB,1390411776 bytes,2715648 sectors
Units: sectors of 1*512=512 bytes
Sectorsize(logical/physical):512 bytes /512 bytes
I/O size(minimum/optimal):512 bytes /512 bytes
Disklabel type: dos
Disk identifier:0x244b8248
DeviceBootStartEndSectorsSizeIdType
raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
raspbian-jessie-lite.img2 137216 2715647 2578432 1.2G83Linux

注意,上面两条很关键!

我们可以在我们的文件系统上挂载这些分区(当然,你也可以直接写入sd卡),从根分区开始:

mount-o loop,offset=70254592 raspbian-jessie-lite.img /mnt

offset 取决于扇区大小(512):70254592 = 512 * 137216
接着是启动分区:

mount-o loop,offset=4194304,sizelimit=66060288 raspbian-jessie-lite.img /mnt/boot

offset :4194304 = 512 8192,sizelimit:66060288 = 512 129024
安装内核
执行以下命令,将编译好的内核以及设备树复制到系统中(前提是你编译完了):

cp arch/arm64/boot/Image/mnt/boot/ kernel8.img
cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot/

执行以下命令,安装内核模块。

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu INSTALL_MOD_PATH=/mnt modules_install

执行以下命令,调整config.txt。

echo kernel=kernel8.img >> /mnt/boot/config.txt

不过,保险起见,你还是手动修改,如果没有的话,加上kernel=kernel8.img,有的话,修改为kernel=kernel8.img
卸载分区

umount /mnt/boot && umount /boot

大功告成!

在树莓派上编译

其实差不多。就是不用交叉编译工具罢了,不过,时间有点久。
注意,要使用aarch64(arm64)的系统进行编译!
不过,这里有现成的Debian | Ubuntu(如果你用Ubuntu的话,请将源换成中科院的mirrors.opencas.org)。
安装依赖

apt-get update
apt-get install -y bc build-essential

获取源码包

git clone https://github.com/raspberrypi/linux.git

开始编译

make ARCH=arm64 bcmrpi3_defconfig
make ARCH=arm64

这时,考验你心态的时候到了,可能要一个多小时吧!
如果你想多核编译,使用-j4参数。
准备一个要移植的系统。
这里,给几个推荐。
ubuntu 15.10   |   CentOS
下载下来后,按照上面方法挂载,或直接写入sd卡。
安装内核
执行以下命令,将编译好的内核以及设备树复制到系统中(前提是你编译完了)

cp arch/arm64/boot/Image/mnt/boot/ kernel8.img
cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot/

执行以下命令,安装内核模块:

make ARCH=arm64 INSTALL_MOD_PATH=/mnt modules_install

执行以下命令,调整config.txt。

echo kernel=kernel8.img >> /mnt/boot/config.txt

不过,保险起见,你还是手动修改,如果没有的话,加上kernel=kernel8.img,有的话,修改为kernel=kernel8.img

卸载分区

umount /mnt/boot && umount /mnt

至此,大功告成

制作一个自己的系统

这里,简要说一下制作根分区(rootfs)的思路。
如果你熟悉 debootstrap,用它构建你自己的(这回比较棘手,因为它需要一些手工调整,它最初的目的是在已经运行的主机上进行 chroot,而不是为其他机器构建根文件系统)。
我建议使用 multistrap,这里有一个很好的教程:http://free-electrons.com/blog/embdebian-with-multistrap/

同样,提供几个根分区的压缩文件。
Ubuntu 17.04   |   CentOS

小贴士:对于第一次使用树莓派 64位 Ubuntu 的用户,建议将 Ubuntu15.10 的源换成中科院的源 mirrors.opencas.org 不然的话将无法使用哦。
项目 GitHub:https://github.com/chainsx/ubuntu64-rpi
Maker 趣无尽项目主页:http://maker.quwj.com/project/28

本文来自:树莓派实验室

Crontab 简单实现树莓派语音闹钟

是时候关掉你的手机闹铃了,用树莓派外接一个音箱就可以 Make 一款科技感和实用性兼备的“AI 闹钟”。这里用到了 Linux 的计划任务、百度语音 API、天气 API。

不看天气的死宅(不爱带包),出门遇到下雨天就尴尬了,在学校还好可以蹭伞,到外面就不行了。
一开始的解决办法就是将爬到的天气信息发到微信上GETWeaInfo
结果有个很大的问题就是,网络要是断了,或者程序不运行了,就要重新载终端上扫二维码登录(太麻烦了)。
于是乎~就有了下面的想法——用树莓派做个天气闹钟。下面开始了!

播放mp3

前提:树莓派安装系统(我装的是最小化的Raspbian jessie)),ssh连接,wifi连接How to set up WiFi..网上都有…音响(基本都可以,没有就用耳机先代替),LED。

sudo apt-get update
sudo apt-get install mplayer
#更新源
#安装mplayer(用他来播放MP3)
mplayer xxx.mp3
#测试一下

如果有声ok,没有参考林佳楠的博客

配置运行环境

前提:用的python3
安装python3

sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev libssl-dev openssl libgdbm-dev liblzma-dev libreadline-dev libncursesw5-dev
#安装依赖包
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
#下载源码包,你也可以换其他的
tar zxf Python-3.6.1.tgz
#解压
cd Python-3.6.1/
./configure --prefix=/usr/loacl/python3
make
sudo make install
echo $?
#如果是0就是正确的,非零仔细看报错信息去百度google(我没有遇到,不好解答)
sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3

安装virtualenv

sudo pip install virtualenv
mkdir naozhong
cd naozhong
virtualenv - p /usr/bin/python3 naoz
#/usr/bin/python3 是你安装python3可执行路径(不知道就运行$ which pytho3),
source naoz/bin/activate
#前面会出现(dirname)
#deactivate (退出)

virtulaenv的作用&&详细使用
安装需要用到的库

pip install requests
pip install beautifulsoup4
pip install baidu-aip
#安装失败,因为依赖的库pillow安装失败
#那就装一些pillow的依赖包
sudo apt-get install libtiff5-dev
    libjpeg8-dev
    zlib1g-dev
    libfreetype6-dev
    liblcms2-dev
    libwebp-dev
    tcl8.6-dev
    tk8.6-dev
    python-tk
 
#我试下来需要一个一个安装,
#能安装就安装,不能的就跳过。
#再次 pip install pillow&&pip install baidu-aip
 
pip install rpi.gpio
#遇到问题error:command 'arm-linux-gnueabihf-gcc' failed with exit status 1
sudo apt-get install python3-dev
sudo apt-get install libevent-dev
#再次pip install rpi.gpio

代码

灯闪亮

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
 
#init GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
def LED_shining():
    try:
        GPIO.output(11, 1)
        time.sleep(0.5)
        GPIO.output(11, 0)
        time.sleep(0.5)
    except:
        print('')
def main():
    for tmp_a in range(60):
        LED_shining()
    GPIO.cleanup()
if __name__ == '__main__':
    main()

led正极接在11引脚上,负极我放在GND

获取天气并用百度语音转mp3文件

# -*- coding: utf-8 -*-
from aip import AipSpeech
import requests
import re
from bs4 import BeautifulSoup
import time
'''
爬取天气网-无锡
http://www.weather.com.cn/weather/101190201.shtml
'''
def getHtmlText(url,code='utf-8'):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = code
        return r.text
    except:
        return ''
def makeSoup(html):
    wstr = ''
    if html == '':
        return '哎呀~今天我也不知道无锡天气了'
    else:
        soup = BeautifulSoup(html,'html.parser')
        soup1 = soup.find_all('li',attrs = {'class':'on'})[1]
        str1 = re.findall(r'>(.*)</',str(soup1))
        b = ''
        try:
            slist = re.findall(r'^(.*)</span>(.*)<i>(.*)$',str1[4])
            for x in range(len(slist[0])):
                b += slist[0][x]
        except:
            b = str1[4]
        if '/' in b:
            b = b.replace('/','-')
        str1[4] = '无锡的温度是'+b
        #print(str1[4])
        str1[6] = '小风风是'+str1[6]
        for i in str1:
            if i != '':
                wstr = wstr +i
        if '雨' in wstr:
            wstr += '今天别忘记带雨伞哦!'
        #print(wstr)
        return wstr
'''
用百度的AIP
把文字变成mp3文件
'''
def stringToMp3(strings_txt):
    strings_txt = '起床呀~懒虫~起床啊~死肥宅~起床啦~要上班啦!今天是' + strings_txt
    APPID = '9***3**8'
    APIKey = 'QC*****UK*****nP***b'
    SecretKey = 'e8***6******25*****56'
 
    aipSpeech = AipSpeech(APPID,APIKey,SecretKey)
    result = aipSpeech.synthesis(strings_txt,'zh','1',\
                                {'vol':8,
                                'per':4,
                                'spd':5})
    if not isinstance(result,dict):
        with open('test_tmp.mp3','wb') as f:
            f.write(result)
 
'''
执行的主函数
'''
def main():
    url = 'http://www.weather.com.cn/weather/101190201.shtml'
    html=getHtmlText(url)
    stringToMp3(makeSoup(html))
 
if __name__ == '__main__':
    main()

去创建新应用,看开发文档,查看key,复制进去,就可以使用百度语音api了。
百度语音合成-开发文档
天气网选择你的城市,把main函数下的url改了,如果html结构都是一样的,那就都可以执行,如果不一样需要更改makeSoup函数了。

最后设置定时运行

首先看时区(中国的是CST)、时间对不对

时区不对:

sudo dpkg-reconfigure tzdata
#选择亚洲-上海就可以了

时间不对:

sudo ntpd -s -d

定时

crontab -e

第一次运行需要指定您的编辑器(随意选)
在最后添加

50,53,55 7 * * * /home/pi/naozhong/naoz/bin/python3 /home/pi/naozhong/LEDShining.py
45 7 * * * /home/pi/naozhong/naoz/bin/python3 /home/pi/naozhong/wulala.py > /home/pi/naozhong/wulala.log 2>&1
50,53,55 7 * * * `mplayer /home/pi/naozhong/tmp.mp3`

前面的python3,就是virtualenv下的python
后面的文件也需要使用绝对路径
mpalyer命令有’`’这个符合不要忘记加上

本文来自:

http://shumeipai.nxez.com/2017/10/27/crontab-and-raspberry-pi-voice-alarm-clock.html

 

树莓派上使用 GitLab 搭建专业 Git 服务

GitLab是一个专业的Git解决方案,功能强大,和GitHub类似,而且其Community Edition (CE)是免费的,完全可以胜任为中小团队提供专业代码托管服务的工作,当然更重要的是它可以在Raspberry Pi上部署运行。

准备

项目首页:https://about.gitlab.com
下载页:https://packages.gitlab.com/gitlab/raspberry-pi2
下载地址(打开页面,点击右上角的Download按钮):
https://packages.gitlab.com/gitlab/raspberry-pi2/packages/debian/jessie/gitlab-ce_8.13.0-ce.0_armhf.deb
下载得到gitlab-ce_8.13.0-ce.0_armhf.deb文件。
注意版本要选择jessie,也就是Debian 8,因为现在的Raspbian是基于它打造的。

官网给出了在线安装的方法,但是我试了几次,可能由于国内到GitLab下载服务器之间的网络状况不好,很难在线安装成功。
国内的软件源即使有GitLab的镜像,通常也没有支持Raspberry Pi架构的分支。

所以这里给出先下载安装包,然后离线安装到Raspberry Pi上的方法。

开始安装

先安装一些必要的依赖包:

sudo apt-get install curl openssh-server ca-certificates postfix apt-transport-https

安装postfix时,会弹出一些设置,这是和发邮件相关的,如果不需要邮件功能,这里的设置并不重要。

 

等待上述依赖包安装完成后,把之前下载的安装包gitlab-ce_8.13.0-ce.0_armhf.deb上传到Raspberry Pi的文件系统里。
正式安装deb包

sudo dpkg -i gitlab-ce_8.13.0-ce.0_armhf.deb

这个包有281MB,包含123034个文件,因此安装会有些慢,卡在下面这步是正常的,耐心等待一下。

安装完成提示信息:

根据提示,需要运行:

sudo gitlab-ctl reconfigure

看到如下提示就配置完成了

初始设置

管理员用户是root
首次登录后会要求修改密码(8位及以上)

在浏览器访问Raspberry Pi的IP,会跳转到设定密码的页面。

设定完成后,用新密码登录root用户。

这是管理员用户,只用它来添加普通用户,在普通用户里新建仓库来托管代码。
点击界面右上角的小扳手图标,进入Admin Area,这是管理员独有的区域。
在user里新建一个普通用户。

注意初始的Projects limit只有10,只能创建10个projects。如果觉得不够用,可以放宽一点限制。

普通用户的密码会发送到邮箱,如果之前邮箱没配置好,可能会收不到,或者如果是内网使用,邮件也无法发出。这个问题可以这样解决:

管理员里可以用管理权限修改这个用户的密码,改完后告诉该用户这个密码,该用户在首次登录后,会被提示设置一个新密码。
如果以后使用时该用户忘记了密码,管理员也可以登录Admin Area重置。
这样就不需要邮件来重置密码,缺点是需要管理员介入,对于中小团队这样的管理方法是可取的(可以由项目组织者充当管理员)。
另外在Admin Area界面右侧有个齿轮形状的图标,点击这里可以修改一些全局设定(包括前面初始的Projects limit等), 根据提示修改就行了。

修改服务端口

默认使用80端口,如果需要修改,可以修改/etc/gitlab/gitlab.rb中如下图的2处地方,比如这样就修改成了7000端口。

两个地方都要修改。
注意保存文件后,要运行如下命令使得配置生效:

sudo gitlab-ctl reconfigure

可以看到能使用7000端口访问了,Project path也是正确的。

一些实用的维护命令

#修改任何配置文件后都要输入如下命令使配置生效。
sudo gitlab-ctl reconfigure
 
#页面缓存清除:
sudo gitlab-rake cache:clear RAILS_ENV=production
 
#GitLab各组件启动:
sudo gitlab-ctl start
 
#GitLab各组件停止:
sudo gitlab-ctl stop
 
#GitLab各组件重启:
sudo gitlab-ctl restart
 
#禁用GitLab开机自启动:
sudo systemctl disable gitlab-runsvdir
 
#启用GitLab开机自启动:
sudo systemctl enable gitlab-runsvdir

本文来自:

树莓派上使用 GitLab 搭建专业 Git 服务

在树莓派3上安装ROS

本文介绍如何在树莓派3上安装ROS Kinect

虽然可以在树莓派官方镜像Raspbian上安装ROS,不过实际上所有代码都在树莓派上本地编译,耗时不说还有可能出现意想不到的错误,因此我们还是推荐大家先把树莓派换成Ubuntu的镜像再安装ROS。

你需要准备以下东西:

  • 树莓派3
  • 最少16G的SD卡,最好Class10

下面让我们一步步来~

1. 在树莓派上安装Ubuntu

最新Kinect版本的ROS只能在16.04上运行,因此我们首先要在树莓派上安装Ubuntu Mate 16.04。

到ubuntu mate 下载最新的镜像,注意一定要选16.04不要下载成16.10了

https://ubuntu-mate.org/raspberry-pi/

下载完成后会得到一个如下的镜像文件

ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img.xz

将它解压得到

ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img

Windows的用户可以使用ImageWrite将镜像烧录到SD卡上,如果找不到工具可以在这里下载 https://sourceforge.net/projects/win32diskimager/

经过漫长的等待。。。。。


2. 首次启动Ubuntu Mate

将烧录好的SD卡插入树莓派3,接上电源,HDMI显示器和键盘鼠标

注意: 这里有同学可能跟我一样平时玩树莓派从来不接键盘鼠标和显示器,全部靠ssh远程操作。不过Ubuntu Mate在首次启动需要人工完成一下安装过程和配置,因此还是老老实实接上外设吧:)

安装过程基本就是一路Next,还有就是配置Ubuntu的用户名和密码。

进入系统后可以先将SD卡扩容到真实大小。具体操作是点击欢迎界面右下角的红色树莓派图标,里面有一个SD卡扩容选项。

也可以通过下面命令行手动重新分区sd卡。

sudo fdisk /dev/mmcblk0

在fdisk的提示框下按下d,2删除第二个分区,之后重新建立分区(n,p,回车,回车),最后按下w保存。重启系统,之后执行下面命令行

sudo resize2fs /dev/mmcblk0p2

注意:安装完系统后配置wifi连接并不能生效,这是一个bug重启系统后解决。


3. 安装ROS Kinect

接下来的步骤基本就是照着http://wiki.ros.org/kinetic/Installation/Ubuntu 走了

打开树莓派的终端,或者远程ssh连到树莓派。

首先加入ROS官方的源

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" &gt; /etc/apt/sources.list.d/ros-latest.list'<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

并且设置秘钥

sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

Ok,现在更新Package的列表

sudo apt-get update

在树莓派上安装ROS包,这里我们只安装ROS内核。因为平时机器人在运动的时候基本上是在PC上远程查看信息的,因此不需要安装ROS的GUI相关工具。

sudo apt-get install ros-kinetic-ros-base

更新ROS相关依赖和环境

sudo rosdep init
rosdep update

注意第二个命令有可能会超时,这是GFW经常卡gist.github造成丢包,多重试几次应该就能过了。
接着将ROS环境导入到bashrc,这样每次启动新的终端都有ros的命令和环境参数了。

echo "source /opt/ros/kinetic/setup.bash" &gt;&gt; ~/.bashrc
source ~/.bashrc

最后安装常用的ROS命令行工具

sudo apt-get install python-rosinstall

到这里位置ROS基本安装完毕了,打开一个新的终端,并且输入:

roscore

看看ROS内核是不是跑起来了呢?

参考链接:

http://wiki.ros.org/kinetic/Installation/Ubuntu

http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi

转载请注明出处:http://kittenbot.cn/install_ros_on_rpi3/ ‎

树莓派3上安装配置Kali Linux

0x01 准备工作

用win32diskmanager将kali系统写入tf卡

1)kali官网下载树莓派3镜像文件(https://www.offensive-security.com/kali-linux-arm-images/)

2)win32diskmanager下载安装(傻瓜式写入tf卡,不赘述了)

0x02 连接树莓派3,简单配置kali

1)若身边无多余显示器,也没有路由器的管理权限(有自己路由管理权限的,登入去看下就知道新装的kali的ip了),可以开启笔记本无线网络共享,用网线连接树莓派3和笔记本,再ssh连接树莓派3,具体操作:

开启无线网络共享

用网线连接树莓派3和笔记本, arp -a 查看树莓派3的ip,此处动态的ip即为你pi3的ip地址

使用SecureCRT或putty等工具ssh连接树莓派3(root/toor),接下来你也会的(apt-get update && apt-get upgrade && apt-get dist-upgrade && apt-get clean),进入漫长的等待吧,可以出去买杯星爸爸再回来看看。笔者没有配置国内源,如果你想配置,也可以,命令 nano /etc/apt/source.list,复制你想要添加的源即可,我这里添加了下阿里和中科大的源。

#阿里云kali源
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free

#中科大kali源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-fre

0x03 安装VNC,远程桌面你的kali

还是先用ssh连接到kali,然后

##apt-get install tightvncserver

安装完之后,开启vnc连接

##tightvncserver

会提示你输入远程时要验证的密码,输入你的密码(系统会提示你需要一定复杂度)

第二个view-only password(应该是指只远程,不授权管理的远程桌面吧,类似qq的那个允许远程,但不授权控制),选n即可;创建完发现是:New ‘X’ desktop is kali:1。

然后在你的笔记本或PC终端上安装vnc(百度下载安装下),打开vnc后输入kali的ip:1(这里后面的“:1”一定要输入),然后键入你刚创建的密码(不是kali系统的密码,允许远程桌面连接的那个密码)

设置vnc服务开机启动(我会另起一文做下说明)

连接成功。

 

0x04 重新调整磁盘大小(安装gparted)

重新调整下你的kali盘符大小,默认装完,可以查看下系统的大小(df -h)

发现才6.7G(我的tf卡有32G),所以我们要resize下磁盘大小,需要安装gparted

##apt-get install gparted

安装完之后,启动

##gparted

重启调整下磁盘大小,拉到最大,确定,应用(apply)。

0x05 完全安装你的kali(kali-linux-full)

安装后之后,你会发现kali上只有一部分工具,那么我们需要完全安装kali

##apt-get install kali-linux-full

安装过程中会让你选择一些配置,根据自己的喜好选择下(什么自动切换mac之类的),接下来又是漫长的等待

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-10/147705.htm

 

 

 

树莓派上安装配置Archlinux

安装Archlinux

安装Archlinux这部分在Linux系统中测试通过。sdX是SD卡盘符。

SD卡分区

  1. 使用fdisk工具 # fdisk /dev/sdX
  2. fdisk提示命令下删除旧分区并新建:
    •  按o 删除全部分区
    • p列出分区,此时应该没有任何分区。
    • n新建分区, 然后p选择为主分区, 输入1作为SD卡的第1个主分区; 按回车选择默认开始扇区,再输入+100M设置结束扇区.
    • t,然后按c设置刚才的主分区类型为W95 FAT32(LBA).
    • n新建分区,然后p选择为主分区,输入2作为SD卡的第2个主分区;按两次回车默认把SD卡剩下的空间都给第2主分区.
    • w写入保存分区, 退出fdisk.

格式化和挂载分区

把第1主分区格式化为FAT分区,并挂载到boot:

mkfs.vfat /dev/sdX1
mkdir boot
mount /dev/sdX1 boot

把第2分区格式化为ext4分区,并挂载到root:

mkfs.ext4 /dev/sdX2
mkdir root
mount /dev/sdX2 root

下载树莓派Archlinux ARM版本, 安装到SD卡

wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz
tar -zxpf ArchLinuxARM-rpi-latest.tar.gz -C root
sync
mv root/boot/* boot

安装完成,卸载分区

unmount boot root

系统安装完成

Archlinux镜像已经安装成功,连上网线,插上电源,可以直接SSH到树莓派了。
默认用户名和密码为:alarm
管理员用户名和密码为:root
管理员帐号无法远程登录

配置Archlinux

添加国内源

编辑 /etc/pacman.d/mirrorlist

在文件头部添加:

  • 清华软件源:Server = http://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo
  • 中科大软件源:Server = http://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo

更新软件源:

pacman -Syyu

安装SUDO

安装sudo:

 pacman -S sudo

输入 visudo 去掉 #%wheel ALL=(ALL) ALL 此行注释,使wheel用户组可以临时使用sudo 提高权限.

visudo

参考资料

  1. http://archlinuxarm.org/platforms/armv6/raspberry-pi

转载自

http://www.jianshu.com/p/be4a44a54b65

20分钟理解并写出简易的网速监控API

这是一篇学习笔记。用于快速理解,并在Raspbian(或者其他Linux系统)上,利用Python的Flask框架快速写出一份简易的网速监控API。

0 序言

我目前成为了树莓派的重度使用者。平时Python的练习可以在上面做,同时它也是我的NAS(简易版)、离线下载机、无线路由器……

对于我来说,对某台机器网速的监控有很大的需求,因此之前尝试利用基于PHP的探针提供的API来监控实时网速

PHP探针在建站环境上的主机会非常方便。但是对于没有PHP环境的主机,专门为了一个探针而配置PHP,则过于臃肿。

今天写了这篇文章,同时也作为我自己的笔记,用Python的Flask框架快速写出一份简易的网速监控API。

进行操作后,不只是网速监控API,可以根据自身需求推广到其他API的快速搭建。

我们最终的目标是,HTTP访问目标ip:端口,得到json形式的返回结果:

{
"interface": "eth0",
"rx": "58829838538",
"time": "1506500429.11",
"tx": "59272128479"
}

包含网口名,rx和tx字节数,此时的时间戳(api提供端无状态,只提供时间戳。网速信息在api获取端运算)。

注:JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

1 了解 /proc

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

pi@raspberrypi:/proc $ ls
1     1158  1323  1452  1673  2057  2474  45   576  66    77    8032  904        bus          interrupts   modules        timer_list
10    1180  1336  146   1674  2058  25    46   579  67    7791  8035  912        cgroups      iomem        mounts         timer_stats
1009  1184  1350  1460  1691  21    26    47   58   670   7797  8097  915        cmdline      ioports      net            tty
104   1187  1356  148   1695  2122  27    48   580  68    78    8134  916        consoles     irq          pagetypeinfo   uptime
1076  124   1357  1482  17    2126  273   49   582  69    7804  8136  917        cpu          kallsyms     partitions     vc-cma
1077  1259  1358  15    1736  22    28    5    59   6948  7811  82    918        cpuinfo      keys         sched_debug    version
1078  1260  1361  1536  1742  222   29    50   60   7     7813  83    919        crypto       key-users    self           vmallocinfo
1079  1269  1363  1585  1777  223   3     51   61   70    79    85    922        devices      kmsg         slabinfo       vmstat
108   1272  1364  1625  1780  224   31    52   619  71    7901  879   932        device-tree  kpagecgroup  softirqs       zoneinfo
1081  1290  1365  1626  18    228   32    53   62   72    7936  88    933        diskstats    kpagecount   stat
1085  1291  1378  1646  1813  2288  322   54   63   73    7940  89    937        driver       kpageflags   swaps
1097  13    1379  1648  1871  23    33    55   64   738   8     892   946        execdomains  loadavg      sys
11    1309  14    1651  19    238   34    56   65   75    80    898   960        fb           locks        sysrq-trigger
1108  1312  1402  1652  2     239   35    57   658  7669  8025  9     asound     filesystems  meminfo      sysvipc
1154  1321  1442  1668  2056  24    44    575  659  7691  8030  90    buddyinfo  fs           misc         thread-self

详情可参考 Linux下/proc目录简介 [1]

对于状态监控,我们一般关心的信息如下:
/proc/cpuinfo cpu的信息
/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态
/proc/meminfo RAM使用的相关信息
/proc/uptime 系统已经运行了多久
/proc/net 网卡设备信息
/proc/net/dev 显示网络适配器及统计信息
/proc/diskstats 取得磁盘信息

这样,我们就可以各取所需。在本例中,我使用了/proc/net/dev 显示网络适配器及统计信息。

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
  tun0: 3852102709 17680346    0    0    0     0          0         0 1974345633 21150157    0 182375    0     0       0          0
 wlan0: 7886340   51924    0    4    0     0          0       248 15654713   23263    0    0    0     0       0          0
    lo: 1109576    6222    0    0    0     0          0         0  1109576    6222    0    0    0     0       0          0
  eth0: 1357382867 17758879    0 32317    0     0          0         0 354351259 21157222    0    0    0     0       0          0
  eth1: 145114110 1581538    0    0    0     0          0         0 2151465834 4647523    0    0    0     0       0          0

/proc/net/dev就是我们流量监控的数据来源。

我关心eth0的网卡流量。因此我只要抓出eth0(第六行)行的RX字节数和TX字节数即可,再在api中返回此时的时间戳。

对于 /proc/net/dev 文件中我关心的信息,我使用的部分Python代码如下。

f = open('/proc/net/dev','r')
 for x in range(5):
       f.readline()
 line = f.readline()
 strline = line.split(' ')
 strline2 = []
 for a in strline:
         if a != ' ':
                 if a !='':
                         strline2.append(a)

至此,我们得到的strline2就是eth0行中包含的数据列表。根据/proc/net/dev 格式,rx数据量是strline2[1],tx数据量是strline2[9]。当然,你也可以用正则表达式来实现。

毕竟是自己使用的简易API,如果不是特别在意的话,实现方法不优雅也无妨。

至此我们就能把自己需要的信息提取出来了。

2 熟悉 flask 框架

Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask使用BSD授权。 Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。

Flask有提供文档 http://docs.jinkan.org/docs/flask/

用简单的话说,Flask可以让你快速搭建起来一个web服务端,而省去一些技术细节。

不要误解,Flask的能力足以支撑大型的商业项目。但由于其轻量易上手,使得我们也可以在自己的项目中轻松使用。我们来看一下其helloworld代码。

from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"

如你所见,短短几行代码实现了基本的web静态服务。

我们将上面获取网速的代码加入,就可以实现我们的API功能。

具体操作如下:

安装flask

sudo pip3 install flask

在我们的目录下新建一个app.py并编辑

#!flask/bin/python
from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def index():
    return "Hello, World!"
 
if __name__ == '__main__':
    app.run(host='0.0.0.0',port='5050',debug=True)

注意,相比helloworld,最后一行代表的含义是:在0.0.0.0(本地/不检查ip)上开放,端口5050,开启调试,然后执行。

此时访问 http://localhost:5050 或者 http://目标机器ip:5050 即可返回HelloWorld。(访问失败,注意防火墙设置)

具体特性如调试、路由等等使用方法,本文不多提及,请参照官方文档。

3 写出服务端

我们最终的目标是,HTTP访问目标ip:端口,得到json形式的返回结果:

{
"interface": "eth0",
"rx": "58829838538",
"time": "1506500429.11",
"tx": "59272128479"
}

接下来将上面两部分结合,写出服务端即可。我的代码如下:

#!flask/bin/python
from flask import Flask, jsonify
import time
 
app = Flask(__name__)
 
net =   {
                'interface':'eth0',
                'rx':'0',
                'tx':'0',
                'time': '0'
        }
 
 
@app.route('/')
def index():
    try:
                f = open('/proc/net/dev','r')
                f.readline()
                f.readline()
                f.readline()
                f.readline()
                line = f.readline()
                strline = line.split(' ')
                strline2 = []
                for a in strline:
                        if a != ' ':
                                if a !='':
                                        strline2.append(a)
                net['rx']=strline2[1]
                net['tx']=strline2[9]
                net['time']=str(time.time())
 
        finally:
                if f:
                        f.close()
                strline=[]
                strline2=[]
        return jsonify(net)
 
 
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5050,debug=True)

说明:
1 jsonify是flask提供的快速打包工具。使用jsonify(net),即可将net打包为json,然后直接返回即可。
2 成功实现后,请取消debug。

我提供一个示例:

http://sfo01.misaka.cc:5050/

访问得到

{
"interface": "eth0",
"rx": "58829838538",
"time": "1506500429.11",
"tx": "59272128479"
}

关于此api的利用,可以参阅我之前的文章。定期刷新获取json,解析后,两次请求数据量差与time时间戳之差之商即为网速。

4 持久运行与使用

可以使用一切使进程持续运行的方法。

可以使用tmux

开启新对话时使用 tmux

在新的会话中使用

sudo python app.py

终端即可直接关闭

5 小结

至此。我们使用flask完成了一个最简单的API的搭建。下一步可以考虑更广的用途。

最后,笔者为生活在一个不需要重复造轮子的时代而感到幸运。

6 相关阅读

[1] Linux下/proc目录简介 http://blog.csdn.net/zdwzzu2006/article/details/7747977
[2] 百度百科-JSON https://baike.baidu.com/item/JSON
[2] Flask框架中文文档 http://docs.jinkan.org/docs/flask/

原文来自 https://steinslab.xyz/archives/1275