如何与HID设备bot hid 通讯类型

1663人阅读
Android usb host开发(2)
再次遇到android & mUsbManager.getDevicelist() 得不到usb 设备的问题。于是深入去探讨android 与usb 外围设备通信的问题。第一篇文章写的有点乱,本质就是需要加入系统的usb操作权限(需要root权限,这种指导国内外的网站上都已经有很多了)。
前面做的项目usb设备是标准的HID设备,使用USBtrace可以看到是setup &class支持HIDclass(如下图1),因此在root android加入权限之后可以通过getDeviceList()得到这个设备。
目前在做的项目的usb设备支持的是复合型usb设备协议(包含usb audio,usb mouse,usb hid等功能),使用usb trace 之后发现setup class &是usb(如图2).
于是怎么折腾都get不到USB设备,于是查找android 源码的实现,最后发现在发现
/p/android-source-browsing/source/browse/services/java/com/android/server/usb/UsbService.java?repo=platform--frameworks--base&name=android-3.2.4_r1&r=02eb63ec&spec=svn.platform--frameworks--base.02eb63ec第264行写着“
Slog.w(TAG, &This kernel does not have USB composite class support&);”,果然翻看系统文件没有找到该文件夹。还是系统不支持的原因。同时第280行的方法也解释为什么键盘和鼠标没有被枚举出来的原因。
android usb host与usb设备的数据传输分为三种方式:控制传输,块传输和断点传输。控制传输的方式是controlTransfer(int requestType, int request, int value,
& & & & & & int index, byte[] buffer, int length, int timeout),块传输的方法是 bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout),断点传输方法:
UsbRequest request=new UsbRequest();
boolean isQueueOk = request.queue(buffer, 128);
if (isQueueOk && mUsbConnection.requestWait() == request) {
如果项目中需要的usb设备不是自己开发的最好先使用usbtrace在pc上先分析下它的协议端点支持的传输方式等(如图3)。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:28554次
排名:千里之外
(1)(1)(9)(3)(3)(1)上位机编程实现与USB—HID设备通信--《电子世界》2012年07期
上位机编程实现与USB—HID设备通信
【摘要】:在上位机中,通过人机交互界面,利用Windows提供的API函数,实现应用程序对HID设备的访问。指出调用API函数的过程和方法,并提供了实现方法的具体实例。
【作者单位】:
【关键词】:
【分类号】:TP11【正文快照】:
1.引言USB全称为Universal Serial Bus(通用串行总线),是一种快速、灵活的总线接口。在USB出现之前,计算机接口在传输速度方面都存在速度偏低,容易产生I/O冲突,中断不够用等缺点。人机接口设备(HID)主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID设备
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【参考文献】
中国期刊全文数据库
邱罡,王伟;[J];平顶山学院学报;2005年05期
【共引文献】
中国期刊全文数据库
张峰峰;潘明;韦海旋;贾转红;;[J];单片机与嵌入式系统应用;2006年11期
李伟;张东亮;杨丽丽;;[J];仪器仪表用户;2007年01期
吴志伟;丁铂;;[J];国外电子元器件;2006年06期
肖远军;方勇;周安民;刘嘉勇;付佳;;[J];计算机应用;2006年06期
王皓;刘嘉勇;蔡恒;杨炜;;[J];四川大学学报(自然科学版);2007年01期
杨应平;石城;李振华;徐晓英;;[J];武汉理工大学学报(信息与管理工程版);2006年08期
中国硕士学位论文全文数据库
薛春艳;[D];大连海事大学;2006年
袁学飞;[D];西北工业大学;2006年
李莹;[D];华北电力大学(北京);2006年
牛瑞锋;[D];西北大学;2006年
李惠明;[D];辽宁师范大学;2006年
梁宝娟;[D];长安大学;2006年
张国梁;[D];山东大学;2006年
王强;[D];山东大学;2006年
刘春燕;[D];哈尔滨工业大学;2006年
郑洪刚;[D];西安科技大学;2007年
【相似文献】
中国期刊全文数据库
张剑伟;;[J];电子测量技术;2011年06期
田源;;[J];自动化与仪器仪表;2011年04期
李春旺;;[J];科技资讯;2011年21期
姜国芳;;[J];大众标准化;2011年S2期
余中正;武玉;夏永胜;贡马林;;[J];微型机与应用;2011年13期
夏娟;黄民;李天剑;吴启焱;;[J];北京信息科技大学学报(自然科学版);2011年03期
梁家海;;[J];工业仪表与自动化装置;2011年04期
何怡茂;;[J];电气传动自动化;2011年04期
尚念朋;卜祥泉;谷增成;李彬;;[J];煤炭工程;2011年S1期
付文轩;高莉;王希娟;;[J];现代计算机(专业版);2011年12期
中国重要会议论文全文数据库
俞佳江;;[A];2011年全国机械行业可靠性技术学术交流会暨第四届可靠性工程分会第三次全体委员大会论文集[C];2011年
姜世金;栾利香;;[A];Proceedings of the 2nd Asia-Pacific Conference on Information Network and Digital Content Security(2011APCID)[C];2011年
黄玉兰;高晓月;李亮;;[A];中国电子学会真空电子学分会第十二届学术年会论文集[C];1999年
唐伟杰;;[A];首届珠中江科协论坛论文集[C];2011年
王志国;;[A];水轮机抗磨蚀技术研讨会论文集[C];2006年
唐锟;韦先霜;王双保;;[A];第九届全国光电技术学术交流会论文集(下册)[C];2010年
王勤华;;[A];信息科学与微电子技术:中国科协第三届青年学术年会论文集[C];1998年
蒋鲲鹏;;[A];中国计量协会冶金分会2011年会论文集[C];2011年
邬丽莲;;[A];中国计量协会冶金分会2011年会论文集[C];2011年
郝庆伟;郝智刚;;[A];中国计量协会冶金分会2011年会论文集[C];2011年
中国重要报纸全文数据库
王树贵;[N];中国电力报;2006年
广东技术师范学院 张华 吴欣
广州致远电子有限公司 滕欣欣 魏小忠;[N];计算机世界;2006年
中国农业大学
张洪生;[N];计算机世界;2008年
上海安勤科技股份有限公司;[N];中国计算机报;2003年
倪旻;[N];中国电力报;2007年
王延满 魏庆安
王春娇;[N];电子报;2007年
王瑞;[N];电子报;2007年
河南省农校
姚国林;[N];中国计算机报;2001年
耿德根;[N];电子报;2001年
薛秀颖;[N];哈尔滨日报;2005年
中国博士学位论文全文数据库
高峰;[D];浙江工业大学;2009年
张志东;[D];天津大学;2007年
杨丽;[D];中国农业大学;2005年
中国硕士学位论文全文数据库
郭飒;[D];东华大学;2004年
许利;[D];山东大学;2011年
易钰;[D];北京工业大学;2002年
龚莉莉;[D];中北大学;2008年
路永明;[D];吉林大学;2005年
吴庆娟;[D];兰州理工大学;2009年
朱振茂;[D];大连海事大学;2008年
兰图;[D];厦门大学;2007年
刘鑫;[D];北京交通大学;2008年
王征;[D];西安科技大学;2003年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号2010年12月 移动平台大版内专家分月排行榜第二2010年11月 移动平台大版内专家分月排行榜第二
2011年5月 移动平台大版内专家分月排行榜第三2011年4月 移动平台大版内专家分月排行榜第三2011年3月 移动平台大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小.
比较好的文章是:&& & &
其中代码之处有些地方需要注意的, 特此注明一下:
* USB HOST 连接 HID
* @author IVAN
public class MainActivity extends Activity {
private static final String TAG = "USB_HOST";
private UsbManager myUsbM
private UsbDevice myUsbD
private UsbInterface myI
private UsbDeviceConnection myDeviceC
private final int VendorID = 8457;
//这里要改成自己的硬件ID
private final int ProductID = 30264;
private TextV
private UsbEndpoint epO
private UsbEndpoint epIn;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
info = (TextView) findViewById();
// 获取UsbManager
myUsbManager = (UsbManager) getSystemService(USB_SERVICE);
enumerateDevice();
findInterface();
openDevice();
assignEndpoint();
* 分配端点,IN | OUT,即输入输出;此处我直接用1为OUT端点,0为IN,当然你也可以通过判断
& & &//USB_ENDPOINT_XFER_BULK & & &/*
& & &#define USB_ENDPOINT_XFER_CONTROL 0
--控制传输& & &#define USB_ENDPOINT_XFER_ISOC
--等时传输& & &#define USB_ENDPOINT_XFER_BULK
--块传输& & &#define USB_ENDPOINT_XFER_INT
--中断传输
private void assignEndpoint() {
& & & & & if (myInterface != null) { //这一句不加的话 很容易报错 &导致很多人在各大论坛问:为什么报错呀&
& & & & & & & //这里的代码替换了一下 按自己硬件属性判断吧
& & & & & & &for (int i = 0; i & myInterface.getEndpointCount(); i++) {&
& & & & & & & & UsbEndpoint ep = myInterface.getEndpoint(i);
& & & & & & & & if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) { & & & & & & & & if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
& & & & & & & & & &epOut =
& & & & & & & & &} else {&
& & & & & & & & & epIn =
& & & & & & & & & } & & & & & & & & }& & & & & & & }& & & & & &}
Log.d(TAG, getString(R.string.text));
* 打开设备
private void openDevice() {
if (myInterface != null) {
UsbDeviceConnection conn = null;
// 在open前判断是否有连接权限;对于连接权限可以静态分配,也可以动态分配权限,可以查阅相关资料
if (myUsbManager.hasPermission(myUsbDevice)) {
conn = myUsbManager.openDevice(myUsbDevice);
if (conn == null) {
if (conn.claimInterface(myInterface, true)) {
myDeviceConnection = // 到此你的android设备已经连上HID设备
Log.d(TAG, "打开设备成功");
conn.close();
* 找设备接口
private void findInterface() {
if (myUsbDevice != null) {
Log.d(TAG, "interfaceCounts : " + myUsbDevice.getInterfaceCount());
for (int i = 0; i & myUsbDevice.getInterfaceCount(); i++) {
UsbInterface intf = myUsbDevice.getInterface(i);
// 根据手上的设备做一些判断,其实这些信息都可以在枚举到设备时打印出来
if (intf.getInterfaceClass() == 8
&& intf.getInterfaceSubclass() == 6
&& intf.getInterfaceProtocol() == 80) {
myInterface =
Log.d(TAG, "找到我的设备接口");
* 枚举设备
private void enumerateDevice() {
if (myUsbManager == null)
HashMap&String, UsbDevice& deviceList = myUsbManager.getDeviceList();
if (!deviceList.isEmpty()) { // deviceList不为空
StringBuffer sb = new StringBuffer();
for (UsbDevice device : deviceList.values()) {
sb.append(device.toString());
sb.append("\n");
info.setText(sb);
// 输出设备信息
Log.d(TAG, "DeviceInfo: " + device.getVendorId() + " , "
+ device.getProductId());
// 枚举到设备
if (device.getVendorId() == VendorID
&& device.getProductId() == ProductID) {
myUsbDevice =
Log.d(TAG, "枚举设备成功");
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
获取数据的代码:
ncount = myDeviceConnection.bulkTransfer(epIn, buffer, buffer.length,
这里注意数据读取的长度, 这个对某些硬件来说非常重要, &有的硬件小了或者大了立马死机重启, 要么就是一直返回-1
这个数据的长度需要根据硬件属性来,
& & 有一种办法是通过int inMax = epIn.getMaxPacketSize()来获取;
& & 还有一种办法是通过windows下面的hid程序探测设备的数据长度;
至于读不到硬件的问题 我觉得以下办法不会有帮助了, 要么是硬件不支持, android4.0以上 貌似都包含了以下的文件信息了
将android.hardware.usb.host.xml文件放到/system/etc/permissions下;第二处是在同目录下的handheld_core_hardware.xml里面添加一句&feature name="android.hardware.usb.host"&
阅读(...) 评论()Hi,欢迎来到中国嵌入式培训第一品牌 - 华清远见嵌入式学院,专注嵌入式工程师培养13年!
全国免费报名电话:400-706-1880
当前位置: >
> Android USB Host与HID 通讯(三)
Android USB Host与HID 通讯(三)
时间:作者:华清远见
上篇文章,我们已经开始进行代码编程,主要目的就是枚举出连接到USBHost上的HID设备,但是在实际开发中,在使用manager.getDeviceList()总是获取不到设备列表。经过一番查找资料,现在终于把问题解决了,在此记录一下,以备不时之需。
1、创建 android.hardware.usb.host.xml,内容为:
<permissions>
<feature name="android.hardware.usb.host"/>
</permissions>
将该文件push到/system/etc/permissions目录下。
2、在/system/etc/permissions下的handheld_core_hardware.xml或者tablet_core_hardware.xml文件的段中添加:
[html] view plaincopyprint?
<feature name="android.hardware.usb.host" />
3、修改AndroidManifest.xml文件,添加以下权限(很关键):
[html] view plaincopyprint?
<uses-permission android:name="android.hardware.usb.host" />
<uses-permission android:name="android.hardware.usb.accessory" />
4、枚举设备的代码例子:
[html] view plaincopyprint?
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Log.e(TAG, "get device list
= " + deviceList.size());
Toast.makeText(this, "get device list
= " + deviceList.size(), 200).show();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
Log.e(TAG, "device name = " + device.getDeviceName());
到此为止,终于看到连接到Android平板上的设备了。
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
学院最新动态

我要回帖

更多关于 蓝牙 hid 双向通讯 的文章

 

随机推荐