关于android USB Host编程的一些总结

简介:

       以前没有接触过android USB Host编程。来到这个公司后,一边做着测试项目,一边又得研究着这个组长临时给的任务。

       他开始说的是,想实现android手机与PC端通过USB 编程方式进行连接,这样写一个android程序装在手机上,插上USB连上电脑,在电脑上就可以管理手机文件了。研究了两个多星期,查了一些资料,也试了不少方法,后来发现似乎走入了误区,就写一下自己的总结,希望给大家一些提示:

一、说一下USB HOST的用处:

       USB设备分为HOST(主设备)和SLAVE(从设备),只有当一台HOST与一台SLAVE连接时才能实现数据的传输。android支持实现了android外设协议的USB硬件。Android外设和主机模式,在android3.1或者更高的平台上直接支持。 但是,对USB主机和外设模式的支持,最终还是要取决于设备的硬件,而不仅仅是看平台的等级。
我上网搜了一下,早期的一些夏新的手机,以及htc的WM手机支持USB HOST功能,而现在的android手机中支持USB HOST的还很非常少, 查到的支持USB HOST功能的手机有三星的I9250,HTC手机暂未发现,现在测试使用的HTC T328w不支持USB HOST功能。所以,测试条件不太充分。
       另外,USB HOST的主要用处,一般是android手机做HOST主设备,用来控制其他一些元器件,比如,单片机,鼠标,游戏手柄,数码相机,等等。
 

       而很少把手机端当做从设备,与电脑端通过USB HOST进行通信的。另外看到一个人说不能通过USB HOST方式与电脑实现通信:
 

        先不说是否能实现,另外,USB HOST通信方式本来就是用USB连接的,如果用USB连接电脑的话,直接就可以管理手机上的文件了,用不到通过程序了吧?
二、通过socket方式进行连接
     开始的时候看到一个例子说是通过USB HOST实现的PC与手机端进行连接,我根据查到的资料和自己的理解觉得大概是如下的意思:
      1.基于socket编程方式,在android手机端和pc端进行连接传输数据。
      2.连接时,需要通过adb forward方式进行端口转发,才能连接的上去。
      3.需要用到broadcast来进行,在server端用adb shell 命令开启android端的socket连接服务。
      4.主要基于android.hardware.usb包下的UsbManager 类和UsbAccessory类。
      5.然后就是一些IO操作,IO处理及关闭优化。
     最关键的两点就是:
     1)端口转发:
      Runtime.getRuntime().exec(“adb forward tcp :12580 tcp:10086 ”);
      在服务端监听10086端口。
       2)在server端java程序中使用adb 命令启动client端的service。
         Runtime.getRuntime().exec(“adb shell am broadcast –a NotifyServiceStart”);
       后来测试多次发现,这个方式没有用到USB HOST的方式,依然是socket通信,只不过是进行了一下端口转发。
       另外,关于socket通信时,写的android程序在模拟器上可以与PC上的server端进行通信,而把程序装到真机上时,就不能实现通信,这个问题的主要原因是PC端和手机上的无线网络不在一个网段,无法进行连接。
三、串口通信
       在网上查到一些关于USB HOST的开发都是基于基于android端与一些单片机进行串口通信的,这是一些嵌入式的开发,对端口数据进行转码操作,还要用到一些c++的知识,另外还要要用到一些开发板,这些底层的东西不懂,另外这跟android端与pc通信又扯不上关系。
       所以,经过分析,主要矛盾总结如下:
      1.    没有测试条件(支持USB HOST的手机)大多数手机没有实现这个功能。
     2.    Android手机与pc端通信使用USB HOST方式,是否有这个必要,明显直接插上USB就能传输文件了。
      3.    Android USB HOST编程难度很大,并且主要是android手机作为主设备的。是否有再研究下去的必要。跟测试手机就没关联了。
    我觉得没有再研究下去的必要了,用了不少时间,也走了不少弯路,再研究下去也未必能研究出什么,程序也没有手机测试。我觉得再研究下去,就是走入误区了,还会占用不少时间,我也不能保证能做出来。不能说什么收获都没有,至少把这些知识都了解一些。我准备下面研究上次你提到的Monkey和MonkeyRunner,不知道X总什么意思,给点指示。。。。



本文转自 风泊海上 51CTO博客,原文链接:http://blog.51cto.com/fengbohaishang/949723
相关文章
|
1月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
存储 缓存 前端开发
关于Android SurfaceView截屏总结
关于Android SurfaceView截屏总结
1441 0
|
1月前
|
Ubuntu 网络协议 Java
在Android平板上使用code-server公网远程Ubuntu服务器编程
在Android平板上使用code-server公网远程Ubuntu服务器编程
|
7月前
|
Android开发
Android获取已连接wifi的热点信息(上位机开发学习之多个界面切换编程)
Android获取已连接wifi的热点信息(上位机开发学习之多个界面切换编程)
182 0
|
8月前
|
IDE Java 开发工具
在Android Studio中进行JNI编程
在Android Studio中进行JNI编程
|
编解码 Android开发
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
475 0
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
|
12月前
|
缓存 监控 Linux
Android C++系列:Linux Socket编程(四)多路IO转接服务器
select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开 的文件描述符个数并不能改变select监听文件个数
94 0
|
12月前
|
网络协议 Linux API
Android C++ 系列:Linux Socket 编程(三)CS 模型示例
服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于 监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服 务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK 段,服务器收到后从accept()返回。
121 0
|
12月前
|
网络协议 Unix Linux
Android C++ 系列:Linux Socket 编程(二)网络套接字函数
socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描 述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调 用出错则返回-1。对于IPv4,domain参数指定为AF_INET。对于TCP协议,type参数指定为 SOCK_STREAM,表示面向流的传输协议。如果是UDP协议,则type参数指定为SOCK_DGRAM,表 示面向数据报的传输协议。protocol参数的介绍从略,指定为0即可。
154 0
|
12月前
|
网络协议 Unix Linux
Android C++ 系列:Linux Socket 编程(一)预备知识
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运 行,可以调用以下库函数做网络字节序和主机字节序的转换。
166 0