iPhone 上的 USB 编程

发布于 2024-11-05 13:50:38 字数 114 浏览 0 评论 0原文

我想做的就是通过 USB 端口发送/接收数据。 使用官方 SDK 是不可能的 - 除了 MFi。

您会建议哪些其他方法可以与其他设备进行有线通信?

非常感谢!

GD

all i want to do is to sent/receive data over the USB Port.
With the official SDK it is not possible - apart from MFi.

Which other methods to communicate wired with other devices are possible and would you propose?

Many Thanks in advance!

GD

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

等你爱我 2024-11-12 13:50:38

软件开发人员不需要 MFI 会员资格,只有硬件开发人员需要 MFI 会员资格。另外你指的是哪个USB端口?你指的是 iPhone 的 32 针连接器吗?您始终可以使用蓝牙将数据发送到硬件设备。

更新 1 -

首先,抱歉,代码可能看起来很复杂,我从当前的项目中粘贴此代码。如果您想要示例项目,请发表评论。

首先,您需要在视图中注册通知已加载

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_accessoryDidConnect:) name:EAAccessoryDidConnectNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_accessoryDidDisconnect:) name:EAAccessoryDidDisconnectNotification object:nil];
[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];

- 然后您应该找到附加的附件 -

     _accessoryList = [[NSMutableArray alloc] initWithArray:[[EAAccessoryManager sharedAccessoryManager] connectedAccessories]];

然后检查这是您正在寻找的正确附件 -

for(EAAccessory *obj in _accessoryList)
    {
        if ([[obj protocolStrings] containsObject:@"com.bluebamboo.p25i"])//if find the accessory(p25) record it
        {
            [accessoryLabel setText:@"P25mi connected"]; // yup this is correct accessory!
            [obj release];
            break;
        }
    }

然后打开一个会话 -

