现在我得到了以下课程,但是没有工作。它在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/>
答案 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设备。”