判断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媒体查询制作响 ...
随机推荐
- DES加密解密 与 Cookie的封装(C#与js互相加密解密)
2D JS框架 - DES加密解密 与 Cookie的封装(C#与js互相加密解密) 这次实现了JS端的DES加密与解密,并且C#端也能正确解析DES的密文(反之也实现了) 使用的代码如下,非常方 ...
- 依赖倒置原则DIP(面向接口编程—OOD)
含义: 1.高层模块不应该依赖底层模块,两者都应该依赖其抽象. 2.抽象不应该依赖细节. 3.细节应该依赖抽象. 底层模块:不可分割的原子逻辑. 高层模块: 原子逻辑的再组装. 抽象:接口或者抽象类, ...
- S3C2440之IIC裸机驱动
花了两天的时间终于把这个搞定了,其实I2C的原理还是比较简单的,只是几个细节性的东西还是需要特别的注意,主要是需要注意一下几点: 1.rIICCON &= ~0x10; 清中断必须要在rIIC ...
- LearnCpp.com
LearnCpp.com is a totally free website devoted to teaching you to program in C++. Whether you’ve had ...
- C语言序列点浅析
摘要: 现行国内的C语言教材普遍不介绍序列点,这使得读者只能“死记硬背”有序列点表达式的求值顺序,不仅造成了读者对C语言知识的认知残缺不全,而且也影响了读者学习的积极性.本文总结了序列点的作用,即表达 ...
- 用docker cluster store实现kuryr的共享subnet
kuryr共享网络 在上一篇分享中,提到共享网络需要在10.8.65.80和10.8.65.81上分别通过docker network create来创建网络.而实际上,通过对docker源码的解读, ...
- 玩转docker镜像和镜像构建
摘要 本文从个人的角度,讲述对于docker镜像和镜像构建的一些实践经验.主要内容包括利用docker hub进行在线编译,下载镜像,dind的实践,对于镜像的一些思考等.本文是对当时微信分享内容的一 ...
- InvocationHandler中invoke()方法的调用问题
转InvocationHandler中invoke()方法的调用问题 Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandl ...
- YC(Y Combinator)斯坦福大学《如何创业》课程要点记录(粗糙)
20节课程,每节都是干货满满,时常听说理论无用,但是好的理论,绝对能帮助你少走一些弯路. YC简介: Y Combinator成立于2005年,是美国著名创业孵化器,Y Combinator扶持初创企 ...
- mac 切换php版本
通过brew安装的php可以通过brew link和brew unlink来切换不同版本 #brew list #brew unlink php56 #brew link php55