Android通过有线USB上网卡上网
USB上网卡分无线3G和有线的,无线3G上网卡我的同事已经实现,我最近实现的是有线的。即通过RJ45转USB连接到MID,驱动会注册好ethX的网络设备,我要实现的就是操作该网络设备就可以了。
ConnectivityService是管理连接的服务,它管理多个网络类型Tracker,如WifiStateTracker,MobileDataStateTracker,类似的,我需要实现UsbNetworkStateTracker。
ConnectivityService在实例化某个Tracker时,会传递进去一个Handler的回调,如果某个Tracker发生状态改变(信号强度,连接状态等),都会通过给该回调发送消息,ConnectivityService根据状态变化,向应用层发送intent。一个典型的例子是数据连接成功后的动作:
- 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,
自定义的两个动作包括:
- 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,只要继承这个接口里面的三个回调的方法,
- 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);
- }
然后通过下面代码注册这个接口
- // 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,通过调用
- 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上网卡上网相关推荐
- 电脑usb android上网,让你的Android手机通过USB共享电脑上网
转贴:来自 http://www.diypda.com/viewthread.php?tid=150277 首先这不是一篇关于 如何 让你的 Android 手机 通过 USB 共享 电脑 上网 (这 ...
- Android设备支持USB转RJ45有线网卡( 沐阳网卡JP1081B/9700)
Android设备支持USB转RJ45有线网卡( 沐阳网卡JP1081B9700) 网卡设备: 沐阳网卡JP1081B/9700 系统平台: HISI3798MV100 Android : 4.2 ...
- 安卓Android/苹果iOS USB有线投屏原理和实现
USB有线投屏 有线镜像投屏简介 iOS 有线镜像投屏原理 1. 启动投屏 2. 接收数据 3. 关闭投屏 Android 有线镜像投屏原理 使用 ADB 镜像投屏 使用 USBAccessory 镜 ...
- android 网络re,Gnirehtet让Android设备通过USB连接电脑上网
Gnirehtet让Android设备通过USB连接电脑上网 2020年08月02日 | 萬仟网移动技术 | 我要评论 目录Gnirehtet简介Gnirehtet教程Gnirehtet下载地址功能快 ...
- 乐鑫Esp32学习之旅 乐鑫 ESP-S2/S3 模组的实现 USB 无线网卡上网,为你的台式机装上无线WiFI上网吧。(附带源码)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 系列一:ESP32系列模组基础学习系列笔记 1. 爬坑学习新旅程,虚 ...
- Android设备通过USB共享网络给OpenWrt路由器
1️⃣前言 如果随身WiFi自带的热点不稳定的话,可以考虑插到有USB口的OpenWrt路由器上,减少随身WiFi的负荷,使网络更为稳定. 但有的路由器虽然有USB口,也是OpenWrt系统,连接设备 ...
- 树莓派zero使用合宙Air724UG作为USB上网卡
硬件:树莓派zero w + 银尔达Air724UG模块 本以为买的银尔达的DTU只能作为串口透传使用,今天突然想到这个DTU还有一个USB口,那能否作为USB上网卡使用呢?顿时想尝试一下. 先搜 ...
- Android 5.0 Usb调试拦截分析及修改
当我们调试安卓机器时,第一次插上usb线,会弹出一个授权的对话框,(前提是打开了usb调试功能)点击确认,才会允许调试. 如果我们想机器默认就可以调试该怎么做呢? 如果我们想动态拦截,需要用户输入帐号 ...
- linux usb免驱麦克风,Android无驱usb音频实现
实现android系统通过usb麦克风采集声音功能,能够兼容多款anroid设备. 设想方案有两个: 1.采用通过libusb库,直接访问usb驱动,分析usb协议中的音频数据. 2.通过tinyal ...
最新文章
- Windows 下noinstall方式安装 mysql-5.7.5-m15-winx64
- SpringBoot(1.5.6.RELEASE)源码解析(一)
- python38怎么用_Python基础练习实例38(数组操作)
- 热力地图高德_高德地图:最新动态
- Spring Boot2.0之 原理—创建内置Tomcat容器
- LNMP安装了哪些软件?安装目录在哪?
- 前妻捐赠一半财产做慈善 世界首富贝佐斯发推文称赞
- CentOS 7系统升级备份恢复实验记录
- jvm系列(五):tomcat性能调优和性能监控(visualvm)
- 54 搜索引擎及Lucene基础、elasticsearch使用基础、ES使用详解、ES查询及Logstash入门...
- Python比较文件不同
- 华为服务器虚拟化:Fusion Compute基础教程
- Chrome插件离线安装方法及编程思路
- 阿里大数据ACP认证对找工作到底有用嘛?
- 【ADS学习笔记(一)——ADS介绍】
- ubuntu服务器安装及网络配置
- 查看lv大小 linux,扩展AIX上的LV大小
- 北京华为HCIE认证里的数通深入学习QOS流量整形令牌桶机制和规则-ielab网络实验室
- Solo.io发布Gloo Mesh Enterprise 2.0
- 安庆师范大学c语言程序设计,安庆c语言编程学习,安庆学c语言编程培训,安庆学c语言编程一般能拿多少工资...
热门文章
- 在Windows10上安装CodeSoft 2015,系统蓝屏,解决办法
- 奇客(Geek)的常用软件清单(操作系统支持OS X, Windows, Linux)
- C++黑客编程:视频播放器的开发
- 图形界面搭建树莓派(Raspberry pi)环境
- s(vstart_and_v3)_(e_tec)_(no_tec_rec)
- jeecgboot的autopoi模板导出的写法
- 双十一成交额给电商从业者带来了哪些思考
- iPhone和ipad键盘高度及键盘响应事件 摘
- ABAP RSA方式调用工行银企直联API
- 计算机知识大讲堂,电脑硬件基础知识 大讲堂