【玩转开源】BananaPi R2 —— 第三篇 基于Openwrt开发一个简单的路由器
上一篇讲解了R2的网口配置,这一篇我们以BananaPi R2为例子来实现一个简单的路由器;那么一个简单的路由器应该具备什么样的功能呢?最简单的说就是wan+lan+ap这三个功能。
首先wan+lan的功能,R2已经默认有了,接下来我们用网桥(bridge)的方式搭建一个无线热点(Ap)。
- 打开R2上mt6625(R2上的无线芯片)的ap模式
jack@jack: wmt_loader &
jack@jack: stp_uart_launcher -p /etc/firmware &
jack@jack: echo A > /dev/wmtWifi &
- 打开后,可以看到生成了一个虚拟网口ap0
root@LEDE:/# ifconfig -a
ap0 Link encap:Ethernet HWaddr :::4A:BA:
BROADCAST MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
- 接下来,我们需要创建一个无线热点出来,这里我使用的是hostapd(soft AP)的方式去创建,在这里我引申一下hostapd的知识:
什么是hostapd?我截取官网一部分解释:hostapd is a user space daemon for access point and authentication servers. It implements IEEE 802.11 access point management, IEEE .1X/WPA/WPA2/EAP Authenticators, RADIUS client, EAP server, and RADIUS authentication server. The current version supports Linux (Host AP, madwifi, mac80211-based drivers) and FreeBSD (net80211).
简单说就是hostapd是一个用户空间1的守护进程,AP(access point)遵循IEEE的部分网络和安全协议。
hostapd官网:https://w1.fi/hostapd/
hostapd相关资料:https://w1.fi/cgit/hostap/plain/hostapd 标注1:用户空间是相对于内核空间去区别的,我们平时的操作基本都是在用户空间去进行的,简单的理解就是我们平时操作的Linux系统Gui,命令行,shell脚本,编译运行的C程序等等都是在用户空间的行为。
- 以下是hostapd的简单配置:
root@LEDE:~# cat hostapd.conf
interface=ap0 #网口是ap0
bridge=br-lan #网桥是br-lan
ssid=BPI_R2 #SSID即无线信号的名称是BPI-R2
driver=nl80211 #使用的驱动是nl80211
country_code=CN
hw_mode=g #使用的是2.4G
channel= #信道是1
wpa_key_mgmt=WPA-PSK #加密算法
wpa_passphrase=ledetest #创建的无线AP密码 关于hostapd.conf文件更多的信息,请查看这里:https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf
- 配置完成后,执行“hostapd -d hostapd.conf”创建无线热点:
root@LEDE:~# hostapd -d hostapd.conf
Configuration file: hostapd.conf
[ 6102.269958] br-lan: port (ap0) entered blocking state
[ 6102.275130] br-lan: port (ap0) entered disabled state
[ 6102.280499] device ap0 entered promiscuous mode
[ 6102.285076] br-lan: port (ap0) entered blocking state
[ 6102.290176] br-lan: port (ap0) entered forwarding state
ap0: interface state UNINITIALIZED->COUNTRY_UPDATE
Using interface ap0 with hwaddr :::4a:ba: and ssid "BPI_R2"
ap0: interface state COUNTRY_UPDATE->ENABLED
ap0: AP-ENABLED
- 看打印的log,可以看出热点以及创建成功了,接下来我用windows系统的笔记本去连接:

连接成功,看来Openwrt已经把dhcp服务也配置好了,这里再简单引申一下dhcp服务:
dhcp(Dynamic Host Configuration Protocol)动态主机配置协议,其实简单来讲,就是设备连入局域网时,可以动态获取到IP的一种协议。
如果没有配置dhcp服务,设备连入局域网后,就获取不到IP,也就上不了Internet。
- 我们来看一下R2上的dhcp服务:
root@LEDE:~# cat /etc/config/dhcp
config dnsmasq #dnsmasq是一个轻量级的dhcp,dns服务
option domainneeded ''
option boguspriv ''
option filterwin2k ''
option localise_queries ''
option rebind_protection ''
option rebind_localhost ''
option local '/lan/'
option domain 'lan'
option expandhosts ''
option nonegcache ''
option authoritative ''
option readethers ''
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.auto'
option nonwildcard ''
option localservice '' config dhcp 'lan'
option interface 'lan'
option start ''
option limit ''
option leasetime '12h'
option dhcpv6 'server'
option ra 'server' config dhcp 'wan'
option interface 'wan'
option ignore '' config odhcpd 'odhcpd'
option maindhcp ''
option leasefile '/tmp/hosts/odhcpd'
option leasetrigger '/usr/sbin/odhcpd-update'
option loglevel ''
乍看上去,这里的dhcp配置让人有点心生畏惧,其实也不用太担心,我们先来简单看一下这个dhcp的配置:
我们先暂时略过dnsmasq和odhcpd,后续会添加讲解。
这里配置了两个接口"lan"和"wan"为dhcp的方式,这两个接口必须也是在/etc/config/network中被定义过的。
“wan”配置很简单,不用过多说明,我们来简单分析一下“lan”的配置:
config dhcp 'lan'
option interface 'lan' #必须是在/etc/config/network中被定义过的
option start '' #从x.x.x.100开始分配IP
option limit '' #一共有150个IP,也就是说这里的配置是x.x.x. - x.x.x.
option leasetime '12h' #最长连接时间
option dhcpv6 'server'
option ra 'server' #服务定义的模式是IPv6(RA & DHCPv6) 更多细节可以参考这里:https://openwrt.org/docs/guide-user/base-system/dhcp
接下来我用手机连接,然后测试R2无线网络的速度,当然这个速度是和R2连接的带宽相关联的,我这里是;

