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模式