找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 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共享服务加载完毕了,几乎和原车音响一个速度;而且我们将要做的游戏模拟器也是要从命令行环境启动。
设置为默认登录到命令行界面的方法如下:

  1. sudo raspi-config
复制代码

先选择第三项“BootOptions”,然后选择“B1 Desktop / CLI”,紧接着是选择“B2 Console Autologin”,之后重启,默认就是命令行界面且pi用户自动登录好了,等待你的指令。
其次我们还要禁用树莓派的IPv6模块,方法是编辑boot分区的cmdline.txt,在最后增加一段“ ipv6.disable=1”,这主要是因为有些软件对IPv6兼容还不是很好,禁用掉最省心。无论你是通过电脑打开或者

  1. sudo nano /boot/cmdline.txt
复制代码

都可以。
在实际操作之前我们还得做点环境准备工作,建立好数据目录并且设置好访问权限:

  1. sudo mkdir -p /mnt/sdcard/media/audio/

  2. sudo mkdir /mnt/sdcard/media/video

  3. sudo mkdir /mnt/sdcard/rom

  4. sudo chmod 777 -R /mnt/sdcard/
复制代码

音乐播放我们用mpd,安装命令:

  1. sudo apt-get install mpd mpc gmpc

  2. sudo apt-get install mpd mpc gmpc
复制代码

其中mpd是音乐播放的守护进程,mpc是命令行版本的播放控制程序,而gmpc是图形界面的播放控制程序。
安装完成后我们得对mpd做些配置,

  1. sudo mkdir -p /mnt/sdcard/media/audio/.mpd/playlists

  2. sudo nano /etc/mpd.conf
复制代码

第一步还是准备好目录,然后编辑配置文件。mpd.conf文件很长,需要修改的重点是下面这些内容:

  1. music_directory,修改为 "/mnt/sdcard/media/audio"

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

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

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

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

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

  7. 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服务让新设置生效。

  1. sudo systemctl restart mpd
复制代码

音乐播放服务我们就算搞定了,但是你可能会发现什么都播放不了,特别是如果你还修改了bind_to_address这一项的话,网上搜出来的“mpc listall”也只会甩给你一句“mpd error: Connection refused”,没关系我们马上就解决它。

  1. sudo apt-get install hostapd dnsmasq
复制代码

这两个是WiFi共享的关键服务,但是安装完成之后我们立刻要做的就是停止并禁用它们。

  1. sudo systemctl stop hostapd

  2. sudo systemctl stop dnsmasq

  3. sudo systemctl disable hostapd

  4. sudo systemctl disable dnsmasq

  5. 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”直接建一个新的,默认配置文件实在是有点啰嗦,我们这种简单的需求只要下面这几句就够了。

  1. interface=wlan0    #服务监听在无线网卡上

  2. server=8.8.8.8       #默认DNS服务器

  3. 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”之后输入下面内容。

  1.   interface=wlan0

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

  3.   hw_mode=g

  4.   channel=6

  5.   ieee80211n=1

  6.   wmm_enabled=0

  7.   macaddr_acl=0

  8.   ignore_broadcast_ssid=0

  9.   auth_algs=1

  10.   wpa=2

  11.   wpa_key_mgmt=WPA-PSK

  12.   wpa_pairwise=TKIP

  13.   rsn_pairwise=CCMP

  14.   ssid=Pi3-AP  # 网络名称

  15.   wpa_passphrase=raspberry  # 网络密码
复制代码

紧接着“sudonano /etc/default/hostapd”,因为全文都是被注释掉的,所以直接在最下面增加一句

  1. DAEMON_CONF="/etc/hostapd/hostapd.conf"
复制代码

就好了。然后还要“sudo nano /etc/init.d/hostapd”,就在开头的位置找到并修改

  1. DAEMON_CONF=/etc/hostapd/hostapd.conf
复制代码

还没完!

  1. sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.wifi

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

  3. sudo nano /etc/dhcpcd.conf.ap
复制代码

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

  1.   interface wlan0

  2.   static ip_address=192.168.200.1/24

  3.   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”,输入以下内容:

  1.   allow-hotplug usb0

  2.   iface usb0 inet dhcp
复制代码

苹果手机就稍微麻烦一点,需要安装一些软件。

  1. sudo apt-get install usbmuxd ipheth-utils libimobiledevice-utils

  2. sudo aptitude install ifuse
复制代码

以后只要连好手机,打开热点,你的树莓派就可以通过手机网络上网了,超赞的!
现在我们有了互联网连接,才能说到共享出去的事。

  1. sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE  #通过安卓绑定转发

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

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

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

  5. sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"  #立即启动ipv4转发
复制代码

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

1,switch2ap#切换到ap模式

  1. #!/bin/sh

  2. touch /boot/ap

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

  4. systemctl daemon-reload

  5. systemctl restart dhcpcd

  6. systemctl start hostapd

  7. systemctl start dnsmasq

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

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

  10. exit 0

复制代码

2,switch2wifi#切换到WiFi模式

  1. #!/bin/sh

  2. rm /boot/ap

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

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

  5. systemctl daemon-reload

  6. systemctl stop hostapd

  7. systemctl stop dnsmasq

  8. rmmod brcmfmac

  9. modprobe brcmfmac

  10. systemctl restart dhcpcd

  11. exit 0
复制代码

经过前面的配置,树莓派已经做好了两手准备,但是默认是被放在WiFi模式下。执行”sudo switch2ap“就可以切换到ap模式,switch2wifi则是从ap模式切回WiFi模式,两种模式之间切换不需要重启(实测偶尔会切换失败需要重启,但是几率很小)。当然实际应用中我们肯定不想每次都手工执行切换,且大部分情况应该都是会跑在ap模式下,所以我们可以通过rc.local自动执行switch2ap。为了更方便,我又做了个标志位,即boot分区里一个名为”ap“的文件。rc.local中实际命令是这样的:

  1. [ -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,在最后面加上

  1. [sdcard]

  2. path = /mnt/sdcard

  3. browseable = yes

  4. guest ok = yes

  5. read only = no

  6. create mask = 0777

  7. directory mask = 0777
复制代码

然后重启samba服务

  1. sudo systemctl restart smbd
复制代码

好了,现在可以通过网上邻居访问树莓派,先随便拷几首歌到audio里面做做测试。拷贝完成之后

  1. mpc listall
复制代码

可以看到媒体库里的文件,然后

  1. mpc listall | mpc add
复制代码

添加到当前播放列表,最后

  1. mpc play
复制代码

播放当前列表。很麻烦是吧?所以我们才装了gmpc这个图形控制界面啊!当然还有另一种方式,就是通过手机来控制。还记得我们给mpd指定了IP地址吗?现在就用上了!iPhone到Appstore搜索”MPD js“,安卓搜索”MPDroid“,这两个都是简单好用的控制端。装好之后把手机连接到树莓派ap上,打开App会自动搜索网络内的mpd服务器,连接过去就可以控制播放了。不过播放列表第一次做好之后基本上也不用管了,每次开机会自动从上次中断的地方继续播放,而且后续给树莓派接上屏幕之后我们会做个更简单的控制,先请稍安勿躁。
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册