2011-07-15 3 views
0

一般的なコードを書いていますが、iOSアプリケーションのPythonスクリプトをOBJ-Cに変換する助けが必要です。OBJ-CからPythonスクリプトに2つの引数を渡す必要があります。iOS App

私はネットワークブリッジ上でXMLRPCサーバーを実行しているpythonスクリプトを持っています。

ボタンを押したときにネットワークブリッジ上で動作するpythonスクリプトを呼び出す必要があるiOSアプリケーションがXcode4で作成されています。

また、XMLRPCサーバーにアクセスできるPythonで書かれたXMLRPCクライアントスクリプトもあります。

基本的には、Python XMLRPCクライアントスクリプトをOBJ-Cに変換して、iOSアプリケーションで実行できるようにする必要があります。

PythonのXMLRPCクライアントスクリプト:Xcodeのから

from xmlrpclib import ServerProxy, Binary 
import time 
yourAddr = Binary('\x00\x00\x04') # SNAP Address of this client application 
ourAddr = Binary('\x4c\x6f\x8c') # SNAP Address of this client application 
CONN_TYPE_USB = 2 
count =0 
def listenForResponse(srv): 
    global count 
    """ Wait and listen for a mcast count message """ 
    eventResp = srv.waitOnEvent(ourAddr,1) 
    if eventResp != None and eventResp['methodName'] == "setButtonCount": 
     # The count should be the first parameter 
     print "The button count = ", (eventResp['parameters'][0]), "\n" 
    else: 
     if eventResp == None: 
      print "time out " 
     else: 
      print "...not the response we were looking for; continue waiting " 
      print eventResp['methodName'] 

# print "mcastRpc setButtonCount to snap server" 
# count = (count + 1) %100 
# srv.mcastRpc(ourAddr, 1,5, 'setButtonCount',[count]) 
# time.sleep(1) 



if __name__ == '__main__': 
    """ The main program loop for this example """ 
    # Connect to SNAPconnect server via TCP port 8080  
# 
# srv = ServerProxy("http://192.168.0.x:8080", allow_none=False) 
    srv = ServerProxy("http://192.168.0.x:8080", allow_none=False) #call from the xmlrpc library 

# srv = ServerProxy("public:public:http://192.168.1.106:8080") 
    # Connect to SNAP bridge node (We'll assume it is on the first USB port) 

    print "opening serial" #remote procedure call being executed on the E10, telling the E10 to listen to the SNAP bridge on Serial port #1 

    srv.connectSerial(1,"/dev/ttyS1") # for the e10 
    # Continually listen for the count 
    while True: 
     listenForResponse(srv) 

マイコード:私は私のアプリでは "てgetResponse" ボタンを押してからXMLRPCサーバーから何を得る

-(IBAction)getResponse:(id) sender{ 


    NSString *ourAddr = @"1"; 
    NSString *dev = @"/dev/ttylS1"; 

    NSString *server = @"192.168.0.x:8080"; 
    XMLRPCRequest *waitOnEvent = [[XMLRPCRequest alloc] initWithHost:[NSURL URLWithString:server]]; 
    [waitOnEvent setMethod:@"connectSerial" withObject:[NSString stringWithString: ourAddr]]; 



    NSString *result=[self executeXMLRPCRequest:waitOnEvent]; 
    [waitOnEvent release]; 

    if(![result isKindOfClass:[NSString class]]) //err occured. 
     lblResponse = result; //@"error"; 
    else 
    lblResponse.text = @"error"; 
} 

- (id)executeXMLRPCRequest:(XMLRPCRequest *)req { 
    XMLRPCResponse *userInfoResponse = [XMLRPCConnection sendSynchronousXMLRPCRequest:req]; 
    return [userInfoResponse object]; 
} 

15:48:15:611 INFO  SNAPconnect Now listening for XML-RPC connections on port 8080 
15:48:23:981 INFO  http_server connectSerial(1,) 
15:48:24:003 INFO  http_server 192.168.0.x:51752 - - "POST/HTTP/1.1" 200 479 

15:48:24:010 INFO  http_server <?xml version='1.0'?> 
<methodResponse> 
<fault> 
<value><struct> 
<member> 
<name>faultCode</name> 
<value><int>1</int></value> 
</member> 
<member> 
<name>faultString</name> 
<value><string>&lt;type 'exceptions.TypeError'&gt;:connectSerial() takes at least 3 arguments (2 given)</string></value> 
</member> 
</struct></value> 
</fault> 
</methodResponse> 

私は複数の引数を渡すしようだから私は

