USB上网卡分无线3G和有线的,无线3G上网卡我的同事已经实现,我最近实现的是有线的。即通过RJ45转USB连接到MID,驱动会注册好ethX的网络设备,我要实现的就是操作该网络设备就可以了。

ConnectivityService是管理连接的服务,它管理多个网络类型Tracker,如WifiStateTracker,MobileDataStateTracker,类似的,我需要实现UsbNetworkStateTracker。

ConnectivityService在实例化某个Tracker时,会传递进去一个Handler的回调,如果某个Tracker发生状态改变(信号强度,连接状态等),都会通过给该回调发送消息,ConnectivityService根据状态变化,向应用层发送intent。一个典型的例子是数据连接成功后的动作:

[java]  view plain copy
  1. private void sendConnectedBroadcast(NetworkInfo info) {
  2. Intent intent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
  3. intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
  4. intent.putExtra(ConnectivityManager.EXTRA_NETWORK_INFO, info);
  5. if (info.isFailover()) {
  6. intent.putExtra(ConnectivityManager.EXTRA_IS_FAILOVER, true);
  7. info.setFailover(false);
  8. }
  9. if (info.getReason() != null) {
  10. intent.putExtra(ConnectivityManager.EXTRA_REASON, info.getReason());
  11. }
  12. if (info.getExtraInfo() != null) {
  13. intent.putExtra(ConnectivityManager.EXTRA_EXTRA_INFO,
  14. info.getExtraInfo());
  15. }
  16. sendStickyBroadcast(intent);
  17. }

各类Tracker都是继承自NetworkStateTracker,而NetworkStateTracker继承自Handler,NetworkStateTracker有一个的NetworkInfo实例,存储当前网络类型的状态,应用程序可以通过ConnectivityService客户端ConnectivityManager的getAllNetworkInfo()来获得这些实例。

UsbNetworkStateTracker跟WifiStateTracker不一样的地方是,WIFI有自己的服务,应用程序可以调用WifiService的客户端WifiManager来操纵wifi设备,从而调用到WfiStateTracker,我只能通过自定的消息来操作UsbNetworkStateTracker,

自定义的两个动作包括:

[c-sharp]  view plain copy
  1. public static final String ACTION_USB_NETWORK_START = "android.net.usb.NETWORK_START";
  2. public static final String ACTION_USB_NETWORK_STOP = "android.net.usb.NETWORK_STOP";

应用程序发送包含该动作的intent,UsbNetworkStateTracker收到以后会执行相应的动作。

除此之外,UsbNetworkStateTracker还应该能识别当前可用的网络设备的名称,NetworkManagementService提供了一个接口INetworkManagementEventObserver,只要继承这个接口里面的三个回调的方法,

[java]  view plain copy
  1. interface INetworkManagementEventObserver {
  2. /**
  3. * Interface link status has changed.
  4. *
  5. * @param iface The interface.
  6. * @param link True if link is up.
  7. */
  8. void interfaceLinkStatusChanged(String iface, boolean link);
  9. /**
  10. * An interface has been added to the system
  11. *
  12. * @param iface The interface.
  13. */
  14. void interfaceAdded(String iface);
  15. /**
  16. * An interface has been removed from the system
  17. *
  18. * @param iface The interface.
  19. */
  20. void interfaceRemoved(String iface);
  21. }

然后通过下面代码注册这个接口

[java]  view plain copy
  1. // register for notifications from NetworkManagement Service
  2. IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
  3. INetworkManagementService service = INetworkManagementService.Stub.asInterface(b);
  4. try {
  5. service.registerObserver(mInterfaceObserver);
  6. } catch (RemoteException e) {
  7. Log.e(TAG, "Error registering observer :" + e);
  8. }

这样你的Tracker就能监听到网络设备的插拔了,这样做是为了保持与wifi的兼容,否则你不知道eth0 和eth1对应的wifi还是usb网卡。

UsbNetworkStateTracker通过调用NetworkUtils的方法来操纵网络设备。典型的方法是执行DHCP,通过调用

