⑴ 谁有嵌入式linux应用开发完全手册的光盘啊要完整的啊
题名: 嵌入式Linux应用开发完全手册(详细)
作者: 韦东山编着
出版者: 人民邮电出版社
日期: 2008
中图法分类号: TP316.81
ISBN: 978-7-115-18262-3,978-7-89479-119-1
是这个吧?已经发过去了,请查收。
⑵ android人物移动 不要扔代码
0
android APN的打开与关闭
由于Android对于APN的网络API没有公开,不过我们可以阅读源代码,然后进行数
据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭APN。
大家可以研究一下frameworks/base/core/java/android/provider
/Telephony.java这个类,
比较重要的就是 URI 和数据库字段: content://telephony/carriers
字段可以在Telephony.java中找到。
其实原理很简单 :
1 、 当开启APN的时候,设置一个正确的移动或者联通的APN
2、 关闭的时候设置一个错误APN就会自动关闭网络
看代码:Activity:
Java代码
package cc.mdev.apn;
import java.util.ArrayList;
⑶ 如何使linux内核2.6.31支持yaffs2文件系统
下面操作的前提是:内核支持nand flash
一. 下载yaffs2源码,(我将源码反正/opt目录下),并解压源码,进入源码目录
# tar xzvf yaffs2.tar.gz
# cd yaffs2
二. 为内核添加yaffs2文件系统补丁,执行:
# ./patch-ker.sh c m /..../linux-2.6.31.1 <----c m后面接的是内核源码所在的目录
执行完后,在内核源码fs目录下就多了一个yaffs2目录,同时Makefile和Kconfig文件也增加了对yaffs2的配置和编译条件。
三. 配置内核对yaffs2的支持
这里的配置根据自己的需求,把不用的文件系统都去掉。
#make menuconfig
找到下面的配置:
File systems --->
DOS/FAT/NT Filesystems --->
<*> MSDOS fs support
<*> VFAT (Windows95) fs support
Miscellaneous filesystems --->
<*> YAFFS2 file system support
[*] Autoselect yaffs2 format
配置语言选项:
Native Language support --->
(iso8859-1) Default NLS Option
<*> Codepage 437(United States, Canada)
<*> Simplified Chinese charset(CP936, GB2312)
<*> NLS ISO8859-1 (Latin 1; Western European Language)
<*> NLS UTF-8
现在内核已经支持NandFlash和yaffs2文件系统,重新编译内核:
#make zImage
将编译好的内核烧入NandFlash后,再烧入yaffs2文件系统,就可以了。
四. 制作yaffs2根文件系统
1. 环境
(1) 交叉编译器版本: arm-linux-gcc 4.3.3
(2) Linux环境:redhat enterprise 5.5 (2.6.18-194.el5)
(3) 开发板:TQ2440
2. 编译busybox
(1) 获取busybox源码,放在/opt目录下,解压,进入busybox源码目录
#tar jxvf busybox-1.17.2.tar.bz2
#cd busybox-1.17.2
#vi Makefile
将164行改为CROSS_COMPILE = arm-linux-
将190行改为ARCH = arm
保存退出进入配置菜单
#make menuconfig 采用默认配置保存推出
#make
#make install
通过上面的步骤,在busybox-1.17.2的根目录下出现了一个_install目录,
在该目录下又有三个目录文件bin sbin usr和一个链接文件 linuxrc。
3. 创建根文件系统必要的目录
(1)在/opt目录下创建root_fs目录
#mkdir root_fs
#cd root_fs
(2)将busybox-1.17.2的根目录下_install中的bin sbin usr和linuxrc拷贝到root_fs
#cp -rf /opt/busybox-1.17.2/_install/* /opt/root_fs
(3)创建必要的目录
#mkdir dev etc home lib mnt opt proc root sys tmp var
(4)创建必要的二级目录
#mkdir usr/lib usr/share
#mkdir etc/rc.d
#mkdir var/lib var/lock var/run var/tmp
4. 创建必要的文件
(1) 获取库文件,(交叉编译工具下的库文件)到root_fs/lib目录中
#cp -rf /opt/arm/4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a
(2) 将主机etc目录下的passwd、group、shadow文件拷贝到root_fs/etc目录下
#cp -f /etc/passwd /etc/group /etc/shadow etc
将目录/opt/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷贝到root_fs/etc下。
在这个目录下有三个文件fstab, inittab, profile和一个目录init.d,在目录init.d中有一个文件rcS。
#cp -rf /opt/busybox-1.17.2/examples/bootfloppy/etc/* etc
在目录etc下创建文件mdev.conf。mdev是?v的一个简化版本,
我们可以通过文件mdev.conf自定义一些设备节点的名称或链接来满足特定的需要,但在此处让它为空。
#touh etc/mdev.conf
(3)创建两个设备文件dev/console dev/null。
在linux内核源码文件init/main.c中有打开设备文件dev/console的操作如下:
static noinline int init_post(void)
__releases(kernel_lock)
{
………………………………
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
………………………………
}
内核启动执行到这里时mdev还没有构建dev目录,如果没有创建设备文件dev/console就将会打印警告
Warning: unable to open an initial console。
在内核启动的过程中要将产生的一些垃圾信息丢弃就需要空设备dev/null。
#mknod dev/console c 5 1
#mknod dev/null c 1 3
5. 修改文件
在启动过程中bootloader会传递参数init=/linuxrc给内核的main()函数,所以在文件系统被挂载后,
运行的第一个程序是linuxrc,而linuxrc是一个指向/bin/busybox的链接文件,也就是说文件系统被挂在后运行的第一个程序是busybox。
Busybox首先会解析文件/etc/inittab,这个文件中存放的是系统的配置信息,这些配置信息指明了接下来将要启动那些程序。
-------------------------------------------------------------------------------------------------------
(1)修改文件etc/inittab如下
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
说明:
/etc/inittab 文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下
:::
:表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省 略,则使用与init进程一样的控制台。
:对于Busybox init程序,这个字段滑意义,可以省略。
:表示init程序如何控制这个子进程,
: 要执行的程序,它可以是可执行程序,也可以是脚本
文件etc/inittab配置条目说明如下:
::sysinit:/etc/init.d/rcS
启动系统初始化文件/etc/init.d/rcS。字段sysinit表明文件/etc/init.d/rcS在系统启动后最先执行,
并且只执行一次,init进程等待它结束才继续执行其它动作。(脚本文件名一般为rc,后缀S代表单用户运行级别脚本)
tq2440_serial0::askfirst:-/bin/sh
在串口s3c2410_serial0上启动askfirst动作的shell。
S3C2410的串口名在/dev下是s3c2410_serialx。askfirst表明init进程先输出 “Please press Enter to actvie this console”,
等用户输入回车键之后才启动-/bin/sh。
::ctrlaltdel:/sbin/reboot
当按下Ctrl+Alt+Delete组合键时,init重启执行程序。字段ctrlaltdel表明当按下Ctrl+Alt+Delete组合键时,执行相应的进程。
::shutdown:/bin/umount -a -r
告诉init在关机时运行umount命令卸载所有的文件系统,如果卸载失败,试图以只读方式重新挂载。
字段shutdown表明在重启关闭系统命令时执行相应进程。 ------------------------------------------------------------------------------------------------------------------------------
(2)当解析完文件etc/inittab后就将启动这些进程,首先要执行的是启动脚本etc/init.d/rcS。
修改文件etc/init.d/rcS如下:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/bin/hostname CPEmbed
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 192.168.1.8 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth0
echo "---------------mount all-----------------"
/bin/mount -a
mkdir /dev/pts
/bin/mknod /dev/pts/0 c 136 0
/bin/mknod /dev/pts/1 c 136 1
/bin/mknod /dev/pts/2 c 136 2
/bin/mknod /dev/pts/3 c 136 3
/bin/mknod /dev/pts/4 c 136 4
/bin/mknod /dev/pts/5 c 136 5
/bin/mount -t devpts devpts /dev/pts
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
/usr/sbin/telnetd &
/usr/sbin/vsftpd &
echo "******************************************"
echo "******************************************"
echo "** Kernel version: linux-2.6.31.1 **"
echo "** Date: 2012.04.12 **"
echo "******************************************"
说明如下:
#! /bin/sh 用busybox的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin //shell命令的搜索路径
runlevel=S //运行在单用户模式
prevlevel=N //前一个级别为n表示没有前一个级别
umask 022 //权限位掩码
export PATH runlevel prevlevel //将设置的变量导出到环境中
/bin/hostname CPembed //主机名,CPembed将出现在shell提示符中[root@CPembed/]#
/sbin/ifconfig lo 127.0.0.1 up //启动lo
/sbin/ifconfig eth0 192.168.1.8 netmask 255.255.255.0 up //配置ip地址
/sbin/route add default gw 192.168.1.1 eth0 //添加默认路由
/bin/mount -a //将文件etc/fstab中指明的文件系统挂载到对应挂载点上
后面的8行是对telnetd的配置
echo /sbin/mdev>/proc/sys/kernel/hotplug //用mdev来处理内核的热插拔事件。
当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev。这时mdev通过环境变量中的ACTION和DEVPATH,
(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,
如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件。
mdev -s //建立dev目录。以‘-s’为参数调用位于/sbin 目录写的 mdev(其实是个链接,作用是传递参数给/bin目录下的busybox 程序并调用它),mdev扫描 /sys/class 和/sys /block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则 mdev 就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次“mdev -s”
/usr/sbin/telnetd & //后台运行telnetd
/usr/sbin/vsftpd & //后台运行vsftpd
------------------------------------------------------------------------------------------------------------------------------
(3)修改文件etc/fstab如下:
#device mount-point type option mp fsck order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
在系统启动初始化文件/etc/init.d/rcS中有执行挂载命令/bin/mount -a ,这便是将文件etc/fstab中指定 的文件系统挂载到对应的挂载点上。这些文件系统的挂在是执行mdev -s命令建立dev目录的前提------------------------------------------------------------------------------------------------------------------------------
(4)在启动脚本etc/init.d/rcS执行完后将在串口s3c2410_serial0启动一个shell。Shell启动过程中会根据文件/etc/profile配置登陆环境。
文件/etc/profile修改如下:
USER=" 'id -un' "
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
具体说明:
USER="id -un" //获取用户名id-un与whoami命令有相同的功能
PS1='[\u@\h \W]# ' //PS1指定sh提示符的格式在本环境下将是[root@cyembed /]#
export USER LOGNAME PS1 PATH 将这些变量导出到环境。
(5)在用户登录时将在/etc下寻找三个文件passwd ,shadow, group匹配相关信息。
这三个文件修改如下:
/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
/etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
ftp:x:50:
nobody:x:99:
/etc/shadow root:$6$hnswPTgxzFaZHlLl$//:14819:0:99999:7:::
bin:*:14715:0:99999:7:::
daemon:*:14715:0:99999:7:::
ftp:*:14715:0:99999:7:::
nobody:*:14715:0:99999:7:::
------------------------------------------------------------------------------------------------------------
6. 制作yaffs2根文件系统镜像
用天嵌科技提供的yaffs2文件系统镜像制作工具mkyaffs2image,制作根文件系统镜像。
#./mkyaffs2image root_fs root_fs.bin
7. 将根文件系统镜像下载到nand flash并启动
启动信息如下:
⑷ 如何在Linux下使用Host Interface Networking
在Linux下使用ADSL
本文以RedHat Linux 6.2为实验平台,其它平台的Linux安装办法可以参照下面从源代码
进行安装的步骤。
一、安装的前提条件
1.确保安装了网卡并工作正常
使用命令
#ifconfig eth0
查看网卡状态
2.在系统中不要设置默认路由(网关),让ADSL拨号后自动获得
如果已经设置了默认路由,使用以下方法删除:
在文件 /etc/sysconfig/network 中删除 GATEWAY= 这一行,然后以root执行:
#/etc/rc.d/init.d/network restart
3.已经安装了pppd软件包
如果存在文件 /usr/sbin/pppd,则说明已经安装了pppd;
如果未安装,从RedHatLinux 6.2安装光盘上安装ppp-2.3.11-4.i386.rpm这个软件包
二、安装PPPOE客户端软件
Linux下的PPPOE客户端软件比较多,而且大多使用GNU License,我们推荐使用rp-pppoe
这个软件包。从http://www.roaringpenguin.com/pppoe/这个网站上,不仅可以下栽
RedHat 62平台下的rp-pppoe的二进制软件包,而且可以下栽源代码软件包。
1.二进制软件包的安装:
A.下栽二进制软件包
⑸ 瑞昱RTL 8187L无线网卡linux驱动
应该是想在LINUX下使用8187无线网卡。那么只要达到目的就行。
拿8187的WINDOWS下的驱动,使用ndiswrapper这个桥梁程序,把驱动借到linux下用,换句话说就是内核先调用ndiswrapper模块,ndiswrapper模块再调用无线网卡在WIN下的驱动。
详细步骤如下,我在我的本本上成功的驱上了我的无线网卡,我把过程记录下来了,现在贴给你,希望对你有帮助。
--------------------------
《Linksys WPC54Gv2的PCMCIA无线网卡在centos5.3下能用了》
问题:CENTOS_5.3安装好后在设备管理器里能看见无线网卡,但无法激活
使用lspci可以看到这个无线网卡
[root@ljj ~]# lspci
...... ......
03:00.0 Network controller: Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller (rev 02)
参考lex在http://fedora.linuxsir.org/main/node/137和mjwdj在http://linux.chinaunix.net/bbs/archiver/tid-1098097.html上的方法解决了问题
解决办法:
1、去http://sourceforge.net/projects/ndiswrapper/files/下载ndiswrapper-1.55.tar.gz,它是一个桥梁,能使windows下的无线网卡驱动在Linux下使用。
2、tar xvzf ndiswrapper-1.55.tar.gz解开它
3、less INSTALL看安装说明,先make uninstall,再make,再su为root超级用户后make install安装它。
4、把windows下的无线网卡驱动解开,我的网卡是PCMCIA接口的linksys WPC54Gv2,解开后运行
[root@ljj ~]#/usr/sbin/ndiswrapper -i lsbcmnds.inf
5、安装后看看是否安装上了
[root@ljj ~]#ndiswrapper -l
lsbcmnds : driver installed
device (14E4:4320) present (alternate driver: bcm43xx)
6、再看看14E4:4320也在,是那个rev 02的版本
[root@ljj ~]# lspci -n
00:00.0 0600: 8086:3575 (rev 04)
00:01.0 0604: 8086:3576 (rev 04)
00:1d.0 0c03: 8086:2482 (rev 02)
00:1d.1 0c03: 8086:2484 (rev 02)
00:1d.2 0c03: 8086:2487 (rev 02)
00:1e.0 0604: 8086:2448 (rev 42)
00:1f.0 0601: 8086:248c (rev 02)
00:1f.1 0101: 8086:248a (rev 02)
00:1f.3 0c05: 8086:2483 (rev 02)
00:1f.5 0401: 8086:2485 (rev 02)
01:00.0 0300: 5333:8c2e (rev 05)
02:00.0 0607: 104c:ac51
02:00.1 0607: 104c:ac51
02:02.0 0780: 11c1:0449 (rev 01)
02:08.0 0200: 8086:1031 (rev 42)
03:00.0 0280: 14e4:4320 (rev 02)
7、看看无线网卡接口
[root@ljj ~]# iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
sit0 no wireless extensions.
eth1 IEEE 802.11b/g ESSID:"" Nickname:"Broadcom 4306"
Mode:Managed Frequency=2.442 GHz Access Point: Invalid
RTS thrff Fragment thrff
Encryption keyff
Link Quality=0/100 Signal level=-256 dBm Noise level=-256 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
发现没有ESSID号,没有连接速率,没连上。
8、把它变成模块
[root@ljj ~]# ndiswrapper -m
adding "alias wlan0 ndiswrapper" to /etc/modprobe.d/ndiswrapper ...
9、lsmod发现系统本身有bcm43xx,这也就是为什么在设备管理器中能看到无线网卡的原因,但它不能用,所以要删掉这个模块改用ndiswrapper
[root@ljj ~]# modprobe -r bcm43xx
10、再加载ndiswrapper模块让它负责用windows下的驱动程序驱动无线网卡
[root@ljj ~]# modprobe ndiswrapper
再用lsmod看看,仅有ndiswrapper模块了
[root@ljj ~]# lsmod
Mole Size Used by
ndiswrapper 170256 0
...... ......
11、指定无线信号源,使用
[root@ljj ~]# iwconfig eth1 essid 'ljj'
12、指定密码
[root@ljj ~]# iwconfig eth1 key 6666-6666-66 open
如果要开机就用可以直接在rc.local文件里设定:
echo 'iwconfig eth1 key 6666-6666-66 open' >> /etc/rc.d/rc.local
13、指定ip地址
[root@ljj ~]# ifconfig eht1 192.168.1.10 netmask 255.255.255.0
[root@ljj ~]# ifconfig eth1 up
15、指定网关、缺省路由
[root@ljj ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
[root@ljj ~]# route add default gw 192.168.1.1 eth1
[root@ljj ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
16、就可以用了,你还可以扫描一下周围的其他网络信号
[root@ljj ~]# iwlist eth1 scanning
eth1 Scan completed :
Cell 01 - Address: 00:1D:0F:93:7A:46
ESSID:"ljj"
Protocol:IEEE 802.11b
Mode:Managed
Frequency:2.462 GHz (Channel 11)
Quality:100/100 Signal level:-31 dBm Noise level:-96 dBm
Encryption keyff
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
12 Mb/s; 24 Mb/s; 36 Mb/s; 9 Mb/s; 18 Mb/s
48 Mb/s; 54 Mb/s
Extra:bcn_int=100
Extra:atim=0
Cell 02 - Address: 00:25:86:4D:B2:BA
ESSID:"TP-LINK_4DB2BA"
Protocol:IEEE 802.11b
Mode:Managed
Frequency:2.437 GHz (Channel 6)
Quality:37/100 Signal level:-72 dBm Noise level:-96 dBm
Encryption keyn
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
12 Mb/s; 24 Mb/s; 36 Mb/s; 9 Mb/s; 18 Mb/s
48 Mb/s; 54 Mb/s
Extra:bcn_int=100
Extra:atim=0
Cell 03 - Address: 00:1D:0F:92:7F:AC
ESSID:"TP-LINK"
Protocol:IEEE 802.11b
Mode:Managed
Frequency:2.437 GHz (Channel 6)
Quality:23/100 Signal level:-81 dBm Noise level:-96 dBm
Encryption keyn
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
12 Mb/s; 24 Mb/s; 36 Mb/s; 9 Mb/s; 18 Mb/s
48 Mb/s; 54 Mb/s
Extra:bcn_int=100
Extra:atim=0
-----------------------------------
以下是配置过程:
[ljj@ljj ~]$ su - root
口令:
[root@ljj ~]# lsmod
Mole Size Used by
savage 32705 2
drm 65365 3 savage
deflate 7873 0
zlib_deflate 21977 1 deflate
ccm 13505 0
serpent 29249 0
blowfish 12609 0
twofish 46017 0
ecb 7617 0
xcbc 9921 0
crypto_hash 6336 1 xcbc
cbc 8257 0
md5 8257 0
sha256 15297 0
sha512 13121 0
des 20417 0
aes_generic 31745 0
testmgr_cipher 6849 0
testmgr 44593 1 testmgr_cipher
crypto_blkcipher 17601 4 ccm,ecb,cbc,testmgr
aes_i586 37057 0
ipcomp6 11849 0
ipcomp 11465 0
ah6 10433 0
ah4 10305 0
esp6 12225 0
xfrm6_esp 9537 1 esp6
esp4 12352 0
xfrm4_esp 9793 1 esp4
aead 11841 4 ccm,testmgr,esp6,esp4
crypto_algapi 22849 7 ccm,ecb,xcbc,cbc,testmgr,crypto_blkcipher,aead
xfrm4_tunnel 6593 0
tunnel4 7365 1 xfrm4_tunnel
xfrm4_mode_tunnel 6849 0
xfrm4_mode_transport 6209 0
xfrm6_mode_transport 6337 0
xfrm6_mode_tunnel 6721 0
xfrm6_tunnel 11233 1 ipcomp6
tunnel6 7365 1 xfrm6_tunnel
af_key 40785 0
autofs4 24261 2
hidp 23105 2
l2cap 29505 5 hidp
bluetooth 53797 2 hidp,l2cap
sunrpc 144765 1
ip_conntrack_ftp 11569 0
ip_conntrack_netbios_ns 6977 0
iptable_nat 11205 0
ip_nat 20845 1 iptable_nat
iptable_mangle 6849 0
ipt_REJECT 9537 1
xt_state 6209 11
ip_conntrack 52897 5 ip_conntrack_ftp,ip_conntrack_netbios_ns,iptable_nat,ip_nat,xt_state
nfnetlink 10713 2 ip_nat,ip_conntrack
xt_tcpudp 7105 13
iptable_filter 7105 1
ip_tables 17029 3 iptable_nat,iptable_mangle,iptable_filter
x_tables 17349 5 iptable_nat,ipt_REJECT,xt_state,xt_tcpudp,ip_tables
vfat 15937 1
fat 51165 1 vfat
dm_mirror 23877 0
dm_multipath 24013 0
scsi_dh 11713 1 dm_multipath
video 21193 0
thinkpad_acpi 56929 0
hwmon 7365 1 thinkpad_acpi
backlight 10049 2 video,thinkpad_acpi
sbs 18533 0
i2c_ec 9025 1 sbs
button 10705 0
battery 13637 0
asus_acpi 19289 0
ac 9157 0
ipv6 261473 21 ipcomp6,ah6,esp6,xfrm6_esp,xfrm6_mode_transport,xfrm6_tunnel,tunnel6
xfrm_nalgo 13381 7 ah6,ah4,esp6,xfrm6_esp,esp4,xfrm4_esp,ipv6
crypto_api 12608 10 ccm,testmgr,crypto_blkcipher,ah6,ah4,esp6,esp4,aead,crypto_algapi,xfrm_nalgo
lp 15849 0
snd_intel8x0 35421 1
snd_ac97_codec 93025 1 snd_intel8x0
ac97_bus 6337 1 snd_ac97_codec
snd_seq_mmy 7877 0
snd_seq_oss 32577 0
snd_seq_midi_event 11073 1 snd_seq_oss
snd_seq 49585 5 snd_seq_mmy,snd_seq_oss,snd_seq_midi_event
snd_seq_device 11725 3 snd_seq_mmy,snd_seq_oss,snd_seq
snd_pcm_oss 42817 0
bcm43xx 415584 0
ieee80211softmac 33729 1 bcm43xx
ieee80211 34313 2 bcm43xx,ieee80211softmac
snd_mixer_oss 19009 1 snd_pcm_oss
ieee80211_crypt 10049 1 ieee80211
snd_pcm 72133 3 snd_intel8x0,snd_ac97_codec,snd_pcm_oss
serio_raw 10693 0
snd_timer 24517 2 snd_seq,snd_pcm
e100 36809 0
ide_cd 40161 0
snd 55237 11 snd_intel8x0,snd_ac97_codec,snd_seq_oss,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer
mii 9409 1 e100
soundcore 11553 1 snd
i2c_i801 11725 0
parport_pc 29157 1
pcspkr 7105 0
cdrom 36577 1 ide_cd
snd_page_alloc 14281 2 snd_intel8x0,snd_pcm
i2c_core 23745 2 i2c_ec,i2c_i801
parport 37513 2 lp,parport_pc
dm_raid45 66509 0
dm_message 6977 1 dm_raid45
dm_region_hash 15681 1 dm_raid45
dm_log 14529 3 dm_mirror,dm_raid45,dm_region_hash
dm_mod 62201 4 dm_mirror,dm_multipath,dm_raid45,dm_log
dm_mem_cache 9537 1 dm_raid45
ata_piix 23621 0
libata 156677 1 ata_piix
sd_mod 25153 0
scsi_mod 141589 3 scsi_dh,libata,sd_mod
ext3 124361 1
jbd 56937 1 ext3
uhci_hcd 25421 0
ohci_hcd 24553 0
ehci_hcd 33357 0
[root@ljj ~]#
[root@ljj ~]#
[root@ljj ~]# modprobe -r bcm43xx
[root@ljj ~]#
[root@ljj ~]#
[root@ljj ~]#
[root@ljj ~]#
[root@ljj ~]#
[root@ljj ~]#
[root@ljj ~]# lsmod
Mole Size Used by
savage 32705 2
drm 65365 3 savage
deflate 7873 0
zlib_deflate 21977 1 deflate
ccm 13505 0
serpent 29249 0
blowfish 12609 0
twofish 46017 0
ecb 7617 0
xcbc 9921 0
crypto_hash 6336 1 xcbc
cbc 8257 0
md5 8257 0
sha256 15297 0
sha512 13121 0
des 20417 0
aes_generic 31745 0
testmgr_cipher 6849 0
testmgr 44593 1 testmgr_cipher
crypto_blkcipher 17601 4 ccm,ecb,cbc,testmgr
aes_i586 37057 0
ipcomp6 11849 0
ipcomp 11465 0
ah6 10433 0
ah4 10305 0
esp6 12225 0
xfrm6_esp 9537 1 esp6
esp4 12352 0
xfrm4_esp 9793 1 esp4
aead 11841 4 ccm,testmgr,esp6,esp4
crypto_algapi 22849 7 ccm,ecb,xcbc,cbc,testmgr,crypto_blkcipher,aead
xfrm4_tunnel 6593 0
tunnel4 7365 1 xfrm4_tunnel
xfrm4_mode_tunnel 6849 0
xfrm4_mode_transport 6209 0
xfrm6_mode_transport 6337 0
xfrm6_mode_tunnel 6721 0
xfrm6_tunnel 11233 1 ipcomp6
tunnel6 7365 1 xfrm6_tunnel
af_key 40785 0
autofs4 24261 2
hidp 23105 2
l2cap 29505 5 hidp
bluetooth 53797 2 hidp,l2cap
sunrpc 144765 1
ip_conntrack_ftp 11569 0
ip_conntrack_netbios_ns 6977 0
iptable_nat 11205 0
ip_nat 20845 1 iptable_nat
iptable_mangle 6849 0
ipt_REJECT 9537 1
xt_state 6209 11
ip_conntrack 52897 5 ip_conntrack_ftp,ip_conntrack_netbios_ns,iptable_nat,ip_nat,xt_state
nfnetlink 10713 2 ip_nat,ip_conntrack
xt_tcpudp 7105 13
iptable_filter 7105 1
ip_tables 17029 3 iptable_nat,iptable_mangle,iptable_filter
x_tables 17349 5 iptable_nat,ipt_REJECT,xt_state,xt_tcpudp,ip_tables
vfat 15937 1
fat 51165 1 vfat
dm_mirror 23877 0
dm_multipath 24013 0
scsi_dh 11713 1 dm_multipath
video 21193 0
thinkpad_acpi 56929 0
hwmon 7365 1 thinkpad_acpi
backlight 10049 2 video,thinkpad_acpi
sbs 18533 0
i2c_ec 9025 1 sbs
button 10705 0
battery 13637 0
asus_acpi 19289 0
ac 9157 0
ipv6 261473 21 ipcomp6,ah6,esp6,xfrm6_esp,xfrm6_mode_transport,xfrm6_tunnel,tunnel6
xfrm_nalgo 13381 7 ah6,ah4,esp6,xfrm6_esp,esp4,xfrm4_esp,ipv6
crypto_api 12608 10 ccm,testmgr,crypto_blkcipher,ah6,ah4,esp6,esp4,aead,crypto_algapi,xfrm_nalgo
lp 15849 0
snd_intel8x0 35421 1
snd_ac97_codec 93025 1 snd_intel8x0
ac97_bus 6337 1 snd_ac97_codec
snd_seq_mmy 7877 0
snd_seq_oss 32577 0
snd_seq_midi_event 11073 1 snd_seq_oss
snd_seq 49585 5 snd_seq_mmy,snd_seq_oss,snd_seq_midi_event
snd_seq_device 11725 3 snd_seq_mmy,snd_seq_oss,snd_seq
snd_pcm_oss 42817 0
snd_mixer_oss 19009 1 snd_pcm_oss
snd_pcm 72133 3 snd_intel8x0,snd_ac97_codec,snd_pcm_oss
serio_raw 10693 0
snd_timer 24517 2 snd_seq,snd_pcm
e100 36809 0
ide_cd 40161 0
snd 55237 11 snd_intel8x0,snd_ac97_codec,snd_seq_oss,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer
mii 9409 1 e100
soundcore 11553 1 snd
i2c_i801 11725 0
parport_pc 29157 1
pcspkr 7105 0
cdrom 36577 1 ide_cd
snd_page_alloc 14281 2 snd_intel8x0,snd_pcm
i2c_core 23745 2 i2c_ec,i2c_i801
parport 37513 2 lp,parport_pc
dm_raid45 66509 0
dm_message 6977 1 dm_raid45
dm_region_hash 15681 1 dm_raid45
dm_log 14529 3 dm_mirror,dm_raid45,dm_region_hash
dm_mod 62201 4 dm_mirror,dm_multipath,dm_raid45,dm_log
dm_mem_cache 9537 1 dm_raid45
ata_piix 23621 0
libata 156677 1 ata_piix
sd_mod 25153 0
scsi_mod 141589 3 scsi_dh,libata,sd_mod
ext3 124361 1
jbd 56937 1 ext3
uhci_hcd 25421 0
ohci_hcd 24553 0
ehci_hcd 33357 0
[root@ljj ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
[root@ljj ~]# modprobe ndiswrapper
[root@ljj ~]# ndiswrapper -l
lsbcmnds : driver installed
device (14E4:4320) present (alternate driver: bcm43xx)
[root@ljj ~]#
[root@ljj ~]# iwconfig eth1 essid 'ljj'
[root@ljj ~]# iwconfig eth1 key 6666-6666-66 open
[root@ljj ~]# iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
sit0 no wireless extensions.
eth1 IEEE 802.11g ESSID:"ljj"
Mode:Managed Frequency:2.462 GHz Access Point: 00:1D:0F:93:7A:46
Bit Rate:54 Mb/s Tx-Power:14 dBm
RTS thr:2347 B Fragment thr:2346 B
Encryption key:6666-6666-66 Security modepen
Power Managementff
Link Quality:100/100 Signal level:-31 dBm Noise level:-96 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
[root@ljj ~]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=4.77 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.68 ms
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 1.687/3.229/4.771/1.542 ms
[root@ljj ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
[root@ljj ~]# ping www..com
PING www.a.shifen.com (202.108.22.5) 56(84) bytes of data.
64 bytes from xd-22-5-a8.bta.net.cn (202.108.22.5): icmp_seq=1 ttl=54 time=15.4 ms
64 bytes from xd-22-5-a8.bta.net.cn (202.108.22.5): icmp_seq=2 ttl=54 time=14.7 ms
64 bytes from xd-22-5-a8.bta.net.cn (202.108.22.5): icmp_seq=3 ttl=54 time=14.9 ms
64 bytes from xd-22-5-a8.bta.net.cn (202.108.22.5): icmp_seq=4 ttl=54 time=14.7 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 14.708/14.952/15.402/0.296 ms
⑹ linux 内核4.9.11如何使用热拔插
在Linux系统中,当系统配置发生变化时,如:添加kset到系统;移动kobject,一个通知会从内核空间发送到用户空间,这就是热插拔事件。热插拔事件会导致用户空间中相应的处理程序(如udev,mdev)被调用,这些处理程序会通过加载驱动程序,创建设备节点等来响应热插拔事件。
操作集合
Structkset_uevent_ops{
int(*filter)(structkset*kset,structkobject*kobj);
constchar*(*name)(structkset*kset,structkobject*kobj);
int(*uevent)(structkset*kset,structkobject*kobj,
structkobj_uevent_env*env);
}
当该kset所管理的kobject和kset状态发生变化时(如被加入,移动),这三个函数将被调用。
Filter:决定是否将事件传递到用户空间。如果filter返回0,将不传递事件。
Name:负责将相应的字符串传递给用户空间的热插拔处理程序。
Uevent:将用户空间需要的参数添加到环境变量中。
int(*uevent)(structkset*kset,
structkobject*kobj,/*产生事件的目标对象*/
char**envp,/*一个保存其他环境变量定义(通常为NAME=value的格式)的数组*/
intnum_envp,/*环境变量数组中包含的变量数(数组大小)*/
char*buffer,intbuffer_size/*环境变量被放入的缓冲区的指针和字节数*/
);/*返回值正常时是,若返回非零值将终止热插拔事件的产生*/
实例源码:temp.rar
点击(此处)折叠或打开
/**
*热插拔事件
*Lzy2012-7-27
*/
#include<linux/device.h>
#include<linux/mole.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/sysfs.h>
#include<linux/stat.h>
#include<linux/kobject.h>
static struct attribute test_attr=
{
.name="kobj_config",
.mode=S_IRWXUGO,
};
static struct attribute*def_attrs[]=
{
&test_attr,
NULL,
};
ssize_t kobj_test_show(struct kobject*kobject,struct attribute*attr,char*buf)
{
printk("Have show -->
");
printk("attrname: %s.
",attr->name);
sprintf(buf,"%s
",attr->name);
return strlen(attr->name)+2;
}
ssize_t kobj_test_store(struct kobject*kobject,struct attribute*attr,constchar*buf,size_t size)
{
printk("Have store -->
");
printk("write: %s.
",buf);
return size;
}
static struct sysfs_ops obj_test_sysops=
{
.show=kobj_test_show,
.store=kobj_test_store,
};
void obj_test_release(struct kobject*kobject)
{
printk("[kobj_test: release!]
");
}
static struct kobj_type ktype=
{
.release=obj_test_release,
.sysfs_ops=&obj_test_sysops,
.default_attrs=def_attrs,
};
staticintkset_filter(struct kset*kset,struct kobject*kobj)
{
//intret=0;
//struct kobj_type*ktype=get_ktype(kobj);/*得到属性类型*/
//ret=(ktype==&ktype_part);
printk("Filter: kobj %s.
",kobj->name);
return 1;
}
staticconstchar*kset_name(struct kset*kset,struct kobject*kobj)
{
static char buf[20];
/*struct device*dev=to_dev(kobj);
if(dev->bus)
return dev->bus->name;
elseif(dev->class)
return dev->class->name;
else
*/{
printk("Name kobj %s.
",kobj->name);
sprintf(buf,"%s","kset_name");
}
return buf;
}
staticintkset_uevent(struct kset*kset,struct kobject*kobj,struct kobj_uevent_env*env)
{
inti=0;
printk("uevent: kobj %s.
",kobj->name);
while(i<env->envp_idx)
{
printk("%s.
",env->envp[i]);
i++;
}
return 0;
}
static struct kset_uevent_ops uevent_ops=
{
.filter=kset_filter,
.name=kset_name,
.uevent=kset_uevent,
};
struct kset*kset_p;
struct kset kset_c;
staticint__init kset_test_init(void)
{
intret=0;
printk("kset test init!
");
/*创建并注册 kset_p*/
kset_p=kset_create_and_add("kset_p",&uevent_ops,NULL);
kobject_set_name(&kset_c.kobj,"kset_c");
kset_c.kobj.kset=kset_p;/*添加 kset_c 到 kset_p*/
/*对于较新版本的内核,在注册 kset 之前,需要
*填充 kset.kobj 的 ktype 成员,否则注册不会成功*/
kset_c.kobj.ktype=&ktype;
ret=kset_register(&kset_c);
if(ret)
kset_unregister(kset_p);
return ret;
}
static void __exit kset_test_exit(void)
{
printk("kset test exit!
");
kset_unregister(&kset_c);
kset_unregister(kset_p);
}
mole_init(kset_test_init);
mole_exit(kset_test_exit);
MODULE_AUTHOR("Lzy");
MODULE_LICENSE("GPL");
⑺ 嵌入式linux 用户空间也是3g 吗
首先,要确认你的嵌入式linux系统是可以支持热插拔的系统。(我用的是mdev方式支持热插拔)
然后,是驱动的安装。AC2746没有专门linux下的驱动。不过,它的usb口在windows系统中实际是用usb转串口的方式转为串口工作的。那么,在linux下同样也可以用usb转串口的方式来使用。linux内核自带了usb转串口的驱动。在内核的编译选择中,选中
Device Drivers ---> [*] USB support ---> USB Serial Converter support ---> USB Serial Converter support
再选中其下的USB driver for GSM and CDMA modems 的选项即可。要注意的是,编译方式一定要选为模块化编译。
选定这两项后,执行make moles命令,会编译源码中/driver/usb/serial/目录下的usb-serial.c和option.c两个文件及其它一些相关文件。
在option.c中,可以看到已经定义了很多设备的描述符,但没有定义AC2746的描述符。我们自已定义一下即可。方法是,在源码中,添加
#define ZTE_VENDOR_ID 0x19d2
⑻ 教你如何开关Android的APN网络
由于Android对于APN的网络API没有公开,不过我们可以阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭APN。
大家可以研究一下frameworks/base/core/java/android/provider/Telephony.java这个类,
比较重要的就是 URI 和数据库字段: content://telephony/carriers
字段可以在Telephony.java中找到。
其实原理很简单 :
1 、 当开启APN的时候,设置一个正确的移动或者联通的APN
2、 关闭的时候设置一个错误APN就会自动关闭网络
请看代码:Activity:
Java代码
package cc.mdev.apn;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
/**
* 这里是Activity
* @author SinFrancis wong
* @since 2010-01-08
*/
public class Main extends Activity {
/** Called when the activity is first created. */
Uri uri = Uri.parse("content://telephony/carriers");
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button open= (Button) findViewById(R.id.open);
Button close= (Button) findViewById(R.id.close);
open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openAPN();
}
});
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
closeAPN();
}
});
}
public void openAPN(){
List<APN> list = getAPNList();
for (APN apn : list) {
ContentValues cv = new ContentValues();
cv.put("apn", APNMatchTools.matchAPN(apn.apn));
cv.put("type", APNMatchTools.matchAPN(apn.type));
getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id});
}
}
public void closeAPN(){
List<APN> list = getAPNList();
for (APN apn : list) {
ContentValues cv = new ContentValues();
cv.put("apn", APNMatchTools.matchAPN(apn.apn)+"mdev");
cv.put("type", APNMatchTools.matchAPN(apn.type)+"mdev");
getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id});
}
}
private List<APN> getAPNList(){
String tag = "Main.getAPNList()";
//current不为空表示可以使用的APN
String projection[] = {"_id,apn,type,current"};
Cursor cr = this.getContentResolver().query(uri, projection, null, null, null);
List<APN> list = new ArrayList<APN>();
while(cr!=null && cr.moveToNext()){
Log.d(tag, cr.getString(cr.getColumnIndex("_id")) + " " + cr.getString(cr.getColumnIndex("apn")) + " " + cr.getString(cr.getColumnIndex("type"))+ " " + cr.getString(cr.getColumnIndex("current")));
APN a = new APN();
a.id = cr.getString(cr.getColumnIndex("_id"));
a.apn = cr.getString(cr.getColumnIndex("apn"));
a.type = cr.getString(cr.getColumnIndex("type"));
list.add(a);
}
if(cr!=null)
cr.close();
return list;
}
public static class APN{
String id;
String apn;
String type;
}
}
APNMatchTools.java
Java代码
package cc.mdev.apn;
/**
* 这里是APN匹配,用于匹配移动或者联通的APN
* @author SinFrancis wong
* @since 2010-01-08
*
*/
public final class APNMatchTools {
public static class APNNet{
/**
* 中国移动cmwap
*/
public static String CMWAP = "cmwap";
/**
* 中国移动cmnet
*/
public static String CMNET = "cmnet";
//中国联通3GWAP设置 中国联通3G因特网设置 中国联通WAP设置 中国联通因特网设置
//3gwap 3gnet uniwap uninet
/**
* 3G wap 中国联通3gwap APN
*/
public static String GWAP_3 = "3gwap";
/**
* 3G net 中国联通3gnet APN
*/
public static String GNET_3="3gnet";
/**
* uni wap 中国联通uni wap APN
*/
public static String UNIWAP="uniwap";
/**
* uni net 中国联通uni net APN
*/
public static String UNINET="uninet";
}
public static String matchAPN(String currentName) {
if("".equals(currentName) || null==currentName){
return "";
}
currentName = currentName.toLowerCase();
if(currentName.startsWith(APNNet.CMNET))
return APNNet.CMNET;
else if(currentName.startsWith(APNNet.CMWAP))
return APNNet.CMWAP;
else if(currentName.startsWith(APNNet.GNET_3))
return APNNet.GNET_3;
else if(currentName.startsWith(APNNet.GWAP_3))
return APNNet.GWAP_3;
else if(currentName.startsWith(APNNet.UNINET))
return APNNet.UNINET;
else if(currentName.startsWith(APNNet.UNIWAP))
return APNNet.UNIWAP;
else if(currentName.startsWith("default"))
return "default";
else return "";
// return currentName.substring(0, currentName.length() - SUFFIX.length());
}
}
最后不要忘记加上修改APN的权限:
Xml代码
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission>
经过测试在G1 上联通和移动卡均是成功的。
⑼ 如何使mdev可以在/dev/下建立设备节点
在busybox源代码的 doc/mdev.txt 文档里面找到以下说明: 怎么能让mdev把设备节点创建在子目录下呢?
在busybox源代码的 doc/mdev.txt 文档里面找到以下说明:
You can rename/move device nodes by using the next optional field.
<device regex> <uid>:<gid> <permissions> [=path]
So if you want to place the device node into a subdirectory, make sure the path
has a trailing /. If you want to rename the device node, just place the name.
hda 0:3 660 =drives/
This will move "hda" into the drives/ subdirectory.
hdb 0:3 660 =cdrom
This will rename "hdb" to "cdrom".
Similarly, ">path" renames/moves the device but it also creates
a direct symlink /dev/DEVNAME to the renamed/moved device.
所以, 我们只要在 /etc/mdev.conf配置文件里面加入几行就可以了:
controlC[0-9] 0:0 0660 =snd/
pcm.* 0:0 0660 =snd/
seq.* 0:0 0660 =snd/
mix.* 0:0 0660 =snd/
timer 0:0 0660 =snd/
这样再运行mdev, ALSA相关的设备节点就都创建在 /dev/snd/ 目录下了。
后记: 内核里面 struct class 里面的 devnode 项跟设备节点所在目录好像也有关系。
⑽ Android开发如何实现APN网络切换
APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。 APN的英文全称是Access Point Name,中文全称叫接入点,是您在通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。 移动手机的默认上网配置有两种:CMWAP和CMNET。一些使用移动办公的大客户,通常会使用专用APN,其接入点随意定义,只要和该省运营商其他APN不冲突即可。 CMWAP也叫移动梦网,通过该接入点可接入一个比较大的移动私网,网内有大量的手机应用下载及资源访问。因为CMWAP不接入互联网,只接入移动运营商的私网,所以流量费用比较低廉。 CMNET也叫GPRS连接互联网,通常每个省的运营商会提供若干个Internet出口以供CMNET拨号用户使用。其流量费用较CMWAP要高一些。 目前国内销售的手机,如果是非智能机,通常已配置好CMWAP连接,智能机通常会配置CMWAP和CMNET连接。如需手动添加这些配置,请参考手机说明书。 专有APN在功能上可以和Internet的VPN做类比,实际上他就是基于GPRS的VPN网络。 专有APN常见组网方式 1,运营商部署一条专线接入到企业的网络中,局端和企业端路由器之间采用私有IP进行连接。 2,局端互连路由器与GGSN采用GRE隧道连接。 专有APN的几个重要特点: 1,除非运营商分配一个Internet IP地址,否则计算机没有任何办法通过Internet访问该APN中的主机。 2,只有手机卡号在APN中的白名单之列,该手机才可以接入该APN。 3,企业客户可以建立一套RADIUS和DHCP服务器,GGSN向RADIUS服务器提供用户主叫号码,采用主叫号码和用户账号相结合的认证方式;用户通过认证后由DHCP服务器分配企业内部的静态IP地址。补充:该认证方式不一定适合于每个省的运营商,这取决于该省运营商的APN管理平台。 GPRS专网系统终端上网登录服务器平台的流程为: 1)用户发出GPRS登录请求,请求中包括由运营商为GPRS专网系统专门分配的专网APN; 2)根据请求中的APN,SGSN向DNS服务器发出查询请求,找到与企业服务器平台连接的GGSN,并将用户请求通过GTP隧道封装送给GGSN; 3)GGSN将用户认证信息(包括手机号码、用户账号、密码等)通过专线送至Radius进行认证; 4)Radius认证服务器看到手机号等认证信息,确认是合法用户发来的请求,向DHCP服务器请求分配用户地址; 5)Radius认证通过后,由Radius向GGSN发送携带用户地址的确认信息; 6)用户得到了IP地址,就可以携带数据包,对GPRS专网系统信息查询和业务处理平台进行访问。 下面是相关代码: public void openAPN(){ List list = getAPNList(); for (APN apn : list) { ContentValues cv = new ContentValues(); cv.put("apn", APNMatchTools.matchAPN(apn.apn)); cv.put("type", APNMatchTools.matchAPN(apn.type)); getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id}); } } public void closeAPN(){ List list = getAPNList(); for (APN apn : list) { ContentValues cv = new ContentValues(); cv.put("apn", APNMatchTools.matchAPN(apn.apn)+"mdev"); cv.put("type", APNMatchTools.matchAPN(apn.type)+"mdev"); getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id}); } } private List getAPNList(){ String tag = "Main.getAPNList()"; //current不为空表示可以使用的APN String projection[] = {"_id,apn,type,current"}; Cursor cr = this.getContentResolver().query(uri, projection, null, null, null); List list = new ArrayList(); while(cr!=null && cr.moveToNext()){ Log.d(tag, cr.getString(cr.getColumnIndex("_id")) + " " + cr.getString(cr.getColumnIndex("apn")) + " " + cr.getString(cr.getColumnIndex("type"))+ " " + cr.getString(cr.getColumnIndex("current"))); APN a = new APN(); a.id = cr.getString(cr.getColumnIndex("_id")); a.apn = cr.getString(cr.getColumnIndex("apn")); a.type = cr.getString(cr.getColumnIndex("type")); list.add(a); } if(cr!=null) cr.close(); return list; } public static class APN{ String id; String apn; String type; } /** * @Name: setDefaultApn * @Description: 设置默认APN * @param apnId * @return boolean 返回类型 * @throws */ public boolean setDefaultApn(int apnId) { boolean res = false; ContentResolver resolver = context.getContentResolver(); ContentValues values = new ContentValues(); values.put("apn_id", apnId); try { resolver.update(PREFERRED_APN_URI, values, null, null); Cursor c = resolver.query(PREFERRED_APN_URI, new String[] { "name", "apn" }, "_id=" + apnId, null, null); if (c != null) { res = true; c.close(); } } catch (SQLException e) { } return res; } /** * 得到当前使用的APN * @return */ public ApnNode getDefaultAPN() { String id = ""; String apn = ""; String name = ""; String type = ""; ApnNode apnNode = new ApnNode(); Cursor mCursor = context.getContentResolver().query(PREFERRED_APN_URI, null, null, null, null); if (mCursor == null) { return null; } while (mCursor != null && mCursor.moveToNext()) { id = mCursor.getString(mCursor.getColumnIndex("_id")); name = mCursor.getString(mCursor.getColumnIndex("name")); apn = mCursor.getString(mCursor.getColumnIndex("apn")) .toLowerCase(); type = mCursor.getString(mCursor.getColumnIndex("type")) .toLowerCase(); } OLD_APN_ID = Integer.valueOf(id); apnNode.setName(name); apnNode.setApn(apn); apnNode.setType(type); System.out.println("old_name:" + name + "--old_apn:" + apn + "--old_type:" + type); return apnNode; } /** * @Name: SwitchApn * @Description: 转换APN状态 * @param 设定文件 * @return void 返回类型 * @throws */ public void SwitchApn() { switch (GetCurrentNetType()) { case NET_3G: if (!IsCurrentEmergencyApn()) { EM_APN_ID = IsEmergencyApnExisted(EMERGENCY_APN); System.out.println(EM_APN_ID); if (EM_APN_ID == -1) { setDefaultApn(AddEmergencyApn()); } else { setDefaultApn(EM_APN_ID); } } break; case NET_WIFI: break; case NET_OTHER: break; default: break; } } public final class APNMatchTools { public static class APNNet{ /* * 中国移动cmwap */ public static String CMWAP = "cmwap"; /* * 中国移动cmnet */ public static String CMNET = "cmnet"; //中国联通3GWAP设置 中国联通3G因特网设置 中国联通WAP设置 中国联通因特网设置 //3gwap 3gnet uniwap uninet /* * 3G wap 中国联通3gwap APN */ public static String GWAP_3 = "3gwap"; /* * 3G net 中国联通3gnet APN */ public static String GNET_3="3gnet"; /** * uni wap 中国联通uni wap APN */ public static String UNIWAP="uniwap"; /** * uni net 中国联通uni net APN */ public static String UNINET="uninet"; } public static String matchAPN(String currentName) { if("".equals(currentName) || null==currentName){ return ""; } currentName = currentName.toLowerCase(); if(currentName.startsWith(APNNet.CMNET)) return APNNet.CMNET; else if(currentName.startsWith(APNNet.CMWAP)) return APNNet.CMWAP; else if(currentName.startsWith(APNNet.GNET_3)) return APNNet.GNET_3; else if(currentName.startsWith(APNNet.GWAP_3)) return APNNet.GWAP_3; else if(currentName.startsWith(APNNet.UNINET)) return APNNet.UNINET; else if(currentName.startsWith(APNNet.UNIWAP)) return APNNet.UNIWAP; else if(currentName.startsWith("default")) return "default"; else return ""; // return currentName.substring(0, currentName.length() - SUFFIX.length()); } } 对于Android APN接入点相关的开发,有一个不错的开源项目APNDroid的源代码本地下载,里面包含了一个不错的Widget框架,大家可以通过APNDroid源码学习到有关接入点的相关问题,可以解决GPRS,尤其是国内的CMNET、CMWAP的切换和管理。