判断iPhone设备是carplay和iPod的方法
Carplay 参考代码: int UdevIsCarplay(int nVid, int nPid)//int UsbModeSwitch(pUdevStatus pStatus) { ; if (nVid != APPLE_IDVENDOR){ ; } r = libusb_init(NULL); ) { pError("failed to initialise libusb\n"); ; } struct libusb_device_handle *devh = NULL; devh = libusb_open_device_with_vid_pid(NULL, nVid, nPid); if (NULL == devh) { pError("Could not find/open device(%s)\n", strerror(errno)); r = ;goto end; } //libusb_device *dev = libusb_get_device(devh); ];// if tmp is {0x01, 0x00, 0x00, 0x00} support carplay;else close carplay. memset(tmp, , ); r = libusb_control_transfer(devh, , , tmp, , );//Page 715 //r = libusb_control_transfer(devh, 0x40, 0x51, 0x01, 0, NULL, 0, 0);//Page 716 UsbModeSwitch ) { pError("UdevIsCarplay --- get support capabilities error !!! r = %d(%s)\n", r, strerror(errno)); r = ; } ) { pError("short write (%d)\n", r); r = ; } else { //int nTmp = tmp[0] + (int)(tmp[1]<<8) + (int)(tmp[2]<<16) + (int)(tmp[3]<<24); pInfo(],tmp[],tmp[],tmp[]); ]) r = ; } libusb_close(devh); end: libusb_exit(NULL); return r ; }
邹工: 参考代码如下: void* UdevEventMonitorThread(void* pParam) { int fd; struct udev_device *dev; struct udev_monitor *mon; pUdevContainer pUdevCon = (pUdevContainer)pParam; mon = udev_monitor_new_from_netlink(pUdevCon->m_pUdev, "udev");//"kernel"或"udev"。基于"kernel"的事件通知要早于"udev",但相关的设备结点未必创建完成 if (mon == NULL) { pError("udev_monitor_new_from_netlink FAILED \n"); return; } ) { pError("UdevAddFilter FAILED \n"); return; } ) { pError("udev_monitor_enable_receiving FAILED \n"); return; } UdevStatus status[];//status[0] is OTG atatus; status[1] is HOST atatus; //pUdevStatus status = calloc(2, sizeof(UdevStatus)); memset(status, , * sizeof(UdevStatus)); status[].m_eUdevStatus = status[].m_eUdevStatus = UDEVOTHER; /* Get the file descriptor (fd) for the monitor.This fd will get passed to select() */ fd = udev_monitor_get_fd(mon); ); struct epoll_event ev; ev.events = EPOLLIN; ev.data.fd = fd; epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev); ]; pInfo("UdevEventMonitorThread --- start ok !!!!!!!!!!! \n"); /* This section will run continuously, calling usleep() at the end of each pass. This is to demonstrate how to use a udev_monitor in a non-blocking way. */ ) { ; //pError("epoll_wait event start!\n"); , -);//-1 is block,>=0 is noblock; //pWarn("epoll_wait event ok ret = %d!\n",ret); ; i < ret; i++) { /* Make the call to receive the device. select() ensured that this will not block. */ dev = udev_monitor_receive_device(mon); if (dev) { const char* szAction = udev_device_get_action(dev); const char* szDevNode = udev_device_get_devnode(dev); const char* szSysPath = udev_device_get_syspath(dev); int nStatus = SetUdevStatus(pUdevCon, szAction);//pStatus, if(UDEVOTHER == nStatus) { //pDebug("nStatus = 0(OTHER); goto end; } //pDebug("nActionStatus = %d\n",nStatus); int nPort = UdevPortJudge(pUdevCon, szSysPath, nStatus); if(OTHERPORT == nPort) { //pDebug("nPort = OTHERPORT(%d)\n", nPort); goto end; } pUdevStatus pStatus = &status[nPort-];//status+(nPort-1)*sizeof(UdevStatus); //pDebug(" status[%d]=(%d),pStatus->m_eUdevStatus(%d),pStatus->m_nChecked(%d)~~~~~~~~~~~~~~\n", nPort-1, nStatus,pStatus->m_eUdevStatus,pStatus->m_nChecked); if(nStatus == UDEVCHANGE) { pStatus->m_eUdevStatus = nStatus; print_all_properties(pUdevCon, pStatus, dev, "prop"); goto end; //pDebug("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); } else if(nStatus == UDEVREMOVE) { if(UDEVREMOVE != pStatus->m_eUdevStatus)//插入USB上电可能没有检测到设备,导致拔出状态错误 { ResetStatus(pStatus); if(NULL != szDevNode) pUdevCon->m_pUdevEvent->UdevStatusProc(pUdevCon->m_eUdevPort, pStatus->m_eUdevStatus, USBNODEV, szDevNode); else pUdevCon->m_pUdevEvent->UdevStatusProc(pUdevCon->m_eUdevPort, pStatus->m_eUdevStatus, USBNODEV, "USBNODEV"); pUdevCon->m_eUdevPort = OTHERPORT; } goto end; } //ADD event pStatus->m_eUdevStatus = nStatus; )//nStatus == ADD { print_all_attributes(pStatus, dev, "attr"); ) { pInfo("[DM-SMING] %d\n", __LINE__); if(pStatus->m_eUdevType == USBHUB) pUdevCon->m_pUdevEvent->UdevStatusProc(nPort, nStatus, USBHUB, "USBHUB"); else if(pStatus->m_eUdevType == USBOTHER) pUdevCon->m_pUdevEvent->UdevStatusProc(nPort, nStatus, USBOTHER, "USBOTHER"); } ) { pInfo("[DM-SMING] %d\n", __LINE__); int nCheck = UdevCheckContinue(pStatus, szDevNode); ) { pInfo("[DM-SMING] %d\n", __LINE__); if(pStatus->m_eUdevType == USBHID) pUdevCon->m_pUdevEvent->UdevStatusProc(nPort, nStatus, USBHID, "USBHID"); else pUdevCon->m_pUdevEvent->UdevStatusProc(nPort, nStatus, pStatus->m_eUdevType, szDevNode); } } } end: udev_device_unref(dev); } else { pDebug("No Device from receive_device().\n");// An error occured. } } //else // usleep(100*1000); //fflush(stdout); } return; } static void print_all_properties(pUdevContainer pUdevCon, pUdevStatus pStatus, struct udev_device *device, const char *key) { struct udev_list_entry *properties; udev_list_entry_foreach(properties, udev_device_get_properties_list_entry(device)) { const char *szName = udev_list_entry_get_name(properties); const char *szValue = udev_list_entry_get_value(properties); if(NULL != szValue) pDebug(" [%s]{%s}==\"%s\"\n", key, szName, szValue); ) { ) { //通过回调给上层USBNORESPOND消息,设备节点为”USBNORESPOND“ pUdevCon->m_pUdevEvent->UdevStatusProc(pUdevCon->m_eUdevPort, pStatus->m_eUdevStatus, USBNORESPOND, "USBNORESPOND"); return; } } } }
库文件在附件中。
链接: http://pan.baidu.com/s/1qXSSB84 密码: ptgu
判断iPhone设备是carplay和iPod的方法的更多相关文章
- 关于iPhone设备不同显示尺寸适配的一些方法
关于iPhone设备不同显示尺寸适配的一些方法 ------关于适配的理解------ 1.什么是适配? 适配是对不同硬件和系统软件的适应,硬件包括屏幕显示,处理器,内存等等(目前主要是屏幕适配, ...
- 判断 iPhone 是否已插入 SIM 卡的方法
判断 iPhone 是否插入了 SIM 卡,可以参考苹果官网的 systemconfigure framework 教程,将下面的代码复制到头文件 extern NSString* const kCT ...
- 判断iPhone和iPad 判断设备版本
//判断iPhone和iPad #define IS_IPHONE (!IS_IPAD) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInt ...
- ios5和ios6横竖屏支持及ipad和iphone设备的判断
ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...
- PHP判断iPhone、iPad、Android、PC设备的方法
因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面我们一起来看小编整理的一段php判断iPhone.iPad.Android.PC设备的例子. 注意:本代码的PC系统为 ...
- Java判断访问设备为手机、微信、PC工具类
package com.lwj.util; import javax.servlet.http.HttpServletRequest; /** * 判断访问设备为PC或者手机--工具类 * * @de ...
- 得到设备是何种iPhone设备 + 怎么获得启动页面图片
一.前言 今天做一个功能,需要动态的获得启动页,然后根据不同设备去使用不用的启动页图片. 二.正文 常规来说,我们直接判断是何种设备,然后通过name去获得图片选择性加载即可.但是实际上遇到的两个问题 ...
- JS判断访问设备、客户端操作系统类型
先给出一个实例:判断windows.linux.android 复制以下代码另存为html文件即可. <html> <head> <title>判断操作系统< ...
- PHP简单判断手机设备的方法
本文实例讲述了PHP简单判断手机设备的方法.分享给大家供大家参考,具体如下: 现在移动互联网越来越发到,很多的网站都普及了手机端浏览,为了更好的让网页在手机端显示,我们都选择了使用CSS媒体查询制作响 ...
随机推荐
- AOP编程和ASP.NET MVC
AOP编程和ASP.NET MVC AOP(Aspect oriented programming)面向切面编程.说成切面不容易理解,代码哪里有切面?又不是三维物体.概念不管,我们从其思想来理解这个名 ...
- Winform程序
故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...
- IP选路
IP选路 1.概述 路由算法是用于获取路由表中的路由项目.它是路由选择协议的核心. 2.路由算法的分类 从路由算法能否随网络的通信量或拓扑自适应的进行调整变化来分,可以分为两类. ...
- OpenXml操作Word的一些操作总结.
OpenXml操作Word的一些操作总结. OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩 ...
- 如何隐藏Cognos Viewer
做BI项目很多时候需要跟Portal做集成,可以将整个BI Portal放到企业门户或者只是存放一些固定的报表.由于Cognos默认运行会带出Cognos Viewer,这样就跟门户不太协调. 有几种 ...
- 命令版本git 分支篇-----不断更新中
最近应用开发的过程中出现了一个小问题,顺便记录一下原因和方法--命令版本 开发中想看看过去某个版本的代码,我们先查看log git log commit f224a720b8192165a4e70f2 ...
- html5 PACS漫谈
2012年html5标准制定之后,其中canvas标签给程序猿提供了图像绘制的接口. 在医疗领域从事PACS开发的我发现BS结构的PACS系统开发有了新可能,不再需要客户端安装flash.active ...
- JavaScript利用闭包实现模块化
利用闭包的强大威力,但从表面上看,它们似乎与回调无关.下面一起来研究其中最强大的一个:模块. function foo() { var something = "cool"; va ...
- XAF-列表视图编辑模式
下面来看看XAF中列表有哪些编辑模式: 一.inline编辑 下图说明了WinForms和ASP.NET应用程序中的可编辑列表视图. 在win中,这个很友好,就像excel中编辑一样.5星功能^_^. ...
- URL传值问题,不同浏览器对URL的长度要求
通过URL传值的问题,所以对url字符串进行encodeURIComponent对url字符串内容进行编码,问题解决,但是有时候会出现 The request filtering module is ...