German ESP8266 vom Tablet ansprechen.

funker

Member
Licensed User
Hallo, guten Tag.
Ps: Frage wurde korrigiert :

Ich habe ein Roboterauto , welches den ESP8266 drauf hat.
Das Pc-Programm (Purebasic) sendet regelmäßig alle 400 ms dort hin :
http://192.168.2.102/?pin=leer mit einer Timer-Schleife.

Vom Pc (Purebasic) kann ich auch Steuersignale zum Fahren übergeben mit einem Button:
http://192.168.2.102/?pin=vor oder
http://192.168.2.102/?pin=stop usw.

Bei jedem Senden zum ESP822 kommt auch ein Wert zurück zu Purebasic entweder wenn der Button betätigt wurde oder wenn die Timerschleife dran ist.

Wie geht so etwas bitte mit dem B4A ?


Danke.

Gruss
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Die erste url sendet daten an deinen pc? Die zweite soll daten an dein gerät schicken welches aber eine andere ip haben müsste.
Irgendwie scheint da was nicht zu passen!?

Ich habe keinen ESP8266; keine Ahnung was der macht oder nicht macht...
 

funker

Member
Licensed User
-----------------------------
welches aber eine andere ip haben müsste.
-----------------------------

Nein braucht es nicht.
Ich habe die Frage noch einmal korrigiert , vielleicht war sie nicht so genau gestellt.

Dieses wird zb von Purebasic gesendet in der url zum Roboter wenn ein Button gedrückt wurde:
http://192.168.2.102/?pin=vor

In einer Timerschleife von Purebasic wird dauernd dieses gesendet in der url ca alle 400 ms wenn kein Button gedrückt wurde. (ersichtlich aus dem Programmcode Purebasic)
http://192.168.2.102/?pin=leer
In der Rückantwort vom Roboter ESP.. ist dann ein bestimmter Wert drin.
Wenn keine bestimmten Daten anliegen ist dort alle 400 ms "0" drin. Wenn von Purebasic nichts gesendet wird, kommt auch keine Rückantwort vom Roboter.

---------------------------
If Event = #PB_Event_Timer And EventTimer() = 123
Buffer = ReceiveHTTPMemory(url)
If buffer
string=Str(PeekC(Buffer))
EndIf
URL = SetURLPart(URL, "pin", "leer")
EndIf
---------------------------

