船模的主要零件已经到手,东拼西凑来的程序表现还不错,接下来就是一些细枝末节的小问题了:

  • WiFi热点建立
  • 开机自启执行脚本
  • 树莓派图传
    这些个小问题我将会依次开文记录解决,至于船模的一些实现细节比赛结束之后再贴出。(我会告诉你是因为我懒嘛)

现在网络上利用树莓派开AP的教程大都基于create_ap这个开源项目,但我亲自试验后发现问题不少,比如说SSID无法修改等致命问题,因此还是用传统的hostapd方法实现我的目的。

注意:我开设热点的目的仅供局域网访问,如果树莓派已经连接好公网需要自行配置iptables。

准备

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从业者的面)。

Last modification:February 1st, 2019 at 08:41 pm
If you think my article is useful to you, please feel free to appreciate