2014-10-29 96 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