lou 发表于 2020-5-6 13:41:47

树莓派打造最强车载娱乐终端(1)音乐和WiFi

本帖最后由 lou 于 2020-5-6 13:44 编辑

树莓派打造最强车载娱乐终端(1)音乐和WiFi



开车跑长途的时候总觉得无聊,就会想起飞机上的娱乐终端,那么我们就来自己做一个吧!这一系列文章里,我会按照功能划分,列出需要的软硬件,尽量做到互相独立,方便自由组合。今天我们先来实现最基本的音乐播放和WiFi共享。
所需硬件:1.树莓派(建议3B+而不是4)2.外壳3.存储设备4.3.5mm公对公音频线5.USB充电线6.车载充电器(建议至少2个USB口)
先来解释一下为什么用树莓派3而不是4呢?主要是为了下一步游戏篇做准备,游戏方面我们将会使用RetroPie方案,而RetroPie目前为止还不能很好的支持树莓派4和Buster系统,所以最好是用3B+和Stretch系统。如果你手里有现成的4也没关系,RetroPie早晚会更新的。外壳最好是有,毕竟我们是做车载终端,稍微保护一下免得短路什么的。随便买个亚克力盒子就行,哪怕你找个合适的硬纸盒都行,反正3B+无需主动散热。存储方面最好是找个大容量的tf卡,虽然u盘甚至移动硬盘也是可以的,但是后面扩展功能的时候你会发现USB口可能很紧张,能省一个是一个,而且USB口总电流就那么大,太多设备来分的话可能会供电不足。如果你一定要用移动硬盘,那么请用固态移动硬盘,不然没几天颠坏了别怪我没提醒你。有人可能会说我的车可以直接播放u盘或者iPhone的音乐,干嘛非要用树莓派做播放器?首先大部分车自带的播放功能都处理不了500首以上的音乐列表,其次手机的存储空间可贵多了,再说后续的其他功能也需要把音频通过车载音响播放出来,现在连接好没坏处。我默认读这篇文章的人都知道该怎么烧写树莓派的系统镜像,但是恐怕不是每个人都有Stretch版本的系统镜像,https://downloads.raspberrypi.org/raspbian/images/raspbian-2019-04-09/这里是官方历史镜像,如果一直返回上一级你可以找到任何官方发布过的版本,当然这里我们就用Stretch的最终版。下载、烧写、联网、启用ssh和vnc,还有更新系统,这些都是基本动作我就不啰嗦了,直接来主菜。我们首先要做的是把系统设置为默认登录到命令行界面。那为什么不直接装个lite版系统呢?因为视频播放等功能还是要图形界面。那又为什么要默认登录到命令行界面呢?水字数也不是这样水的啊!因为命令行界面启动快,正常来讲从通电开始10秒钟之内命令行已经完成启动并且把我们今天要做的音乐播放和WiFi共享服务加载完毕了,几乎和原车音响一个速度;而且我们将要做的游戏模拟器也是要从命令行环境启动。设置为默认登录到命令行界面的方法如下:
sudo raspi-config
先选择第三项“BootOptions”,然后选择“B1 Desktop / CLI”,紧接着是选择“B2 Console Autologin”,之后重启,默认就是命令行界面且pi用户自动登录好了,等待你的指令。其次我们还要禁用树莓派的IPv6模块,方法是编辑boot分区的cmdline.txt,在最后增加一段“ ipv6.disable=1”,这主要是因为有些软件对IPv6兼容还不是很好,禁用掉最省心。无论你是通过电脑打开或者
sudo nano /boot/cmdline.txt
都可以。在实际操作之前我们还得做点环境准备工作,建立好数据目录并且设置好访问权限:
sudo mkdir -p /mnt/sdcard/media/audio/

sudo mkdir /mnt/sdcard/media/video

sudo mkdir /mnt/sdcard/rom

sudo chmod 777 -R /mnt/sdcard/
音乐播放我们用mpd,安装命令:
sudo apt-get install mpd mpc gmpc

sudo apt-get install mpd mpc gmpc
其中mpd是音乐播放的守护进程,mpc是命令行版本的播放控制程序,而gmpc是图形界面的播放控制程序。安装完成后我们得对mpd做些配置,
sudo mkdir -p /mnt/sdcard/media/audio/.mpd/playlists

sudo nano /etc/mpd.conf
第一步还是准备好目录,然后编辑配置文件。mpd.conf文件很长,需要修改的重点是下面这些内容:
music_directory,修改为 "/mnt/sdcard/media/audio"

playlist_directory,修改为 "/mnt/sdcard/media/audio/.mpd/playlists"

db_file,修改为 "/mnt/sdcard/media/audio/.mpd/tag_cache"

log_file,修改为 "/mnt/sdcard/media/audio/.mpd/mpd.log"

pid_file,修改为 "/mnt/sdcard/media/audio/.mpd/pid"

state_file,修改为 "/mnt/sdcard/media/audio/.mpd/state"

