本文主要内容是如何将Raspberry Pi配置成一个具备路由功能的开发机。虽然网上已经有很多文章类似文章,但是我发现即便是完全按照步骤操作还是会遇到很多麻烦,例如:无线网卡驱动问题、路由自动启动问题、SD卡的读取问题等等。所以写此篇文章与大家分享一下经验,当然也欢迎大家提出问题,共同进步。:)

最近,入手了风靡全球的Raspberry Pi。这个设备真是一个不错的玩具,可以用你的智慧在上面实现很多非凡的想法和创意。搜索一下就会发现已经涌现出很多有趣的创意。而至于我入手的原因,主要为了能够利用长途路上的空闲时间进行web应用的移动式开发,像nodejs、ruby、html5、websocket、webgl。所以我将这个小Pi做成一个路由器兼linux开发机,然后用Android移动设备(本人屌丝无Apple设备)通过Secure Shell Client(强力推荐ConnectBot,其Google Play链接)进行开发,在移动设备的浏览器上进行测试。^_^

好了,我们开始吧。

第一步,设备清单,装配

本人购买的是一个四合一套装版,包括Raspberry Pi(Model B,Made In UK)、透明亚克力外壳(需手动拼装)、一张SD卡(4G,Class 4)、HDMI连接线,通过ICKey.cn购买(因为Pi官网提到了这个商家,不过它的新套餐居然更便宜了,而且感觉配件更实用,真的很无语),当然也还有很多其它渠道,如亚马逊、淘宝或者海外代购。其实Pi本身的价格虽然不高,但是随着功能的扩展和模块的添加,最后的价格也不会便宜。就拿我来讲,还要专门购买了一个无线网卡(TP-LINK TL-WN725N)。

在拿到货后先将外壳和线路板拼装起来,如下图,是手动拼装好后的Pi:

ps:据其他网友讲拼这个外壳的时候还是要手轻些,以免掰折卡口。

第二步,准备SD卡和系统

从Raspberry Pi官网下载系统镜像压缩包,由于个人平时使用ubuntu,所以就选用同样是基于Debian的Raspbian(其它系统并不了解)。下载完成后解压得到一个img文件,按照如下方法将该系统镜像写入SD卡中。

对于linux用户:

将SD卡与PC链接,通过如下命令写入系统。这个过程比较长,请耐心等待。

ddif=*raspbian镜像文件名*.img of=*设备路径*

ps:请根据自己的使用环境替换*raspbian镜像文件名*和*设备路径*

对于windows用户:

下载Win32DiskImager工具,解压后运行。同样将SD卡与PC链接,选择系统镜像,选择SD卡盘符,点击Write,将会把系统写入SD卡。

ps:这里与官网所描述没什么区别。更全面的讲解请参考:http://elinux.org/RPi_Easy_SD_Card_Setup

在做好系统后不要着急去启动,因为如果显示器分辨率比较低的话,你会发现屏幕无法显示所有内容。所以为了能够得到一个完整的显示,需要配置一下相应显示器的分辨率。

将写入系统的SD卡重新连接到PC上,你可以看到一个fat格式的盘符(ubuntu和windows都可以识别出来)。找到并打开该盘符下的config.txt文件,把其中的hdmi_group设置改为2,hdmi_mode设置改为11,去掉这两项前的“#”(如果有的话)。这个设置表示显示器的分辨率和频率分别为800×600和75Hz。当然还有很多其它分辨率可用,具体数值配置请参考此网址:http://elinux.org/RPi_config.txt。

第三步,首次启动和配置Pi,修复SD卡文件系统,更新系统

通电之前要将SD卡和无线网卡插入Pi,连接一根网线(我们需要通过网络更新系统和安装驱动),连接一个USB键盘作为输入设备,通过HDMI线连接显示器作为输出设备。使用当前很常见的一种电源线(Micro USB Power)给Pi供电。注意:Pi并没有电源开关,链接电源启动,拔掉电源则关机。

通电后系统将会进入首次启动配置页面(如果以后还想进行这样的配置运行‘sudo raspi-config’即可),请进行下列操作:

  1. 选择expand_rootfs,将系统容量进行扩展

  2. 选择boot_behaviour,将启动方式设置为console

  3. 选择change_pass,设置用户pi的密码。这个pi用户就是一个管理员账户

  4. 选择ssh,启用ssh

  5. 选择change_timezone,设置时区

