Hi, Reading the documentation might help. http://noxrepo.org/~yapkke/doc/classvigil_1_1jsonmessenger.html#_details
Try have a type field. Regards KK On 29 January 2012 07:34, Giorgio Mazza <giorgio.mazza...@gmail.com> wrote: > A little update and a further question :) > > With destiny's messenger my component works, even adding jsonmessenger as a > dependency. Also Jsonmsg_events are raised and handled without errors by my > callback and I solved the dummy timer problem with the client disconnection. > > Now, I have a strange behaviour with my callback that seems to handle only > messages that have the default syntax described in jsonmessenger.hh ( just > above the definition of the jsonmessenger class). > If I send a 'connect' or a 'disconnect' message it is handled by my > callback, while, if I send a different message (that's what I want to do), > jsonmessenger posts a JSONMsg_event, that it is simply ignored by my > callback. > > That 's a snippet of my install function: > > from nox.coreapps.messenger.pyjsonmsgevent import JSONMsg_event > JSONMsg_event.register_event_converter(self.ctxt) > self.register_handler(JSONMsg_event.static_get_name(), > self.json_message_callback) > > > That's my (temporary) callback: > > def json_message_callback(self, e): > import json > global cache_server_table > message = json.loads(e.jsonstring) > cache_server_table.update(message) > print message > print cache_server_table > e.reply(json.dumps({"MSG":"Welcome! I am the Controller"})) > if cache_server_table.has_key("MSG"): > print cache_server_table["MSG"] > if cache_server_table["MSG"] == "Connection setup": > cache_server_MAC = cache_server_table["MAC"] > print cache_server_MAC > return CONTINUE > > > And that's what I get as output: > > 00046|nox|INFO:nox bootstrap complete > 00047|messenger_core|DBG:Starting connection with idleInterval 0 > 00048|jsonmessenger|DBG:JSON message of length 18 (connect) > 00049|jsonmessenger|DBG:JSON message of length 18 > 00050|jsonmessenger|DBG:JSON: {"type":"connect"} > {u'type': u'connect'} > <--------------------------- the two print instruction > {u'type': u'connect'} > <--------------------------- in the callback > 00051|messenger_core|DBG:Sent string of length 39 socket 0x8e536c0 > 00052|messenger_core|DBG:TCP socket connection accepted > 00053|messenger_core|DBG:Copy 74 bytes to message > 00054|messenger_core|DBG:Received packet of length 74 > 00055|jsonmessenger|DBG:JSON message of length 74 > 00056|jsonmessenger|DBG:Message posted as JSONMsg_event > <----------------------------------------- after that I would expect the > output of my callback (the two print instruction) > 00057|jsonmessenger|DBG:JSON: > {"MAC":"08:00:27:cc:77:1c","IP":"10.0.10.2","MSG":"Connection setup"} > 00058|messenger_core|DBG:Copy 22 bytes to message > 00059|messenger_core|DBG:Received packet of length 22 > 00060|jsonmessenger|DBG:JSON message of length 22 > 00061|jsonmessenger|DBG:Message posted as JSONMsg_event > > 00062|jsonmessenger|DBG:JSON: {"type":"disconnect"} > 00063|jsonmessenger|DBG:Clear connection state for 0x8e536c0 > {u'type': u'disconnect'} > {u'type': u'disconnect'} > > > So, the question is: Why my callback does not handle events posted by > jsonmessenger? How can I fix that? Is there any particular syntax I have to > follow so that it is a json-related error? > > Thanks in advance. > > Regards, > Giorgio > > > > On 27/01/2012 16:42, kk yap wrote: > > Hi Giorgio, > > Your client is disconnecting before the reply is sent. If you look at > nox-console.py, it should be a good example to follow. > > Regards > KK > > On 27 January 2012 05:12, Kyriakos Zarifis <kyr.zari...@gmail.com> wrote: > > A JSONMsg_event is just another NOX event and us such it will either passed > on to all components down the event handler chain or stopped by one of them. > Your handler needs to return a valid NOX event disposition ( > http://noxrepo.org/noxwiki/index.php/Disposition ) > So in your case you just need to add a "return STOP" and the error will > disappear. > > > As for the other comment, I'm not sure how messenger_core cleans the > connections state/closes socket. It might very well be a timing issue, maybe > the connection state hasn't been cleaned when the event is processed. I > don't know if the log messages represent the reality 100%. In any case the > last message is either never really sent or it's sent to the void. Either > way I'd just ignore it, I doubt it will affect anything > > > On Fri, Jan 27, 2012 at 3:02 AM, Giorgio Mazza <giorgio.mazza...@gmail.com> > wrote: > > I tried this way: I replaced zaku's default messenger folder with > destiny's messenger one (nox/src/nox/coreapps/messenger), that I had > previously downloaded and installed. > Then I recompiled zaku and the import error disappeared, so that when I > run > ./nox_core -v -i ptcp:6633 jsonmessenger=tcpport=3334 my_component > I do not get errors anymore and components are installed successfully. > However, when I try to send a json message from my external application I > get a strange behaviour. I don't understand very well what is happening and > why I get this error, so I do not know if it is my fault in doing something > or if I need to hack something because the simple replacement of messenger > folder is not enough. > > My callback is fairly simple for the moment and the only thing it does is > to store the value of the received json message and to answer with a "Hello > world" message, like that: > def json_message_callback(self, e): > import json > global cache_server_table #the global dict where I > want to store received json information > cache_server_table = json.loads(e.jsonstring) > print cache_server_table > > e.reply(json.dumps({"msg":"Hello world"})) > > > This is my simple external application: > > import json > import socket > > HOST = '10.0.10.1' > PORT = 3334 > s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) > s.connect((HOST, PORT)) > print "Connected to server: " + str(s.getpeername()) > message={"msg":"CS-setup","mac":"xxxxx","ip":"10.0.10.2"} > json_message=json.dumps(message) > s.send(json_message) > print "Sent JSON message" > data = s.recv(1024) > print 'Received', repr(data) > > > And this is what I get in the controller prompt, after executing the above > code: > > 00045|openflow|DBG:Passive tcp interface bound to port 6633 > 00046|nox|INFO:nox bootstrap complete > 00047|messenger_core|DBG:Starting connection with idleInterval 0 > 00048|jsonmessenger|DBG:JSON message of length 18 (connect) > 00049|jsonmessenger|DBG:JSON message of length 18 > 00050|jsonmessenger|DBG:JSON: {"type":"connect"} > {u'type': u'connect'} > 00051|messenger_core|DBG:Sent string of length 22 socket 0x8b9ff48 > 00052|pyrt|ERR:Python handler returned invalid Disposition. > <------------------------ No idea > 00053|messenger_core|DBG:TCP socket connection accepted > 00054|messenger_core|DBG:Copy 54 bytes to message > 00055|messenger_core|DBG:Received packet of length 54 > 00056|jsonmessenger|DBG:JSON message of length 54 > 00057|jsonmessenger|DBG:Message posted as JSONMsg_event > 00058|jsonmessenger|DBG:JSON: > {"mac":"xxxxx","msg":"CS-setup","ip":"10.0.10.2"} > 00059|jsonmessenger|DBG:JSON message of length 21 (disconnect) > 00060|jsonmessenger|DBG:JSON message of length 21 > 00061|messenger_core|DBG:socket closed > 00062|jsonmessenger|DBG:JSON: {"type":"disconnect"} > 00063|jsonmessenger|DBG:Clear connection state for 0x8b9ff48 > {u'type': u'disconnect'} > 00064|messenger_core|DBG:Sent string of length 22 socket > 0x8b9ff48 <-------------------------- It seems that my > callback tries to answer when the socket is already closed. Why? > 00065|pyrt|ERR:Python handler returned invalid Disposition. > > > Any idea or suggestion will be appreciated. > > Regards, > Giorgio > > > > On 26/01/2012 23:39, Kyriakos Zarifis wrote: > > That's the reason; the jsonmsg_event isn't exposed in python on zaku. > I'd really encourage you to try to migrate to destiny. Not only because > this will work, but more importantly because destiny is a far more developed > branch by now, with many fixes and added features. > > If you really don't want to switch to destiny, maybe you could just grab > jsonmsg_event.i from destiny and stick it in your zaku tree. (I can't > remember if this is going to just work or you'll need to hack something, but > give it a try and see what breaks?) > > On Thu, Jan 26, 2012 at 1:37 PM, Giorgio Mazza > <giorgio.mazza...@gmail.com> wrote: > > Yes, I'm using zaku... > And I do not have any file called "jsonmsg_event.i". > Any idea about how can I receive json messages and handle them in order > to install flow entries? > Do I have to use destiny branch? > I don't know if it could be simple to switch from zaku to destiny, but > i'd rather to keep zaku, as I already worked a bit on it in order to extend > it with other classes and with the component I am try to improve. > Is it possible to implement those functionalities going on with zaku? > > Giorgio > > > On 26/01/2012 21:38, Kyriakos Zarifis wrote: > > Hi Girogio, > > I forgot to ask, but, are you using the destiny branch or zaku? It looks > like you're using zaku. > > In your _source_ directory, not the build dir, (so: > nox/src/nox/coreapps/messenger), you should have a file called > "jsonmsg_event.i", which creates the module you're missing. That exists only > in destiny > > On Thu, Jan 26, 2012 at 5:27 AM, Giorgio Mazza > <giorgio.mazza...@gmail.com> wrote: > > Actually I get the same error, because I do not have neither > pyjsonmsgevent nor pymsgevent in messenger folder... > This is the list of what I have in messenger folder: > > giorgio@controller:~/nox/build/src$ ls -a nox/coreapps/messenger/ > . jsonmessenger.la > messenger.la > .. jsonmessenger_la-jsonmessenger.lo > messenger_la-messenger.lo > cacert.pem .libs > messenger.py > .deps Makefile > meta.json > __init__.py messenger_core.la > servercert.pem > __init__.pyc messenger_core_la-messenger_core.lo serverkey.pem > > > Do I miss anything in my folders or did I make something wrong? > > Giorgio > > > On 26/01/2012 13:05, Murphy McCauley wrote: > > Oops, that was my bad -- as I said, I had adapted that from another > message. > The correct import should be: > from nox.coreapps.messenger.pyjsonmsgevent import JSONMsg_event > > -- Murphy > > On Jan 26, 2012, at 3:40 AM, Giorgio Mazza wrote: > > Thanks, I think I will specify a port. > > Another question... > At the moment I get an error while importing the JSON_Msg event in the > install() of my component. > > "in install > from nox.coreapps.messenger.pymsgevent import JSONMsg_event > ImportError: No module named pymsgevent " > > I blindly followed your instructions at first, but then I looked in my > messenger folder without finding where this event is defined. > Could you please tell me where is it, so that I can insert the correct > path in my install function? I'm using the standard message folder. > Thank you. > Regards, > > Giorgio > > On 25/01/2012 22:28, Murphy McCauley wrote: > > I believe it defaults to port 2703. You should be able to set the port > number by specifying it on the commandline... > ./nox_core -i ptcp: jsonmessenger=tcpport=4096 your_app_here > > It listens on all IP addresses; there is currently no way to specify > just one. > > -- Murphy > > On Jan 25, 2012, at 1:11 PM, Giorgio Mazza wrote: > > A question about the socket opened when invoking jsonmessenger. > What are the IP address, the tcp port and the interface that this socket > refers to? Is there any way to set them? > I undersotood the mechanism, but I don't know where to send my messages > from the external application. > Thank you. > Regards, > > Giorgio > > On 24/01/2012 13:49, Murphy McCauley wrote: > > The minimum to get up and going should be something like this: > > 1) In your component's install function: > from nox.coreapps.messenger.pymsgevent import JSONMsg_event > JSONMsg_event.register_event_converter(self.ctxt) > self.register_handler(JSONMsg_event.static_get_name(), myHandler) > > 2) Implement a handler: > def myHandler (e): > import json > print json.loads(e.jsonstring) > e.reply(json.dumps({"msg":"Hello world"})) > > 3) Include jsonmessenger on the commandline or as a dependency > > > That may not be exactly correct -- it's adapted from a quick writeup I > did in December about using the new Python support for the "regular" > messenger (as opposed to the JSON messenger), which has not yet been pushed > to the repository. For reference, that post was: > http://noxrepo.org/pipermail/nox-dev/2011-December/008382.html > > (If using the new version of messenger that I linked to in that post, > you remove the register_event_converter() call from step 1 and include > pyjsonmessenger instead of jsonmessenger in step 3.) > > Invoking the jsonmessenger component (on the commandline or by including > it as a dependency in your app's meta.json) will create the server socket > for you. > > You absolutely do not have to use the messenger.py class. I'm removing > it from that directory, because all it ever does is confuse people -- it > really doesn't belong there. messenger.py is a library for writing JSON > messenger *clients* (external programs) in Python. That may be useful to > you, but you don't need it for the NOX side of things. > > Hope that helps. > > -- Murphy > > On Jan 24, 2012, at 4:12 AM, Giorgio Mazza wrote: > > Thank you. > I try to sum up the operations I need to perform, to see if I understood > correctly. > Basically in my external application I have to set up a socket that > sends json messages and this would be quite simple. > In my nox component, instead, I have to import the "JSONMsg_event" and, > within the "install()" instruction, to handle it with my specific method, > that, in my case, would only save these json messages into a dictionary, for > using them later, according to some conditions. > Is that correct? > > A couple of things that I didn't understand: > - I assume I also have to set up a server socket in my nox component, in > order to receive json messages and handle JSONMsg_events. So, I think this > socket has to be already up and running when I handle the event. So, when do > I have to create it and how? Do I have to use messenger.py channel class? > - Second question, probably related to the first. I think to be pretty > confused about jsonmessenger: what are the jsonmessenger files I could look > into in order to understand fields and methods that I would need to use? Are > the jsonmessenger.cc and jsonmessenger.hh in nox/src/nox/coreapps/messenger? > And, if it is the case, how can I integrate them into a python component? > > Thanks again, > > Giorgio > > On 24/01/2012 12:28, Kyriakos Zarifis wrote: > > Hi Giorgio, > > yes, I think using jsonmessenger would be the best approach for this. > > you need to implement a send/receive interface on the external > application and in your nox component. For the external application, it's > pretty straightforward - Connect to the jsonmessenger socket and send json > strings. In your nox application you need to register for JSON messages, and > handle them appropriately. > > The wiki explains the communication in a few steps (specifically for the > GUI<->NOX, but it will be similar and simpler for any external app) here: > > If you want to see a full example, the GUI and the monitoring component > in destiny could be a place to look. I'm afraid it's much more complex than > what you need, but the bits you need are in there if you dig in the code a > bit. > > > On Tue, Jan 24, 2012 at 2:16 AM, Giorgio Mazza > <giorgio.mazza...@gmail.com> wrote: > > Hi all! > I have written a simple component in python that works fine. > Now I would to improve it, making it to install flow entries depending > on parameters received from an external application. > In particular I want to pass those parameters via json messages to my > component, which, in my thougths, has to open a "permanent" socket listening > for them, save those parameters in a dictionary and, as a consequence, > decide the desired switch behaviour (whether install or not a flow entry for > the received parameters). > In previous threads I found that I have to use jsonmessenger (even in > python?) or to have a look to discovery.py, but I am not sure to have > understood what I have to do and where in order to realize such a behaviour. > Could anyone, please, help me? > Thank you in advance, > > Giorgio Mazza > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > _______________________________________________ nox-dev mailing list nox-dev@noxrepo.org http://noxrepo.org/mailman/listinfo/nox-dev