B4X:
Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_Timer And EventTimer() = 123
    Buffer = ReceiveHTTPMemory(url)
    If buffer
      string=Str(PeekC(Buffer))
    EndIf
    URL = SetURLPart(URL, "pin", "leer")
  EndIf

  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()

      If EventGadget =  #vor
        URL = SetURLPart(URL, "pin", "vor")
      EndIf

      If EventGadget =  #zur
        URL = SetURLPart(URL, "pin", "zur")
      EndIf

      If EventGadget =  #links
        URL = SetURLPart(URL, "pin", "links")
      EndIf

      If EventGadget =  #hlinks
        URL = SetURLPart(URL, "pin", "hlinks")
      EndIf

      If EventGadget =  #rechts
        URL = SetURLPart(URL, "pin", "rechts")
      EndIf

      If EventGadget =  #hrechts
        URL = SetURLPart(URL, "pin", "hrechts")  
      EndIf

      If EventGadget =  #mitte
        URL = SetURLPart(URL, "pin", "mitte")
      EndIf

      If EventGadget =  #v0
        URL = SetURLPart(URL, "pin", "v0")
      EndIf

      If EventGadget =  #v1
        URL = SetURLPart(URL, "pin", "v1")
      EndIf

      If EventGadget =  #v2
        URL = SetURLPart(URL, "pin", "v2")
      EndIf

      If EventGadget =  #servo0
        URL = SetURLPart(URL, "pin", "ser0")
      EndIf

      If EventGadget =  #servo1
        URL = SetURLPart(URL, "pin", "ser1")
        TEST=1
        winkel=0
        wd=2
      EndIf

      If EventGadget =  #sharp
        URL = SetURLPart(URL, "pin", "sharp")
        TEST=2
        winkel=0
        wd=1.8
      EndIf

      If EventGadget =  #ton
        URL = SetURLPart(URL, "pin", "ton")
      EndIf

      If EventGadget =  #cls
        text_e=""
        SetGadgetText(#Editor_0, text_e)
        wTEST=3
      EndIf

    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver

Gruss
 
Last edited:

funker

Member
Licensed User
Ich hab jetzt einen Erfolg.
Es funktioniert der Roboter (mit ESP8266) gemäß den Befehlen, die im Programm aufgeführt sind mit meinem "Medion Livetab" .

Wie funktioniert jetzt bitte ein regelmäßiger Timeraufruf von 400 ms für diesen Aufruf:
job1.Download("http://192.168.2.102/?pin=leer")

Und wie kann ich bitte den Stringwert davon in einen String packen und in einem
Textfenster ausgeben?
strwert=job1.Download("http://192.168.2.102/?pin=leer") ????

B4X:
#Region Module Attributes
    #FullScreen: False
    #IncludeTitle: True
    #ApplicationLabel: HttpUtils2
    #VersionCode: 1
    #VersionName: 
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
    #LibraryVersion: 2.20
    #LibraryName: OkHttpUtils2
#End Region

Sub Process_Globals

End Sub

Sub Globals
    Dim job1 As HttpJob

    Private hlinks As Button
    Private links As Button
    Private hrechts As Button
    Private mitte As Button
    Private rechts As Button
    Private vor As Button
    Private zurueck As Button
    Private v0 As Button
    Private v1 As Button
    Private v2 As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
      Activity.LoadLayout("esp8266")
      job1.Initialize("Job1", Me)  
End Sub

Sub JobDone (job As HttpJob)
    Log("JobName = " & job.JobName & ", Success = " & job.Success)

    If job.Success = True Then
        Select job.JobName
            Case "Job1"
        End Select
    End If
    job.Release
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub rechts_Click
    job1.Download("http://192.168.2.102/?pin=rechts")
    Delay(400)
End Sub

Sub hrechts_Click
    job1.Download("http://192.168.2.102/?pin=hrechts")
    Delay(400)
End Sub

Sub mitte_Click
    job1.Download("http://192.168.2.102/?pin=mitte")
    Delay(400)
End Sub

Sub hlinks_Click
    job1.Download("http://192.168.2.102/?pin=hlinks")
    Delay(400)
End Sub

Sub links_Click
    job1.Download("http://192.168.2.102/?pin=links")
    Delay(400)
End Sub

Sub v0_Click
    job1.Download("http://192.168.2.102/?pin=v0")
    Delay(400)
End Sub

Sub v1_Click
    job1.Download("http://192.168.2.102/?pin=v1")
    Delay(400)
End Sub

Sub v2_Click
    job1.Download("http://192.168.2.102/?pin=v2")
    Delay(400)
End Sub

Sub zurueck_Click
    job1.Download("http://192.168.2.102/?pin=zur")
    Delay(400)
End Sub

Sub vor_Click
    job1.Download("http://192.168.2.102/?pin=vor")
    Delay(400)
End Sub

Sub Delay(nMilliSecond As Long)
    Dim nBeginTime As Long
    Dim nEndTime As Long
    nEndTime = DateTime.Now + nMilliSecond
    nBeginTime = DateTime.Now

    Do While nBeginTime < nEndTime
        nBeginTime = DateTime.Now
        Log(nBeginTime)
        If nEndTime < nBeginTime Then
            Return
        End If
          DoEvents
    Loop
End Sub

Gruss
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Wie funktioniert jetzt bitte ein regelmäßiger Timeraufruf von 400 ms für diesen Aufruf
Setze nen Timer und im timer_Tick rufst du den Code auf
Und wie kann ich bitte den Stringwert davon in einen String packen und in einem
Textfenster ausgeben?
Das Ergebnis erhälst Du in der JobDone sub!
 

funker

Member
Licensed User
Danke.
Habe jetzt einen Timer gesetzt. Das mit dem JobDone sub... verstehe ich nicht.

Kannst du mir bitte die Stringvariable mal reinbringen in einem Code und in einem Textfenster:

B4X:
Sub Process_Globals
    Dim Timer1 As Timer
End Sub

Sub Globals
    Dim job1 As HttpJob

    Private hlinks As Button
    Private links As Button
    Private hrechts As Button
    Private mitte As Button
    Private rechts As Button
    Private vor As Button
    Private zurueck As Button
    Private v0 As Button
    Private v1 As Button
    Private v2 As Button

    Timer1.Initialize("Timer1", 400)
    Timer1.Enabled = True
End Sub

Sub Activity_Create(FirstTime As Boolean)
      Activity.LoadLayout("esp8266")
      job1.Initialize("Job1", Me)    
End Sub

Sub JobDone (job As HttpJob)
    Log("JobName = " & job.JobName & ", Success = " & job.Success)

    If job.Success = True Then
        Select job.JobName
            Case "Job1"
        End Select
    End If
    job.Release
End Sub

Sub Timer1_Tick
    job1.Download("http://192.168.2.102/?pin=leer")   ??????????????????
End Sub

............
........

Danke.
Gruss
 

DonManfred

Expert
Licensed User
Longtime User
B4X:
sub timer_tick
  Dim job1 AsHttpJob ' IMMER(!!) einen neuen Job DIMmen bei jedem neuen Aufruf. Benutze keine globalen Variablen. Das führt zu Problemen
  job1.Initialize("Job1", Me)
  job1.Download("http://192.168.2.102/?pin=leer")
end sub
Sub JobDone (job As HttpJob)
    Log("JobName = " & job.JobName & ", Success = " & job.Success)

    If job.Success = True Then
        Select job.JobName
            Case "Job1"
              log(job.GetString)
        End Select
    End If
    job.Release
End Sub
 

funker

Member
Licensed User
Danke.

Wie bekomme ich bitte das jetzt zur Anzeige auf meinem Medion im Textfeld?
log(job.GetString)


Muss das : "Dim job1 As HttpJob" hier auch rein?
B4X:
Sub rechts_Click
    job1.Download("http://192.168.2.102/?pin=rechts")
    Delay(200)
End Sub

Danke.
Gruss
 

DonManfred

Expert
Licensed User
Longtime User
Muss das : "Dim job1 As HttpJob" hier auch rein?
siehe post #9. Dim, initialize und download gehören zusammen

Wie bekomme ich bitte das jetzt zur Anzeige auf meinem Medion im Textfeld?
log(job.GetString)
B4X:
edit1.text = job.getString
? Beschäftige Dich mit der Sprache! Ich bin keine Auskunft!
 

funker

Member
Licensed User
Danke für deine Hilfe.

Es kommt kein Text zur Ausgabe an bei : edit1.text = job.getString , wenn ich die Sensoren Starte.
Dieser Probetext wird zu Anfang ausgegeben : edit1.text ="hallo" und ist zu sehen.

Wenn ich mein Purebasicempfangsprogram starte, dann kommen dort die Daten an.
Ich kann also die Sensoren vom Medion aus bedienen. Es funktionieren auch alle anderen Steuerungsorgane über den Medion.

B4X:
#Region Module Attributes
    #FullScreen: False
    #IncludeTitle: True
    #ApplicationLabel: esp8266
    #VersionCode: 1
    #VersionName: 
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
    #LibraryVersion: 2.20
    #LibraryName: OkHttpUtils2
#End Region

Sub Process_Globals
    Dim Timer1 As Timer
End Sub

Sub Globals
    Dim text As String
    Dim job1 As HttpJob
   
    Private hlinks As Button
    Private links As Button
    Private hrechts As Button
    Private mitte As Button
    Private rechts As Button
    Private vor As Button
    Private zurueck As Button
    Private v0 As Button
    Private v1 As Button
    Private v2 As Button
    Private ser0 As Button
    Private ser1 As Button
    Private sharp As Button
    Private edit1 As EditText
   
    Timer1.Initialize("Timer1", 400) 
    Timer1.Enabled = True   
   
End Sub

Sub Activity_Create(FirstTime As Boolean)   
     Activity.LoadLayout("esp8266")
     job1.Initialize("Job1", Me)   
    edit1.text ="hallo"
End Sub

Sub JobDone (job As HttpJob)
    Log("JobName = " & job.JobName & ", Success = " & job.Success)

    If job.Success = True Then
        Select job.JobName
            Case "Job1"
              edit1.text = job.getString
        End Select
    End If
    job.Release
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub Timer1_Tick
  Dim job1 As HttpJob 
  job1.Initialize("Job1", Me)
  job1.Download("http://192.168.2.102/?pin=leer")
End Sub

Sub rechts_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=rechts")
    Delay(200)
End Sub

Sub hrechts_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=hrechts")
    Delay(200)
End Sub

Sub mitte_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=mitte")
    Delay(200)
End Sub

Sub hlinks_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=hlinks")
    Delay(200)
End Sub

Sub links_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=links")
    Delay(200)
End Sub

Sub v0_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=v0")
    Delay(200)
End Sub

Sub v1_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=v1")
    Delay(200)
End Sub

Sub v2_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=v2")
    Delay(200)
End Sub

Sub zurueck_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=zur")
    Delay(200)
End Sub

Sub vor_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=vor")
    Delay(200)
End Sub

Sub ser0_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=ser0")
    Delay(200)
End Sub

Sub ser1_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)  
    job1.Download("http://192.168.2.102/?pin=ser1")
    Delay(200)
