Android通过有线USB上网卡上网
2013-03-27 10:22
316 查看
USB上网卡分无线3G和有线的,无线3G上网卡我的同事已经实现,我最近实现的是有线的。即通过RJ45转USB连接到MID,驱动会注册好ethX的网络设备,我要实现的就是操作该网络设备就可以了。
ConnectivityService是管理连接的服务,它管理多个网络类型Tracker,如WifiStateTracker,MobileDataStateTracker,类似的,我需要实现UsbNetworkStateTracker。
ConnectivityService在实例化某个Tracker时,会传递进去一个Handler的回调,如果某个Tracker发生状态改变(信号强度,连接状态等),都会通过给该回调发送消息,ConnectivityService根据状态变化,向应用层发送intent。一个典型的例子是数据连接成功后的动作:
[java] view
plaincopy
private void sendConnectedBroadcast(NetworkInfo info) {
Intent intent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
intent.putExtra(ConnectivityManager.EXTRA_NETWORK_INFO, info);
if (info.isFailover()) {
intent.putExtra(ConnectivityManager.EXTRA_IS_FAILOVER, true);
info.setFailover(false);
}
if (info.getReason() != null) {
intent.putExtra(ConnectivityManager.EXTRA_REASON, info.getReason());
}
if (info.getExtraInfo() != null) {
intent.putExtra(ConnectivityManager.EXTRA_EXTRA_INFO,
info.getExtraInfo());
}
sendStickyBroadcast(intent);
}
各类Tracker都是继承自NetworkStateTracker,而NetworkStateTracker继承自Handler,NetworkStateTracker有一个的NetworkInfo实例,存储当前网络类型的状态,应用程序可以通过ConnectivityService客户端ConnectivityManager的getAllNetworkInfo()来获得这些实例。
UsbNetworkStateTracker跟WifiStateTracker不一样的地方是,WIFI有自己的服务,应用程序可以调用WifiService的客户端WifiManager来操纵wifi设备,从而调用到WfiStateTracker,我只能通过自定的消息来操作UsbNetworkStateTracker,
自定义的两个动作包括:
[c-sharp] view
plaincopy
public static final String ACTION_USB_NETWORK_START = "android.net.usb.NETWORK_START";
public static final String ACTION_USB_NETWORK_STOP = "android.net.usb.NETWORK_STOP";
应用程序发送包含该动作的intent,UsbNetworkStateTracker收到以后会执行相应的动作。
除此之外,UsbNetworkStateTracker还应该能识别当前可用的网络设备的名称,NetworkManagementService提供了一个接口INetworkManagementEventObserver,只要继承这个接口里面的三个回调的方法,
[java] view
plaincopy
interface INetworkManagementEventObserver {
/**
* Interface link status has changed.
*
* @param iface The interface.
* @param link True if link is up.
*/
void interfaceLinkStatusChanged(String iface, boolean link);
/**
* An interface has been added to the system
*
* @param iface The interface.
*/
void interfaceAdded(String iface);
/**
* An interface has been removed from the system
*
* @param iface The interface.
*/
void interfaceRemoved(String iface);
}
然后通过下面代码注册这个接口
[java] view
plaincopy
// register for notifications from NetworkManagement Service
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
INetworkManagementService service = INetworkManagementService.Stub.asInterface(b);
try {
service.registerObserver(mInterfaceObserver);
} catch (RemoteException e) {
Log.e(TAG, "Error registering observer :" + e);
}
这样你的Tracker就能监听到网络设备的插拔了,这样做是为了保持与wifi的兼容,否则你不知道eth0 和eth1对应的wifi还是usb网卡。
UsbNetworkStateTracker通过调用NetworkUtils的方法来操纵网络设备。典型的方法是执行DHCP,通过调用
[java] view
plaincopy
public native static boolean runDhcp(String interfaceName, DhcpInfo ipInfo);
这个通过jni调用到dhcpclient.c里面的函数。
如果说不加Tracker行不行,在apk里面直接调用NetworkUtils是没有权限的,就算是获得了所有的网络权限,甚至在AndroidManifest里面将android:sharedUserId设置为android.uid.system都不行,原因我到现在还没搞清楚。其实实现一个Tracker也还好,不用自己去管理一些中间状态,而且对应用层很友好。
加了一个Tracker会改变android的api,可能会遇到编译上的问题,你需要到工程目录下(比如/all/froyo/)
运行如下命令:make update-api; make PRODUCT-sdk-sdk;
具体参考:http://hi.baidu.com/programmar/blog/item/732776ea307360dfd439c938.html
ConnectivityService是管理连接的服务,它管理多个网络类型Tracker,如WifiStateTracker,MobileDataStateTracker,类似的,我需要实现UsbNetworkStateTracker。
ConnectivityService在实例化某个Tracker时,会传递进去一个Handler的回调,如果某个Tracker发生状态改变(信号强度,连接状态等),都会通过给该回调发送消息,ConnectivityService根据状态变化,向应用层发送intent。一个典型的例子是数据连接成功后的动作:
[java] view
plaincopy
private void sendConnectedBroadcast(NetworkInfo info) {
Intent intent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
intent.putExtra(ConnectivityManager.EXTRA_NETWORK_INFO, info);
if (info.isFailover()) {
intent.putExtra(ConnectivityManager.EXTRA_IS_FAILOVER, true);
info.setFailover(false);
}
if (info.getReason() != null) {
intent.putExtra(ConnectivityManager.EXTRA_REASON, info.getReason());
}
if (info.getExtraInfo() != null) {
intent.putExtra(ConnectivityManager.EXTRA_EXTRA_INFO,
info.getExtraInfo());
}
sendStickyBroadcast(intent);
}
各类Tracker都是继承自NetworkStateTracker,而NetworkStateTracker继承自Handler,NetworkStateTracker有一个的NetworkInfo实例,存储当前网络类型的状态,应用程序可以通过ConnectivityService客户端ConnectivityManager的getAllNetworkInfo()来获得这些实例。
UsbNetworkStateTracker跟WifiStateTracker不一样的地方是,WIFI有自己的服务,应用程序可以调用WifiService的客户端WifiManager来操纵wifi设备,从而调用到WfiStateTracker,我只能通过自定的消息来操作UsbNetworkStateTracker,
自定义的两个动作包括:
[c-sharp] view
plaincopy
public static final String ACTION_USB_NETWORK_START = "android.net.usb.NETWORK_START";
public static final String ACTION_USB_NETWORK_STOP = "android.net.usb.NETWORK_STOP";
应用程序发送包含该动作的intent,UsbNetworkStateTracker收到以后会执行相应的动作。
除此之外,UsbNetworkStateTracker还应该能识别当前可用的网络设备的名称,NetworkManagementService提供了一个接口INetworkManagementEventObserver,只要继承这个接口里面的三个回调的方法,
[java] view
plaincopy
interface INetworkManagementEventObserver {
/**
* Interface link status has changed.
*
* @param iface The interface.
* @param link True if link is up.
*/
void interfaceLinkStatusChanged(String iface, boolean link);
/**
* An interface has been added to the system
*
* @param iface The interface.
*/
void interfaceAdded(String iface);
/**
* An interface has been removed from the system
*
* @param iface The interface.
*/
void interfaceRemoved(String iface);
}
然后通过下面代码注册这个接口
[java] view
plaincopy
// register for notifications from NetworkManagement Service
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
INetworkManagementService service = INetworkManagementService.Stub.asInterface(b);
try {
service.registerObserver(mInterfaceObserver);
} catch (RemoteException e) {
Log.e(TAG, "Error registering observer :" + e);
}
这样你的Tracker就能监听到网络设备的插拔了,这样做是为了保持与wifi的兼容,否则你不知道eth0 和eth1对应的wifi还是usb网卡。
UsbNetworkStateTracker通过调用NetworkUtils的方法来操纵网络设备。典型的方法是执行DHCP,通过调用
[java] view
plaincopy
public native static boolean runDhcp(String interfaceName, DhcpInfo ipInfo);
这个通过jni调用到dhcpclient.c里面的函数。
如果说不加Tracker行不行,在apk里面直接调用NetworkUtils是没有权限的,就算是获得了所有的网络权限,甚至在AndroidManifest里面将android:sharedUserId设置为android.uid.system都不行,原因我到现在还没搞清楚。其实实现一个Tracker也还好,不用自己去管理一些中间状态,而且对应用层很友好。
加了一个Tracker会改变android的api,可能会遇到编译上的问题,你需要到工程目录下(比如/all/froyo/)
运行如下命令:make update-api; make PRODUCT-sdk-sdk;
具体参考:http://hi.baidu.com/programmar/blog/item/732776ea307360dfd439c938.html
相关文章推荐
- Android通过有线USB上网卡上网
- 让Android 设备通过USB 转RJ45有线网卡上网
- 让Android 设备通过USB 转RJ45有线网卡上网
- 让Android 设备通过USB 转RJ45有线网卡上网
- 让Android 设备通过USB 转RJ45有线网卡上网
- 让Android 设备通过USB 转RJ45有线网卡上网
- 让Android 设备通过USB 转RJ45有线网卡上网
- 让Android 设备通过USB 转RJ45有线网卡上网
- 〖Linux〗通过USB连接,共享Linux上的网络,使用Android手机上网。
- WIFI 安卓Android系统手机通过USB连接电脑上网
- android手机通过usb绑定与PC互联接上网(总结)
- android手机通过usb绑定与PC互联接上网(总结)
- 「教程」Android手机如何通过USB使用电脑宽带上网(测试手机:Moto XT800)
- Android手机通过usb连接电脑上网
- G1 Android手机通过USB线共享电脑的网络上网
- 手机usb有线上网
- Linux下通过USB连接并利用手机拨号上网
- 通过USB使用手机调试Android程序
- 3种方法让android手机通过电脑上网
- WIN7下,联想A30T通过USB连接上网