完成以上5个配置后,在主菜单中选择Finish,即完成首次启动前的配置。

刚开始使用Pi时,总是会发生磁盘分区问题,导致一出现问题就重写SD卡。经过一番搜索后发现需要通过fsck对SD卡文件系统进行一次修复。估计是第一次启动的扩充系统容量操作会导致分区大小错误,从而出现后续写入的文件在重启后无法读取。

将SD卡重新链接到ubuntu上,运行如下脚本命令:

sudofsck.ext4 -p /dev/sdd2

好了,至此我们的SD卡就已经准备完毕。

重启系统后通过用户名pi和密码(如果没有设置新密码则为raspberrypi)进入系统。在命令行模式下,通过如下命令更新系统:

sudoapt-get update && sudoapt-get upgrade

一段漫长的更新后,你就已经可以使用最新版的Raspberry Pi了。

第四步,编译安装无线网卡驱动(TP-LINK TL-WN725N 2.0)和软AP程序

由于当前Raspbian系统并没有提供TL-WN725N 2.0的驱动,所以在启动后无法识别到wlan设备。在这里要感谢《用raspberry-pi制作无线路由过程的札记2-编译8188eu芯片的无线网》和《raspberry pi 入手小记》文章的作者,感谢他们提供了编译安装TL-WN725N 2.0驱动和该网卡的软AP程序的方法,具体操作请转至这两篇文章。

如果你不想编译,后面‘相关链接’部分有已经编译好的驱动和软AP程序下载链接。然后通过下面命令安装该驱动:

sudoinstall-p -m 644 8188eu.ko  /lib/modules/3.6.11+/kernel/drivers/net/wireless/
sudo/sbin/depmod-a 3.6.11+

第五步,设置路由

此处要感谢《树莓派上手实战之把Raspberry Pi 配置成无线路由器》,这篇文章描述了如何使用hostapd和isc-dhcp-server将Pi制作成一个软路由。使用TL-WN725N 2.0无线网卡的用户要记住安装好hostapd后,请用我们上一步所编译好的hostapd和hostapd_cli覆盖/usr/sbin目录下的文件。完成文中所述操作后,平板或者手机就应该可以通过Pi来访问网络了。

这时会出现一个使用问题,每次开机后都要通过命令来开启路由功能。由于软路由的开启是两个模块组成的,所以最好的解决方法是自制一个启动服务脚本,然后使用update-rc.d来控制。我的启动脚本raspi-router,其内容如下:

#!/bin/sh
#
#### BEGIN INIT INFO
# Provides:          raspi-router
# Required-Start:    $remote_fs $network $syslog
# Required-Stop:     $remote_fs $network $syslog
# Should-Start:      $local_fs slapd $named $network
# Should-Stop:       $local_fs slapd
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Router Server in Raspberry Pi
# Description: Activite hostapd and isc-dhcp-server in Raspberry Pi
### END INIT INFOPATH=/sbin:/bin:/usr/sbin:/usr/bincase"$1"instart)service hostapd startecho"Set the address of wlan0 to 192.168.91.1"ifconfigwlan0 192.168.91.1service isc-dhcp-server start;;stop)service hostapd stopservice isc-dhcp-server stop;;restart | force-reload)service hostapd restartecho"Set the address of wlan0 to 192.168.91.1"ifconfigwlan0 192.168.91.1service isc-dhcp-server restart;;status)service hostapd statusservice isc-dhcp-server status;;*)echo"Usage: $0 {start|stop|restart|force-reload|status}"exit1
esacexit0

注意:第23行和33行的192.168.91.1,这个地址是Pi作为路由的ip地址。如果你的有所不同,请自行更改。

将该脚本放到/etc/init.d目录下,运行以下脚本命令,将会安装并运行rcconf:

sudoapt-get installrcconf
sudorcconf

选择rcconf界面中的raspi-router并确定,如下图:

第六步,完成,测试

好了,按照上面所描述的方法和注意事项,你应该可以得到一个路由器兼开发机。通过手机或平板上的ssh应用程序即可访问该路由,并进行web应用开发。如果配上随身电源,那么不管走到哪里都可以连接到Pi上,访问你的web应用服务。在我的Pi上就运行着用nodejs+websocket开发的聊天服务,这样即便是在旅途中,周围的朋友都可以访问这个路由进行沟通(似乎有点多余:))。当然也可以做成文档服务器、游戏服务器、微社交服务器等等,就可以真正的实现移动办公、移动游戏、移动交友(瞎掰了)。

