⑴ 誰有嵌入式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的切換和管理。