一般的なコードを書いていますが、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><type 'exceptions.TypeError'>: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><type 'exceptions.ValueError'>:Serial interface type must be an integer</string></value>
</member>
</struct></value>
</fault>
</methodResponse>
これで、 "1"を整数として宣言し、整数と文字列の両方を同時に渡す方法を理解する必要があります。これまでにIVEが試みたことは、私にBAD_EXCを与えています...
ので、あなたの中から別のサーバー上で実行中のスクリプトを呼び出すカントあなたのアプリ?本当に私はこのテストが必要です。最終的にネットワークブリッジはWebサーバーに接続され、アプリケーションは単にデータを表示します。ご協力いただきありがとうございます! – swbooking
私の悪いです。私はあなたのコードをスキミングしました。デバイス上で起動することはできません。 – bshirley
NSURL/NSURLRequest/NSURLConnectionを使用してPOSTメソッドを呼び出す例を探したいとします。 – bshirley