sticker_file,修改为 "/mnt/sdcard/media/audio/.mpd/sticker.sql"
上面这些是必选项,作用大多可以望文生义,都集中在配置文件开头部分。下面还有些可选项,我会逐条解释。bind_to_address,默认为 "localhost",建议修改为 "192.168.200.1"。这一行的作用是控制mpd守护进程监听的IP地址,如果播放控制程序和mpd在同一台设备上的话,默认值localhost就能工作的挺好,但是如果你想要跨设备控制mpd的话,就得指定为mpd进程所在的设备IP,不然控制端可能会找不到服务端。"192.168.200.1"这个IP地址是等下我们做WiFi共享功能时将要指定给树莓派的地址,所以也不是随便写的。auto_update "yes",这一行默认是被注释掉的,我们需要启用它。这个设置项的功能是自动扫描music_directory并且更新媒体库。如果你新增或者删除了某些音乐文件但是没有更新媒体库的话,mpd会找不到新的音乐。zeroconf_enabled "yes",这一行默认也是被注释掉的,作用是在网络上广播mpd服务。同样的如果你想通过网络控制mpd的话,最好启用它。紧跟着还有一项zeroconf_name"Music Player",这个是广播出去的媒体播放服务器的名字,可以改成你喜欢的。其他的配置项没有特殊需求就不用管了。修改完之后重启mpd服务让新设置生效。
sudo systemctl restart mpd
音乐播放服务我们就算搞定了,但是你可能会发现什么都播放不了,特别是如果你还修改了bind_to_address这一项的话,网上搜出来的“mpc listall”也只会甩给你一句“mpd error: Connection refused”,没关系我们马上就解决它。
sudo apt-get install hostapd dnsmasq
这两个是WiFi共享的关键服务,但是安装完成之后我们立刻要做的就是停止并禁用它们。
sudo systemctl stop hostapd

sudo systemctl stop dnsmasq

sudo systemctl disable hostapd

sudo systemctl disable dnsmasq

sudo systemctl unmask hostapd
原因是如果你没有禁用它们,又意外的在没有准备好之前就重启了,那就很难再通过网络访问树莓派了,还有可能把你网络上的其他设备给带歪了。“systemctl unmask”这个命令很多人可能会有点陌生,某些服务是会被mask(罩)住的,意思就是你没事了别动它,连start都不行,为了操作这些被masked服务就得先unmask了它们。我们先来配置dnsmasq服务。先“sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig”把默认配置文件改个名字,然后“sudo nano /etc/dnsmasq.conf”直接建一个新的,默认配置文件实在是有点啰嗦,我们这种简单的需求只要下面这几句就够了。
interface=wlan0    #服务监听在无线网卡上

server=8.8.8.8       #默认DNS服务器

dhcp-range=192.168.200.101,192.168.200.200,12h    #IP地址池及租期
注意到了吗?我们的地址池就是192.168.200段的,和刚刚mpd配置文件里一样,等下我们会把192.168.200.1指定给树莓派自己。如果你按自己的喜好做了修改,请保持各处一致。下面是hostapd的配置。“sudo nano /etc/hostapd/hostapd.conf”之后输入下面内容。
interface=wlan0

driver=nl80211#nl(小写字母L)80211(数字1)

hw_mode=g

channel=6

ieee80211n=1

wmm_enabled=0

macaddr_acl=0

ignore_broadcast_ssid=0

auth_algs=1

wpa=2

wpa_key_mgmt=WPA-PSK

wpa_pairwise=TKIP

rsn_pairwise=CCMP

ssid=Pi3-AP# 网络名称

wpa_passphrase=raspberry# 网络密码
紧接着“sudonano /etc/default/hostapd”,因为全文都是被注释掉的,所以直接在最下面增加一句
DAEMON_CONF="/etc/hostapd/hostapd.conf"
就好了。然后还要“sudo nano /etc/init.d/hostapd”,就在开头的位置找到并修改
DAEMON_CONF=/etc/hostapd/hostapd.conf
还没完!
sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.wifi

sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.ap

sudo nano /etc/dhcpcd.conf.ap
最后的命令是把我们刚刚复制得到的/etc/dhcpcd.conf.ap打开,输入下列内容
interface wlan0

static ip_address=192.168.200.1/24

nohook wpa_supplicant
整理一下思路,我们现在有3份dhcpcd.conf,默认的dhcpcd.conf、和默认的dhcpcd.conf一模一样的dhcpcd.conf.wifi,还有刚刚修改好的dhcpcd.conf.ap。你肯定看出来了,最后的dhcpcd.conf.ap才是我们共享WiFi会主要用的配置文件,其中也包含了我们给无线网卡指定的IP地址。如果现在重启,什么都不会发生,树莓派官方系统可不会读取我们刚刚改好的dhcpcd.conf.ap,而且hostapd和dnsmasq两个服务也被我们禁用了,那么接下来做什么?如果我们用dhcpcd.conf.ap替换掉dhcpcd.conf,然后启用hostapd和dnsmasq两个服务,再重启,将会得到一个没有互联网出口的无线ap,你可能会说我可以给LAN口插网线啊,那出门怎么办?别忘了我们是要做车载终端的。显然出门的时候我们最方便能使用的互联网连接就是手机了,现在我们就来把手机的网络共享给树莓派。安卓手机不需要额外安装软件,数据线连接好手机和树莓派,在手机上启用USB热点共享,回到树莓派上使用命令“ifconfig -s”就可以看到一个名为“usb0”的网络接口,为了真正能够使用这个接口,我们得使用命令“sudo nano/etc/network/interfaces.d/tether_android”,输入以下内容:
allow-hotplug usb0