结束语

文中如有错误和问题,欢迎指正,欢迎咨询、欢迎交流、欢迎留言。

最后附一张截图,启动后的Pi:

用Raspberry Pi制作无线路由过程的札记2-编译8188eu芯片的无线网卡驱动和hostap

当时在采集RPi的配件时,是依据elinux.org上RPi_VerifiedPeripherals的信息。上面所列出的可兼容硬件都是RPi玩家亲试的。选择TP-LINK TL-WN725N USB无线网卡的原因就是上面写着“TL-WN725N Works out of the box on Raspbian 2012-12-16 without a powered USB hub.”。当时也有考虑过EDUP N8508,但因为它需要接上有源USB HUB来保证供电,而我不想在用作无线路由时还要带着一个USB HUB,所以就选择了TL-WN725N。

但买回来的TL-WN725N插入到RPi却无法驱动。ifconfig -a没有看到wlan0。无论是在Raspbian还是Arch Linux ARM下都无法使用。

 
  1. [root@alarmpi ~]# lsusb

复制代码 

的显示是:

 
  1. Bus001Device002: ID 0424:9512StandardMicrosystemsCorp. LAN9500 Ethernet10/100Adapter

  2. Bus001Device001: ID 1d6b:0002LinuxFoundation2.0 root hub

  3. Bus001Device003: ID 0424:ec00 StandardMicrosystemsCorp.

  4. Bus001Device004: ID 0bda:8179RealtekSemiconductorCorp.

复制代码 

和网上一些论坛里贴出的不一样:

 
  1. Bus001Device008: ID 0bda:8176RealtekSemiconductorCorp. RTL8192CU 802.11n WLAN Adapter

复制代码 

连具体的芯片型号也没识别出来。也在论坛问一下,有人说是供电的问题。但我也试过插到有源的USB HUB里,lsusb得到的结果一样。不过,发现一个问题是网上贴出的lsusb结果中的USB ID和我的不一样,网上的是8176,而我的是8179。于是google一下才发现,这个型号的网卡分v1和v2,v1(即8176)的芯片是8192cu,而v2(即8179)的芯片是8188eu。于是到Realtek的官网找了一下,没有8188eu。但感觉TL-WN725N两个版本的芯片应该是差不多,否则厂家不可能这样替换,而价格和功能的说明却没改。所以就下了Realtek官网上8192cu的驱动下来编译试试。结果不行,ifconfig -alsusb显示的结果一样,而lsmod中却能看到新编译的8192cu驱动已经被内核加载了,而旧的rtl8192cu也被禁止了。在苦恼之际,随便看了一下8192cu驱动中的文档,却发现有提到RTL8188eu,但在驱动的发行说明中的支持芯片列表中却没看到RTL8188eu。难道是官方还没有提供8188eu的Linux驱动,而google“8188eu linux driver”之后发现有很多8188eu的Windows驱动,却没有Linux的。而在某论坛中发现有人也是用v2版的,而他在一个国产的Android智能电视棒的Linux系统源码中找到了8188eu的驱动代码:https://github.com/Red54/linux-shumeipai2/tree/sunxi-3.0/drivers/net/wireless/rtl8188eu。看了一下其github中的提交备注和对比了一下它和8188cu的源码,发现这个驱动源码应该是在8192cu的基础上修改的,而不是官方发布的。不过管不了那么多了,下载下来试试。

由于在编译安装驱动的过程,要用到gcc编译工具链,还有一些Linux的实用工具和用unzip解压驱动源码包,所以先要通过pacman安装它们:

 
  1. [root@alarmpi ~]# pacman -S util-linux unzip base-devel

复制代码 

安装好上述的软件包后,最好重新启动一下系统:

 
  1. [root@alarmpi ~]# reboot

复制代码 

在编译之前,需要修改驱动源码目录里Makefile文件中的编译选项。在Makefile里可以找到如下的目标编译平台开关宏。可见其中的默认配置是i386平台:

 
  1. ...

  2. CONFIG_PLATFORM_I386_PC = y

  3. CONFIG_PLATFORM_ANDROID_X86 = n

  4. CONFIG_PLATFORM_ARM_S3C2K4 = n

  5. CONFIG_PLATFORM_ARM_PXA2XX = n

  6. ...

复制代码 

