三、Mac与USB通讯

一、usbmuxd 介绍

usbmuxd 是苹果的一个服务,这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes、Xcode,都直接或间接地用到了这个服务。

iTunes使用 usbmux 与 iphone 通信, 它提供了一个USB - TCP的转换服务, 这个服务在Mac端是由/System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd提供的, 当然, 开机自动启动。

它创建了一个Unix Domain Socket 在 /var/run/usbmuxd. usbmuxd服务程序监控iPhone在USB口上的连接, 当它监控到iPhone以用户模式连接到USB, (相对的是recovery模式), usbmuxd服务程序就会连接到这个/var/run/usbmuxd的TCP端口, 并开始成为一个USB - TCP 请求转发器

那么,如果想编写个第三方程序与iphone进行通信,实现类似iTunes的功能, 你的程序可以通过usbmuxd! 建立一个TCP连接到/var/run/usbmuxd端口, 根据协议发送对应的请求包, usbmuxd服务会将请求转发到USB的iPhone上。

peertalk,一个基于usbmuxd服务的开源代码,可以实现 iPhone 与 Mac 通信。

libimobiledevice,在可以PC端提供usbmuxd服务,实现 iPhone 与 windows 通信。
二、Peertalk 的使用:iPhone 与 Mac 通信
iOS 端

1、创建 channel,监听指定端口

// 创建 channel
PTChannel *channel = [PTChannel channelWithDelegate:self];
// 监听指定端口,PTExampleProtocolIPv4PortNumber自定义端口号
[channel listenOnPort:PTExampleProtocolIPv4PortNumber IPv4Address:INADDR_LOOPBACK callback:^(NSError *error) {
    if (error) { // 创建监听失败

    } else { // 创建监听成功 

    }
}];

2、实现 Channel 的代理方法

@protocol PTChannelDelegate

@required
// 收到信息
- (void)ioFrameChannel:(PTChannel*)channel didReceiveFrameOfType:(uint32_t)type tag:(uint32_t)tag payload:(PTData*)payload;

@optional
// 收到消息调用,如回复NO,则忽略这条消息
- (BOOL)ioFrameChannel:(PTChannel*)channel shouldAcceptFrameOfType:(uint32_t)type tag:(uint32_t)tag payloadSize:(uint32_t)payloadSize;

// 出错回调
- (void)ioFrameChannel:(PTChannel*)channel didEndWithError:(NSError*)error;

// 连接成功回调
- (void)ioFrameChannel:(PTChannel*)channel didAcceptConnection:(PTChannel*)otherChannel fromAddress:(PTAddress*)address;

@end

3、连接成功后,会发送设备信息
Mac 端

1、监听USB设备的连接/断开

// 开始监听设备的连接与断开
- (void)startListeningForDevices {
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

// 监听设备连接
[nc addObserverForName:PTUSBDeviceDidAttachNotification object:PTUSBHub.sharedHub queue:nil usingBlock:^(NSNotification *note) {
    NSNumber *deviceID = [note.userInfo objectForKey:@"DeviceID"];
    dispatch_async(notConnectedQueue_, ^{
        if (!connectingToDeviceID_ || ![deviceID isEqualToNumber:connectingToDeviceID_]) {
            // 断开现有连接
            [self disconnectFromCurrentChannel];
            connectingToDeviceID_ = deviceID;
            connectedDeviceProperties_ = [note.userInfo objectForKey:@"Properties"];
            // 重新连接
            [self enqueueConnectToUSBDevice];
        }
    });
}];

// 监听设备断开
[nc addObserverForName:PTUSBDeviceDidDetachNotification object:PTUSBHub.sharedHub queue:nil usingBlock:^(NSNotification *note) {
    NSNumber *deviceID = [note.userInfo objectForKey:@"DeviceID"];
    if ([connectingToDeviceID_ isEqualToNumber:deviceID]) {
        connectedDeviceProperties_ = nil;
        connectingToDeviceID_ = nil;
        if (connectedChannel_) { // 关闭连接通道
            [connectedChannel_ close];
        }
    }
}];

}

2、连接设备