End Sub

Sub sharp_Click
    Dim job1 As HttpJob 
    job1.Initialize("Job1", Me)
    job1.Download("http://192.168.2.102/?pin=sharp")
    Delay(200)
End Sub

Sub Delay(nMilliSecond As Long)
    Dim nBeginTime As Long
    Dim nEndTime As Long
    nEndTime = DateTime.Now + nMilliSecond
    nBeginTime = DateTime.Now
   
    Do While nBeginTime < nEndTime
        nBeginTime = DateTime.Now
        Log(nBeginTime)
        If nEndTime < nBeginTime Then
            Return
        End If
          DoEvents
    Loop
End Sub
 

funker

Member
Licensed User
Sendet das Gerät denn irgendwas als Antwort?

Der ESP8266 sendet die Daten regelmäßig ca alle 400ms wenn ich den Button am Medion dafür gedrückt habe., da geht dann kurz die blaue Sendediode am ESP an bei jeder Datensendung , sind ungefähr 70 Datenendungen , danach kann ich wieder andere Dinge schalten. Mit meinem Purebasicprogramm kann ich die Daten empfangen.Also liegen da welche an.

Vielleicht gibt es dafür einen anderen http-Befehl ?

Danke.
Gruss
 
Last edited:

funker

Member
Licensed User
Die Daten werden in einen Buffer gepackt als String.

