开车跑长途的时候总觉得无聊,就会想起飞机上的娱乐终端,那么我们就来自己做一个吧!
这一系列文章里,我会按照功能划分,列出需要的软硬件,尽量做到互相独立,方便自由组合。今天我们先来实现最基本的音乐播放和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首以上的音乐列表,其次手机的存储空间可贵多了,再说后续的其他功能也需要把音频通过车载音响播放出来,现在连接好没坏处。
下载、烧写、联网、启用ssh和vnc,还有更新系统,这些都是基本动作我就不啰嗦了,直接来主菜。
我们首先要做的是把系统设置为默认登录到命令行界面。那为什么不直接装个lite版系统呢?因为视频播放等功能还是要图形界面。那又为什么要默认登录到命令行界面呢?水字数也不是这样水的啊!因为命令行界面启动快,正常来讲从通电开始10秒钟之内命令行已经完成启动并且把我们今天要做的音乐播放和WiFi共享服务加载完毕了,几乎和原车音响一个速度;而且我们将要做的游戏模拟器也是要从命令行环境启动。
设置为默认登录到命令行界面的方法如下:
先选择第三项“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,在最后面加上
- [sdcard]
- path = /mnt/sdcard
- browseable = yes
- guest ok = yes
- read only = no
- create mask = 0777
- directory mask = 0777
复制代码
然后重启samba服务
- sudo systemctl restart smbd
复制代码
好了,现在可以通过网上邻居访问树莓派,先随便拷几首歌到audio里面做做测试。拷贝完成之后
可以看到媒体库里的文件,然后
添加到当前播放列表,最后
播放当前列表。很麻烦是吧?所以我们才装了gmpc这个图形控制界面啊!当然还有另一种方式,就是通过手机来控制。还记得我们给mpd指定了IP地址吗?现在就用上了!iPhone到Appstore搜索”MPD js“,安卓搜索”MPDroid“,这两个都是简单好用的控制端。装好之后把手机连接到树莓派ap上,打开App会自动搜索网络内的mpd服务器,连接过去就可以控制播放了。不过播放列表第一次做好之后基本上也不用管了,每次开机会自动从上次中断的地方继续播放,而且后续给树莓派接上屏幕之后我们会做个更简单的控制,先请稍安勿躁。