这里没有RPi的BCM2708平台配置,所以需要自行添加。首先在将CONFIG_PLATFORM_I386_PC改为n,并在下面添加RPi的目标编译平台开关宏,修改后的代码如下:

 
  1. ...

  2. CONFIG_PLATFORM_I386_PC = n

  3. CONFIG_PLATFORM_BCM2708 = y

  4. CONFIG_PLATFORM_ANDROID_X86 = n

  5. CONFIG_PLATFORM_ARM_S3C2K4 = n

  6. CONFIG_PLATFORM_ARM_PXA2XX = n

  7. ...

复制代码 

接下来是创建新增的目标编译平台配置项。还是在Makefile里,继续往下找,可以看到:

 
  1. ...

  2. ifeq ($(CONFIG_PLATFORM_I386_PC), y)

  3. EXTRA_CFLAGS +=-DCONFIG_LITTLE_ENDIAN

  4. SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)

  5. ARCH ?= $(SUBARCH)

  6. CROSS_COMPILE ?=

  7. KVER  := $(shell uname -r)

  8. KSRC :=/lib/modules/$(KVER)/build

  9. MODDESTDIR :=/lib/modules/$(KVER)/kernel/drivers/net/wireless/

  10. INSTALL_PREFIX :=

  11. endif

  12. ifeq ($(CONFIG_PLATFORM_TI_AM3517), y)

  13. EXTRA_CFLAGS +=-DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_SHUTTLE

  14. CROSS_COMPILE := arm-eabi-

  15. KSRC := $(shell pwd)/../../../Android/kernel

  16. ARCH := arm

  17. endif

  18. ...

复制代码 

ifeq ($(CONFIG_PLATFORM_I386_PC), y)...endififeq ($(CONFIG_PLATFORM_TI_AM3517), y)之间添加CONFIG_PLATFORM_BCM2708的编译配置参数,即添加如下的代码:

 
  1. ...

  2. ifeq ($(CONFIG_PLATFORM_BCM2708), y)

  3. EXTRA_CFLAGS +=-DCONFIG_LITTLE_ENDIAN

  4. ARCH := arm

  5. CROSS_COMPILE :=

  6. KVER := $(shell uname -r)

  7. KSRC :=/lib/modules/$(KVER)/build

  8. MODDESTDIR :=/lib/modules/$(KVER)/kernel/drivers/net/wireless

  9. INSTALL_PREFIX :=

  10. MODULE_NAME :=8188eu

  11. endif

  12. ...

复制代码 

解释一下这些编译参数的含意:

  • EXTRA_CFLAGS:附加编译选项,可用值如下:

    • CONFIG_BIG_ENDIANCONFIG_LITTLE_ENDIAN是大端存储械和小端存储模式。两种存储模式在ARM上都支持,而默认是小端存储,所以这里选择了CONFIG_LITTLE_ENDIAN

    • CONFIG_MINIMAL_MEMORY_USAGE是指定以小内存分配模式。为了在性能较强的平台上获得较好的性能,驱动会分配大尺寸的连续内存空间作为TX/RX的IO缓冲区。这种分配模式在嵌入式平台中可能导致内存分配失败,可以通过定义此项来避免这个问题。考虑到RPi的内存比较大,所以不使用小内存分配模式,故此项忽略

    • CONFIG_PLATFORM_ANDROID是用在没有定义CONFIG_ANDROID宏的旧版本Android平台上强制生成Android代码的情况

  • ARCH:目标编译平台。RPi的BCM2853是ARM架构,填“arm”

  • CROSS_COMPILE:指定交叉编译工具链。直接在RPi上编译,不需要指定此项

  • KVER:内核版本。通过shell的uname -r获取即可

  • KSRC:内核源代码路径。填/lib/modules/$(KVER)/build

  • MODDESTDIR:模块目标目录。这个选项是用于指定编译好的驱动模块的安装路径,填/lib/modules/$(KVER)/kernel/drivers/net/wireless。其实也可以不填此项,等编译完成后将编译好的.ko文件复制到指定的目录也可以,并使用depmod -a命令将编译好的驱动模块安装到内核中

  • INSTALL_PREFIX:模块安装目录。这个可以不填,但如果编译出现的模块有多个文件,也可以设置专门的目录用于存放。如果填写了此项,那些模块的安装目录就会变成:MODDESTDIR/INSTALL_PREFIX,而不是MODDESTDIR

  • MODULE_NAME:模块名称。最后编译出来的驱动文件的名称就是此名称加.ko。如果没有设置此项,则默认为8188cu,即编译好的驱动文件名称为8188eu.ko

