Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetNetIf mbed
Diff: main.cpp
- Revision:
- 0:a0cd4d9690f0
diff -r 000000000000 -r a0cd4d9690f0 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Nov 19 17:19:03 2010 +0000
@@ -0,0 +1,470 @@
+/*
+ *
+ * RPC over TCP (RPC over telnet)
+ * (Same functionality of Serial RPC via Serproxy )
+ *
+ * Command format is same as serial RPC (not HTTP RPC)
+ *
+ * (example)
+ * So you can control mbed by sending the followng command (over UDP)
+ * /DigitalOut/new LED1 myled
+ * /myled/write 1
+ * /AnalogIn/new p20 ain
+ * /ain/read
+ *
+ * Please find attached Test Programs(processing & ActionScript3) at end of this file as comment "#if 0"
+ *
+ * Serproxy(Serial Proxy) source&binary can be downloaded from:
+ * http://cote.cc/blog/serialproxy-v014-can-use-com-ports-above-9
+ * http://cote.cc/sites/default/files/serproxy-0.1.4.win32.zip
+ * http://cote.cc/sites/default/files/serproxy-0.1.4.src_.zip
+ *
+ */
+
+// 2010/11/20
+// written by: xshige
+
+
+// please change port# if you need
+#define TCP_LISTENING_PORT 5335 // telnet port
+
+#define DEBUG
+//#define DHCP
+//#define LIVE_LED
+
+#include "mbed.h"
+#include "EthernetNetIf.h"
+#include "TCPSocket.h"
+#include "rpc.h"
+
+#ifdef DHCP
+EthernetNetIf eth;
+#else
+// please set your mbed IP
+EthernetNetIf eth(
+ IpAddr(192,168,0,25), //IP Address
+ IpAddr(255,255,255,0), //Network Mask
+ IpAddr(192,168,0,1), //Gateway
+ IpAddr(192,168,0,1) //DNS
+);
+#endif
+
+#ifdef LIVE_LED
+DigitalOut led4(LED4, "led4");
+#endif
+
+
+// receive commands, and send back the responses
+char inbuf[512], outbuf[512];
+
+TCPSocket ListeningSock;
+TCPSocket* pConnectedSock; // for ConnectedSock
+Host client;
+TCPSocketErr err;
+
+void onConnectedTCPSocketEvent(TCPSocketEvent e)
+{
+ switch(e)
+ {
+ case TCPSOCKET_CONNECTED:
+ printf("TCP Socket Connected\r\n");
+ break;
+ case TCPSOCKET_WRITEABLE:
+ //Can now write some data...
+// printf("TCP Socket Writable\r\n");
+ break;
+ case TCPSOCKET_READABLE:
+ //Can now read dome data...
+ // printf("TCP Socket Readable\r\n");
+//-------------------------------------
+ // Read in any available data into the buffer
+ int len = pConnectedSock->recv(inbuf, 512);
+ inbuf[len] = 0;
+#ifdef DEBUG
+ printf("\nReceived: %s", inbuf);
+#endif
+ // do RPC
+ if (len>0) {
+ rpc(inbuf, outbuf);
+ outbuf[strlen(outbuf)]=0;
+ // send result of RPC
+ pConnectedSock->send(outbuf, strlen(outbuf));
+#ifdef DEBUG
+ printf("Sent:%s\n",outbuf);
+#endif
+ }
+ break;
+//----------------------------------------
+ case TCPSOCKET_CONTIMEOUT:
+ printf("TCP Socket Timeout\r\n");
+ break;
+ case TCPSOCKET_CONRST:
+ printf("TCP Socket CONRST\r\n");
+ break;
+ case TCPSOCKET_CONABRT:
+ printf("TCP Socket CONABRT\r\n");
+ break;
+ case TCPSOCKET_ERROR:
+ printf("TCP Socket Error\r\n");
+ break;
+ case TCPSOCKET_DISCONNECTED:
+ printf("TCP Socket Disconnected\r\n");
+// pConnectedSock->close();
+ break;
+ default:
+ printf("DEFAULT\r\n");
+ }
+}
+
+
+void onListeningTCPSocketEvent(TCPSocketEvent e)
+{
+ switch(e)
+ {
+ case TCPSOCKET_ACCEPT:
+ printf("Listening: TCP Socket Accepted\r\n");
+ // Accepts connection from client and gets connected socket.
+ err=ListeningSock.accept(&client, &pConnectedSock);
+ if (err) {
+ printf("onListeningTcpSocketEvent : Could not accept connection.\r\n");
+ return; //Error in accept, discard connection
+ }
+ // Setup the new socket events
+ pConnectedSock->setOnEvent(&onConnectedTCPSocketEvent);
+ // We can find out from where the connection is coming by looking at the
+ // Host parameter of the accept() method
+ IpAddr clientIp = client.getIp();
+ printf("Listening: Incoming TCP connection from %d.%d.%d.%d\r\n",
+ clientIp[0], clientIp[1], clientIp[2], clientIp[3]);
+ break;
+ // the following cases will not happen
+ case TCPSOCKET_CONNECTED:
+ printf("Listening: TCP Socket Connected\r\n");
+ break;
+ case TCPSOCKET_WRITEABLE:
+ printf("Listening: TCP Socket Writable\r\n");
+ break;
+ case TCPSOCKET_READABLE:
+ printf("Listening: TCP Socket Readable\r\n");
+ break;
+ case TCPSOCKET_CONTIMEOUT:
+ printf("Listening: TCP Socket Timeout\r\n");
+ break;
+ case TCPSOCKET_CONRST:
+ printf("Listening: TCP Socket CONRST\r\n");
+ break;
+ case TCPSOCKET_CONABRT:
+ printf("Listening: TCP Socket CONABRT\r\n");
+ break;
+ case TCPSOCKET_ERROR:
+ printf("Listening: TCP Socket Error\r\n");
+ break;
+ case TCPSOCKET_DISCONNECTED:
+ //Close socket...
+ printf("Listening: TCP Socket Disconnected\r\n");
+ // keep socket for next connection //ListeningSock.close();
+ break;
+ default:
+ printf("DEFAULT\r\n");
+ };
+}
+
+
+int main() {
+
+// make debug port Fast
+ Serial pc(USBTX, USBRX);
+// pc.baud(9600);
+ pc.baud(115200);
+// pc.baud(230400);
+
+
+ // setup the classes that can be created dynamically
+ Base::add_rpc_class<AnalogIn>();
+ Base::add_rpc_class<AnalogOut>();
+ Base::add_rpc_class<DigitalIn>();
+ Base::add_rpc_class<DigitalOut>();
+ Base::add_rpc_class<DigitalInOut>();
+ Base::add_rpc_class<PwmOut>();
+ Base::add_rpc_class<Timer>();
+ Base::add_rpc_class<SPI>();
+ Base::add_rpc_class<BusOut>();
+ Base::add_rpc_class<BusIn>();
+ Base::add_rpc_class<BusInOut>();
+ Base::add_rpc_class<Serial>();
+
+ // setup network
+ printf("\r\n");
+ printf("Setting up...\r\n");
+ EthernetErr ethErr = eth.setup();
+ if(ethErr)
+ {
+ printf("Error %d in setup.\r\n", ethErr);
+ return -1;
+ }
+ printf("RPC over TCP(telnet) Setup OK\r\n");
+
+ IpAddr ip = eth.getIp();
+ printf("mbed IP Address is %d.%d.%d.%d:%d\r\n", ip[0], ip[1], ip[2], ip[3],(TCP_LISTENING_PORT));
+
+ // Set the callbacks for Listening
+ ListeningSock.setOnEvent(&onListeningTCPSocketEvent);
+
+ // bind and listen on TCP
+ err=ListeningSock.bind(Host(IpAddr(), TCP_LISTENING_PORT));
+ printf("Binding..\r\n");
+ if(err)
+ {
+ //Deal with that error...
+ printf("Binding Error\n");
+ }
+
+ err=ListeningSock.listen(); // Starts listening
+ printf("Listening...\r\n");
+ if(err)
+ {
+ printf("Listening Error\r\n");
+ }
+
+#ifdef LIVE_LED
+ Timer tmr;
+ tmr.start();
+#endif
+
+
+ while(true)
+ {
+ Net::poll();
+
+#ifdef LIVE_LED
+ if(tmr.read() > 0.2) // sec
+ {
+ led4=!led4; //Show that we are alive
+ tmr.reset();
+ }
+#endif
+ }
+}
+#if 0
+//------------------------------------------------------------------------
+// Test Program (written in processing)
+
+/*
+ *
+ * RPC over TCP(telnet) or
+ * Serial RPC (via Serproxy)
+ * Test Program
+ *
+ */
+
+import processing.net.*;
+
+// please setup remoteIP for yor enviroment
+String remoteIP = "192.168.0.25"; // server IP
+//String remoteIP = "127.0.0.1"; // (Serproxy case)
+int TELNET_PORT = 5335;
+
+Client myClient;
+String dataIn;
+
+void setup() {
+ size(200, 200);
+ myClient = new Client(this, remoteIP, TELNET_PORT);
+}
+
+void draw() {} // Empty draw keeps the program running
+
+/*
+ * on key pressed event:
+ * pressing a key sends predefined command
+ */
+void keyPressed() {
+ String cmd="";
+// Real Serial RPC needs terminator("\r\n")
+ if (key == '1') cmd="/";
+ //
+ if (key == '2') cmd="/AnalogIn/new p20 ain";
+ if (key == '3') cmd="/ain/read";
+ //
+ if (key == '4') cmd="/AnalogOut/new p18 aout";
+ if (key == '5') cmd="/aout/";
+ if (key == '6') cmd="/aout/write_u16 4123";
+// if (key == '4') cmd="/BusIn/new bin p23 p22 p21";
+// if (key == '5') cmd="/bin/read";
+ //
+ if (key == '8') cmd="/DigitalOut/new LED4 myled4";
+ if (key == '9') cmd="/myled4/write 1";
+ if (key == '0') cmd="/myled4/write 0";
+
+ // send the command
+ // *** Serial RPC needs terminator("\n") **
+ myClient.write(cmd+"\n");
+
+}
+
+// ClientEvent message is generated when the server
+// sends data to an existing client.
+void clientEvent(Client someClient) {
+ if (someClient.available()>0) {
+ dataIn = someClient.readString();
+ //println(dataIn);
+ print(dataIn);
+ }
+
+}
+#endif
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+#if 0
+// TelnetClient.as
+
+/*
+ *
+ * RPC over TCP(telnet) or
+ * Serial RPC (via Serproxy)
+ * Test Program
+ *
+ */
+
+package {
+ import flash.display.Sprite;
+ import flash.events.Event;
+ import flash.events.IOErrorEvent;
+ import flash.events.KeyboardEvent;
+ import flash.events.ProgressEvent;
+ import flash.events.SecurityErrorEvent;
+ import flash.net.Socket;
+ import flash.text.*;
+ import flash.ui.Keyboard;
+
+ public class TelnetClient extends Sprite
+ {
+ // please set your mbed IP
+ private var targetIP:String = "192.168.0.25";
+ //private var targetIP:String = "127.0.0.1";
+ //
+ private var targetPort:String = "5335";
+ //private var targetPort:String = "5334";
+
+ private var socket:Socket;
+ private var textView:TextField;
+ private var textBoard:TextField;
+
+ public function TelnetClient()
+ {
+ // setup text field
+ textView = addTextField( 5, 10, 640, 340+190 );
+ textBoard = addTextField( 5, 340+200, 640, 20 ); // input field
+
+ // Create a new Socket object and assign event listeners.
+ socket = new Socket();
+
+ socket.addEventListener( Event.CONNECT, onConnect );
+ socket.addEventListener( Event.CLOSE, onClose );
+ socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurtyError );
+ socket.addEventListener( IOErrorEvent.IO_ERROR,onIOError );
+ socket.addEventListener(ProgressEvent.SOCKET_DATA, onRead );
+ addEventListener( KeyboardEvent.KEY_DOWN, onWriteBoard );
+
+ // Attempt to connect to remote socket server.
+ try {
+ writeView("trying to connect to " + targetIP + ":" + targetPort +'\n');
+ socket.connect(targetIP, parseInt(targetPort));
+ } catch (error:Error) {
+ /*
+ Unable to connect to remote server, display error
+ message and close connection.
+ */
+ writeView(error.message+'\n');
+ socket.close();
+ }
+
+ }
+
+ public function onConnect( event:Event ):void
+ {
+ writeView( "server connected\n" );
+ }
+
+ public function onClose( event:Event ):void
+ {
+ writeView( "server close\n" );
+ }
+
+ public function onSecurtyError( ev:Event ):void
+ {
+ writeView( "Security error.\n" );
+ }
+
+ public function onIOError( ev:Event ):void
+ {
+ writeView( "IOError.\n" );
+ }
+
+ public function onRead( event:Event ):void
+ {
+ writeView( socket.readUTFBytes(socket.bytesAvailable ) );
+ }
+
+ public function onWriteBoard( event:KeyboardEvent ):void
+ {
+ if( !socket.connected ) return;
+ if( event.keyCode == Keyboard.ENTER )
+ {
+ // Shortcut Keys for testing RPC
+ if (textBoard.text == "1") textBoard.text = "/";
+ if (textBoard.text == "2") textBoard.text = "/AnalogIn/new p20 ain";
+ if (textBoard.text == "3") textBoard.text = "/ain/read";
+ //
+ //if (textBoard.text == "4") textBoard.text = "/AnalogOut/new p18 aout";
+ //if (textBoard.text == "5") textBoard.text = "/aout/";
+ //if (textBoard.text == "6") textBoard.text = "/aout/write_u16 4123";
+ //
+ if (textBoard.text == "4") textBoard.text = "/BusOut/new b0 LED1 LED2 LED3 LED4";
+ if (textBoard.text == "5") textBoard.text = "/bo/write 13";
+ //
+ if (textBoard.text == "8") textBoard.text = "/DigitalOut/new LED4 myled4";
+ if (textBoard.text == "9") textBoard.text = "/myled4/write 1";
+ if (textBoard.text == "0") textBoard.text = "/myled4/write 0";
+ //
+ socket.writeUTFBytes( textBoard.text + '\n' );
+ socket.flush();
+ textBoard.text = '';
+ }
+ }
+
+ public function writeView( str:String ):void
+ {
+ if( textView.text == '' )
+ {
+ textView.text = str;
+ }
+ else {
+ // textView.text = textView.text + '\n' + str;
+ // textView.text = textView.text + str;
+ textView.appendText(str+'\n'); // serial RPC via serproxy
+ }
+ //
+ textView.scrollV++; // make scroll
+ }
+
+ private function addTextField( x:int, y:int, w:uint,h:uint ):TextField
+ {
+ var textField:TextField = new TextField();
+ addChild( textField );
+ textField.x = x;
+ textField.y = y;
+ textField.width = w;
+ textField.height = h;
+ textField.text = "";
+ textField.selectable = true;
+ textField.border = true;
+ textField.type = TextFieldType.INPUT;
+ textField.wordWrap = true;
+ return textField;
+ }
+
+ }
+}
+#endif
+//------------------------------------------------------------------------