2014-10-29 18 views
1

我有这个简单的Perl软件来监视我的家庭自动化总线的活动,并在灯光改变状态时“说”。我想用Xcode操作系统使用Swift语言来实现它。任何解决方案尝试?如何使用Swift游乐场实现套接字连接?

#!/usr/bin/perl -w 
# 
use strict; 
use IO::Socket::INET; 
my $mh200ip = "10.0.1.82"; 
my $ownport = "20000"; 
my $frames; 
my $socket = IO::Socket::INET->new(
    PeerAddr => $mh200ip, 
    PeerPort => $ownport, 
    Proto => "tcp", 
    Type  => SOCK_STREAM 
); 
die "Could not create socket: $!\n" unless $socket; 
$socket->send("*99*1##"); # Sending OPEN ACK 

while (1) { 
    $socket->recv($frames, 128); 
    if ($frames ne '') { 
     print "$frames\n"; 
     my $data = ($frames); 
     my @values = split('##', $data); 
     if ($data eq "*1*0*53##") { 
      `say "light off"`; 
     } 
     if ($data eq "*1*1*53##") { 
      `say "light on"`; 
     } 
    } else { 
     print "server closed connection"; 
     exit 1; 
    } 
} 
+0

这是一个“请翻译我的代码” - 请求,这是不适合堆栈溢出 - 它太广阔。不要求翻译,首先尝试翻译,然后询问你没有设法翻译自己的具体部分。这表明你已经做出了一些努力来帮助自己,而不是要求别人为你做所有的工作。 – amon 2014-10-29 23:17:58

回答

0

这是一个几乎逐字翻译成你的Perl代码段的斯威夫特:

#!/usr/bin/swift 
import Foundation 

func say(whatToSay: String) { 
    let task = NSTask() 
    task.launchPath = "/usr/bin/say" 
    task.arguments = [whatToSay] 
    task.launch() 
} 

let addr = "127.0.0.1" 
let port = 2000 

var buffer = [UInt8](count: 255, repeatedValue: 0) 

var inp : NSInputStream? 
var out : NSOutputStream? 

NSStream.getStreamsToHostWithName(addr, port: port, inputStream: &inp, outputStream: &out) 

if inp != nil && out != nil { 
    let inputStream : NSInputStream = inp! 
    let outputStream : NSOutputStream = out! 
    inputStream.open() 
    outputStream.open() 

    if outputStream.streamError == nil && inputStream.streamError == nil { 
     let queryString: String = "*99*1##" 
     let queryData: NSData = queryString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 
     while true { 
      outputStream.write(UnsafePointer(queryData.bytes),maxLength:queryData.length) 
      var readChars: Int = inputStream.read(&buffer, maxLength: buffer.count) 
      if (readChars > 0) { 
       let readString: String = NSString(data: NSData(bytes:buffer, length:readChars), encoding: NSUTF8StringEncoding)! 
       if readString == "*1*0*53##" { 
        say("Light off") 
       } else if readString == "*1*1*53##" { 
        say("Light on") 
       } 
      } else { 
       println ("server closed connection") 
       inputStream.close() 
       outputStream.close() 
       break 
      } 
     } 
    } else { 
     println ("could not create socket") 
    } 
} else { 
    println ("could not initialize stream") 
} 
+0

我再次启动了Xcode,并且该文件也在操场上运行。 println结果显示在“值历史记录”窗口中。 – 2014-10-31 04:17:42

+0

感谢Francesco,您的程序在Swift 3之前运行正常。现在我遇到了一个我不能解决的不安全冬季问题。 – 2016-10-19 08:05:26