船模的主要零件已经到手,东拼西凑来的程序表现还不错,接下来就是一些细枝末节的小问题了:
- WiFi热点建立
- 开机自启执行脚本
- 树莓派图传
这些个小问题我将会依次开文记录解决,至于船模的一些实现细节比赛结束之后再贴出。(我会告诉你是因为我懒嘛)
现在网络上利用树莓派开AP的教程大都基于create_ap这个开源项目,但我亲自试验后发现问题不少,比如说SSID无法修改等致命问题,因此还是用传统的hostapd方法实现我的目的。
准备
sudo apt-get update
sudo apt-get install hostapd
sudo apt-get install udhcpd
第一行更新包列表,第二行安装hostapd(建立热点用,自带树莓派3B无线网卡驱动),第三行做DHCP服务器分配IP地址。
修改DHCP配置
sudo nano /etc/udhcpd.conf
需要修改的地方有:
interface改为你需要的网卡,start、end按需修改,注意与下文一致,参考下列格式:
opt dns 192.168.10.2 192.168.10.10
option subnet 255.255.255.0
opt router 192.168.10.1
opt wins 192.168.10.10
option dns 8.8.8.8 # appened to above DNS servers for a total of 3
option domain local
option lease 864000 # 10 days of seconds
wins服务器和dns服务器可以瞎填(如果没有外网需求的话)
sudo nano /etc/default/udhcpd
注释掉DHCPD_ENABLED=”no”
修改IP配置
sudo nano /etc/network/interfaces
注释掉原有与wlan0有关的内容,按以下格式增加内容,注意与DHCP配置保持一致:
allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface wlan0 inet static
address 192.168.10.1
netmask 255.255.255.0
network 192.168.10.0
broadcast 192.168.0.255
然鹅网上有的教程到这里戛然而止,其实树莓派默认并不使用这个文件获取ip,注释里面也提到了:
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
所以还要sudo nano /etc/dhcpcd.conf
,在文件最后添加一行denyinterfaces wlan0
,重启sudo reboot
。重启后用ifconfig命令检查是否按照指定IP分配了地址。
配置AP
首先创建配置文件:sudo nano /etc/hostapd/hostapd.conf
内容参照:
interface=wlan0
driver=nl80211
ssid=MyRPiBoat
channel=6
hw_mode=g
wpa=3
wpa_passphrase=*********
wpa_key_mgmt=WPA-PSK
sudo nano /etc/default/hostapd
把 #DAEMON_CONF="" 改为 DAEMON_CONF="/etc/hostapd/hostapd.conf"即可。
启动服务
sudo nano /etc/init.d/hostapd
指定好配置文件:
DAEMON_SBIN=/usr/sbin/hostapd
DAEMON_DEFS=/etc/default/hostapd
DAEMON_CONF=/etc/default/hostapd
sudo /etc/init.d/hostapd start
sudo /etc/init.d/udhcpd start
运行完以上两个命令,可用手机看看能否正常连接。一般地应该只在“正在获取IP地址……”停留一小会。
设置自启动
sudo update-rc.d hostapd enable
sudo update-rc.d udhcpd enable
开启外网访问
完成以上操作之后你会发现尽管连接上了热点但并联不上网,这是因为本项目并没有外网需求。
如果在eth0已经联网的基础上,首先开放内核转发:sudo nano /etc/sysctl.conf
添加一行:net.ipv4.ip_forward=1
。
然后使用iptables转发数据包:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
这样的设置仅一次有效,我们先将防火墙配置保存一下:sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
然后将这一行加在/etc/rc.local文件exit 0之前:iptables-restore < /etc/iptables.ipv4.nat
OK,大功告成,虽然速度比不上专业路由器但也不是谁都有四核处理器的,以后可以出去吹逼说我家路由器都是四核的了(别当着IT从业者的面)。