看起来网速还算是比较快的;现在,我们就已经成功在R2上面部署了一个具有基础路由功能的Openwrt了。
接下来有人可能会遇到这个问题,我的R2关机或者重启了,之前配置好的环境没了,又要重新配置,有没有什么方法可以开机启动后去自动配置我要的环境呢?
答案当然是有的:
- 首先创建一个启动Ap的脚本
vim setup.sh
#!/bin/ash
wmt_loader &
sheep
stp_uart_launcher -p /etc/firmware &
sleep
echo A > /dev/wmtWifi &
sleep
hostapd -d hostapd.conf
- 然后再把setup.sh加到Openwrt的启动文件里
root@LEDE:~# vim /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
cd /root/ #我的setup.sh是放在/root目录下的,所以要先进入/root目录
sleep 6 #这里sleep 6s是因为在等系统其它服务init完成
./setup.sh &
exit
- 然后再套个盒子,接根天线,就有那么点意思了

现在,一个简单的路由器产品就完成了。最后,有人可能会问,既然是要做一个路由器产品,不可能老是用命令行去操作吧,再怎么样也要有一个web的页面去配置吧。
说的没错,要实现web页面对路由器的配置,这里不得不提到Openwrt的好帮手Luci,那么下一篇我们就来看什么是Luci,以及如何配置。
欢迎大家批评指正,转载请注明出处,多谢。
【玩转开源】BananaPi R2 —— 第三篇 基于Openwrt开发一个简单的路由器的更多相关文章
- linux设备驱动第三篇:如何实现一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...
- linux设备驱动第三篇:如何写一个简单的字符设备驱动?
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...
- iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...
- LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...
- Linux第三周学习总结——构造一个简单的Linux系统MenuOS
第三周学习总结--构造一个简单的Linux系统MenuOS 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心
作者:Grey 原文地址:ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 很多程序往 ...
- 第三篇 基于.net搭建热插拔式web框架(重造Controller)
由于.net MVC 的controller 依赖于HttpContext,而我们在上一篇中的沙箱模式已经把一次http请求转换为反射调用,并且http上下文不支持跨域,所以我们要重造一个contro ...
- 【如何快速的开发一个简单的iOS直播app】(代码篇)
开篇([如何快速的开发一个完整的iOS直播app](原理篇)) 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金量 ...
- Python开发篇——基于React-Dropzone开发上传组件
这次我要讲述的是在React-Flask框架上开发上传组件的技巧.我目前主要以React开发前端,在这个过程中认识到了许多有趣的前端UI框架--React-Bootstrap.Ant Design.M ...
随机推荐
- [openssh-server]install and enable ssh in debian9 / 在debian9上安装并启用ssh
新安装的debian9.8 with XFCE 发现没有ssh,下载debian-9.8.0-amd64-DVD-1.iso并挂在到ESXi虚拟机/media/cdrom0. 清空或保存/etc/ap ...
- Idea查看并过滤某个接口或者类的实现
查看当前类的父类 会出现一个图 不过这个有点鸡肋,我们通常想看一个类的实现有哪些,虽然有个方法可以,但是没有图. 查看类的实现 在你想查看的类上 Ctrl+H(Ctrl+Alt+B是直接弹窗,不能过滤 ...
- python爬虫学习笔记
爬虫的分类 1.通用爬虫:通用爬虫是搜索引擎(Baidu.Google.Yahoo等)“抓取系统”的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 简单来讲就是尽可 ...
- 构建之法助教园地第一次作业--点评<西北师范大学|李晓婷>
一 博客点评 第一次作业--准备篇:https://www.cnblogs.com/Mookiepiece/p/10464606.html#4192515 点评内容: 首先,你对电脑很感兴趣,兴趣就是 ...
- textCNN原理
一.TextCnn的结构 1. 嵌入层(embedding layer) textcnn使用预先训练好的词向量作embedding layer.对于数据集里的所有词,因为每个词都可以表征成一个向量,因 ...
- 装饰器模式-Decorator(Java实现)
装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...
- 腾讯地图 API 调用入门
本文仅为腾讯地图 API 调用入门,如需进阶学习,请在腾讯位置服务网站上进行学习. 登陆网址 https://lbs.qq.com/ 点击右上角的登陆按钮,需要进行注册按照流程进行就好. 完成之后,选 ...
- C51学习
十六个数字循环显示 #include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar uns ...
- Python编程四大神兽:迭代器、生成器、闭包和装饰器
生成器 生成器是生成一个值的特殊函数,它具有这样一个特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程序 ...
- 移动端返回上一页,刚需!document.referrer 详解
返回上一页,在PC端我们可以使用:history.go(-1)或者history.back(),可以正常返回第一层.这样,我们不需要上一页的 url 具体是什么,只要使用 history 一般都没啥问 ...