[connectSerial(1)]渡され、それが3 connectSerialを(1、は/ dev/ttylS1)]必要connectSerialのみ2つの引数を取得していることをこのことから見ます

[waitOnEvent setMethod:@ "connectSerial" withObject:[NSString stringWithString:ourAddr:dev]];私はちょうど私がPythonクライアントスクリプトを実行したときに、私はPythonのサーバーから何を得るBAD_EXCまたはSIGABRT

を取得

15:54:00:505 INFO  http_server connectSerial(1, /dev/ttyS1,) 
15:54:00:534 INFO  http_server 192.168.0.x:51772 - - "POST /RPC2 HTTP/1.0" 200 225 

15:54:00:541 INFO  http_server <?xml version='1.0'?> 
<methodResponse> 
<params> 
<param> 
<value><boolean>1</boolean></value> 
</param> 
</params> 
</methodResponse> 

15:54:00:573 INFO  http_server waitOnEvent(4c6f8c, 1,) 

これに任意のヘルプや洞察力をいただければ幸いです!ごめんなさい。私は必要に応じて説明を提供します。

ありがとうございます!

EDITは:今後の参考のために、さらに明確にする:

まあそのは

は、私が使用している場合は...まだなく、かなりそこに私は近い得ているように思えるが、:

NSString *const ourAddr = @"1"; 
NSString *const dev = @"/dev/ttyS1"; 


-(IBAction)getResponse:(id) sender{ 


    NSArray *args = [NSArray arrayWithObjects: ourAddr, dev, nil]; 


    NSString *server = @"http://192.168.0.x:8080"; 
    XMLRPCRequest *waitOnEvent = [[XMLRPCRequest alloc] initWithHost:[NSURL URLWithString:server]]; 
    [waitOnEvent setMethod:@"connectSerial" withObjects: args]; 

サーバーは私にこれを与える:

20:17:20:954 INFO  http_server connectSerial(1, /dev/ttyS1,) 
20:17:20:975 INFO  http_server 192.168.0.x:52253 - - "POST/HTTP/1.1" 200 467 

20:17:20:981 INFO  http_server <?xml version='1.0'?> 
<methodResponse> 
<fault> 
<value><struct> 
<member> 
<name>faultCode</name> 
<value><int>1</int></value> 
</member> 
<member> 
<name>faultString</name> 
<value><string>&lt;type 'exceptions.ValueError'&gt;:Serial interface type must be an integer</string></value> 
</member> 
</struct></value> 
</fault> 
</methodResponse> 

これで、 "1"を整数として宣言し、整数と文字列の両方を同時に渡す方法を理解する必要があります。これまでにIVEが試みたことは、私にBAD_EXCを与えています...

答えて

0

iOSデバイスでスクリプトを呼び出すことはできません。 OS Xでは実行できますが、(アプリストアで承認された)iOSアプリでは実行できません。

+0

ので、あなたの中から別のサーバー上で実行中のスクリプトを呼び出すカントあなたのアプリ?本当に私はこのテストが必要です。最終的にネットワークブリッジはWebサーバーに接続され、アプリケーションは単にデータを表示します。ご協力いただきありがとうございます! – swbooking

+0

私の悪いです。私はあなたのコードをスキミングしました。デバイス上で起動することはできません。 – bshirley

+0

NSURL/NSURLRequest/NSURLConnectionを使用してPOSTメソッドを呼び出す例を探したいとします。 – bshirley

0

私の推測では、あなたの引数を含む配列を作成する必要があるということです。そして、

NSArray *args = [NSArray arrayWithObjects:ourAddr, dev, nil]; 

とあなたのXMLRPCRequestにそれを渡す:

[waitOnEvent setMethod:@"connectSerial" withObject:args]; 
+0

うわー...私はそれを試みたことを誓う。好きなものは答えに近い。 その正しい引数を渡しています... []と ''を付け加えただけで 助けてくれてありがとう! – swbooking

+0

これは私がPython Serverから返すものです: 17:19:27:579 INFO http_server connectSerial(['1'、 '/ dev/ttylS1']) 17:19:27:600 INFO http_server 192.168.0.xの:52626 - - "POST/HTTP/1.1" 200 479 17:19:27:607 INFO HTTP_Serverの<?xmlのバージョン= '1.0'> faultCode <タイプ 'exceptions.TypeError' >のfaultString :connectSerialを()かかり、少なくとも3つの引数(所与2)場合@swbooking swbooking

+0

この答えはまさにあなたが探しているもので、答えの左側に表示される大きな「V」で正しいものをクリックしてマークしてください:) – brandizzi