[java]  view plain copy
  1. 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上网卡上网相关推荐

  1. 电脑usb android上网,让你的Android手机通过USB共享电脑上网

    转贴:来自 http://www.diypda.com/viewthread.php?tid=150277 首先这不是一篇关于 如何 让你的 Android 手机 通过 USB 共享 电脑 上网 (这 ...

  2. Android设备支持USB转RJ45有线网卡( 沐阳网卡JP1081B/9700)

    Android设备支持USB转RJ45有线网卡( 沐阳网卡JP1081B9700) 网卡设备: 沐阳网卡JP1081B/9700 系统平台: HISI3798MV100  Android : 4.2 ...

  3. 安卓Android/苹果iOS USB有线投屏原理和实现

    USB有线投屏 有线镜像投屏简介 iOS 有线镜像投屏原理 1. 启动投屏 2. 接收数据 3. 关闭投屏 Android 有线镜像投屏原理 使用 ADB 镜像投屏 使用 USBAccessory 镜 ...

  4. android 网络re,Gnirehtet让Android设备通过USB连接电脑上网

    Gnirehtet让Android设备通过USB连接电脑上网 2020年08月02日 | 萬仟网移动技术 | 我要评论 目录Gnirehtet简介Gnirehtet教程Gnirehtet下载地址功能快 ...

  5. 乐鑫Esp32学习之旅 乐鑫 ESP-S2/S3 模组的实现 USB 无线网卡上网,为你的台式机装上无线WiFI上网吧。(附带源码)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 系列一:ESP32系列模组基础学习系列笔记 1. 爬坑学习新旅程,虚 ...

  6. Android设备通过USB共享网络给OpenWrt路由器

    1️⃣前言 如果随身WiFi自带的热点不稳定的话,可以考虑插到有USB口的OpenWrt路由器上,减少随身WiFi的负荷,使网络更为稳定. 但有的路由器虽然有USB口,也是OpenWrt系统,连接设备 ...

  7. 树莓派zero使用合宙Air724UG作为USB上网卡

    硬件:树莓派zero w  +  银尔达Air724UG模块 本以为买的银尔达的DTU只能作为串口透传使用,今天突然想到这个DTU还有一个USB口,那能否作为USB上网卡使用呢?顿时想尝试一下. 先搜 ...

  8. Android 5.0 Usb调试拦截分析及修改

    当我们调试安卓机器时,第一次插上usb线,会弹出一个授权的对话框,(前提是打开了usb调试功能)点击确认,才会允许调试. 如果我们想机器默认就可以调试该怎么做呢? 如果我们想动态拦截,需要用户输入帐号 ...

  9. linux usb免驱麦克风,Android无驱usb音频实现

    实现android系统通过usb麦克风采集声音功能,能够兼容多款anroid设备. 设想方案有两个: 1.采用通过libusb库,直接访问usb驱动,分析usb协议中的音频数据. 2.通过tinyal ...

最新文章

  1. Windows 下noinstall方式安装 mysql-5.7.5-m15-winx64
  2. SpringBoot(1.5.6.RELEASE)源码解析(一)
  3. python38怎么用_Python基础练习实例38(数组操作)
  4. 热力地图高德_高德地图:最新动态
  5. Spring Boot2.0之 原理—创建内置Tomcat容器
  6. LNMP安装了哪些软件?安装目录在哪?
  7. 前妻捐赠一半财产做慈善 世界首富贝佐斯发推文称赞
  8. CentOS 7系统升级备份恢复实验记录
  9. jvm系列(五):tomcat性能调优和性能监控(visualvm)
  10. 54 搜索引擎及Lucene基础、elasticsearch使用基础、ES使用详解、ES查询及Logstash入门...
  11. Python比较文件不同
  12. 华为服务器虚拟化:Fusion Compute基础教程
  13. Chrome插件离线安装方法及编程思路
  14. 阿里大数据ACP认证对找工作到底有用嘛?
  15. 【ADS学习笔记(一)——ADS介绍】
  16. ubuntu服务器安装及网络配置
  17. 查看lv大小 linux,扩展AIX上的LV大小
  18. 北京华为HCIE认证里的数通深入学习QOS流量整形令牌桶机制和规则-ielab网络实验室
  19. Solo.io发布Gloo Mesh Enterprise 2.0
  20. 安庆师范大学c语言程序设计,安庆c语言编程学习,安庆学c语言编程培训,安庆学c语言编程一般能拿多少工资...

热门文章

  1. 在Windows10上安装CodeSoft 2015,系统蓝屏,解决办法
  2. 奇客(Geek)的常用软件清单(操作系统支持OS X, Windows, Linux)
  3. C++黑客编程:视频播放器的开发
  4. 图形界面搭建树莓派(Raspberry pi)环境
  5. s(vstart_and_v3)_(e_tec)_(no_tec_rec)
  6. jeecgboot的autopoi模板导出的写法
  7. 双十一成交额给电商从业者带来了哪些思考
  8. iPhone和ipad键盘高度及键盘响应事件 摘
  9. ABAP RSA方式调用工行银企直联API
  10. 计算机知识大讲堂,电脑硬件基础知识 大讲堂