I am struggling (like many others it seems) to get started with LwIP over PPPos (ppp over serial) for STM32. I could have ended that sentence earlier, because even without PPPos I am having a hard time understanding where to start.
I have read, and read, and read. Their official home page, wiki, tons of forums, and trying to digest github examples for other platforms. But still I am having a hard time to have a clue where to start.
There seem to be little (none?) examples on this online taking me through the whole process. And I really don't get it. The IoT world is exploding. So I really thought it would be "easy" to have some hello world example.
What I have at the moment:
But instead of clumsy internet communication using AT commands (and AT+CMQTT commands) I want to rely on a proper TCP/IP stack. Set the LTE modem in data mode (PPP), and have LwIP take over the TCP/IP stack.
Is this still very complicated anno 2021? Or am I completely looking in the wrong direction? Is there anybody who can point me in the right direction?
I already have freertos working too. I don't mind to use it. I also don't mind to go without. I am just looking for a way to get started with LwIP without having to reverse engineer the LwIP stack completely.
Going top-to-bottom, you have your application code which in the end will likely want to talk to some server: resolve DNS name, open a tcp connection etc. This is what LwIP provides - a set of API functions: socket functions, DNS functions and other. For example, when you do a TCP socket connect
to a given IP address and port, it decides which out of available network interfaces to use, constructs a frame in form of array of bytes and sends those bytes over that interface. This is where LwIP part ends - it requesting given network interface to output X bytes it provides, as well as consuming any bytes that may arrive on that interface. It doesn't know how exactly to make the bytes "come out", but it knows how to construct the data to send and understands the data you give it.
Going bottom-to-top, you have your modem - LTE, 3G, 2G, doesn't really matter. Modems provide a set of AT commands to talk to them to perform a set of functions: set SIM card PIN, get signal quality, list available operators, select an operator etc., as well as a way to switch it to PPP mode, which is done using the ATD
command. Assuming the modem has been configured properly before, once you switch it to PPP mode it'll be able to send data using PPP protocol and will also "spit out" any data it receives from the network. This is where the modem part ends - when switched to PPP mode, the modem is able to send and receive raw network traffic using PPP protocol. It knows how to output the raw bytes you give it, but it doesn't understand them on a very high level.
Your role is to connect (interface) both parts. Your modem uses PPP to produce and consume network traffic. LwIP has the capability to understand and produce PPP frames.
In case of sending data out, after preparing a PPP frame LwIP is going to call the sio_write
function that is expected to send provided bytes to modem that's already in PPP mode. This is the part that you need to fill in. In case of reads, sio_read
function is used and it's your job to fill it in so that it returns bytes that were received from the modem. How you're going to do that - using RTOS and queues for bytes, no RTOS or any other way - doesn't matter. It's what you find more convenient or what fits your overall project structure better. As long as those functions do what they're supposed to, LwIP will be happy to use them.
This interfacing is discussed in more detail here: https://lwip.fandom.com/wiki/PPP#PPP_over_serial. Again, the general concept is that LwIP is just a software library and in the end it'll want to send and receive bytes. Your job is enabling it to do so, by filling in the functions it expects.