<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Oops. Sorry. That change broke MQTT. I couldn’t understand what was going on (as mg_send was sending immediately). MQTT works like this:<div class=""><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">void mg_mqtt_publish(struct mg_connection *nc, const char *topic,</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">                     uint16_t message_id, int flags, const void *data,</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">                     size_t len) {</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  size_t old_len = nc->send_mbuf.len;</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class=""><br class=""></span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  uint16_t topic_len = htons((uint16_t) strlen(topic));</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  uint16_t message_id_net = htons(message_id);</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class=""><br class=""></span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  mg_send(nc, &topic_len, 2);</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  mg_send(nc, topic, strlen(topic));</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  if (MG_MQTT_GET_QOS(flags) > 0) {</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">    mg_send(nc, &message_id_net, 2);</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  }</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  mg_send(nc, data, len);</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class=""><br class=""></span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">  mg_mqtt_prepend_header(nc, MG_MQTT_CMD_PUBLISH, flags,</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">                         nc->send_mbuf.len - old_len);</span></font></div><div class=""><font face="Andale Mono" class=""><span style="font-size: 18px;" class="">}</span></font></div></div></blockquote><div class=""><div><br class=""></div><div>It uses mg_send a bunch of times, then goes back and modifies the send_mbuf by inserting a header, then finishes so that the actual transmission can occur. Seems a really dumb way to do it, but such is life.</div><div><br class=""></div><div>It was driving me crazy last night, so in the end I just updated mongoose this morning and hey! everything worked. Now I know why :-(</div><div><br class=""></div><div>I see that mg_send_dns_query() does the same (it calls mg_dns_insert_header, which then calls mbuf_insert). Making mg_send transmit immediately would break that as well.</div><div><br class=""></div><div>How about introducing a new mg_send_now() that calls mg_send() then sends the data immediately? Perhaps it could be a separate .h/.c file mongoose_extensions to avoid the change getting overwritten?</div><div><br class=""></div><div>Regards, Mark.</div><div><br class=""></div><div><blockquote type="cite" class=""><div class="">On 19 Jan 2018, at 2:36 PM, Stephen Casner <<a href="mailto:casner@acm.org" class="">casner@acm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Mark,<br class=""><br class="">The update of Mongoose to v6.10 removed the change I had made so that<br class="">the mg_send() call would transmit on the network immediately if the<br class="">socket was ready.  I needed to make that change because we would<br class="">otherwise run out of RAM with SSH because mg_send() would just buffer<br class="">everything until the next poll.<br class=""><br class="">                                                        -- Steve<br class=""><br class="">On Fri, 19 Jan 2018, Mark Webb-Johnson wrote:<br class=""><br class=""><blockquote type="cite" class="">I re-worked the ovms_server_* framework, and v2 implementation, to use MONGOOSE.<br class=""><br class="">It seems to be _basically_ working. It can connect/disconnect/etc. Some slight memory saving, but standardising the networking throughout on mongoose should simplify things.<br class=""><br class="">I am seeing problems with transmitting the FEATURES and PARAMETERS sometimes - particularly in low memory situations. I’m still trying to find out why.<br class=""><br class="">Regards, Mark.<br class=""><br class=""><blockquote type="cite" class="">On 17 Jan 2018, at 8:33 AM, Mark Webb-Johnson <<a href="mailto:mark@webb-johnson.net" class="">mark@webb-johnson.net</a>> wrote:<br class=""><br class=""><br class="">This is the issue Michael pointed out. The 'server response is incomplete’ problem with select(). Apologies for this; I am not sure why I didn’t notice it before.<br class=""><br class="">Gory details are here:<br class=""><br class=""><a href="https://github.com/espressif/esp-idf/issues/1510" class="">https://github.com/espressif/esp-idf/issues/1510</a> <<a href="https://github.com/espressif/esp-idf/issues/1510" class="">https://github.com/espressif/esp-idf/issues/1510</a>><br class=""><br class="">I think Espressif implemented requirement this in a bizarre way, likely to break compatibility, but such is life. They did point it out as a ‘breaking change’ (at the bottom of the release notes for 3.0b1):<br class=""><br class=""><a href="https://github.com/espressif/esp-idf/releases/tag/v3.0-rc1" class="">https://github.com/espressif/esp-idf/releases/tag/v3.0-rc1</a> <<a href="https://github.com/espressif/esp-idf/releases/tag/v3.0-rc1" class="">https://github.com/espressif/esp-idf/releases/tag/v3.0-rc1</a>><br class=""><br class="">LWIP socket file descriptors now take higher numeric values (via the LWIP LWIP_SOCKET_OFFSET macro). BSD sockets code should mostly work as expected (and, new in V3.0, some standard POSIX functions can now be used with sockets). However any code which assumes a socket file descriptor is always a low numbered integer may need modifying to account for LWIP_SOCKET_OFFSET.<br class=""><br class="">It sure broke us.<br class=""><br class="">I’ve made a one-line workaround fix (to ovms_buffer.cpp), and ovms server v2 connections are working again for me. That is committed and pushed already.<br class=""><br class="">It is kind of messy to have all these different networking implementations in our code base; I intend to move ovms_server_* to mongoose networking over the next few days. That will mean we won’t need a separate task/stack for server connections, and should save us 7KB internal RAM for each connection. Also ovms_ota. But that will have to wait, as I need to get the hardware complete first (some issues with 1.8v vs 3.3v logic on VDD_SDIO of the wrover module and some of our GPIOs), and that is top priority.<br class=""><br class="">Regards, Mark.<br class=""><br class=""><blockquote type="cite" class="">On 17 Jan 2018, at 7:05 AM, Greg D. <<a href="mailto:gregd2350@gmail.com" class="">gregd2350@gmail.com</a> <<a href="mailto:gregd2350@gmail.com" class="">mailto:gregd2350@gmail.com</a>>> wrote:<br class=""><br class="">But, I'm not getting much love out of the v2 server.  The connection doesn't appear to be working - "server response is incomplete".  Same error whether on wifi or modem.<br class=""></blockquote><br class=""></blockquote><br class=""></blockquote>_______________________________________________<br class="">OvmsDev mailing list<br class=""><a href="mailto:OvmsDev@lists.teslaclub.hk" class="">OvmsDev@lists.teslaclub.hk</a><br class="">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev<br class=""></div></div></blockquote></div><br class=""></div></div></body></html>