把上述的内容都修改好后,保存Makefile文件,就可以用

 
  1. [root@alarmpi rtl8188eu]# make && make install

复制代码 

来编译及安装驱动模块。
由于模块没有编译进内核中,而是作为附加模块来编译的,所以要让系统在启动的时候自动加载它才可以使用。这里使用systemd的方法来设置,在/etc/modules-load.d目录下创建一下模块加载的配置文件(如8188eu.conf),在配置文件里写入驱动文件的名称,但不要带.ko,如8188eu即可。
所有这些完成后,重新启动系统就可以使用TL-WN725N了。lsusb依然没有显示其芯片型号,不过ifconfig -a可以看到wlan0了。
正在兴奋之余,安装了hostap:

 
  1. [root@alarmpi ~]# pacman -S hostap

复制代码 

,配置好/etc/hostapd/hostapd.conf,却提示nl80211驱动不兼容此网卡。弄了几天才找到可用的驱动,好不容易才让系统识别到无线网卡,现在又冒出一个问题。再一次绝望了!
在绝望之余,突然在8192cu的官方驱动包时看到有一个关于软ap的使用文档,便好奇地打开看看。发现里面关于启动软ap的步骤中的第5步是编译驱动包里的一个hostap工具。然后翻了翻其他pdf文档,在一个关于软ap模式特性的文档里讲到,托管网络模式需要hostap加上基于Realtek专用的871x驱动接口才可以启动。一下子豁然开朗了!原来这个系列的无线网卡不再使用老试的nl80211兼容驱动来打开软ap模式,而是需要Realtek专用的驱动来实现的。
于是,解压8192cu官方驱动包中的wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_20120803.zip,切换到其中的hostapd目录,执行make进行编译。完成后用编译好的hostapd覆盖掉/usr/bin/hostapd,再将/etc/hostapd/hostapd.conf里的driver项改为rtl871xdrv,通过

 
  1. [root@alarmpi ~]# hostapd /etc/hostapd/hostapd.conf

复制代码 

启动软ap。
用手机搜索一下,找到刚启动的软ap了。
在上面提到的软ap模式特性文档中说明了这个专用的ap驱动只支持CCMP安全模式和WPA-PSK认证模式,所以在/etc/hostapd/hostapd.conf中最好将wpa_key_mgmt设置为WPS-PSK,和将wpa_pairwise设置为CCMP。其他的配置参数请见具体的说明文档及样例配置文件中的注释。
最后,还可以将hostapd设置成系统启启动时自动启动的服务项,这样就不用每次启动系统都要手工加载hostapd了:

 
  1. [root@alarmpi ~]# systemctl enable hostapd

复制代码 

弄了接近3天,终于弄好了软ap了。这里提供已经修改好Makefile的8188eu驱动源码、Realtek专用的hostapd源码及软ap模式的相关说明文档的归档文件,方便有需要的朋友下载使用。

后记:使用内核没有提供驱动的硬件有个不方便的地方——升级内核的时候需要重新编译驱动。而我是把RPi作为无线路由用的,虽说没必要频繁升级内核,但我又不满足于RPi只做无线路由,还打算玩其他东西。最后还是决定更换无线网卡。年后进了一个Tenda W311MI(主控是Ralink RT5370),RPi的固件中直接提供了驱动,省了手工编译安装驱动的麻烦。而且该网卡的驱动是基于mac80211的,可以使用nl80211驱动的hostapd,可以直接使用从更新源直接安装的hostapd。不过还有点不足——无法打开wps,不知道是网卡不支持(网卡的盒子还写着支持的),还是hostapd的问题。算了,又岂能事事尽如人意呢!反正放家里用,又不开802.11n,出到外面连信号都没了,还管他安不安全了。