iface usb0 inet dhcp
苹果手机就稍微麻烦一点,需要安装一些软件。
sudo apt-get install usbmuxd ipheth-utils libimobiledevice-utils

sudo aptitude install ifuse
以后只要连好手机,打开热点,你的树莓派就可以通过手机网络上网了,超赞的!现在我们有了互联网连接,才能说到共享出去的事。
sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE#通过安卓绑定转发

sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE#通过iPhone绑定转发

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE#通过有线接口转发

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"#保存上述路由表

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"#立即启动ipv4转发
如果你是直接操作树莓派而不是通过ssh,那现在使用dhcpcd.conf.ap这个配置文件重启dhcpcd服务、启动hostapd和dnsmasq,树莓派就变成一个路由器了,无论你是插网线还是接手机都可以自动共享出去。可是这样的操作好像很绕啊,完全没必要每次手工启动服务。嗯,因为我的目的是让树莓派可以很方便的在作为ap和使用WiFi两种状态之间切换。下面是原创干货时间,先贴脚本后解释。
1,switch2ap#切换到ap模式
#!/bin/sh

touch /boot/ap

cp /etc/dhcpcd.conf.ap /etc/dhcpcd.conf

systemctl daemon-reload

systemctl restart dhcpcd

systemctl start hostapd

systemctl start dnsmasq

sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

iptables-restore < /etc/iptables.ipv4.nat

exit 0


2,switch2wifi#切换到WiFi模式
#!/bin/sh

rm /boot/ap

sh -c "echo 0 > /proc/sys/net/ipv4/ip_forward"

cp /etc/dhcpcd.conf.wifi /etc/dhcpcd.conf

systemctl daemon-reload

systemctl stop hostapd

systemctl stop dnsmasq

rmmod brcmfmac

modprobe brcmfmac

systemctl restart dhcpcd

exit 0
经过前面的配置,树莓派已经做好了两手准备,但是默认是被放在WiFi模式下。执行”sudo switch2ap“就可以切换到ap模式,switch2wifi则是从ap模式切回WiFi模式,两种模式之间切换不需要重启(实测偶尔会切换失败需要重启,但是几率很小)。当然实际应用中我们肯定不想每次都手工执行切换,且大部分情况应该都是会跑在ap模式下,所以我们可以通过rc.local自动执行switch2ap。为了更方便,我又做了个标志位,即boot分区里一个名为”ap“的文件。rc.local中实际命令是这样的:
[ -f /boot/ap ] && /usr/bin/switch2ap || /usr/bin/switch2wifi
如果存在”/boot/ap“这个文件则自动进入ap模式,否则就保持在WiFi模式。这样的话如果树莓派需要连上WiFi进行升级调试等操作,只需要用读卡器删掉boot分区的ap文件再开机即可。同理新建一个ap文件再开机,就会自动进入ap模式。通过脚本切换的话也会自动处理ap文件。现在我们回过头来把音乐播放给彻底搞定。首先我们得拷贝点音乐进去,这个最好是通过网络解决,不然读写树莓派的ext4分区还是个小麻烦。这个简单我们装上samba服务。sudo apt-get install samba老规矩还要修改配置文件/etc/samba/smb.conf,在最后面加上


path = /mnt/sdcard

browseable = yes

guest ok = yes

read only = no

create mask = 0777

directory mask = 0777
然后重启samba服务
sudo systemctl restart smbd
好了,现在可以通过网上邻居访问树莓派,先随便拷几首歌到audio里面做做测试。拷贝完成之后
mpc listall
可以看到媒体库里的文件,然后
mpc listall | mpc add
添加到当前播放列表,最后
mpc play
播放当前列表。很麻烦是吧?所以我们才装了gmpc这个图形控制界面啊!当然还有另一种方式,就是通过手机来控制。还记得我们给mpd指定了IP地址吗?现在就用上了!iPhone到Appstore搜索”MPD js“,安卓搜索”MPDroid“,这两个都是简单好用的控制端。装好之后把手机连接到树莓派ap上,打开App会自动搜索网络内的mpd服务器,连接过去就可以控制播放了。不过播放列表第一次做好之后基本上也不用管了,每次开机会自动从上次中断的地方继续播放,而且后续给树莓派接上屏幕之后我们会做个更简单的控制,先请稍安勿躁。
页: [1]
查看完整版本: 树莓派打造最强车载娱乐终端(1)音乐和WiFi