一篇搞定Linux和IOS或Android通讯(usbmuxd、libimobiledevice、libusb、AOA)

1、Linux要与苹果手机通讯需要两个组件

1、usbmuxd 是苹果的一个服务,这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes、Xcode,都直接或间接地用到了这个服务。
参考链接:https://www.theiphonewiki.com/wiki/Usbmux
2、libimobiledevice是一个跨平台的软件库,用于与iOS设备进行交互。
参考链接:https://www.theiphonewiki.com/wiki/MobileDevice_Library

编译安装上面2个库就直接可以使用socket套接字进行通讯

上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
#include <pthread.h>

#define MAX_CONNECT_NUM 2
#define BUFFER_SIZE 1024
const char *filename = "/var/run/usbmuxd";
static pthread_t th;
static pthread_t th1;

//sudo mv /var/run/usbmuxd /var/run/usbmuxx
// sudo socat -t100 -x -v UNIX-LISTEN:/var/run/usbmuxd,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/usbmuxx


void *thread_recv(void *ptr)
{
   
    int fd = *(int *)ptr;
    char buffer[BUFFER_SIZE];
    bzero(buffer, BUFFER_SIZE);

    while (1)
    {
   
        printf("waiting recv...\n");
        int ret = recv(fd, buffer, BUFFER_SIZE, 0);

        if (ret <= 0)
        {
   
            printf("recv failed\n");
            close(fd);
            pthread_cancel(th1);
            return NULL;
        }

        printf("%s\n", buffer);

        if (strncmp("end", buffer, 3) == 0)
        {
   
            close(fd);
            exit(0);
        }
    }
}

void *thread_send(void *ptr)
{
   
    int fd = *(int *)ptr;
    while(1)
    {
   
        char buff[128] = {
   0};
        fgets(buff, 128, stdin);

        int ret = send(fd, buff, 128, 0);
        if (ret <= 0)
        {
   
            close(fd);
            pthread_cancel(th);
            return NULL;
        }
    }
}

int main()
{
   
    int fd, new_fd, len, i;
    //struct sockaddr_un结构有两个参数:sun_family、sun_path
    //sun_family只能是AF_LOCAL或AF_UNIX,而sun_path是本地文件的路径。
    struct sockaddr_un un;
    fd = socket(AF_UNIX, SOCK_STREAM, 0);//SOCK_DGRAM是基于UDP的
    //本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。
    if (fd < 0)
    {
   
        printf("Request socket failed!\n");
        return -1;
    }
    un.sun_family = AF_UNIX;
    strcpy(un.sun_path, filename);
    if (bind(fd, (struct sockaddr *)&un, sizeof(un)) < 0)
    {
   
        printf("bind failed!\n");
        return -1;
    }
    if (listen(fd, MAX_CONNECT_NUM) < 0)
    {
   
        printf("listen failed!\n");
        return -1;
    }
    while (1)
    {
   
        printf("wait to accept...\n");

        new_fd = accept(fd, NULL, NULL);

        printf("new accept.\n");

        if (new_fd < 0)
        {
   
            printf("accept failed\n");
            return -1;
        }
        pthread_create(&th, NULL, thread_recv, (void *)(&new_fd));
        pthread_create(&th1, NULL, thread_send, (void *)(&new_fd));

    }
    close(fd);
}

2、Linux要与Android手机通讯只需要一个库

libusb是一个开源的用C实现的,应用程序与用户的USB设备进行通信的库。 链接地址:https://github.com/libusb/libusb
编译安装好上面的库后直接可以使用AOA进行通讯了

AOA说明:手机通过USB连接到设备时,触发一次插入事件,设备通过VID和PID来判断USB是否为AOA模式

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值