0

I'm building a remote for my WiFi-RGB Lights. I have an ESP8266, which should send one TCP packet with 4 chars.

My code:

#include <ESP8266WiFi.h>
const char* ssid = "Wifi";
const char* password = "wifikey";
void WiFiEvent(WiFiEvent_t event) {
 Serial.printf("[WiFi-event] event: %d\n", event); 
}
void setup() {
 Serial.begin(115200);
 WiFi.disconnect(true);
 delay(1000);
 WiFi.onEvent(WiFiEvent);
 WiFi.begin(ssid, password);
}
void loop() {
 delay(1000);
 const uint16_t port = 5577;
 const char * host = "192.168.178.150";
 WiFiClient client;
 client.connect(host, port);
 client.print(char(0x71));
 client.print(char(0x24));
 client.print(char(0x0f));
 client.print(char(0xa4));
 client.flush();
 client.stop();
 delay(5000); 
}

The problem: I send 4 TCP packets, while I should send 1 TCP packet with all 4 chars.

Thanks for your help.

dda
1,5951 gold badge12 silver badges17 bronze badges
asked Jul 5, 2017 at 22:48
4
  • 3
    TCP data flow is not packet oriented, rather that is detail hidden in the implementation itself; a properly implemented TCP server must accept data arriving in any combination of packets, including one character per packet, words or lines broken between packets, packets that contain the end of one thing and the start of another, etc. Commented Jul 6, 2017 at 3:54
  • You can try sending all characters in a single print() but you're basically trying to use undocumented behavior of one thing to accommodate erroneous behavior of another. Commented Jul 6, 2017 at 3:55
  • Sounds like the problem is on the receiving end. Try shift/or-ing all values into one unsigned long and send that with one call to print. Commented Jul 6, 2017 at 17:38
  • Use UDP if you want to send a data that fit in a single packet. TCP is costly due to the overhead of open/close a sesion. Commented Feb 9, 2018 at 15:00

1 Answer 1

1

After searching and experimenting on this, I believe the short answer to the question is that you need to send the command string like a buffer of characters AND put your Hex Coded command for the LED controller as an escaped string of characters.

Here is my code (it toggles the LED Controller between Green and Blue every 5 seconds, but you can extend this for other commands and colors as described at http://jpelectron.com/sample/Electronics/WiFi%20LED%20control/):

/*
Send Commands to LED Controller via Wifi Network and Wemos D1 Board
*/
#include <ESP8266WiFi.h>
const char* ssid = "***yourWifiSSID***"; //Change this value for your network
const char* password = "***yourWifiPassword***"; //Change this value for your network
boolean connected = false;
boolean colorToggle = false;
void WiFiEvent(WiFiEvent_t event) {
 //Serial.printf("[WiFi-event] event: %d\n", event); 
 switch(event) {
 case 3:
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
 connected = true;
 break;
 case 6:
 Serial.println("WiFi lost connection");
 connected = false;
 break;
 }
 // 0 : WL_IDLE_STATUS when Wi-Fi is in process of changing between statuses
 // 1 : WL_NO_SSID_AVAILin case configured SSID cannot be reached
 // 3 : WL_CONNECTED after successful connection is established
 // 4 : WL_CONNECT_FAILED if password is incorrect
 // 6 : WL_DISCONNECTED if module is not configured in station mode
}
void setup() {
 pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output
 Serial.begin(115200);
 WiFi.disconnect(true);
 delay(1000);
 WiFi.onEvent(WiFiEvent);
 WiFi.begin(ssid, password);
 Serial.println("");
 // Wait for connection
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 Serial.println("");
 Serial.print("Connected to ");
 Serial.println(ssid);
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());
}
// the loop function runs over and over again forever
void loop() { 
 //if we are connected
 if(connected){
 digitalWrite(LED_BUILTIN, LOW); //Turn on LED on the Board
 turnLEDSOn();
 }
 else
 {
 digitalWrite(LED_BUILTIN, HIGH); //Turn off LED on the Board
 setup();
 }
}
void turnLEDSOn() {
 const uint16_t port = 5577;
 const char * host = "192.168.10.2"; //Change to whatever your LED Controller IP is
 WiFiClient client;
 if (client.connect(host, port)) //Try to connect to TCP Server
 {
 Serial.println("Connected to LED Controller... ");
 if (colorToggle)
 { //Green
 char command[] = "\x31\x00\xff\x00\x00\x00\xf0\x0f\x2f";
 client.write((uint8_t *)command, sizeof(command));
 colorToggle = false;
 delay(5000); 
 }
 else
 { //Blue
 char command[] = "\x31\x00\x00\xff\x00\x00\xf0\x0f\x2f";
 client.write((uint8_t *)command, sizeof(command));
 colorToggle = true; 
 delay(5000); 
 }
 Serial.println("Command sent ... "); // command is the color or animation sent to the LED controller
 } 
 else
 {
 Serial.println("connection failed ... ");
 }
 if (client.available())
 {
 //Read from LED Controller
 char c = client.read();
 Serial.print(c);
 }
 if (!client.connected())
 {
 Serial.println();
 Serial.println("disconnecting ... ");
 client.stop();
 for(;;);
 } 
}
answered Sep 12, 2017 at 2:07
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.