B4R Question Porting Arduino Code to B4R

Discussion in 'B4R Questions' started by mark35at, May 14, 2018.

  1. mark35at

    mark35at Well-Known Member Licensed User

    I have this code working in Arduino and am trying to port it to B4R for ease of programming. I have not yet tried my attempt as I am stuck with one line.

    Arduino Code (working):

    Code:
    /*
     * Create a Wifi AP on Wemos D1 R2
     * 
     * Create MQTT Broker
     * 
     * M. Read May 
    2018
     *
     * Status: Working
     */

    /* Setup Wifi AP  */
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h> 

    extern 
    "C" {
      
    #include<user_interface.h>
    }

    /* Set these to your desired credentials. */
    const char *ssid = "Rover AP";
    const char *password = "";

    unsigned char number_client;      //new number of clients connected

    /* Setup MQTT Broker */
    #include "uMQTTBroker.h"
    unsigned int mqttPort = 1883;       // the standard MQTT broker port
    unsigned int max_subscriptions = 10;
    unsigned int max_retained_topics = 10;

    /* Remember subroutines must be declared before they are used, ie. before setup */

    void data_callback(uint32_t *client /* we can ignore this */, const char* topic, uint32_t topic_len, const char *data, uint32_t lengh) {
      char topic_str[topic_len+1];
      os_memcpy(topic_str, topic, topic_len);
      topic_str[topic_len] = '\0';

      char data_str[lengh+1];
      os_memcpy(data_str, data, lengh);
      data_str[lengh] = '\0';

      Serial.print("received topic '");
      Serial.print(topic_str);
      Serial.print("' with data '");
      Serial.print(data_str);
      Serial.println("'");

    }

    void client_status() {
      struct station_info *stat_info;
     
      struct ip_addr *IPaddress;
      IPAddress address;
      int i=1;
       
      stat_info = wifi_softap_get_station_info();

      if (number_client==0){
    //    Serial.println("No Connected Clients");
        return;           //If there are no clients - exit
        }    
     
      Serial.print(" Connected Clients = ");
      Serial.println(number_client);
      Serial.println("");
     
     
        while (stat_info != NULL) {
       
          IPaddress = &stat_info->ip;
          address = IPaddress->addr;
         
          Serial.print("client ");
          Serial.print(i);
          Serial.print(": IP =  ");
          Serial.print((address));
               
          stat_info = STAILQ_NEXT(stat_info, next);
          i++;
          Serial.println();
        }
       
      delay(500);
    }


    void setup() {
      // put your setup code here, to run once:
      Serial.begin(115200);


      Serial.println();
      Serial.print("Configuring access point...");
      /* You can remove the password parameter if you want the AP to be open. */
      WiFi.softAP(ssid, password);
      delay(1000);
     
      IPAddress myIP = WiFi.softAPIP();
      Serial.print("AP IP address: ");
      Serial.println(myIP);

      /* Register the callback */
      MQTT_server_onData(data_callback);

    /* Start the broker */
      Serial.println("Starting MQTT broker");
      MQTT_server_start(mqttPort, max_subscriptions, max_retained_topics);

    /* Subscribe to anything */
      MQTT_local_subscribe((unsigned char *)"#", 0);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      delay(2000);

      // If the number of clients has changed, update serial
      if(wifi_softap_get_station_num()!=number_client){
        number_client= wifi_softap_get_station_num();

        client_status();
      }
     

    }
    This is my B4R code to date:

    Code:
    #Region Project Attributes
        
    #AutoFlushLogs: True
        
    #CheckArrayBounds: True
        
    #StackBufferSize: 300
    #End Region

    Sub Process_Globals
        
    'These global variables will be declared once when the application starts.
        'Public variables can be accessed from all modules.
        Public Serial1 As Serial
        
    Public ssid As String="Rover AP"
        
    Public password As String=""
        
    Public wifi As ESP8266WiFi
        
    Public mqttport As Int=1883
        
    Public max_subscriptions As Int=10
        
    Public max_retained As Int=10
           
    End Sub

    'Setup the Wifi AP
    #if C
    void SetAP(B4R::Object* o) {
       WiFi.mode(WIFI_AP);
    }
    #end if

    'Setup the MQTT Broker
    #if C
    #include "uMQTTBroker.h"
    void StartBroker (B4R::Object* o) {
      Serial.println("Starting MQTT broker");
      Serial.println(MQTT_server_start(1883, 30, 30));
      MQTT_local_subscribe((unsigned char *)"#", 0);
    }
    #End If


    Private Sub AppStart
        Serial1.Initialize(
    115200)
        
    Log("AppStart")
       
        
    Log(wifi.StartAccessPoint(ssid))
        RunNative(
    "SetAP"Null)
        
    Log(wifi.AccessPointIp)
       
        RunNative(
    "StartBroker"Null)
       
    End Sub
    My problem is this line from the arduino code:

    Code:
    /* Register the callback */
      MQTT_server_onData(data_callback);
    How to include this in B4R?

    Also I would like to pass the MQTT Broker values (port etc) as variables.

    I am referecing the "uMQTTBroker.h" file which is a broker and client.
     
  2. Erel

    Erel Administrator Staff Member Licensed User

  3. mark35at

    mark35at Well-Known Member Licensed User

    Thanks Erel, I saw that post. After hours of trying, I cannot get the Wifi AP to work with B4R and the broker. One seems to kill the other. I am going to give up and use the arduino code directly on my ESP8266. It is working great and is VERY fast.

    I am able to run the AP + Broker on one ESP, a second ESP has a motor and a tablet controls the motor, all via MQTT. I will post the whole system later. It is a little rough at present.

    Many thanks.
     
  4. tigrot

    tigrot Well-Known Member Licensed User

    I have seen that misterious crashes are almost always related to lack of stackbuffer spaces. Did you tried to encrease?
     
  5. mark35at

    mark35at Well-Known Member Licensed User

    The serial log shows that the AP starts and the Broker as well but the AP is not visible and therefore a connection is not possible.
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice