精华内容
下载资源
问答
  • openwrt开发

    2015-03-24 11:12:00
    之前写过一篇日志,是关于如何搭建自己的OpenWRT开发环境。经过最近一段时间的开发学习和实践,对OpenWRT环境的开发有了一定的了解。在这里将我的开发心得做个整理。   1、搭建开发环境 首先,我们需要一个为...

    之前写过一篇日志,是关于如何搭建自己的OpenWRT开发环境。经过最近一段时间的开发学习和实践,对OpenWRT环境的开发有了一定的了解。在这里将我的开发心得做个整理。

     

    1、搭建开发环境

    首先,我们需要一个为路由器定制的开发环境,具体可以参考我的另一篇日志:《搭建自己的OpenWrt开发环境》。这里只做一个简单的补充,在执行make menuconfig后,会出现下图:

                           

     

     

    其中,图中红框部分是我定制路由器的系统版本,大家可以根据不同的路由器进行不同的选择;绿框部分表示我们需要编译一个SDK开发环境(默认情况下,此项未勾选)。

     

    编译过程中需要通过官网下载很多相关的软件包,所以必须保证能够顺利连上外网。由于下载速度的限制,编译过程大概需要数小时。编译结束后,所有的产品都会放在编译根目录下的bin/yourtarget/. 例如:我所编译的产物都放在./bin/brcm47xx/下,其中文件主要有几类:

     

    (1).bin/.trx 文件: 这些都是在我们所选的target-system的类别之下,针对不同路由器型号、版本编译的路由器固件。这些不同路由器的型号和版本是openwrt预先设置好的,我们不需要更改。至于.bin和.trx的区别,一种说法是,第一次刷路由器的时候,需要用.bin文件,如果需要再升级,则不能再使用.bin文件,而需要用.trx文件。原因是,.bin是将路由器的相关配置信息和.trx封装在一起而生成的封包,也就是说是包含路由器版本信息的.trx。在第一次刷固件的时候,我们需要提供这样的信息,而在后续升级时,则不再需要,用.trx文件即可。

     

    (2)packages文件夹: 里面包含了我们在配置文件里设定的所有编译好的软件包。默认情况下,会有默认选择的软件包。

     

    (3)OpenWrt-SDK.**.tar.bz2:  这个也就是我们定制编译好的OpenWRT SDK环境。我们将用这个来进行OpenWrt软件包的开发。例如,我所编译好的SDK环境包为:/bin/brcm47xx/OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2

    可以从名称上看出,target system是brcm47xx,host system是Linux-x86_64,使用的编译工具以及库是4.3.3+cs_uClibc-0.9.30.1。

     

    (4)md5sums 文件: 这个文件记录了所有我们编译好的文件的MD5值,来保证文件的完整性。因为文件的不完整,很容易将路由器变成“砖头”。

     

    需要主要的是,编译完成后,一定要将编译好的bin目录进行备份(如果里面东西对你很重要的话),因为在下次编译之前,执行make clean 会将bin目录下的所有文件给清除掉!!

     

    2、 更改原有packages

     

    在编译根目录下会有一个dl的目录,这个目录其实是“download”的简写,在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。编译时,会将软件包解压到build_dir目录下。

    当然,你也可以自己在dl里面创建自己的软件包,然后更改相关的配置文件,让openwrt可以识别这个文件包。

     

    由于我的项目更改的内容是底层的,需要跟固件一起安装。所以,我使用的方法就是直接更改dl目录下软件包,然后重新进行固件编译。感觉类似于Linux的内核编译。反复编过十多次,没有任何问题。

     

    3、 新建自己的packages

    对于自己新建的package,而这个package又不需要随固件一起安装,换句话说,就是可以当做一个可选软件包的话。我们可以利用我们的SDK环境来单独编译,编译后会生成一个ipk的文件包。然后利用 opkg install xxx.ipk 来安装这个软件。

     

    下面具体说下,如何编译一个helloword的软件包。

    (1)首先,编写helloworld程序

    编写helloworld.c

    /****************

    * Helloworld.c

    * The most simplistic C program ever written.

    * An epileptic monkey on crack could write this code.

    *****************/

     

    #include <stdio.h>

    #include <unistd.h>

    int main(void)

    {

         printf("Hell! O' world, why won't my code compile?\n\n");

         return 0;

    }

     

    编写Makefile文件

    # build helloworld executable when user executes "make"

     

    helloworld: helloworld.o

            $(CC) $(LDFLAGS) helloworld.o -o helloworld

     

    helloworld.o: helloworld.c

            $(CC) $(CFLAGS) -c helloworld.c

     

    # remove object files and executable when user executes "make clean"

    clean:

            rm *.o helloworld

                                     

    在这两个文件的目录下,执行make 应该可以生成helloworld的可执行文件。执行helloworld后,能够打印出“Hell! O' world, why won't my code compile?”。 这一步,主要保证我们的源程序是可以正常编译的。下面我们将其移植到OpenWRT上。

     

    (2)将OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2解压

    tar –xvf OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2

     

    (3)进入SDK

    cd OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1

    可以看到里面的目录结构跟我们之前source的目录结构基本相同,所需要编译的软件包,需要放置在package目录下

     

    (4)在package目录下创建helloworld目录

    cd package

    mkdir helloworld

    cd helloworld

     

    (5)创建src目录,拷贝 helloworld文件

    mkdir src

    cp /home/wrt/test/helloworld.c src

    cp /home/wrt/test/Makefile src

     

    (6)在helloworld目录下创建Makefile文件

    这个Makefile文件是给OpenWRT读的,而之前写的那个Makefile文件是针对helloworld给编译其读的。两个Makefile不在同一层目录下。

     

    touch Makefile

    vim Makefile

     

    Makefile文件模板内容如下:

    ##############################################

    # OpenWrt Makefile for helloworld program

    #

    #

    # Most of the variables used here are defined in

    # the include directives below. We just need to

    # specify a basic description of the package,

    # where to build our program, where to find

    # the source files, and where to install the

    # compiled program on the router.

    #

    # Be very careful of spacing in this file.

    # Indents should be tabs, not spaces, and

    # there should be no trailing whitespace in

    # lines that are not commented.

    #

    ##############################################

     

    include $(TOPDIR)/rules.mk

     

    # Name and release number of this package

    PKG_NAME:=helloworld

    PKG_RELEASE:=1

     

     

    # This specifies the directory where we're going to build the program.

    # The root build directory, $(BUILD_DIR), is by default the build_mipsel

    # directory in your OpenWrt SDK directory

    PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

     

     

    include $(INCLUDE_DIR)/package.mk

     

     

     

    # Specify package information for this program.

    # The variables defined here should be self explanatory.

    # If you are running Kamikaze, delete the DESCRIPTION

    # variable below and uncomment the Kamikaze define

    # directive for the description below

    define Package/helloworld

            SECTION:=utils

            CATEGORY:=Utilities

            TITLE:=Helloworld -- prints a snarky message

    endef

     

     

    # Uncomment portion below for Kamikaze and delete DESCRIPTION variable above

    define Package/helloworld/description

            If you can't figure out what this program does, you're probably

            brain-dead and need immediate medical attention.

    endef

     

     

     

    # Specify what needs to be done to prepare for building the package.

    # In our case, we need to copy the source files to the build directory.

    # This is NOT the default.  The default uses the PKG_SOURCE_URL and the

    # PKG_SOURCE which is not defined here to download the source from the web.

    # In order to just build a simple program that we have just written, it is

    # much easier to do it this way.

    define Build/Prepare

            mkdir -p $(PKG_BUILD_DIR)

            $(CP) ./src/* $(PKG_BUILD_DIR)/

    endef

     

     

    # We do not need to define Build/Configure or Build/Compile directives

    # The defaults are appropriate for compiling a simple program such as this one

     

     

    # Specify where and how to install the program. Since we only have one file,

    # the helloworld executable, install it by copying it to the /bin directory on

    # the router. The $(1) variable represents the root directory on the router running

    # OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install

    # directory if it does not already exist.  Likewise $(INSTALL_BIN) contains the

    # command to copy the binary file from its current location (in our case the build

    # directory) to the install directory.

    define Package/helloworld/install

            $(INSTALL_DIR) $(1)/bin

            $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/

    endef

     

     

    # This line executes the necessary commands to compile our program.

    # The above define directives specify all the information needed, but this

    # line calls BuildPackage which in turn actually uses this information to

    # build a package.

    $(eval $(call BuildPackage,helloworld))

     

     

    (7)返回到SDK的根目录

    执行make进行编译

    编译过程会在build_dir目录下完成

    编译结果会放在 bin/[yourtarget]/package目录下helloworld_1_bcm47xx.ipk

     

    (8)上传helloworld_1_bcm47xx.ipk

    使用sftp软件上传helloworld_1_bcm47xx.ipk至路由器

    执行 opkg install helloworld_1_bcm47xx.ipk

    输入hello然后按Tab键,发现openwrt中已经有helloworld可执行命令。

    执行 helloworld 查看程序的效果。

     

    Hell! O' world, why won't my code compile?

     

    【End】

     

    希望对大家能有帮助 :)

     

    -----------------------------------------------------------

    展开全文
  • openwrt开发ipk

    2014-07-15 15:33:40
    最近在做openwrt开发,本文详细讲解了,如何在openwrt下开发自己的程序固件ipk
  • Openwrt开发指南.docx

    2019-10-15 16:22:43
    本文档主要描述openwrt开发相关的指南,包括编译环境、固件烧录、启动脚本说明、makefile说明等内容
  • openwrt 开发笔记

    2019-08-29 09:48:44
    这里写自定义目录标题openWRT开发笔记log管理功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...

    1.log管理

    logd

    在openWRT系统中调试,需要查看自己的打印信息。可以用logread来查看。具体的操作为:
    #logread 将查看历史打印信息
    #logread -f 将查看实时的打印信息
    logread的实现流程主要是:连接共享内存->信号量加锁->读取共享内存中的信息并输出->信号量解锁。而log信息也是有一个logd的守护进程所处理的。查看进程信息可以看到:/sbin/logd -S 256;-S 256的含义就是分配256KB的内存空间来存储log信息;超过256KB的情况下会滚动覆盖。而 256的参数一般在/etc/config/system中的log_size值。可以根据需要来调整存储内存的大小。

    rsyslogd

    linux系统中读取内核启动打印信息。可以使用 cat /var/log/dmesg。
    linux系统中驱动调试的打印信息。可以用cat /var/log/kern.log。
      rsyslog 是一个快速处理收集系统日志的程序,提供了高性能、安全功能和模块化设计。rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的地,可以处理百万条信息。远程log管理,可以通过网络来传输log信息到指定主机。(具体另查)

    syslogd

    2.配置管理

    openWRT通用的配置信息均存在/etc/config目录下。如网络参数/etc/config/network;无线参数/etc/config/wireless。这些参数可以直接用编辑器进行编辑,或者用uci脚本命令来编辑。编辑完成后,可以直接重启脚本进行生效。

    网络参数配置

    基本网络接口配置
    config interface ‘lan’
    option ifname ‘eth0 eth1’
    option force_link ‘1’
    option type ‘bridge’
    option proto ‘static’
    option netmask ‘255.255.255.0’
    option gateway ‘10.10.10.1’
    option ip6assign ‘60’
    option ipaddr ‘10.10.10.98’
    端口VLAN配置
    config switch
    option name ‘switch0’
    option reset ‘0’

    config switch_vlan
    option device ‘switch0’
    option vlan ‘1’
    option ports ‘0t 1 2 3 4 5’
    4G上网PPP拨号配置
    config interface ‘ppp0’
    option proto ‘3g’
    option apn ‘ctnet’
    option dialnumber ‘*99#’
    option device ‘/dev/ttyUSB1’
    option service ‘umts’
    option username ‘ctnet@mycdma.cn’
    option password ‘vnet.mobi’
    当network参数配置完成后,需要即时生效配置后的参数,使用命令/etc/init.d/network reload来生效配置的参数。

    无线参数配置

    config wifi-device ‘wifi0’
    option type ‘qcawifi’
    option channel ‘auto’ //信道选择为自动
    option country ‘CN’ //区域选择为中国,这里主要是有些无线参数需符合当地无线电规范要求
    option hwmode ‘11ng’ //无线模式选择
    option txpower ‘12’ //发送功率 dBm
    option htmode ‘HT20’ //频宽

    config wifi-iface
    option device ‘wifi0’
    option network ‘lan’ //网络配置
    option mode ‘ap’ //工作模式,AP,Client,WDS等配置
    option ssid ‘SSID0’ //SSID配置
    option encryption ‘none’ //加密方式,目前无
    option disabled ‘0’ //wifi启动开关 0为开启
    option hidden 1 //是否隐藏SSID,1为隐藏

    当wifi的参数配置完成后,需要即时生效配置后的参数,需要执行wifi reload命令来生效。
    以上wifi参数配置分为一个wifi-device和一个wifi-iface的两个配置表。
    具体的wifi参数配置参考:https://blog.csdn.net/hui523hui523hui523/article/details/38493725

    SSH登入

    主要描述通过密钥方式登入SSH服务器,一般为Linux系统。本例用ubuntu作为参考测试。
    1.在ubuntu客户端创建要登入服务器端的用户账户:sudo adduser admin
    2.切换到admin账户下,使用ssh命令创建RSA密钥:ssh-keygen -b 1024 -t rsa;-b为设置密钥长度,可以不配置。该命令将在用户目录下的.ssh目录里产生私钥id_rsa 及公钥id_rsa.pub。
    3.如果服务器为ubuntu,即将公钥id_rsa.pub复制到对应的用户目录.ssh下authorized_keys文件;现在为openwrt中的web配置,将公钥id_rsa.pub内的所有字符串内容拷贝到web配置管理内。
    在这里插入图片描述
    4.将公钥保存在登入服务器上了,此时可以免密登入了。登入命令:ssh admin@192.168.1.1 -i id_rsa;IP地址为SSH服务器的IP地址。
    5.注,必须确保服务器有此用户名可以访问,及对应的SSH服务为重新生效配置的。

    3. VRRP配置

    虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准。
    具体应用实例描述:http://www.h3c.com/cn/d_200904/631528_30003_0.htm

    3.1编译配置

    1.配置编译openWRT支持VRRP,在make menuconfig中:

    network---> 
    	<*> keepalived............... Failover and monitoring daemon for LVS clusters
    

    2.编译openwrt,同其他编译一样生成Image。
    3.查看启动脚本

    //查看启动脚本,cat /etc/init.d/keepalived或cat /etc/rc.d/S70keepalived 
    root@openwrt:~# cat /etc/rc.d/S70keepalived 
    #!/bin/sh /etc/rc.common
    # Copyright (C) 2007-2015 OpenWrt.org
    START=70
    SERVICE_USE_PID=1
    start() {
            service_start /usr/sbin/keepalived
    }
    stop() {
            service_stop /usr/sbin/keepalived
    }
    

    4.编辑配置文件;注意格式,tab,空格等。

    root@openwrt:~# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    
    vrrp_instance VI_1 {
        state BACKUP	//如果是MASTER,这里就用MASTER
        interface br-lan
        virtual_router_id 51	//虚拟路由器组,同一组的配置,该值必须一致
        priority 99		//优先级,数值越大,优先级越高,在抢占中会或者MASTER,MASTER的优先级比BACKUP高,MASTER配置成200。
        advert_int 1		//MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒
        authentication {
            auth_type PASS	//验证类型,主要有PASS、AH 两种,通常使用的类型为PASS
            auth_pass 1111	//验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。
        }
        virtual_ipaddress {
            10.10.10.116	//虚拟ip地址,可以有多个地址,每个地址占一行.
        }
    }
    

    配置选项参数描述:
    nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
    preempt_delay #抢占延时,默认5分钟

    3.2调试

    当配置完成后,开始调试。
    1.分别启动MASTER与BABKUP虚拟路由器的keepalived。分别查看VIP的情况,只有MASTER才能生成VIP接口,BACKUP不生成;当BACKUP变成MASTER后,即生成VIP接口。

    MASTER:# ip addr
    7: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 78:b6:c1:04:1f:54 brd ff:ff:ff:ff:ff:ff
        inet 10.10.10.98/24 brd 10.10.10.255 scope global br-lan
           valid_lft forever preferred_lft forever
        inet 10.10.10.116/32 scope global br-lan	//VIP生成
           valid_lft forever preferred_lft forever
        inet6 fd04:64ed:d8b7::1/60 scope global 
           valid_lft forever preferred_lft forever
        inet6 fe80::7ab6:c1ff:fe04:1f54/64 scope link 
           valid_lft forever preferred_lft forever
    
    BACKUP:# ip addr
    12: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 7e:41:e0:e6:1b:0b brd ff:ff:ff:ff:ff:ff
        inet 10.10.10.99/24 brd 10.10.10.255 scope global br-lan
           valid_lft forever preferred_lft forever
        inet6 fd5f:6c07:c024::1/60 scope global noprefixroute 
           valid_lft forever preferred_lft forever
        inet6 fe80::7c41:e0ff:fee6:1b0b/64 scope link 
           valid_lft forever preferred_lft forever
    

    2.此时可以ping VIP接口,再用arp -a查看对应的MAC地址,确认是哪个设备上的。如果虚拟路由器有web server,也可以通过VIP来访问web,看是否对应正常。
    3.此时关闭MASTER路由器的keepalived,#killall keepalived。再在BACKUP路由器上查看是否获取到VIP接口。如果获取到,BACKUP路由器将变成MASTER路由器,由于刚才的MASTER路由器异常。

    12: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 7e:41:e0:e6:1b:0b brd ff:ff:ff:ff:ff:ff
        inet 10.10.10.99/24 brd 10.10.10.255 scope global br-lan
           valid_lft forever preferred_lft forever
        inet 10.10.10.116/32 scope global br-lan	//此时VIP在BACKUP路由器上获取到,变成MASTER
           valid_lft forever preferred_lft forever
        inet6 fd5f:6c07:c024::1/60 scope global noprefixroute 
           valid_lft forever preferred_lft forever
        inet6 fe80::7c41:e0ff:fee6:1b0b/64 scope link 
           valid_lft forever preferred_lft forever
    

    4.此时可以ping VIP接口,再用arp -a查看对应的MAC地址,确认是哪个设备上的。如果虚拟路由器有web server,也可以通过VIP来访问web,看是否对应正常。如果一切正常,ping通的是原来BACKUP路由器(现在变成了MASTER)
    5.现在把原来的MASTER再次运行,由于配置都没有改变,按照要求原来的MASTER会变回MASTER,原来的BACKUP(现在是MASTER)会变回为BACKUP。

    4.vmware搭建LEDE软路由

    4.1环境准备

    4.1.1 LEDE镜像下载安装

    1)LEDE镜像软件包下载。
    vmware安装镜像包下载
    点击以上链接后,下载 openwrt-koolshare-mod-v2.31-r10822-50aa0525d1-x86-64-combined-squashfs.vmdk;也可以根据自己的需求选择。
    2)vmware安装,略
    3)将镜像安装到vmware中,略。

    安装参考:https://www.jianshu.com/p/8f84f444a1d8

    4.1.2 组网环境

    目前在路由器(192.168.100.1)下连接两个PC,一个安装vmware LEDE虚拟路由,一个就是普通的PC。网络参数配置如下。PC上下行网络通信分别红色蓝色的数据流通过LEDE Router转发,PC在Router上是二层转发。
    在这里插入图片描述

    4.2配置虚拟网卡

    需要模拟路由,需要配置两个虚拟网卡,分别配置如下:
    配置VMnet0为主机模式,配置VMnet1为桥接模式,桥接到物理接口上。其原理就是,在LEDE系统中有两个接口,eth0作为LAN口,eth1作为WAN口使用;而这两个接口跟VMnet*接口有对应的关系。一定要按照这个顺序配置。WAN口桥接是为了跟上行路由器处于同一网段使用。LAN口作为主机接口仅用于接口通信(或LAN口也配置为桥接模式。

    注意:VMnet0子网地址段需要配置成与Router的LAN接口同网段192.168.100.0。否则可能网络不通。
    在这里插入图片描述
    在这里插入图片描述
    查看LEDE中的网络接口信息:

    root@Openwrt:~# ifconfig
    br-lan    Link encap:Ethernet  HWaddr 00:0C:29:D9:F8:E2
              inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fed9:f8e2/64 Scope:Link
              inet6 addr: fd04:64ed:d8b7:4::1/62 Scope:Global
              inet6 addr: fd51:d813:a03a::1/60 Scope:Global
              inet6 addr: fd51:d813:a03a:4::1/62 Scope:Global
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:32063 errors:0 dropped:24 overruns:0 frame:0
              TX packets:28598 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:2605197 (2.4 MiB)  TX bytes:15850313 (15.1 MiB)
    
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:D9:F8:E2
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:130246 errors:0 dropped:0 overruns:0 frame:0
              TX packets:29750 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:34853815 (33.2 MiB)  TX bytes:17440958 (16.6 MiB)
    
    eth1      Link encap:Ethernet  HWaddr 00:0C:29:D9:F8:EC
              inet addr:192.168.100.176  Bcast:192.168.100.0  Mask:255.255.255.0
              inet6 addr: fd51:d813:a03a:0:20c:29ff:fed9:f8ec/64 Scope:Global
              inet6 addr: fd04:64ed:d8b7:4:20c:29ff:fed9:f8ec/64 Scope:Global
              inet6 addr: fd04:64ed:d8b7:0:20c:29ff:fed9:f8ec/64 Scope:Global
              inet6 addr: fd51:d813:a03a:4:20c:29ff:fed9:f8ec/64 Scope:Global
              inet6 addr: fe80::20c:29ff:fed9:f8ec/64 Scope:Link
              inet6 addr: fd51:d813:a03a:4::7c6/128 Scope:Global
              inet6 addr: fd51:d813:a03a::7c6/128 Scope:Global
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:19625 errors:0 dropped:16 overruns:0 frame:0
              TX packets:11203 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:6168258 (5.8 MiB)  TX bytes:1020847 (996.9 KiB)
    

    4.3 LEDE 系统访问

    如果一切正常,通过192.168.1.1可以正常访问web。访问密码为koolshare。
    ssh登入为:user:root,password:koolshare。

    root@Openwrt:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         192.168.100.1   0.0.0.0         UG    0      0        0 eth1
    192.168.1.0     *               255.255.255.0   U     0      0        0 br-lan
    192.168.100.0   *               255.255.255.0   U     0      0        0 eth1
    root@Openwrt:~# brctl show
    bridge name     bridge id               STP enabled     interfaces
    br-lan          7fff.000c29d9f8e2       no              eth0
    
    root@Openwrt:~# cat /etc/config/network
    
    config interface 'loopback'
            option ifname 'lo'
            option proto 'static'
            option ipaddr '127.0.0.1'
            option netmask '255.0.0.0'
    
    config globals 'globals'
            option ula_prefix 'fd51:d813:a03a::/48'
            option multipath 'disable'
            option mptcp_path_manager 'fullmesh'
            option mptcp_scheduler 'default'
            option congestion 'bbrplus'
            option mptcp_checksum '0'
            option mptcp_debug '0'
            option mptcp_syn_retries '5'
            option mptcp_fullmesh_num_subflows '1'
            option mptcp_fullmesh_create_on_err '1'
            option mptcp_ndiffports_num_subflows '1'
    
    config interface 'lan'
            option type 'bridge'
            option ifname 'eth0'
            option proto 'static'
            option ipaddr '192.168.1.1'
            option netmask '255.255.255.0'
            option ip6assign '60'
    
    config interface 'wan'
            option ifname 'eth1'
            option proto 'static'
            option multipath 'off'
            option ipaddr '192.168.100.176'
            option netmask '255.255.255.0'
            option gateway '192.168.100.1'
            option dns '192.168.100.1'		#注意默认情况下,路由器自身未配置DNS,无法安装插件,需要添加这行来上网
            option broadcast '192.168.100.0'
    
    

    从以上信息可以看到,eth0为br-lan的一个接口加入到桥,eth1为WAN接口。

    4.4 软路由安装

    实体系统软路由安装参考:https://www.jianshu.com/p/19b3afac41b1

    4.5 源码编译安装

    1.下载源码:

    1.下载路径:
    #git clone https://git.openwrt.org/openwrt/openwrt.git
    2.镜像下载:
    #git clone https://github.com/openwrt/openwrt.git
    3.本地下载:chaos_calmer 版
    #git clone https://gitee.com/greenice897/openwrt.git
    

    2.更新安装:

    #cd openwrt
    #更新feeds.conf中的种子包
    #./scripts/feeds update -a
    #安装软链接到package/feeds/,这样make menuconfig才能进行相关配置
    #./scripts/feeds install -a
    

    3.配置编译选项:为了使虚拟机使用编译生成VMDK文件。
    Target System (x86)
    [] Build VMware image files (VMDK)
    <
    > luci-app-uhttpd… uHTTPd Webserver Configuration
    其他配置根据需求配置完成。
    4.编译:make
    5.编译生成:bin/targets/x86/generic/
    openwrt-x86-generic-generic-squashfs-combined.vmdk为vmware使用Image。

    5.网络应用

    5.1 PPTP通过4G ppp拨号建立

    5.1.1 4G ppp拨号配置

    这部分在以下文章中描述完成
    https://blog.csdn.net/chenchao03/article/details/88970288

    5.1.2 PPTP配置

    1.进入接口配置页配置PPTP的相关参数,如下。
    在这里插入图片描述
    2.参看下防火墙配置,配置为WAN接口。
    在这里插入图片描述
    3.拨号成功后:
    在这里插入图片描述
    当拨号成功后,就可以访问PPTP服务器,及PPTP路由的内网地址。

    5.1.3 命令行查看配置信息:

    1.参数配置:

    admin@openwrt:~# cat /etc/config/network 
    
    config interface 'loopback'
            option ifname 'lo'
            option proto 'static'
            option ipaddr '127.0.0.1'
            option netmask '255.0.0.0'
    
    config globals 'globals'
            option ula_prefix 'fd04:64ed:d8b7::/48'
    
    config interface 'lan'
            option force_link '1'
            option type 'bridge'
            option proto 'static'
            option ipaddr '10.10.10.99'
            option netmask '255.255.255.0'
            option gateway '10.10.10.1'
            option ip6assign '60'
            option _orig_ifname 'eth1'
            option _orig_bridge 'true'
            option ifname 'eth0 eth1'
            option delegate '0'
    
    config switch 'eth1'
            option reset '1'
            option enable_vlan '1'
    
    config interface 'ppp0'	//4G 上网 PPP
            option proto '3g'
            option apn 'ctnet'
            option dialnumber '*99#'
            option device '/dev/ttyUSB0'
            option service 'umts'
            option username 'ctnet@mycdma.cn'
            option password 'zpqxwlan3g'
    
    config interface 'pptp' //建立PPTP 配置
            option proto 'pptp'
            option server '125.119.222.173' 
            option username 'pptpall'
            option password 'qaz123'
            option mppe '128bit'
            option overinteface '3g-ppp0'	//使用以上ppp拨号接口建立
    

    2.成功后的路由信息:

    admin@AOBO:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         192.168.2.10    0.0.0.0         UG    0      0        0 pptp-pptp
    10.10.10.0      *               255.255.255.0   U     0      0        0 br-lan
    10.64.64.64     *               255.255.255.255 UH    0      0        0 3g-ppp0
    125.119.222.173 *               255.255.255.255 UH    0      0        0 3g-ppp0
    192.168.2.10    *               255.255.255.255 UH    0      0        0 pptp-pptp
    admin@
    ###修改路由信息如下:
    AOBO:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         10.64.64.64     0.0.0.0         UG    0      0        0 3g-ppp0
    10.10.10.0      *               255.255.255.0   U     0      0        0 br-lan
    10.64.64.64     *               255.255.255.255 UH    0      0        0 3g-ppp0
    125.119.222.173 *               255.255.255.255 UH    0      0        0 3g-ppp0
    192.168.2.10    *               255.255.255.255 UH    0      0        0 pptp-pptp
    192.168.10.0    192.168.2.10    255.255.255.0   UG    0      0        0 pptp-pptp
    

    修改后的路由表信息分析:
    第一行:默认路由,非后面的路由信息均通过10.64.64.64走3g-ppp0接口;
    第二行:10.10.10.X的局域网内的IP地址访问,均在br-lan桥内,即局域网;
    第三行:访问10.64.64.64的IP地址通过3g-ppp0接口访问;
    第四行:访问125.119.222.173的IP地址通过3g-ppp0接口访问;
    第五行:访问192.168.2.10的IP地址通过pptp-pptp接口访问;
    第六行:访问192.168.10.X的IP地址通过192.168.2.10走pptp-pptp接口访问;
    3.成功后的接口信息:

    admin@openwrt:~# ifconfig
    3g-ppp0   Link encap:Point-to-Point Protocol  
              inet addr:100.82.215.172  P-t-P:10.64.64.64  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
              RX packets:651 errors:0 dropped:0 overruns:0 frame:0
              TX packets:660 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:3 
              RX bytes:63214 (61.7 KiB)  TX bytes:63380 (61.8 KiB)
    
    br-lan    Link encap:Ethernet  HWaddr 78:B6:C1:04:31:40  
              inet addr:10.10.10.99  Bcast:10.10.10.255  Mask:255.255.255.0
              inet6 addr: fe80::7ab6:c1ff:fe04:3140/64 Scope:Link
              inet6 addr: fd04:64ed:d8b7::1/60 Scope:Global
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:4057 errors:0 dropped:0 overruns:0 frame:0
              TX packets:2544 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:305459 (298.2 KiB)  TX bytes:343136 (335.0 KiB)
    
    pptp-pptp Link encap:Point-to-Point Protocol  
              inet addr:192.168.2.17  P-t-P:192.168.2.10  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1400  Metric:1
              RX packets:502 errors:0 dropped:0 overruns:0 frame:0
              TX packets:498 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:3 
              RX bytes:29832 (29.1 KiB)  TX bytes:29470 (28.7 KiB)
    

    4./etc/init.d/route.sh 信息:
    该脚本一直运行中,用来检查vpn拨号前的route信息配置,以便可以成功配置网络联通。

    admin@openwrt:~# cat /etc/init.d/route.sh 
    vpn_state=0
    vpn_startup=0
    lte_if0_name="3g-ppp0"
    lte_if1_name="3g-ppp1"
    lte_if_link=0
    
    vpn_check()
    {
    	vpn_if=$(uci show network | grep "overinteface" | cut -d "=" -f 2)
    	vpn_if_link=$(cat /sys/class/net/eth0/carrier)
    	VPN_SERVER=$(uci get network.vpn.server)
    	if [ "$vpn_startup" == "0" ];then
    		/sbin/ifdown vpn
    		sleep 3
    		/sbin/ifup vpn
    		vpn_startup=1
    		return
    	fi
    
    #	echo "###vpn if:$vpn_if, link:$vpn_if_link, serverip:$VPN_SERVER." > /dev/console
    #	echo "###chenchao:pptp vpnwan:$vpnwan" > /dev/console
    	if [ "$vpn_if" == "$lte_if0_name" ] || [ "$vpn_if" == "$lte_if1_name" ];then
    
    		vpn_link_info=$(route |grep "vpn" | awk '{print $2}')
    		if [ "$vpn_link_info" != "" ];then
    			vpn_check_num=0
    		else
    			let "vpn_check_num+=1"
    			if [ $vpn_check_num -ge 60 ];then
    				/sbin/ifdown vpn
    				sleep 3
    				/sbin/ifup vpn
    				vpn_startup=1
    	#			echo "vpn unlink, restart up vpn IF." > /dev/console
    				vpn_check_num=0
    				return
    			fi
    		fi
    #		echo "VPN if is lte:$vpn_if, lte_if_link:$lte_if_link." > /dev/console
    		host_lan_route=$(uci get system.@system[0].hostname)
    		lte_route_err=$(route |grep "$(host_lan_route).lan" | awk '{print $2}')
    		echo "vpn_check_num:$vpn_check_num, lte_route_err:$lte_route_err."
    		if [ "$lte_route_err" != "" ] && [ "$lte_route_err" != "*" ];then
    			lte_if_link=0
    		fi
    
    		if_info=$(ifconfig | grep $vpn_if)
    		if [ "$if_info" != "" ];then
    		if [ $lte_if_link -eq 0 ];then
    			vpn_gw=$(route |grep 'default' | awk '{print $2}')
    			if [ -z "$vpn_gw" ];then
    #				echo "###vpn gateway is NULL, return." > /dev/console
    				return
    			fi
    
    			echo "($vpn_if) is $VPN_SERVER, route is $vpn_gw." > /dev/console
    			route del -host $VPN_SERVER dev br-lan
    			route add -net $VPN_SERVER netmask 255.255.255.255 gw $vpn_gw
    			lte_if_link=1
    		fi
    		else
                vpn_link_info=$(route |grep "vpn" | awk '{print $2}')
                if [ "$vpn_link_info" != "" ];then
                    /sbin/ifdown vpn
                fi
    			lte_if_link=0
    		fi
    		return
    	else
    		echo ""
    		lte_if_link=0
    #		echo "###vpn is not lte if,the if is: $vpn_if." > /dev/console
    	fi
    
    	if [ "$vpn_if" == "eth0" ];then
    		if [ "$vpn_startup" == "5550" ];then
    			/sbin/ifdown vpn
    			sleep 3
    			/sbin/ifup vpn
    			vpn_startup=1
    			return
    		fi
    		if [ "$vpn_if_link" == "0" ];then
    #			echo "###vpn wan interface is link down" > /dev/console
    			if [ "$vpn_state" == "0" ];then
    				return
    			fi
    			/sbin/ifdown vpn
    			vpn_state=0
    			sleep 1
    			return
    		fi
    
    #		echo "###vpn_state:$vpn_state." > /dev/console
    		# VPN WAN if is up
    		if [ "$vpn_state" == "0" ];then
    #			echo "###vpn wan interface is link up" > /dev/console
    			vpn_gw=$(route |grep 'default' | awk '{print $2}')
    			if [ -z "$vpn_gw" ];then
    #				echo "###vpn gateway is NULL, return." > /dev/console
    				return
    			fi
    
    			echo "($vpn_if) is $VPN_SERVER, route is $vpn_gw." > /dev/console
    
    			route del -host $VPN_SERVER dev br-lan
    			route add -net $VPN_SERVER netmask 255.255.255.255 gw $vpn_gw
    			vpn_state=1
    			
    			# up vpn if
    			/sbin/ifup vpn
    			return
    		fi
    		return
    	else
    #		echo "###vpn if:$vpn_if, undo." > /dev/console
    		vpn_state=0
    	fi
    }
    
    vpn_handle()
    {
    	for proto_name in pptp l2tp
    	do
    #		echo "###vpn WAN protocol is: $proto_name." > /dev/console
    		vpn_protocol=$(uci show network.vpn | grep "proto=$proto_name" | cut -d "=" -f 2)
    		if [ "$vpn_protocol" ];then
    #			echo "###vpn WAN protocol is2: $vpn_protocol." > /dev/console
    			vpn_check
    			break
    		else
    			echo ""
    #			echo "###vpn WAN protocol is: $proto_name, is NULL." #> /dev/console
    		fi
    	done
    }
    
    start()
    {
    while [ "1" == "1" ]
    do
    	vpn_handle		#循环处理vpn拨号前的路由信息。
    	sleep 1
    done
    }
    
    

    5.2 PPTP WAN接口

    本openwrt系统平台上,eth0作为wan口,eth1作为lan口。本地LAN(br-lan)接口IP为10.10.10.99;WAN(eth0)接口IP为:DHCP获取(获取IP为:192.168.1.108);PPTP server IP地址为:192.168.1.31,配置的PPTP接口IP为192.168.0.1,预分配的IP池为:192.168.0.200-192.168.0.230。

    5.2.1配置WAN接口

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5.2.2 配置PPTP接口

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5.2.3 路由信息添加

    在这里插入图片描述

    5.2.4 查看信息表

    进入openwrt的终端命令行查看运行信息。

    pptp-pptp Link encap:Point-to-Point Protocol  
              inet addr:192.168.0.200  P-t-P:192.168.0.1  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
              RX packets:10 errors:0 dropped:0 overruns:0 frame:0
              TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:3 
              RX bytes:420 (420.0 B)  TX bytes:452 (452.0 B)
    
    admin@AOBO:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         192.168.0.1     0.0.0.0         UG    0      0        0 pptp-pptp
    10.10.10.0      *               255.255.255.0   U     0      0        0 br-lan
    192.168.0.1     *               255.255.255.255 UH    0      0        0 pptp-pptp
    192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
    192.168.1.31    *               255.255.255.255 UH    0      0        0 eth0
    

    5.2.5 脚本优化

    命令脚本连接PPTP,或关闭PPTP:

    #/sbin/ifup pptp	//连接
    #/sbin/ifdown pptp	//关闭
    

    5.3 IPsec 移植开发

    openwrt下的IPsec也是用strongswan来处理的,具体调试可以见Linux下的strongswan配置移植开发。

    5.3.1 openwrt 配置编译

    进入openwrt源码目录,运行make menuconfig配置编译strongswan与web相关配置
    配置luci功能支持:
    在这里插入图片描述
    配置uhttpd支持web服务:
    在这里插入图片描述
    配置strongswan及进入strongswan配置页配置需要的参数:
    在这里插入图片描述

    5.3.2 web页面开发

    在network主页面下增加一个IPsec子页面。

    #cat /usr/lib/lua/luci/controller/admin/network.lua
    function index() 
    --该函数下最后一行增加IPsec配置页选项
    entry({"admin","network","ipsec"},cbi("admin_network/ipsec"),_("IPsec"),130) 	--这里的130是页面选项插在第几个链表上。
    end
    

    编辑ipsec.lua配置页放置在/usr/lib/lua/luci/model/cbi/admin_network/ipsec.lua下;这样network.lua将能关联到该配置页。

    require("luci.sys")
    require("luci.sys.zoneinfo")
    require("luci.tools.webadmin")
    require("luci.fs")
    require("luci.config")
    
            arg[1] = arg[1] or ""
            local m,s,o,a,b
    
            m = Map("ipsec", translate("IPsec"))
            m:chain("luci")
            s = m:section(TypedSection, "basic_config", translate("Basic Configuation"))	--配置IPsec基本配置
            s.anonymous = true                                                          
            s.addremove = false      
            o = s:option( ListValue, "tunnel_type", translate("tunnel type"))           
            o:value("net2net", translate("net2net"))                                    
            o:value("net2host", translate("net2host"))                                  
                                                                                        
            o = s:option( Value, "gateway", translate("gateway"))                       
            o.datatype = "ip4addr"  
    -- 后续参数省略,同样的规则编程
            s = m:section(TypedSection, "advance_config", translate("Advance Configuation"))    --高级配置
            s.anonymous = true                                                                  
            s.addremove = false                                                                 
                                                                                                
            o = s:option( Flag, "advance_enabled", translate("Enable Advance Configuration"))   --复选框使能高级配置项
            o.rmempty = false   
            
            o = s:option( Value, "local_identifier", translate("local_identifier"))   --leftid配置                
            o.datatype = "string"                                                                     
            o:depends("advance_enabled", "1")     --代表1使能                                                    
                                                                                                      
            o = s:option( Value, "remote_identifier", translate("remote_identifier"))                 
            o.datatype = "string"                                                                     
            o:depends("advance_enabled", "1")   
    
            local apply = luci.http.formvalue("cbi.apply")                                            
            if apply then                                                                             
              luci.sys.call("/etc/init.d/ipsec start &")    --这里是shell脚本调用,主要处理uci配置到linux ipsec的配置参数文件的转化 。这里加&符号是指后台运行,不阻塞当前任务。即将新生成的配置文件生效,后续ipsec脚本可以使用。                                     
            end                                                                                       
    return m 
    
    

    多配置页风格,此时ipsec脚本需要对应修改,因为/etc/config/ipsec配置文件仅支持一个配置list。

    require("luci.sys")
    require("luci.sys.zoneinfo")
    require("luci.tools.webadmin")
    require("luci.fs")
    require("luci.config")
    
            arg[1] = arg[1] or ""
            local m,s,o,a,b
    
            m = Map("ipsec", translate("IPsec"))
            m:chain("luci")
    
    --
    -- remote
    --
            s = m:section(TypedSection, "basic_config", translate(""))
            s.anonymous = true
            s.addremove = false
    
            s:tab("general", translate("General Settings"))
            s:tab("advanced", translate("Advance Configuration"))
    
    
    --      o = s:option( Flag, "enabled", translate("Enabled"))
            o = s:taboption( 'general', Flag, "enabled", translate("Enabled"))
            o.rmempty = false
    
            o = s:taboption( 'general', ListValue, "tunnel_type", translate("tunnel_type"))
            o:value("net-net", translate("net-net"))
            o:value("host-host", translate("host-host"))
            o:depends("enabled", "1")
    
            o = s:taboption( 'general', Value, "interface", translate("interface"))
            for k, v in ipairs(luci.sys.net.devices()) do
                    if v ~= "lo" and v ~= "eth1" and v ~= "gre0" and v ~= "gretap0" and v ~= "br-lan" then
                            o:value(v)
                    end
            end
    --      o.datatype = "string"
            o:depends("enabled", "1")
    
            o = s:taboption( 'general', ListValue, "connect_mode", translate("Connect Mode"))
            o:value("Master", translate("Master"))
            o:value("Slave", translate("Slave"))
            o:depends("enabled", "1")
    
            o = s:taboption( 'general', Value, "gateway", translate("gateway"))
            o.datatype = "ip4addr"
            o.placeholder="0.0.0.0"
            o:depends("enabled", "1")
            o.deps[1]['deps']['connect_mode'] = 'Slave'
    
            o = s:taboption( 'general', ListValue, "keyexchange", translate("keyexchange"))
    --      o:value("ikev1", translate("ikev1"))
            o:value("ikev2", translate("ikev2"))
            o:depends("enabled", "1")
    
            o = s:taboption( 'general', ListValue, "authentication_method", translate("authentication_method"))
            o:value("psk", translate("psk"))
            o:depends("enabled", "1")
    
            o = s:taboption( 'general', Value, "pre_shared_key", translate("pre_shared_key"))
            o.datatype = "string"
            o:depends("enabled", "1")
    
            o = s:taboption( 'general', Value, "local_subnet", translate("local_subnet"))
            o.datatype = "ip4addr"
            o:depends("enabled", "1")
            o.deps[1]['deps']['tunnel_type'] = 'net-net'
    
            o = s:taboption( 'general', Value, "remote_subnet", translate("remote_subnet"))
            o.datatype = "ip4addr"
            o:depends("enabled", "1")
            o.deps[1]['deps']['tunnel_type'] = 'net-net'
    --
    -- p1_proposal
    --
    
    --      s = m:section(TypedSection, "advance_config", translate("Advance Configuration"))
    --      s.anonymous = true
    --      s.addremove = false
            o = s:taboption( 'advanced', Flag, "advance_enabled", translate("Enabled"))
            o.rmempty = false
    
            o = s:taboption( 'advanced', Value, "local_identifier", translate("local_identifier"))
            o.datatype = "string"
            o:depends("advance_enabled", "1")
    
            o = s:taboption( 'advanced', Value, "remote_identifier", translate("remote_identifier"))
            o.datatype = "string"
            o:depends("advance_enabled", "1")
    
            o = s:taboption( 'advanced', ListValue, "ike_key", translate("ike_key"))
            o:value("3des-md5-modp1024", translate("3des-md5-modp1024"))
            o:value("3des-sha1-modp1024", translate("3des-sha1-modp1024"))
            o:value("aes128-md5-modp1024", translate("aes128-md5-modp1024"))
            o:value("aes128-sha1-modp1024", translate("aes128-sha1-modp1024"))
            o:value("aes256-sha1-modp1024", translate("aes256-sha1-modp1024"))
            o:depends("advance_enabled", "1")
    
            o = s:taboption( 'advanced', ListValue, "esp_key", translate("esp_key"))
            o:value("3des-md5-modp1024", translate("3des-md5-modp1024"))
            o:value("3des-sha1-modp1024", translate("3des-sha1-modp1024"))
            o:value("aes128-md5-modp1024", translate("aes128-md5-modp1024"))
            o:value("aes128-sha1-modp1024", translate("aes128-sha1-modp1024"))
            o:value("aes256-sha1-modp1024", translate("aes256-sha1-modp1024"))
            o:depends("advance_enabled", "1")
    
            o = s:taboption( 'advanced', Value, "dpddelay", translate("dpddelay"))
            o.datatype = "string"
            o:depends("advance_enabled", "1")
    
            o = s:taboption( 'advanced', Value, "dpdtimeout", translate("dpdtimeout"))
            o.datatype = "string"
            o:depends("advance_enabled", "1")
    
            o = s:taboption( 'advanced', Value, "dpdaction", translate("dpdaction"))
            o:value("none", translate("none"))
            o:value("restart", translate("restart"))
            o:depends("advance_enabled", "1")
    
            local apply = luci.http.formvalue("cbi.apply")
            if apply then
              luci.sys.call("/etc/init.d/ipsec start &")
            end
    return m
    

    到此,在页面上就有完整的呈现了,具体如下:
    在这里插入图片描述
    接下来需要配置openwrt的配置文件(/etc/config/ipsec)到linux strongswan的配置文件(/etc/ipsec.conf)的转换,使用shell来完成。

    #cat /etc/init.d/ipsec
    #!/bin/sh /etc/rc.commonNAME=ipsec
    START=60
    STOP=60
    
    . $IPKG_INSTROOT/lib/functions.sh
    FileConn=/etc/ipsec.conf
    
    ipsec_cfg() {                                                                              
            rm -rf /etc/ipsec.conf                                                             
            echo "config setup" >> $FileConn                                                   
            echo "conn %default" >> $FileConn                                                  
            echo "  ikelifetime=60m" >> $FileConn                                              
            echo "  keylife=20m" >> $FileConn                                                  
            echo "  rekeymargin=3m" >> $FileConn                                               
            echo "  keyingtries=1" >> $FileConn                                                
            echo "  authby=secret" >> $FileConn                                                
            echo "  mobike=no" >> $FileConn                                                    
            echo "  keyexchange=$1" >> $FileConn                                               
    }  
    config_tun() {                                                                             
            local gateway                                                                      
            local pre_shared_key                                                               
            local authentication_method                                                        
                                                                                               
            config_get gateway                                      "$1" gateway               
            config_get pre_shared_key                       "$1" pre_shared_key                
            config_get authentication_method        "$1" authentication_method                 
            config_get local_subnet                         "$1" local_subnet                  
            config_get remote_subnet                        "$1" remote_subnet                 
            config_get exchange_mode                        "$1" exchange_mode                 
                                                                                               
            ipsec_cfg $exchange_mode                                                           
                                                                                               
            rm -rf /etc/ipsec.secrets                                                          
            echo ": PSK $pre_shared_key" >> /etc/ipsec.secrets                                 
                                                                                               
            echo "conn net-net" >> $FileConn                                                   
            echo "  left=%any" >> $FileConn                                                    
            echo "  leftsubnet=$local_subnet" >> $FileConn                                     
            echo "  right=$gateway" >> $FileConn                                               
            echo "  rightsubnet=$remote_subnet" >> $FileConn                                   
            echo "  auto=start" >> $FileConn                                                   
    }   
    advance_tun() {                                                                            
            local advance_enabled                                                              
            local local_identifier                                                             
            local remote_identifier                                                            
                                                                                               
            config_get local_identifier                     "$1" local_identifier              
            config_get remote_identifier            "$1" remote_identifier                     
            config_get advance_enabled                      "$1" advance_enabled               
                                                                                               
            echo "debug enable:$advance_enabled" > /dev/console                                
            if [ "$advance_enabled" == "1" ];then                                              
                    echo "enabled advance IPsec." > /dev/console                               
                    echo "leftid=$local_identifier" > /dev/console                             
                    echo "  leftid=$local_identifier" >> $FileConn                             
                    echo "  rightid=$remote_identifier" >> $FileConn                           
            else                                                                               
                    echo "disabled advance IPsec." > /dev/console                              
            fi                                                                                 
            echo "local_id:$local_identifier" > /dev/console                                   
    }  
    start() {                                                                                  
    #  CheckInstallation                                                                       
    #  PrepareEnvironment   
                                                                                                                                                                                                       
            config_load ipsec                                                                                                                      
            config_foreach config_tun basic_config                                             
            config_foreach advance_tun advance_config                                          
                                                                                               
            /usr/sbin/ipsec restart                                                                                                       
    }                                                                                          
                                                                                               
    stop() {                                                                                   
      /usr/sbin/ipsec stop                                                                     
    }    
    
    

    此时将完成/etc/config/ipsec到/etc/ipsec.conf的转变,还有/etc/ipsec.secrets的生成。注意:/etc/config/ipsec配置文件可能需要默认配置生成,否则页面不能呈现。
    具体如下:

    # cat /etc/config/ipsec 
    
    config ipsec
            option zone 'vpn'
    
    config basic_config 'ipsec_b'
            option authentication_method 'psk'
            option local_subnet '10.10.10.0/24'
            option remote_subnet '192.168.100.0/24'
            option pre_shared_key 'adminipsec'
            option exchange_mode 'ikev2'
            option gateway '192.168.2.30'
            option tunnel_type 'net2net'
    
    config advance_config 'ipsec_a'
            option advance_enabled '1'
            option local_identifier '@moon.com'
            option remote_identifier '@sun.com'
    # cat /etc/ipsec.conf 
    config setup
    conn %default
            ikelifetime=60m
            keylife=20m
            rekeymargin=3m
            keyingtries=1
            authby=secret
            mobike=no
            keyexchange=ikev2
    conn net-net
            left=%any
            leftsubnet=10.10.10.0/24
            right=192.168.2.30
            rightsubnet=192.168.100.0/24
            auto=start
            leftid=@moon.com
            rightid=@sun.com
    # cat /etc/ipsec.secrets 
    : PSK adminipsec
    #
    

    5.4 中继桥

    openwrt通过中继桥设置进行无线中继,可以使所有设备在同一网段内,为方便进行管理连接。这里的实例是,主路由器AP连接,副路由器通过WiFi连接到主路由器,副路由通过下行LAN口进行接入到主路由器。
    1.主路由器按照正常的AP配置上网方式,IP为192.168.1.1。
    2.副路由器通过Client方式接入AP服务器,具体配置参数如下。
    在这里插入图片描述
    配置好以上配置后,运行正常将从主路由器上获取一个IP地址,192.168.1.111。
    3.再创建一个中继桥,具体参数如下,网络间中继为LAN与刚才创建的wwan接口,本地IP为wwan获取的IP:192.168.1.111。
    在这里插入图片描述
    4.配置本地LAN,br-lan的网关地址为192.168.1.111,即走此地址出去。
    在这里插入图片描述
    此时,所有的配置基本完成。查看路由表项:

    admin@routerAP:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
    10.10.10.0      *               255.255.255.0   U     0      0        0 br-lan
    192.168.1.0     *               255.255.255.0   U     0      0        0 wlan0
    

    5.配置PC。
    在这里插入图片描述
    此时,正常情况下,PC可以ping通AP主路由器192.168.1.1。如果主路由器具有上网功能,PC也应该可以直接上网。

    PC此时也可以配置为DHCP方式获取IP,将从主路由器上获取IP地址及网关地址(192.168.1.103/192.168.1.1,DNS:192.168.1.1)。

    6.网络

    6.1 端口转发

    6.2 NAT

    6.3

    7.WiFi

    7.1WiFi抓包环境搭建

    7.1.1 WiFi监控设备采购

    一般笔记本电脑带的WiFi网卡驱动不支持空口抓包,此时需要去淘宝采购一个可以空口抓包的WiFi,一般为USB dongle比较方便。提供一个采购链接:https://item.taobao.com/item.htm?spm=a230r.1.14.29.7b483bd6p3JGte&id=549315237655&ns=1&abbucket=18#detail
    卖家还提供相应驱动及omnipeek抓包工具。
    百度网盘:https://dwz.cn/ynlAwFLy,提取码:732y。

    7.1.2 Win10系统关闭安全数字签名

    Win10系统一般有安全数字签名配置,需要将其关闭,否则驱动安装后会被安全驱动隔离。以联想昭阳e4为例。
    1.启动系统,按住Fn+F1,听到滴的一声进入BIOS系统,在Secure Boot下disable安全启动。
    2.重新启动系统,进入Win10系统,点击右下角的【通知】图标,在【所有设置】-》【更新和安全】-》【恢复】-》【立即重启系统】重新启动系统。
    3.重启后,选择【疑难解答】-》【高级选项】-》【启动设置】-》【重启】。系统重启。
    4.按照提示输入7禁用驱动程序强制签名。进行系统重启即可。

    7.1.3 Win10驱动安装

    插入USB dongle WiFi网卡,进入设备管理器,查看网络适配器。
    在这里插入图片描述
    第一个【802.11ac Wireless LAN Card】,即为新增加的网络设备,USB dongle WiFi网卡。
    点击右键,进入【更新驱动程序】进行更新驱动,具体根据卖家提供的驱动包,选择64为系统x86_64选择对应的驱动rt2870.inf进行安装。
    安装驱动成功后,系统要求重启生效,重启系统,驱动就可以正确安装完成。

    7.1.4 omnipeek抓包工具安装

    网上或者USB dongle卖家提供的有相应版本的工具,都可以使用。这里就不展开安装描述。
    安装时主要需要Keygen根据对应的版本产生SN。根据安装提示完成即可。
    在这里插入图片描述
    110代表对应的时11版本产生的SN。如果是其他版本即填入其他对应版本数值。

    7.1.5 omnipeek使用

    打开omnipeek软件,选择【New Capture】
    在这里插入图片描述
    主要查看Adapter选择对应的无线网卡,注意一定要有omnipeek=yes的信息项,证明驱动安装成功,支持omnipeek空口抓包。
    在这里插入图片描述
    在802.11里选择对应的信道进行抓包即可。后续就是报文分析了。

    7.1.6 规则过滤

    在这里插入图片描述
    如上图,A按钮是执行过滤规则。点击A按钮,将出现B的过滤规则。可以选择一种过滤规则进行过滤。
    注意,请先配置过滤规则为all packets。这样后续的规则在所有的报文中过滤。每执行一次过滤规则都在已经过滤出来的报文中继续过滤的。

    在这里插入图片描述
    上图的A按钮是编辑自己的过滤规则的,当点击A按钮的时候,会弹出B窗口进行过滤规则的匹配,这里可以设置自己需要的过滤规则。
    在这里插入图片描述
    上图中,点击A按钮Type,选择高级,还可以视图过滤的规则路径,如B窗口。

    配置好规则后,会在第一张图的B区域增加一个规则,规则名字在配置规则是自己命名,尽量命名为自己特定的名字,便于查找使用。

    7.2 WiFi分析

    7.2.1 AP+Client连接过程

    具体的报文信息抓包信息在百度网盘中有。
    报文含义参考:https://www.cnblogs.com/zhaozhong1989/articles/2730415.html
    下面是Station和Ap建立开放Association的过程:

        (0)Ap周期性地广播Beacon帧
    
        (1)Station广播Probe Request到达Ap
    
        (2)Ap向Station发送Probe Reponse
    
        (3)Station向Ap发送ACK
    
        (4)Station向Ap发送Authentication Request
    
        (5)Ap向Station发送ACK
    
        (6)Ap向Station发送Authentication Reponse
    
        (7)Station向Ap发送ACK
    
        (8)Station向Ap发送Association Request
    
        (9)Ap向Station发送ACK
    
        (10)Ap向Station发送Association Reponse
    
        (11)Station向Ap发送ACK
    
        (12)Station和Ap开始相互通信。
    
    展开全文
  • 对于物联网openwrt开发,最初的嵌入式设备是一个空白的系统,需要通过主机为它构建基本的软件系统,并烧写到设备中;另外,嵌入式设备的资源并不足以用来开发软件。所以需要用到交叉开发模式:在主机上编辑、编译...

    2.1硬件环境构建

    2.1.1主机与目标板结合的交叉开发模式

    开发PC机上的软件时,可以直接在PC机上编辑、编译、调试软件,最终发布的软件也是在PC机上运行。对于物联网openwrt开发,最初的嵌入式设备是一个空白的系统,需要通过主机为它构建基本的软件系统,并烧写到设备中;另外,嵌入式设备的资源并不足以用来开发软件。所以需要用到交叉开发模式:在主机上编辑、编译软件,然后在目标板上运行、验证程序。对于RT5350开发板,进行物联网openwrt开发时一般可以分为以下3个步骤。

    (1)在主机上编译U-boot,然后通过SPIFlash烧写器烧入单板。
    通过SPIFlash烧写器烧写程序的效率非常低,而且还需要取下Flash芯片,它适用于烧写空白单板。为方便开发,通常选用具有串口传输、网络传输、烧写Flash功能的U-boot,它可以快速地从主机获取可执行代码,然后烧入单板。
    该U-boot在开发板生产时,已经由工厂烧入到了SPIFlash中。特别强调,在做物联网openwrt开发时,一般不建议大家自己开发、重新烧写U-boot!否则,一不小心,开发板就会变成砖头的哦。

    (2)在主机上编译openwrt,通过U-boot烧入单板或直接启动。一个可以在单板上运行的openwrt是进行后续开发的基础。

    (3)在主机上编译各类应用程序,经过验证后烧入单板。
    烧写、启动U-boot后,就可以通过U-boot的各类选项来下载、烧写、运行程序了。启动Linux后,也是通过执行各种命令来启动应用程序的。怎么输入这些命令、查看命令运行的结果呢?一般通过串口来进行输入输出。所以交叉开发模式中,主机与目标板通常需要2种连接:串口、网络。

    2.1.2硬件要求

    1.主机要求

    一般的PC机就可以用来进行物联网openwrt开发,它应该满足以下要求。
    ①有一个USB口;
    ②支持网络;
    ③至少20GB的硬盘。

    因为要通过串口来操作Linux,所以得使用USB-串口转换器。该RT5350开发板,已经板载了该转换器。

    2.目标板要求

    由于后面会设计到大量的教程、大量的应用的移植,所以建议大家用32MB的内存、8MBFlash。所谓的硬件开发环境搭建很简单,将主机与目标板通过串口线(直接用miniUSB线连接主机和目标板即可)、网线(接单板上的任意网口)连接起来,将各类设备连接到目标板上去即可。

    2.2软件环境构建

    2.2.1在Windows上安装虚拟机

    本书基于Ubuntu12.04进行开发,它是一个很容易安装和使用的Linux发行版。光盘映象文件的下载地址为http://releases.ubuntu.com/。

    安装方法有好几种:将映像文件刻录成光盘后安装,通过网络安装等。对于不熟悉Linux的读者,可以通过VMware虚拟机软件使用映象文件安装,这样可以在Windows中使用Linux──反过来也是可以的,安装Linux后,再使用VMware安装windows,这样就可以在Linux中同时使用Windows了。

    这几种安装方法基本相同,下面介绍在Windows中通过VMware来安装Linux的方法。不管是哪种方法,都建议单独使用一个分区来存放本书所涉及的源码、编译结果,这可以避免当系统出错、系统重装时破坏学习成果。

    从VMware的官方网站http://www.vmware.com下载到VMware工具,安装后,参照以下方法安装、设置Linux。

    在VMware中建立一个虚拟机器,可以想象需要指定硬盘、内存、网络。在VMware中可以使用实际的硬盘,也可以使用文件来模拟硬盘。依照下面的一系列图形就可以建立了。

    1>启动VMware,如图2-1所示。选“CreateaNewVirtualMachine”。

    在这里插入图片描述

    图2-1启动VMware

    2>在后续界面中使用默认选项,直到出现如图2-2所示的界面,在里面选择“Custom”
    自己定制虚拟机器。

    在这里插入图片描述

    图2-2选择定制虚拟机

    3>选择虚拟机的格式,使用默认选项即可,如图2-3所示。选择客户操作系统,选择“Iwillinstalltheoperatingsystemlater.”,如图2.4所示。

    在这里插入图片描述

    图2-3选择虚拟机的格式

    在这里插入图片描述

    图2-4选择客户操作系统

    4>在Windows中使用VMware安装Linux,Windows被称为“HostOperatinsSystem”(主机操作系统),Linux被称为“GestOperatinsSystem”(客户操作系统)。选择Linux作为客户操作系统,版本为“Ubuntu”,如图2-5所示。

    在这里插入图片描述

    图2-5选择客户操作系统

    5>设置虚拟机的名字及存储位置,如图2-6所示。

    在这里插入图片描述

    图2-6设置虚拟机的名字及存储位置
    6>指定处理器个数(根据自己的实际情况设置),如图2-7所示。指定虚拟机的内存容量,在图2.8所示的界面中有推荐值及取值范

    在这里插入图片描述

    图2-7指定处理器个数

    在这里插入图片描述

    图2-8指定虚拟机的内存容量

    7>指定虚拟机的网络连接类型,一般使用桥接方式(bridgenetworking),如图2-9所示。安装完华后可以再进行修改。

    在这里插入图片描述

    图2-9指定虚拟机的网络连接类型

    8>选择“I/OAdapter”,使用默认值,如图2-10所示。

    在这里插入图片描述

    图2-10选择“I/OAdapter”

    9>图1-11、1-12、1-13、1-14共4个图都是用来创建虚拟硬盘。在图1-13中,为了方便管理,建议选择“storagevirtualdiskasasinglefile”。

    在这里插入图片描述

    图2-11选择创建新的虚拟硬盘

    在这里插入图片描述

    图2-12选择硬盘(使用默认类型)

    在这里插入图片描述

    图2-13指定硬盘容量

    在这里插入图片描述

    图2-14设置虚拟硬盘的名字(在Windows下将新建一个文件来表示这个虚拟硬盘)

    在这里插入图片描述

    图2-15完成

    单击“完成”按钮,现在已经创建了一个虚拟机器。
    10>在上图中单击“完成”按钮后,就创建了一个虚拟机器。

    2.2.2在虚拟机上安装Linux

    本书使用Ubuntu12.04的光盘文件ubuntu-12.04.1-desktop-i386.iso文件进行安装。下面简单介绍关键步骤,其他步骤可以参看安装时出现的说明。

    1>在虚拟机上使用光盘文件。如图2-16所示,进入虚拟机的编辑界面,选中“CD/DVD”,在右边的界面中,选择“Connnect atpoweron”(表示开启虚拟机时就连接光盘);然后选择“UseISOimage”,如果有实际的光盘,可以选择“Usephysicaldrive”。

    在这里插入图片描述

    图2.16在虚拟机上使用光盘文件

    2>启动虚拟机,它使用前面设置的光盘文件启动,这时候即可开始安装Linux。如图2-17所示,在虚拟机启动后,桌面有个名为“installUbuntu”的图标,单击它进行安装。接着出现图2-18所示界面,使用默认设置,点“Continue”。当出现如图2-19所示的界面时,选择“ErasediskandinstallUbuntu”。

    注意:在VMware的操作系统中,要将鼠标释放出来(回到Windows中),按“Ctrl+Alt”键即可。

    在这里插入图片描述

    图2-17通过“手动”来使用硬盘

    在这里插入图片描述

    图2-18条件检查

    在这里插入图片描述

    图2-19安装类型

    3>在紧接着出现的界面中单击“installnow”,如图2-20所示。

    在这里插入图片描述

    图2.20准备分区

    4>然后在后续的界面中使用默认值,安装程序会进行格式化虚拟硬盘等操作。当出现如图2-21所示的界面时,在里面设置用户名及密码。

    在这里插入图片描述

    图2-21设置用户名和密码

    5>继续往下,开始安装系统。当安装完成时,出现如图2-22所示的界面:

    在这里插入图片描述

    图2-22安装结束

    这时候从VMware的菜单“VM”->“Setting…”进入虚拟机的设置界面,在“CD-ROM”的设置界面去掉“Connnectatpoweron”(参考图2-16)。然后点击Linux安装界面的“Restart now”即可(如果不能重启,直接关闭VMware后再启动)。

    2.2.3主机Linux操作系统上网络服务的配置与启动

    配置Linux,启动ftp、ssh这2个服务。如果不是通过远程登录Linux,而是直接在Linux中进行开发,则ftp、ssh这两个服务不用开启。

    (1)准备使用软件维护工具apt-get。

    Ubuntu12.04中没有安装ftp、ssh、nfs服务器软件,它提供了一个很方便的安装、升级、维护软件的工具:apt-get。apt-get从光盘、网络上下载程序,并安装。所以要使用apt-get,通常要保证Linux能上网。

    第一次使用apt-get来安装程序之前,要先完成以下两件事:

    ①修改/etc/apt/sources.list,将其中注释掉的网址打开在安装Ubuntu12.04的时候,如果网络无法使用,它会自动将/etc/apt/sources.list中各项注释掉。比如需要将以下两行开头的“#”号去掉:
    #deb http://cn.archive.ubuntu.com/ubuntu/gutsymainrestricted
    #deb-src http://cn.archive.ubuntu.com/ubuntu/gutsymainrestricted
    ……

    注意:
    由于/etc/apt/sources.list属于root用户,而Ubuntu12.04中屏蔽了root用户的使
    用,要修改它,需要使用sudo命令。比如可以使用“sudo vi/etc/apt/sources.list”来修改它,或者使用“sudo gedit&”命令启动图形化的文本编辑器,再打开、编辑它。

    ②更新可用的程序列表
    执行如下命令即可,它只是更新内部的数据库以确定:有哪些程序已经安装、哪些没有安装、哪些有新版本。apt-get程序将使用这个数据库来确定怎样安装用户指定的程序,并找到和安装它所依赖的其他程序。下面的指令

    sudo apt-get update

    (2)安装、配置、启动服务。
    首先说明,Ubuntu7.10中隐藏了root用户,就是说不能使用root用户登录,这可以避免不小心使用root权限而导致系统崩溃。当需要使用root权限时,使用“sudo”命令,比如要修改/etc/exports文件时,修改如下所示:

    sudo vi /etc/exports

    现在可以使用apt-get来安装软件了,以下的安装、配置、启动方法在Ubuntu7.10自带的帮助文档中都有说明:

    ① 安装、配置、启动ftp服务。
    执行以下命令安装,安装后即会自动运行:

    sudo apt-get install vsftpd

    修改vsftpd的配置文件/etc/vsftpd.conf,将下面几行前面的“#”号去掉。

     #local_enable=YES
     #write_enable=YES
    

    上面第一行表示是否允许本地用户登录,第二行表示是否允许上传文件。
    修改完华之后,执行以下命令重启ftp服务:

    sudo /etc/init.d/vsftpd restart

    ② 安装、配置、启动ssh服务。
    执行以下命令安装,安装后即会自动运行:

    sudo apt-get install open ssh-server

    它的配置文件为/etc/ssh/sshd_config,使用默认配置即可。

    2.2.4 Ubuntu和Windows互传文件

    1)虚拟机->设置->共享文件夹

    在这里插入图片描述

    图2-23

    2)选择下一步,然后选择共享文件夹路径

    在这里插入图片描述

    图2-24

    再下一步->完成就可。
    3)进行软链接
    输入命令:

    ln –s /mnt/hgfs/share

    好了,现在Ubuntu和Windows就能互传文件了。

    2.2.5修改Linux的计算机名

    1)修改/etc/hostname

    sudo vim /etc/hostname

    将文件中的内容改为自己想设置的名字。

    2) sudo vim /etc/hosts

    将文件中127.0.1.1后面内容改为自己刚才设置的名字。

    展开全文
  • OpenWRT开发杂记

    2019-04-26 11:02:01
    如何在OpenWRT环境下做开发---->...OpenWRT开发之——研究包的Makefile---->一些变量还有包的介绍 OpenWRT的学习之路---->一些基本的操作 OpenWRT第一个helloworld---->编写程序的Makefile注意的...

    如何在OpenWRT环境下做开发---->https://zhidao.baidu.com/question/368930753235585244.html

    OpenWRT开发之——研究包的Makefile---->一些变量还有包的介绍

    OpenWRT的学习之路---->一些基本的操作

    OpenWRT第一个helloworld---->编写程序的Makefile注意的点

    UDP编程总结---->https://blog.csdn.net/haoxiuzhao/article/details/80286686

    TCP和UDP网络编程---->http://www.jizhuomi.com/software/404.html

    网络编程----->网络编程 第三天 (UDP编程&IO模型)

    C语言FILE文件操作---->文件操作

    OpenWRT开发---->GPIO相关

    OpenWRTmtk7688---->宝藏!!!

    Linux下常用函数---->http://net.pku.edu.cn/~yhf/linux_c/

    boost库的使用手册---->http://zh.highscore.de/cpp/boost/

                                   ---->https://www.gamedev.net/blogs/entry/2249317-a-guide-to-getting-started-with-boostasio/?pg=1

    OpenWRT下shell脚本自动运行 干货---->https://blog.csdn.net/tianlx1985/article/details/79886624?utm_source=blogxgwz2

     

     

    串口:

    https://blog.csdn.net/badagougou/article/details/78774583

    http://www.cnblogs.com/chengmin/p/3818133.html

    https://www.jianshu.com/p/63fd9a018ad7

    https://blog.csdn.net/winux123/article/details/45395761

    https://blog.csdn.net/liuqz2009/article/details/51967763

    https://zhidao.baidu.com/question/571101298.html

    daemon--->http://ju.outofmemory.cn/entry/271982

     

    RTC:

    读取RTC时间---->https://blog.csdn.net/haiwil/article/details/7411010

     

    网络:

    网络配置(官网)---->https://oldwiki.archive.openwrt.org/doc/uci/wireless

    wifi接口函数的配置---->https://zhuanlan.zhihu.com/p/24578817

     

    UCI:

    UCI的用法详解---->https://blog.csdn.net/KOBE_ZERO/article/details/51496761

    UCI准确介绍--->https://blog.csdn.net/jf_xu/article/details/72629302

    UCI配置使用--->https://blog.csdn.net/Damon_linux/article/details/76407899

    编程时没有uci.h---->https://blog.csdn.net/flexman09/article/details/51546277

     

    QT:

    QT ListView用法---->http://blog.sina.com.cn/s/blog_81db26d80102ymn3.html

     

     

    展开全文
  • openwrt开发文档中文版

    2016-01-26 18:30:04
    openwrt开发文档中文版
  • OpenWrt Project is a Linux operating system targeting embedded devices. Instead of trying to create a single, static firmware, OpenWrt provides a fully writable filesystem with package management. ...
  • openwrt开发外围准备工作:(零)编译openwrt固件前言准备编译工具克隆所需源码下载组件配置功能选择环境型号驱动相关配置网络相关驱动配置USB相关驱动配置无线驱动相关添加LUCI页面配置网络相关保存配置执行编译...
  • openwrt 开发环境

    2019-03-19 15:01:55
    使用Ubuntu系统进行openwrt开发,主要介绍开发环境的搭建过程和要点
  • OpenWRT 开发相关资源

    2020-04-15 17:44:54
    本人所写的博客都为开发之中遇到问题记录的随笔,主要是给自己积累些问题。免日后无印象,如有不当之处敬请指正...OpenWRT开发时需要用到的相关资源, 持续更新记录如下: 1:OpenWRT 官方开发手册 2:OpenWrt下载网 ...
  • Openwrt 开发环境 Eclipse 教程
  • OpenWRT开发环境搭建

    2017-04-20 09:29:35
    OpenWRT开发环境搭建OpenWRT官方...安装OpenWRT开发所需依赖 WR703N 安装OpenWRT开发所需依赖首先更新下软件包库:sudo apt-get update安装官方所说需要的安装的依赖: sudo apt-get install subversion build-essent
  • OpenWRT开发环境

    2016-02-01 15:46:06
    本文主要简单介绍了Openwrt开发所涉及的一些概念。
  • openwrt开发环境搭建

    2019-10-05 16:28:23
    OpenWrt 可以被描述为一个嵌入式的 Linux 发行版。现在叫lede,全名Linux嵌入式开发环境项目(Linux Embedded ...构建Openwrt开发环境(SDK) 嵌入式系统结构 Bootloader基础结构与移植(基于uboot源码分析) Kernel基础...
  • openwrt开发指南

    2018-07-21 18:56:48
    OpenWrt Development Guide Overview of OpenWrt BuildRoot Environment
  • OpenWRT 开发小记

    2015-06-24 17:24:24
    OpenWRT 开发小记 最近这段时间一直在使用OpenWRT 做一些开发工作,我把这个过程中遇到的一些问题记录下来,希望以后可避免这些问题的出现,同时也为后来者提供一些建议. 编译过程中遇到的问题 编译过程中容易出现...
  • 搭建自己的OpenWrt开发环境
  • OpenWrt开发指南博文导航

    千次阅读 多人点赞 2017-12-22 13:18:55
    自博主更新该专栏也很久了,今天博主就给出关于OpenWrt开发的一个导航,为的是读者朋友能更好找到自己所感兴趣的那一块,当然博主以后对OpenWrt有新的发现和想法也会在第一时间发表在CSDN上,在此感谢CSDN这个平台给...
  • OpenWRT开发准备工作

    2017-04-20 16:35:10
    准备工作首先,根据上面教程(OpenWRT开发环境搭建)安装我们OpenWRT所需编译环境 其次,下载一个openwrt源码,可从官网或论坛上下,也可使用下面的方法(后面会介绍)下载必要工具 WinSCP 用网口连接电脑与路由器...
  • OpenWrt 开发 (二) 搭建开发环境

    千次阅读 2017-12-18 15:19:05
    本文主要介绍如何搭建 OpenWrt开发环境,大部分资源都来自网络,你可以将它看成是一个资源整理帖,节省搜索时间。OpenWrt 开发环境的搭建大致分为以下几步: - 安装虚拟机 - 安装 Linux-ubuntu 系统 - 安装...
  • OpenWrt开发环境搭建

    2018-06-20 21:07:29
    OpenWrt开发环境搭建第一部分:搭建编译环境· 1、安装Ubuntu(编译需要Linux环境),到其官网下载,版本根据自己所需选择即可。可以选择安装到虚拟机或者物理机,图形化安装而且是中文版,连安装都搞不定的,可以...
  • Ubuntu 16.04下配置openWRT开发环境

    千次阅读 2019-07-12 16:16:17
    Ubuntu 16.04下配置openWRT开发环境 1、配置openwrt开发环境,本实验室在ubuntu16.04系统下测试 在编译之前我们先要搭建环境,ubuntu下OpenWrt编译环境需要安装很多组件: sudo apt-get install gcc g++ binutils ...
  • OpenWrt开发 之扩展软件包

    千次阅读 2015-05-18 16:17:09
    OpenWrt开发 之扩展软件包
  • openwrt开发日记

    2015-05-16 17:01:47
    这个文档是我自己平时学习开发openwrt系统的时候自己写的记录的一些东西,看的懂得需要的下载
  • Ubuntu配置OPENWRT开发环境

    千次阅读 2018-01-22 15:23:35
    Ubuntu下配置OPENWRT开发环境 1.环境配置 sudo apt-get install gcc sudo apt-get install g++ sudo apt-get install patch sudo apt-get install bzip2 sudo apt-get install make sudo apt-get install ...
  • OpenWrt Project is a Linux operating system targeting embedded devices. Instead of trying to create a single, static firmware, OpenWrt provides a fully writable filesystem with package management. ...
  • openwrt开发 am335x 新手开始

    千次阅读 2018-02-03 14:14:09
    openwrt开发 am335x 新手开始 从linux驱动转openwrt,最开始有很多不理解的地方,在网上找资料发现很多都没有讲到核心点上,导致自己走了很多弯路,希望借这篇文章让大家对openwrt有一定的了解,因为自己也还不是很...
  • openwrt开发与luci介绍

    千次阅读 2014-12-09 15:16:27
    Openwrt开发与Luci介绍 分享到 评论 LUCIOpenwrt开发 文章目录 1. Luci介绍 1.1. Luci 的启动—uhttpd1.2. Luci 的启动—luci1.3. Luci— Web1.4. 以status模块为例进行说明1.5. entry()函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,548
精华内容 619
关键字:

openwrt开发