沙盒打开了,是否有更多的Objective-C方式来打开一个COM端口?

时间:2012-04-17 00:35:14

标签: objective-c serial-port appstore-sandbox

现在我得到了以下课程,但是没有工作。它在open电话失败。我认为这是因为沙盒,但我不确定如何前进。此外,这似乎是C版,是否有更好的Objective-C(IOKIT?)方式来解决这个问题?

设备本身是USB串口。

给出错误:

  

无法打开设备:不允许操作

当前代码:

#include <termios.h>
#import "Com.h"

#define BAUDCOUNT 17
speed_t baud_const[BAUDCOUNT] = { B50,    B75,    B110,   B134,   B150,   B200,
                                  B300,   B600,   B1200,  B1800,  B2400,  B4800, 
                                  B9600,  B19200, B38400, B57600, B115200 };
unsigned long baud_value[BAUDCOUNT] = { 50,   75,    110,   134,   150,   200,
                                        300,  600,   1200,  1800,  2400,  4800, 
                                        9600, 19200, 38400, 57600, 115200 };

@interface Com()
@property (assign) int fd;
@property (assign) struct termios oldio;
@end


@implementation Com
@synthesize fd = _fd;
@synthesize oldio = _oldio;

- (id)init
{
    self = [super init];
    if (self)
    {
        self.fd = -1;
        return self;
    }
    return nil;
}

- (BOOL)open:(NSString*)device withBaud:(int)baud
{
    struct termios oldio;
    struct termios newtio;

    // Find the correct baud rate
    int baudid = -1;
    for(int i = 0; i < BAUDCOUNT; i++) {
        if (baud_value[i] == baud) {
            baudid = i;
            break;
        }
    }
    if(baudid == -1)
    {
        NSLog(@"Invlaid baud rate: %d", baud);
        return NO;
    }

    // Open the device
    self.fd = open([device UTF8String], O_RDWR | O_NOCTTY | O_NDELAY);
    if (self.fd < 0)
    {
        NSLog(@"Failed to open device: %s", strerror(errno));
        return NO;
    }

    // Save old settings
    tcgetattr(self.fd, &oldio);
    self.oldio = oldio;

    // Init memory
    memset(&newtio, 0x00 , sizeof(newtio));
    cfmakeraw(&newtio);

    // settings flags
    newtio.c_cflag |= CS8;
    newtio.c_cflag |= CLOCAL;
    newtio.c_cflag |= CREAD;
    newtio.c_iflag = IGNPAR | IGNBRK;
    newtio.c_oflag = 0;
    newtio.c_lflag = 0;

    // Timeout in 100ms
    newtio.c_cc[VTIME] = 0;
    // read 1 character
    newtio.c_cc[VMIN] = 0;

    // Setting baudrate
    cfsetispeed (&newtio, baud_const[baudid]);
    cfsetospeed (&newtio, baud_const[baudid]);

    // Flushing buffer
    tcflush(self.fd, TCIOFLUSH);

    // aplying new configuration
    tcsetattr(self.fd, TCSANOW, &newtio);

    return YES;
}
@end

目前的权利:

<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.device.usb</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>

2 个答案:

答案 0 :(得分:1)

有几个Objective C框架用于处理串口。

更新:我认为您可能需要com.apple.security.device.serial权利。尽管您使用的是USB串行适配器,但我相信操作系统设备驱动程序会使所有串行端口显示相同,即不是USB设备。我怀疑你拥有的com.apple.security.device.usb权利不适用于USB串行设备。

更新2:我刚刚从去年8月发现了Open Radar,报告了您的问题。所以看起来com.apple.security.device.serial权利不起作用(或者肯定在八月没有工作)。

更新3:如果您确实需要直接访问USB设备(并假设这适用于com.apple.security.device.usb权利),那么您可能希望查看IOSerialFamily源代码,可在http://opensource.apple.com/source/IOSerialFamily/IOSerialFamily-59/获取。

来源tarball:http://opensource.apple.com/tarballs/IOSerialFamily/IOSerialFamily-59.tar.gz

答案 1 :(得分:0)

你正在做一些内核编程,这可能是你想要做的,但如果你可以使用IOKit那么我建议你这样做。简而言之,使用内核+沙盒做任何事情,我都不建议你发现它。

IOKit是另一种动物,真的不是太糟糕。下面是一个示例,其中包含一个快速代码段,可以禁止系统休眠。这演示了如何使用IOKit,我相信它可以与沙盒应用程序一起使用。

    IOPMAssertionID assertionID;
    IOReturn err = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, CFSTR("Add Reason Here"), &assertionID);
    if ( err == kIOReturnSuccess ) {

        // Do stuff here while system is unable to sleep

        // Let the system resume ability to sleep
        err = IOPMAssertionRelease(assertionID);
    }

此文档也应该有所帮助:link

注意:“重要如果您的应用程序是沙盒,则必须请求com.apple.security.device.usb权利才能访问USB设备。”