P1 WiFi module limitations for sockets and background tasks
Rsadeika
Posts: 3,837
in Propeller 1
In my WiFi module html program I am thinking about implementing some javascript background tasks and some html socket server code. Anybody have any idea as to what limitations I would be running into, and could the P1 WiFi module handle something like that. I know there is a ram limitation for the files, what else?
Ray
Comments
I just tried using putty telnet to connect to my P1 WiFi module html program. I got a connection refused. I am using SimpleIDE for this stuff, is there some setup code for allowing a connection?
Ray
HTML requires a liitle more data then just connecting with putty. Also the port to access a web page is port 80 and not 22 or 23.
You might want to try CURL.
javascript runs in the browser so those things should work.
Mike
Thanks Mike for the lead. I discovered PycURL, at first glance, it looks a little bit intimidating with the POST and GET stuff, but I will do some deeper look see. I also found libtelnet, which I will see what that is all about. Both of these run under Python, so that fits into what I am working on.
If this works out, that means I will probably be able to jam in more stuff into the WiFi module html file. I still have a lot of room left on the Simpleide C file, for this stuff.
Ray
I just checked out the cURL docs, it is a WEB SCRAPE tool. If you want to see the html code, this program will do it for you. I do not think that this tool will get me what I want and need.
It looks like I will have to spend some time with javascript and sockets. I did have some success with sockets, in another program, but that was for moving a file from one computer to another. Now I have to figure out how to move a specific variable.
Ray
Took a crack at it and wrote some python code on the RPI and some C code on the P1 to pass data back and forth.
I don't write in python so it took a little longer than I would like.
Oh what fun.
Here is the python program on the Raspberry PI:
On the P1 I used this program:
The Python program takes in a text string and sends it over to the P1 through the WiFi module that is on the same network.
In my case the Wifi module has a fixed IP address of 101.1.1.15. You would have to change this to what address your module has.
Entering in the text 'terminate' will cause the Python program to end.
Mike
Looks good Mike. I tried it out and it works on my setup. Now I have to figure out how to have the Pi code send some data to the rpi. I did not know that Python had some code for using the socket stuff. I guess Python has just about everything covered, now if they could just get rid of that indentation stuff.
Ray
Next phase was to get an apache2 server running on the Raspberry Pi and run python programs.
Done. works great.
Now I need to build a web page to call the python program and build a python program to send request to the P1.
Mike
Mike your little program is working great. I tried some test runs with your setup, worked into my P1 WiFi program, and came up with some problems. The problem is that the P1 WiFi program uses 'wifi_start(31,30,115200,WX_ALL_COM)'. To talk too the rpi I need to also use 'serial_open(31,30,0,115200)', there is the conflict, both are trying to use the same port. I did not see any P1 C code that could mediate usage of that one port between the two requesting for use.
I like the socket code on the Python side, that means I could talk to other machines on my network.
Now thinking about your latest phase, I see you are going to get info from the P1 and have the rpi web page display that info. That sounds like an idea that would could work. Maybe I will have to try something like that, I was hoping to keep it as simple as possible.
Ray
I have also decided to install a web server on my rpi unit, which is now running. Now comes the hard part, creating the web page in conjunction with the Python program. It seems like the easy part now is getting the data on my P1 WiFi over to the Python program. The hard part is getting the data from the Python program to the web page. Still not sure how I will complete that.
Ray
Doing a WEB page for the Raspberry Pi is a PIA. To bad that the P1 WiFi module does not have more capabilities. I know somebody is thinking what kind of capabilities, to frustrated to enumerate at this time. I do know working with nano in sudo mode is a PIA, and creating an html file in /var/www/html is a PIA, and the list goes on.
Ray
Yes, I do not like working on the dark side. I'm a windows guy and I can do Linux but would rather not.
I thought the RPi would do better at heavy lifting then the other way around. The Pi could just request data from the P1 as if it was an external device and get an immediate response.
When I pass data back from the P1 or from windows I like to use JASON and encode the answer. This is a little more work but at least the data is readable almost any ware.
On the PI you can just create a Python program that sends a request over to the P1 and not even use a web page until you have that working the way you want it.
Yes, the request are being passed around on the Telnet port for the Wifi module. This is not a problem since it can handle both as long as you don't use the escape code in the request.
Mike
You don't have to use
nano
, you don't have to edit as root, and you don't have to put your files in/var/www/html
. Things in Linux are exactly as easy as you make them. Generally, if you just follow dumbed-down online tutorials and are afraid to change things to suit your taste, you'll only be making things more difficult for yourself.nano
is my least favorite Linux text editor.There has to be a better way of doing this, not sure what that is at the moment. I really do not want to create a full blown web server just to support a simple web page. The P1 WiFi module offers this. It is complex enough to deal with the html/javascript code as it is, but the Parallax Learn site gives some good instruction in how to do it. I have to give it some more thought before I get to deep into the web server.
Ray
I hear you; I was trying to simplify the process by removing the wires between the two units. If you have a Wifi connection, why not use it.
What you have now should work either way.
Start the Python code on the Raspberry PI to open a connection to the P1 through the Wifi telnet port to get data from the P1.
On the P1 just process the web page like you are and then send it back through the same connection. The Wifi will only process request that are encoded for it and will not show up on the Raspberry Pi.
Think of it as talking to two devices on the same connection and there addressed with different addresses.
Now I think you need to encode your data better before sending it over to the RPi.
Mike
I was just looking at the Wi-Fi Module docs and came across this:
char wifi_send (int handle, char *data, int size)
Transmit WebSocket/TCP data, or extended HTTP body (after REPLY command).
int wifi_recv (int handle, char *data, int size)
Retrieve incoming HTTP body or WebSocket/TCP data.
Anybody know how this is to be used, in some WiFi C code. There used to be some forum members that were familiar with the WiFi stuff, but they have not been around for a while. Andy Lindsay is the author of this document and code but I do not think that he checks this forum anymore.
Ray
Hi
Don't know if this might be of interest?
https://geoffg.net/webmite.html
Dave
Thanks Dave, looks very interesting.
Ray
I need C coders help. I think I figured out how to use the wifi_send() function. In my P1C wifi program, in the while() loop, which handles 'G' and 'P' functions, I added wifi_send(), which works as expected. The problem:
sx=17.23 floating point
wifi_send(handle,"%.2f",sx), sends a form of sx that the Python decode() does not understand, and throws an error.
So, I tried:
char newsx[5]
sprint(newsx,"%.2f",sx)
wifi_send(handle,"%c",newsx), sends a form of newsx as a "%" char. On the Python side, decode() does not have a problem with newsx.
Because wifi_send() function sends a char/string form, I have to figure out how to convert a floating point number to a char/string form. I think my example is terse enough, and understandable. Any ideas, or did I do something wrong with sprint().
Ray
WiFi send expects a buffer or string object to send and not %c.
Mike
Thanks Mike, that works on the P1 C side. Now I am having problems on the Python side. The decode() works correctly, but the output gets weird.
I get numbers like:
12.23
3
12
12.45
45
2
and so on.
Pi C code
Python code
I believe the s.recv(5) sets the buffer for 5 bytes, and I think that buffer is being overrun.
Ray
Don't understand the use of decode here.
s.recv(max bytes) returns a byte array of data.
to convert the byte data to a string you would use str(bytedata, 'ascii')
and to convert a string to bytes you would use bytes(string, 'ascii')
To make the floating data less floating you could use "%3.2f" --> 014.20
Mike
Thanks Mike. I got the Pi C program working correctly and I have the Python program working correctly.I ran the P1 program and the Python program at the same time, I checked the web page, and that seems to be working as expected. So, things are looking good so far. Now I have the P1 talking to the rpi, no wires, just a one way conversation. to be sure. Not sure if I want to make it a two way conversation, that is to be determined at a later date.
Ray
I tried to get two-way communication work but was unable to get the return value back from the Python using the Wifi library.
I was able to get it to work with my own esp8266 library. Don't know what's going on there.
Here is my test Python program that I used:
And this is the test program that follows an example from the WiFi library that doesn't seem to work.
Mike
So now I have a problem that I am not sure how to solve. The WiFi module ip address gets getting switched, while it is running, not sure if this is the wifi module that is acting up or it is the router that is causing the problem. If I have to guess I would say it is the wifi module that is causing the problem, can anybody verify my assumption.
Ray
The IP address is assigned by the router. The router is configured with a range of addresses to assign to each device that connects to it. The router uses a lease time for that address and will not give it to another device until the lease time has expired.
In my case I can tell the router that this device always gets this address, so the address is permanent.
Devices are assigned a MAC address at the factory, so the router assigns addresses based on that.
In the case of the Raspberry Pi it is possible to configure a fixed address on that interface and not use the address from the router.
This is not the case for the WiFi module.
Mike
I think I fixed the problem with the P1 WiFi module. I did a deep dive into my router setup, and I did what Mike had suggested, setting the IP address to a permanent setting. Today I will test this to see if it holds. If it holds, then it is back to do some programming, hopefully I can get a two way communication between the P1 and the rpi via the socket.
Ray
I have been trying to get wifi_recv() to work, but no success, so far. Where is Andy when you need some guidance. Has anybody gotten wifi_recv() to work, and willing to share some examples.
Ray
I am now wondering if anybody has tried to move libwifi over to the flexprop, can this be done? Or, has anybody tried to create a web page with flexprop using the Parallax WiFi module and the P1 or P2? It seems that Mike and I are the only ones that are using SimpleIDE. If that is the case then I think that Parallax is just waiting for SimpleIDE to finally fall off the vine, and disappear on the ground.
Or, maybe I got this all wrong, SimpleIDE is for doing simple things with the Activity board. If you want to do some of the more advanced stuff than you are on your own, or should be thinking about a different product. This is a very interesting predicament to be in. Still scratching my head.
Ray
I tried to get the wifi to work with the WiFi library but was unable to get it to work.
I don't use that library as I have my own and yes, I have moved that library over to the P2.
I have several application that use this wifi library that have been running for years now.
This application wakes up every minute and sends a UDP packet from the Wifi module to a webserver that then collects the data for display.
Weather Display site.
I think my library is in the OBEX somewhere.
The P2 stuff is in github only and I have several as there are no library function available for C programs on the P2.
This is the program I used with my library to send and receive data from a python program:
This is the Python program that I used to receive the request and return the answer:
I ran the python program on my windows system but should be the same as the Raspberry Pi.
Mike
I guess I am a slow learner Mike, I will see if I can find it in OBEX. Your hints were way to subtle for me.
Ray