linux TL-WN725N2.0 AP Raspberry Pi 无线网卡驱动 路由设置相关推荐

  1. oneplus 驱动_OnePlus投放CyanogenMod,Raspberry Pi 2驱动的机器人等

    oneplus 驱动 在本周的开源新闻摘要中,我们将介绍采用新移动操作系统的OnePlus,采用Raspberry Pi 2驱动的机器人,即将开源的大数据供应商等等! 开源新闻让您阅读愉快. 2015 ...

  2. linux ansible_使用Ansible在Raspberry Pi上构建基于Linux的HPC系统

    linux ansible 在上一篇有关Opensource.com的文章中 ,我介绍了OpenHPC项目,该项目旨在加速高性能计算(HPC)的创新. 本文通过使用OpenHPC的功能来构建小型HPC ...

  3. SteamOS 2.0,Raspberry Pi上的仿真器以及更多开放游戏新闻

    您好,开放游戏迷! 在本周的版本中,我们将介绍带有Raspberry Pi,SteamOS 2.0的仿真器,面向Linux的新游戏等. 2015年10月3日至9日开放游戏摘要 Raspberry Pi ...

  4. 苹果的Swift 2.0,Raspberry Pi Zero vs CHIP以及更多新闻

    在本周的开源新闻摘要中,我们来看看苹果公司发布了Swift 2.0开放源代码,Raspberry Pi Zero vs. CHIP等! 2015年11月29日至12月5日的开源新闻摘要 苹果发布Swi ...

  5. linux 自动挂载usb设备,Raspberry Pi 自动挂载USB存储设备

    简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...

  6. 树莓派linux网络编程,树莓派(Raspberry Pi)接太阳板和移动电源

    正在考虑给树莓派(Raspberry Pi)接上太阳能电池板, 这样就能把这玩意随意扔到一个有太阳的地方就可以了7X24小时待机了. 初步设想是,电池板+移动电源来给树莓派和无线网卡24小时供电. 首 ...

  7. 3070网卡驱动linux教程,Ubuntu 12.04下RT5370无线网卡驱动安装

    之前买了个水星150U的无线网卡,一直没在Ubuntu下安装好驱动?今天再次在Ubuntu 12.04下尝试安装尽然成功了.以前我一直以为是RT2870的芯片的,今天拆开了一看原来是5370N,晕到R ...

  8. kali linux不用网卡驱动,Kali Linux ——在无网络情况下安装无线网卡驱动

    1.背景: 今日刚刚开始学习kali linux,众所周知,安装完成后,系统是没有无线网卡驱动的,这就对学生党造成相当的困扰:校园网要连接有线是需要认证客户端的,而认证客户端只有windows端,如此 ...

  9. Linux Ubuntu系统台式电脑安装外置USB无线网卡驱动(以net-core磊科NW392无线网卡为例)

    前言 最近想让自己的台式电脑也能连上WiFi,台式电脑没有无线网卡,所以使用了一个外置USB无线网卡,就像下面这两个 这个直接插在电脑上就能使用,对于Windows系统来说,使用这个网卡操作非常简单, ...

最新文章

  1. 机器手六维坐标怎么定义_从基础到实操,一本书读懂ABB工业机器人
  2. mac -- 安装OpenCV
  3. 挖掘频繁模式、关联和相关
  4. typescript parseint不能传number_Typescript 使用日志
  5. python 库总结_最近用的python 库总结
  6. CCF CSP 201604-1 折点计数
  7. GO语言学习之路22
  8. html打印日志_Graylog(四)使用Log4j2发送日志到Graylog
  9. 【物流选址】基于matlab佛洛依德算法求解物流选址问题【含Matlab源码 892期】
  10. deepin linux mac主题,deepin,安装GNOME桌面环境,类mac界面美化
  11. wxpython 教程 pdf_活学活用wxPython 完整版PDF
  12. java万年历开题报告_单片机万年历开题报告
  13. 华为路由器--帧中继
  14. android apk结构,APK文件结构详解
  15. Java使用iText PDF按页(逐页、单页)拆分PDF
  16. 困扰了很久的ubuntu下智能拼音输入法
  17. 2019.9.1课程设计报告
  18. 如何进行网站流量分析(二)
  19. android 网络编程 笔记,【Android 应用开发】Android 网络编程 API笔记
  20. 【安装填坑】-import win32api, sys, os ImportError: DLL load failed: 找不到指定的模块。

热门文章

  1. 公司产品移动端网页-前端网页设计技术精美网站源码HTML+CSS+JS
  2. CentOS 安装 微软雅黑字体
  3. No module named '_bz2'
  4. HTML5小游戏-简单抽奖小游戏
  5. Python爬虫:调用百度翻译接口实现中英翻译功能
  6. python_selenium项目_批量获取企业信用代码
  7. 网页版双色球号码生成工具
  8. 视频教程-规范毕业论文及精美简历排版实战-Office/WPS
  9. 零基础如何成为自由插画师?
  10. Oracle - Spool导出数据到TXT文件