<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class="">I’m having a fascinating time with the new SIMCOM modem support for OVMS v3.</div><div class=""><br class=""></div><div class="">I’ve wanted to use the CMUX protocol for some time, as it allows the single async line to be split to multiple separate logic communication channels, and for each of those channels to be used for different things. So, we can:</div><div class=""><br class=""></div><div class=""><ul class="MailOutline"><li class="">Create a channel for the GPS. Then, that can be straight NMEA protocol, streaming from the GPS, with no need to poll.</li><li class="">Create a channel for the PPP connection used to provide data service (GPRS, etc). This means we can handle our own networking (with lwip) and expose the modem network as a pure network accessible to normal networking stacks in the ESP32 framework. A “connect” would work the same way, no matter if it is over Wifi, or GSM modem.</li><li class="">Create a channel for AT commands.</li></ul></div><div class=""><br class=""></div><div class="">The real advantage is that these are all separate, so we can issue AT commands while reading a GPS NMEA message, while sending telemetry to the server.</div><div class=""><br class=""></div><div class="">Those of you familiar with OVMS v2 net.c code will recognise the issue; synchronising all the different accesses to a single async link used for AT, GPRS, SMS, and DATA, was a nightmare. CMUX was actually in the 2G SIMCOM chips as well, but we just didn’t have the ram or flash space in v2 to do it.</div><div class=""><br class=""></div><div class="">So, now v3 is here, and I start to work on it. Turns out that the CMUX protocol is not SIMCOM’s. Instead, they use an industry standard protocol called "GSM 07.10 Multiplexing protocol”, in basic mode. The specification I am using dates back to 1997. Also of note is that the AT command set has also been standardised by the same body as GMS 07.07. Reading that specification, and working with that protocol, is like a journey back in history. Most of it seems based on the X.25 protocol from back in the 1980’s (my I.T. career started with messing around with X.25 systems, and asynchronous RPADs, so it is dredging up old memories dealing with Set Asynchronous Balanced Mode (SABM) and Unnumbered Acknowledgement (UA) responses). Great fun…</div><div class=""><br class=""></div><div class="">Anyway, it is a big specification, with lots of nuances, but I am making progress.</div><div class=""><br class=""></div><div class="">To leave normal single channel AT command mode, and enter GSM 07.10 multiplexor mode, we send some AT commands to program the multiplexor channel connections that we want:</div><div class=""><br class=""></div><div class=""><ul class="MailOutline"><li class="">Channel 0 is mapped to the DIAG service</li><li class="">Channel 1 is mapped to the NMEA (GPS) service</li><li class="">Channel 2 is mapped to the DATA (AT) service</li><li class="">Channel 3 is mapped to the DATA (AT) service</li></ul></div><div class=""><br class=""></div><div class="">Then we send “AT+CMUX=0” and wait for the OK:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx 41 54 2b 43 4d 55 58 53 52 56 50 4f 52 54 3d 30 AT+CMUXSRVPORT=0</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx 2c 30 3b 2b 43 4d 55 58 53 52 56 50 4f 52 54 3d ,0;+CMUXSRVPORT=</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx 31 2c 35 3b 2b 43 4d 55 58 53 52 56 50 4f 52 54 1,5;+CMUXSRVPORT</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx 3d 32 2c 31 3b 2b 43 4d 55 58 53 52 56 50 4f 52 =2,1;+CMUXSRVPOR</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx 54 3d 33 2c 31 3b 2b 43 4d 55 58 3d 30 0d 0a    T=3,1;+CMUX=0..</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx 0d 0a 4f 4b 0d 0a                               ..OK..</span></font></div></blockquote><div class=""><br class=""></div><div class="">Now, we start talking GSM 07.10. We need three channels, so send SABM messages and wait for UA acknowledgements, for each in sequence:</div><br class=""><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><span style="font-size: 18px; font-family: 'Andale Mono';" class="">I (88695) gsm-mux: Start MUX</span></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88695) gsm-mux: StartChannel(0)</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx f9 03 3f 01 1c f9                               ..?...</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx f9 03 73 01 d7 f9                               ..s...</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88705) gsm-mux: ProcessFrame(CHAN=0, ADDR=03, CTRL=73, FCS=d7, LEN=6)</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88705) gsm-mux: Channel #0 is open</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88705) gsm-mux: StartChannel(1)</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx f9 07 3f 01 de f9                               ..?...</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx f9 07 73 01 15 f9                               ..s...</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88705) gsm-mux: ProcessFrame(CHAN=1, ADDR=07, CTRL=73, FCS=15, LEN=6)</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88705) gsm-mux: Channel #1 is open</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88705) gsm-mux: StartChannel(2)</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx f9 0b 3f 01 59 f9                               ..?.Y.</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx f9 0b 73 01 92 f9                               ..s...</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88715) gsm-mux: ProcessFrame(CHAN=2, ADDR=0b, CTRL=73, FCS=92, LEN=6)</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88715) gsm-mux: Channel #2 is open</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88715) gsm-mux: StartChannel(3)</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM tx f9 0f 3f 01 9b f9                               ..?...</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx f9 0f 73 01 50 f9                               ..s.P.</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88715) gsm-mux: ProcessFrame(CHAN=3, ADDR=0f, CTRL=73, FCS=50, LEN=6)</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (88715) gsm-mux: Channel #3 is open</span></font></div></blockquote><font face="Andale Mono" class=""><span style="font-size: 18px;" class=""><div class=""><span style="font-family: Helvetica; font-size: 24px;" class=""><br class=""></span></div><div class=""><span style="font-family: Helvetica; font-size: 24px;" class="">Once the channels are open, then the SIMCOM modem sends messages:</span></div><div class=""><span style="font-family: Helvetica; font-size: 24px;" class=""><br class=""></span></div></span></font><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><span style="font-size: 18px; font-family: 'Andale Mono';" class="">SIMCOM rx f9 0d ff 1f 0d 0a 2b 43 53 51 3a 20 31 34 2c 39 ......+CSQ: 14,9</span></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx 39 0d 0a f0 f9                                  9....</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (403335) gsm-mux: ProcessFrame(CHAN=3, ADDR=0d, CTRL=ff, FCS=f0, LEN=21)</span></font></div></blockquote><div class=""><br class=""></div><div class="">That is a signal quality report (+CSQ) coming in on the data channel.</div><div class=""><br class=""></div><div class="">Here is what an incoming SMS message (+CMT) looks like:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><span style="font-size: 18px; font-family: 'Andale Mono';" class="">SIMCOM rx f9 0d ff c3 0d 0a 2b 43 4d 54 3a 20 22 2b 34 34 ......+CMT: "+44</span></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx 37 39 33 37 34 30 xx xx xx xx 22 2c 22 22 2c 22 793740xxxx","","</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx 31 37 2f 31 30 2f 31 31 2c 30 31 3a 35 33 3a 35 17/10/11,01:53:5</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx 31 2b 30 34 22 2c 31 34 35 2c 34 2c 30 2c 30 2c 1+04",145,4,0,0,</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx 22 2b 34 34 37 37 39 37 37 30 xx xx xx xx 22 2c "+44779770xxxx",</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx 31 34 35 2c 31 31 0d 0a 48 45 4c 4c 4f 20 57 4f 145,11..HELLO WO</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">SIMCOM rx 52 4c 44 0d 0a xx f9                            RLD..u.</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">I (1727775) gsm-mux: ProcessFrame(CHAN=3, ADDR=0d, CTRL=ff, FCS=xx, LEN=103)</span></font></div></blockquote><div class=""><br class=""></div><div class="">It is a lot of work getting this working, but the result should be worth it.</div><div class=""><br class=""></div><div class="">Regards, Mark</div><div class=""><br class=""></div></body></html>