Wie kann man einen Buffer erstellen ?
Und daraus die Daten lesen ?

daten = job.getString

daten ist jetzt der Buffer.

Danke.
Gruss
 
Last edited:

funker

Member
Licensed User
1473759212222 solche Zahlen kommen in der Log an, regelmäßig je nach Timmerzeit ca 15-20x dann wird die Zahl um eins erhöht. Wenn die Messung zu ende ist kommt kein Ausdruck mehr. Erst wieder wenn ich eine Steuerung einleite "rechts, "links", "vor" usw da auch ca 15-20 die selbe Zahl und dann um 1 erhöht. Dann kommt wieder nichts in der Log.

Eigentlich brauche ich nur eine Schleife anspringen die 70x "job1.Download("http://192.168.2.102/?pin=leer")" macht alle
400 ms wenn ich mit den Button vom Medion die Messung einleite. Der Roboter unterbricht die Annahme von Schaltdaten , weil er alle ca 400 ms sendet und das ca 70x, dann nimmt er wieder Schaltdaten zum Fahren an usw.

Da ist dann das gleiche Spiel wie oben.

Irgendwie muss noch ein andere http-Abfrage geben mit Rückantwort ?

Danke.
Gruss

B4X:
Sub schleife()
    For z=0 To 80
      Dim job1 As HttpJob
      job1.Initialize("Job1", Me)
      job1.Download("http://192.168.2.102/?pin=leer")
     Delay(500)
    Next
End Sub




Gruss
 
Last edited:

funker

Member
Licensed User
Das ist der Code für den reinen ESP8266, den ich mit der Arduinio-IDE compiliere und reinlade.

Und das ist das ausschlagebende vom ESP8266:
client.write(&my_string[0],8);
Ein String wird gesendet vom ESP8266 jedesmal wenn ich ihm einmal aufrufe.

Und der String(wert) kommt bei den anderen Proggrammiersprachen an : Purebasic, Blitzbasic und Freebasic.

B4X:
#include <ESP8266WiFi.h>

char my_string[32];
byte dat_byte, inbyte;

const char* ssid = "********";
const char* password = "*******";

WiFiServer server(80);

void setup() {
  Serial.begin(9600);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  server.begin();
}

void loop() {

  if (Serial.available()){
    inbyte = Serial.read();
    dat_byte=inbyte;
  }
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  while(!client.available()){
    delay(1);
  }
  String req = client.readStringUntil('\r');
  client.flush();
  my_string[0]=dat_byte;

  client.write(&my_string[0],8);

  if (req.indexOf("vor") != -1){
    Serial.println("v");
  }
  else if (req.indexOf("zur") != -1){
    Serial.println("z"); 
  }
   else if (req.indexOf("hlinks") != -1){
    Serial.println("k");
  }   
  else if (req.indexOf("links") != -1){
    Serial.println("l");
  }
  else if (req.indexOf("hrechts") != -1){
    Serial.println("h");
  } 
  else if (req.indexOf("rechts") != -1){
    Serial.println("r");
  } 
  else if (req.indexOf("mitte") != -1){
    Serial.println("m"); 
  } 
  else if (req.indexOf("v0") != -1){
    Serial.println("w"); 
  }
  else if (req.indexOf("v1") != -1){
    Serial.println("s"); 
  } 
  else if (req.indexOf("v2") != -1){
    Serial.println("x"); 
  } 
   else if (req.indexOf("ser0") != -1){
    Serial.println("q"); 
  } 
  else if (req.indexOf("ser1") != -1){
    Serial.println("u"); 
  }
  else if (req.indexOf("sharp") != -1){
    Serial.println("f"); 
  } 
  else if (req.indexOf("ton") != -1){
    Serial.println("t"); 
  }     
  else if (req.indexOf("leer") != -1){
     Serial.println("p");   
  }     
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  client.flush();

  delay(1);
}
 
Top