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的方法的更多相关文章

  1. 关于iPhone设备不同显示尺寸适配的一些方法

    关于iPhone设备不同显示尺寸适配的一些方法   ------关于适配的理解------ 1.什么是适配? 适配是对不同硬件和系统软件的适应,硬件包括屏幕显示,处理器,内存等等(目前主要是屏幕适配, ...

  2. 判断 iPhone 是否已插入 SIM 卡的方法

    判断 iPhone 是否插入了 SIM 卡,可以参考苹果官网的 systemconfigure framework 教程,将下面的代码复制到头文件 extern NSString* const kCT ...

  3. 判断iPhone和iPad 判断设备版本

    //判断iPhone和iPad #define IS_IPHONE (!IS_IPAD) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInt ...

  4. ios5和ios6横竖屏支持及ipad和iphone设备的判断

    ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...

  5. PHP判断iPhone、iPad、Android、PC设备的方法

    因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面我们一起来看小编整理的一段php判断iPhone.iPad.Android.PC设备的例子. 注意:本代码的PC系统为 ...

  6. Java判断访问设备为手机、微信、PC工具类

    package com.lwj.util; import javax.servlet.http.HttpServletRequest; /** * 判断访问设备为PC或者手机--工具类 * * @de ...

  7. 得到设备是何种iPhone设备 + 怎么获得启动页面图片

    一.前言 今天做一个功能,需要动态的获得启动页,然后根据不同设备去使用不用的启动页图片. 二.正文 常规来说,我们直接判断是何种设备,然后通过name去获得图片选择性加载即可.但是实际上遇到的两个问题 ...

  8. JS判断访问设备、客户端操作系统类型

    先给出一个实例:判断windows.linux.android 复制以下代码另存为html文件即可. <html> <head> <title>判断操作系统< ...

  9. PHP简单判断手机设备的方法

    本文实例讲述了PHP简单判断手机设备的方法.分享给大家供大家参考,具体如下: 现在移动互联网越来越发到,很多的网站都普及了手机端浏览,为了更好的让网页在手机端显示,我们都选择了使用CSS媒体查询制作响 ...

随机推荐

  1. web前端安全---读书笔记

    web前端安全---读书笔记 粗略的看完了Web前端黑客技术揭秘前两章了,由于自身的前端功力不深,当然也是初涉前端的安全问题,所以实话还是有些问题看不太明白的.在豆瓣看到的这本书,名字真心有点很肥主流 ...

  2. .Net用户使用期限的设置、限制通用小组件

    .Net用户使用期限的设置.限制通用小组件 最近比较项目组的同事都比较烦,不断的穿梭在不同的项目之间,一个人同时要兼顾多个项目的维护修改.甚至刚放下这个客户的电话,另一个客户的电话就进来了.究其原因, ...

  3. 纯Python综合图像处理小工具(1)分通道直方图

    平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visua ...

  4. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  5. C# .Net 使用zxing.dll生成二维码,条形码

    public static string GetBarcode(string format, string value, int? width, int? height)        {       ...

  6. hdu 1809 求SG函数

    A New Tetris Game(2) Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. android fragment addToBackStack bug

    In FragmentActivity.First, I add two fragment by FragmentTransaction. See the flowing code : /****** ...

  8. Hexo+NextT第三方服务调用【4】

    该系列博客列表请访问:http://www.cnblogs.com/penglei-it/category/934299.html 摘要        静态站点与动态站点有很大的不一样,它拥有一定的局 ...

  9. 【转载】Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门

    Servlet Filter(过滤器).Filter是如何实现拦截的.Filter开发入门 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过F ...

  10. DLoopDetector回环检测算法

    词袋模型是一种文本表征方法,它应用到计算机视觉领域就称之为BoF(bag of features),通过BoF可以把一张图片表示成一个向量.DBoW2是一个视觉词袋库,它提供了生成和使用词典的接口,但 ...