// 连接设备
- (void)connectToLocalIPv4Port {
// 创建通道,设置代理
PTChannel *channel = [PTChannel channelWithDelegate:self];
channel.userInfo = [NSString stringWithFormat:@”127.0.0.1:%d”, PTExampleProtocolIPv4PortNumber];
// 连接指定端口地址,与iOS端设置保持一致
[channel connectToPort:PTExampleProtocolIPv4PortNumber IPv4Address:INADDR_LOOPBACK callback:^(NSError *error, PTAddress *address) {
if (error) { // 连接失败

    } else { // 连接成功

    }
}];

}

3、连接成功会,会收发送 ping、pong 心跳数据
三、libimobiledevice、Peertalk 的使用:iPhone 与 windows 通信
1、实现原理

windows端 通过 libimobiledevice 运行 usbmuxd 的多路复用守护进程,该进程的作用是建立本地端口和远程端口的转发,实现usb到tcp的转换服务
2、安装服务

windows端首先要安装苹果公司提供的相关服务,才能实现通信功能。服务名称为:AppleApplicationSupport和AppleMobileDeviceSupport
3、规定协议

首先指定 ip地址和端口,端口号建议大些,以免与苹果系统应用端口重复。如:127.0.0.1:62345。PC端可以通过端口转发实现。
定义相同结构体数据,以便数据的加密、解析。PC端可和Peertalk定义的协议保持一致。如:

// 数据头结构体
typedef struct _PTFrame {
uint32_t version; // 对应版本
uint32_t type; // 数据类型
uint32_t tag; // tag标记
uint32_t payloadSize; // 数据大小
} PTFrame;

// 数据类型
enum {
PTExampleFrameTypeDeviceInfo = 100, // 设备信息
PTExampleFrameTypeTextMessage = 101, // 文本数据
PTExampleFrameTypePing = 102, // Ping
PTExampleFrameTypePong = 103, // Pong
};

4、联调测试

定好协议后,指定相同ip地址和端口,进行测试。如连接失败,可尝试更换端口号重试。先调试连接,然后再收发数据,最后进行数据处理。

参考链接1:http://blog.csdn.net/u010343361/article/details/50539401
参考链接2:https://github.com/Polyfun/libimobiledevice-windows
参考链接3:https://github.com/rsms/peertalk

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
五一放假,出门在外,有时候没有WiFi,没法通过无线ssh到iOS中调程序,怎么办呢?好在大神Nikias Bassen(即@pimskeks5)写了一个可以把本地OSX/Windows端口转发到远程iOS端口的工具usbmuxd16,使我们能够通过USB连接线ssh到iOS中,大大增加了ssh连接的速度,也方便了那些没有WiFi的朋友。下面我们就简单介绍一下怎么使用神器usbmuxd。(注:以下操作在OSX中进行,Windows用户请自行安装python环境) 下载usbmuxd 从这里下载usbmuxd(http://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz),解压到本地。我们要用到的只有python-client目录下的tcprelay.py和usbmux.py两个文件,把它们放到同一个目录下,如笔者的 /Users/snakeninny/Code/USBSSH/ 使用usbmuxd usbmuxd的用法比较简单,在Terminal中输入 /Users/snakeninny/Code/USBSSH/tcprelay.py -t 远程iOS上的端口:本地OSX/Windows上的端口 即可把本地OSX/Windows上的端口转发到远程iOS上的端口,如 /Users/snakeninny/Code/USBSSH/tcprelay.py -t 22:2222 可把本地的2222端口转发到iOS上的22端口,那么直接 ssh root@localhost -p 2222 即可ssh到iOS中。 使用场景举例 完全脱离WiFi,使用USB连接到iOS,用lldb调试SpringBoard。 i) 把本地2222端口转发到iOS的22端口 /Users/snakeninny/Code/USBSSH/tcprelay.py -t 22:2222 ii) ssh过去并用debugserver attach到SpringBoard ssh root@localhost -p 2222 debugserver *:1234 -a "SpringBoard" iii) 把本地1234端口转发到iOS的1234端口 /Users/snakeninny/Code/USBSSH/tcprelay.py -t 1234:1234 iv) 用lldb开始调试 lldb process connect connect://localhost:1234

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值