//if accessory not null
if(accessory)
{
    session = [[EASession alloc] initWithAccessory:accessory forProtocol:@"com.bluebamboo.p25i"];//initial session that pair with protocol string
    [[session outputStream] setDelegate:self];//set delegate class for output stream 
    [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; //set outputstream loop
    [[session outputStream] open]; //open session
    [[session inputStream] setDelegate:self];
    [[session inputStream] open];
    [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];


}

然后将调用流委托 -

//this is a stream listener function that would actived by system while steam has any event
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{   



    switch(streamEvent)
    {
        case NSStreamEventOpenCompleted:
            if(theStream==[session outputStream])//to identify which stream has been opend
            {
                [self addLabel:@"outputNSStream open;"];
            }
            else
            {
                [self addLabel:@"inputNSStream open:"];
            }


            break;
        case NSStreamEventHasBytesAvailable:
            //if system has stream data comes in
            [self addLabel:@"receiving Data;"];

            uint8_t buf2[100];//create a buffer
            unsigned int len = 0;
            //read buffer commands return actuall length of return data
            len = [[session inputStream] read:buf2 maxLength:100];

            if (len>0 )
            {
                if (buf2[4]==0x03&&buf2[5]==0x00)//if two bytes are 0x03 and 0x00, that means print success 
                {
                    //display success message
                    alertMessage = [[UIAlertView alloc] initWithTitle:@"SUCCESS:" message:@"P25i have printed Text successfully" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                    [alertMessage show];
                    [alertMessage release];

                    [self addLabel:@"received success"]; 
                }

            }


            [self enableButton];
            //operation finished then close all streams and session
            [[session outputStream] close];
            [[session outputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [[session outputStream] setDelegate:nil];
            [[session inputStream] close];
            [[session inputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [[session inputStream] setDelegate:nil];
            [session release];
            session = nil;
            //[self connectSession];
            //switcher2=TRUE;

            break;
        case NSStreamEventHasSpaceAvailable:

            [self addLabel:@" NSStreamEventHasSpaceAvailable"];
            if (switcher2)//we send loop mode so application would keep sending data to p25, the switcher2 identify the data has send to P25m
            {


                         //[self addLabel:@"buffer is selected"];
                 int contentLength=[printContent.text length];
                 unsigned char buffer[contentLength+7];
                 buffer[0] = 0X55; 
                         buffer[1]=0x66; 
                         buffer[2]=0x77;  
                         buffer[3]=0x88; 
                         buffer[4]=0x44;//print command
                for (int i=5;i<contentLength+5;i++)//add print content
                {
               buffer[i] =[printContent.text characterAtIndex:i-5];
                  }
               buffer[contentLength+5]=0x0A;
               buffer[contentLength+6]=0x0A;
              [[session outputStream] write:(const uint8_t *)buffer maxLength:contentLength+7];//send print package



                switcher2 =FALSE;
            }



            break;
        case NSStreamEventErrorOccurred:
            alertMessage = [[UIAlertView alloc] initWithTitle:@"ERROR:" message:@"NSSTream Error" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alertMessage show];
            [alertMessage release];

            [self enableButton];
            [self addLabel:@"NSSTream error"];
            break;
        default:

            break;
    }
}

MFI membership is not needed for software developers its only needed for hardware developer. Also what USB port are you referring? are you referring the iPhone's 32 pin connector? You can always send data to hardware device using bluetooth.

update 1 -

First of all Sorry the code may look complex I am pasting this from my current project. Post comment if you want a sample project.

first you need to register for notifications in view did load-

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_accessoryDidConnect:) name:EAAccessoryDidConnectNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_accessoryDidDisconnect:) name:EAAccessoryDidDisconnectNotification object:nil];
[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];

Then you should find the attached accessories -

     _accessoryList = [[NSMutableArray alloc] initWithArray:[[EAAccessoryManager sharedAccessoryManager] connectedAccessories]];

Then check this is the correct accessory you are looking for -

for(EAAccessory *obj in _accessoryList)
    {
        if ([[obj protocolStrings] containsObject:@"com.bluebamboo.p25i"])//if find the accessory(p25) record it
        {
            [accessoryLabel setText:@"P25mi connected"]; // yup this is correct accessory!
            [obj release];
            break;
        }
    }

Then open a session -

//if accessory not null
if(accessory)
{
    session = [[EASession alloc] initWithAccessory:accessory forProtocol:@"com.bluebamboo.p25i"];//initial session that pair with protocol string
    [[session outputStream] setDelegate:self];//set delegate class for output stream 
    [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; //set outputstream loop
    [[session outputStream] open]; //open session
    [[session inputStream] setDelegate:self];
    [[session inputStream] open];
    [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];


}

Then the stream delegate will be called -

//this is a stream listener function that would actived by system while steam has any event
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{   



    switch(streamEvent)
    {
        case NSStreamEventOpenCompleted:
            if(theStream==[session outputStream])//to identify which stream has been opend
            {
                [self addLabel:@"outputNSStream open;"];
            }
            else
            {
                [self addLabel:@"inputNSStream open:"];
            }


            break;
        case NSStreamEventHasBytesAvailable:
            //if system has stream data comes in
            [self addLabel:@"receiving Data;"];

            uint8_t buf2[100];//create a buffer
            unsigned int len = 0;
            //read buffer commands return actuall length of return data
            len = [[session inputStream] read:buf2 maxLength:100];

            if (len>0 )
            {
                if (buf2[4]==0x03&&buf2[5]==0x00)//if two bytes are 0x03 and 0x00, that means print success 
                {
                    //display success message
                    alertMessage = [[UIAlertView alloc] initWithTitle:@"SUCCESS:" message:@"P25i have printed Text successfully" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                    [alertMessage show];
                    [alertMessage release];

                    [self addLabel:@"received success"]; 
                }

            }


            [self enableButton];
            //operation finished then close all streams and session
            [[session outputStream] close];
            [[session outputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [[session outputStream] setDelegate:nil];
            [[session inputStream] close];
            [[session inputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [[session inputStream] setDelegate:nil];
            [session release];
            session = nil;
            //[self connectSession];
            //switcher2=TRUE;

            break;
        case NSStreamEventHasSpaceAvailable:

            [self addLabel:@" NSStreamEventHasSpaceAvailable"];
            if (switcher2)//we send loop mode so application would keep sending data to p25, the switcher2 identify the data has send to P25m
            {


                         //[self addLabel:@"buffer is selected"];
                 int contentLength=[printContent.text length];
                 unsigned char buffer[contentLength+7];
                 buffer[0] = 0X55; 
                         buffer[1]=0x66; 
                         buffer[2]=0x77;  
                         buffer[3]=0x88; 
                         buffer[4]=0x44;//print command
                for (int i=5;i<contentLength+5;i++)//add print content
                {
               buffer[i] =[printContent.text characterAtIndex:i-5];
                  }
               buffer[contentLength+5]=0x0A;
               buffer[contentLength+6]=0x0A;
              [[session outputStream] write:(const uint8_t *)buffer maxLength:contentLength+7];//send print package



                switcher2 =FALSE;
            }



            break;
        case NSStreamEventErrorOccurred:
            alertMessage = [[UIAlertView alloc] initWithTitle:@"ERROR:" message:@"NSSTream Error" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alertMessage show];
            [alertMessage release];

            [self enableButton];
            [self addLabel:@"NSSTream error"];
            break;
        default:

            break;
    }
}
可遇━不可求 2024-11-12 13:50:38

查看 http://redpark.com

他们出售 USB 电缆和 iOS SDK,用于向通过以下方式连接的设备读取/写入数据USB。

我已经成功地使用它将 iPad 连接到各种硬件。

check out http://redpark.com

they sell an USB cable and iOS SDK for reading/writing data to a device connected via USB.

i have used it successfully to interface the iPad to various hardware.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文