android4.0 通过DHCP实现以太网连接
来源:互联网 发布:淘宝中老年女模特 编辑:程序博客网 时间:2024/06/03 21:32
本文转载自 android4.0 通过DHCP实现以太网连接
由于项目需要,需要使用以太网进行通讯,看了一下一个网友的实现,基于android4.0的以太网DHCP或者设置静态Ip来实现网络连接,主要实现过程如下:
一。DHCP动态获取ip实现网络连接
1.注册网络状态变化的广播接收:
private void registerEthernet() { IntentFilter ethFilter = new IntentFilter(EthernetManager.ETHERNET_STATE_CHANGED_ACTION); ethFilter.addAction(EthernetManager.NETWORK_STATE_CHANGED_ACTION); registerReceiver(mEthConnectReceiver, ethFilter);}private BroadcastReceiver mEthConnectReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.d(TAG, " Ethernet onRecevice action = " + action); if (action.equals(EthernetManager.ETHERNET_STATE_CHANGED_ACTION)) { int msg = intent.getIntExtra(EthernetManager.EXTRA_ETHERNET_STATE, -1); switch (msg) { case EthernetDataTracker.EVENT_DHCP_CONNECT_FAILED: break; case EthernetDataTracker.EVENT_DHCP_DISCONNECT_FAILED: break; case EthernetDataTracker.EVENT_STATIC_CONNECT_FAILED: break; case EthernetDataTracker.EVENT_STATIC_DISCONNECT_FAILED: break; case EthernetDataTracker.EVENT_DHCP_CONNECT_SUCCESSED: pingEthGateway(getEthGateWay());//ping命令DHCP连接网络是否成功 break; case EthernetDataTracker.EVENT_DHCP_DISCONNECT_SUCCESSED: break; case EthernetDataTracker.EVENT_STATIC_CONNECT_SUCCESSED: pingEthGateway(getEthGateWay());//ping命令测试静态IP连接网络是否成功 break; case EthernetDataTracker.EVENT_STATIC_DISCONNECT_SUCCESSED: break; case EthernetDataTracker.EVENT_PHY_LINK_UP: setDhcp();//网线插上后自己进行DHCP break; case EthernetDataTracker.EVENT_PHY_LINK_DOWN: Log.d(TAG, "EVENT_PHY_LINK_DOWN ");//网线拔出 break; default: break; } } }};
2.通过DHCP实现网络连接
private String dhcp_gateway = null;private String wifi_gateway = null;private EthernetManager mEthManager = null;private WifiManager mWifiManager = null;private ConnectivityManager mConnectivityManager = null;public void getInstance(Context context) { mEthManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); }public void setDhcp() { mWifiManager.setWifiEnabled(false);//断开WIFI的连接 mEthManager.setEthernetEnabled(false); Log.i(TAG, "getEthernetState=" + mEthManager.getEthernetState()); mEthManager.setEthernetDefaultConf(); mEthManager.setInterfaceName("eth0"); mEthManager.setEthernetEnabled(true); Log.i(TAG, "getEthernetState=" + mEthManager.getEthernetState());}
3.获取IP信息:
public String getEthGateWay() { String ip = mConnectivityManager.getLinkProperties(ConnectivityManager.TYPE_ETHERNET) .getAddresses().toString(); String mGW = mConnectivityManager.getLinkProperties(ConnectivityManager.TYPE_ETHERNET) .getRoutes().toString(); String mDns = mConnectivityManager.getLinkProperties(ConnectivityManager.TYPE_ETHERNET) .getDnses().toString(); Log.i(TAG, "getEthGateWay ip=" + ip); Log.i(TAG, "getEthGateWay mGW=" + mGW); Log.i(TAG, "getEthGateWay mDns=" + mDns); if (mGW.contains(">")) { mGW = mGW.substring(mGW.lastIndexOf('>') + 2, mGW.length() - 1); } dhcp_gateway = mGW; return mGW;}
其中获取的Ip信息为:
getEthGateWay ip=[/192.168.1.102] getEthGateWay mGW=[0.0.0.0/0 -> 192.168.1.1] getEthGateWay mDns=[/192.168.10.247, /192.168.1.1]
因此需要对网关信息进行处理。
4.Ping命令测试IP地址:
使用Root权限,通过JNI封装成一个系统库,调用exe command进行ping -c 4 -w 100 192.168.1.1测试。代码将不详细贴出。
执行结果:
I/SystemTestingJNI( 1836): executeCommand ret=0, result=PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. I/SystemTestingJNI( 1836): 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=6.54 ms I/SystemTestingJNI( 1836): 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.316 ms I/SystemTestingJNI( 1836): 64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.194 ms I/SystemTestingJNI( 1836): 64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.255 ms I/SystemTestingJNI( 1836): I/SystemTestingJNI( 1836): — 192.168.1.1 ping statistics — I/SystemTestingJNI( 1836): 4 packets transmitted, 4 received, 0% packet loss, time 3001ms I/SystemTestingJNI( 1836): rtt min/avg/max/mdev = 0.194/1.826/6.542/2.723 ms
–还有一种方法,使用Runtime去ping,但是需要注意权限问题,以及输入输出流得自己处理。 exec执行时阻塞、非阻塞,返回结果问题
Process p= Runtime.getRuntime().exec(cmd);//String cmd
——————————————————————————————————————-
二。通过设置静态IP连接网络:
public static void setStaticIp() { mWifiManager.setWifiEnabled(false); mEthManager.setEthernetEnabled(false); DhcpInfoInternal mDhcpInfoInternal = new DhcpInfoInternal(); InetAddress iRoute = NetworkUtils.numericToInetAddress("192.168.1.103"); InetAddress iNetmask = NetworkUtils.numericToInetAddress("255.255.255.0"); try { int netmask = NetworkUtils.inetAddressToInt(iNetmask); int prefixLength = NetworkUtils.netmaskIntToPrefixLength(netmask); mDhcpInfoInternal.prefixLength = prefixLength; } catch (IllegalArgumentException e) { e.printStackTrace(); } mDhcpInfoInternal.ipAddress = "192.168.1.103"; mDhcpInfoInternal.addRoute(new RouteInfo(iRoute)); mDhcpInfoInternal.dns1 = "192.168.10.248"; mDhcpInfoInternal.serverAddress = "255.255.255.0"; mEthManager.saveEthernetIpInfo(mDhcpInfoInternal.makeDhcpInfo(), EthernetManager.ETHERNET_CONNECT_MODE_MANUAL); mEthManager.setEthernetEnabled(true); DhcpInfo dhcpInfo = mEthManager.getSavedEthernetIpInfo(); dhcp_gateway = Formatter.formatIpAddress(dhcpInfo.gateway);}
—-通过网口实现网络连接实现,就此Ending。。——
后续会贴上 WIFI,热点扫描,配对,以及IP的获取。、
本文转载自 android4.0 通过DHCP实现以太网连接
0 0
- android4.0 通过DHCP实现以太网连接
- Android4.4 以太网和DHCP启动过程介绍
- Android4.4 以太网和DHCP启动过程介绍
- android4.0 WIFI实现网络连接
- Android 以太网Ethernet DHCP和静态设置实现
- android4.2系统,实现应用层调用以太网/3G网卡
- 以太网连接
- PC通过以太网使用adb shell 连接到Android设备
- 西门子S7300PLC通过以太网连接组态王KingSCADA
- Android4.0平板通过OTG线连接Acr122U读取智慧校园卡
- 通过ADS协议实现与beckhoff控制器的以太网通讯
- Android4.1+通过USB 连接Ubuntu进行文件传输方案
- 以太网实现
- 嵌入式linux通过DHCP自动获取IP地址实现
- 嵌入式linux通过DHCP自动获取IP地址实现获取
- 嵌入式linux通过DHCP自动获取IP地址实现
- 嵌入式linux通过DHCP自动获取IP地址实现
- 嵌入式linux通过DHCP自动获取IP地址实现
- JDK并发工具包CompletionService和ExecutorCompletionService的好处和使用场景
- Codeforces 318A Even Odds
- 开发调用电话,短信,邮箱
- JAVA程序调用PLSQL里边写的小函数
- 1.启动页如何控制引导页、主页的显示
- android4.0 通过DHCP实现以太网连接
- (raspberry、bananapi)Archlinux 无法安装yaourt解决办法-----手工编译(不难)(适用于package-query找不到)
- SurfaceView基础用法
- 任务门,调用门,中断门,陷阱门
- 查看linux服务器的系统信息
- 《C语言及程序设计》实践参考——小玩文件
- 排序算法复习
- Unity中的mvc框架_StrangeIoC(之一)
- Android 不规则封闭区域填充 手指秒变油漆桶