I’m trying to create a simple client/server but it the client won’t connect to the server once it is running. I’ve looked at similar problems and people have suggested looking at the method for defining IP addresses but I think i’m addressing that in my code? Any help would be appreciated and apologies if it is something obvious.
Code:
Client
TCPClient client;
int analogPin = A0;
int port = 9999;
void setup() {
// Initialize the Serial
Serial.begin(9600);
// IPAddress myIP = WiFi.localIP();
// Serial.println(myIP);
uint8_t server[] = { 192, 168, 25, 1};
IPAddress IPfromBytes( server );
//byte server[] = { 192, 168, 25, 1};
// Connect to the remote server
if(client.connect(IPfromBytes, port)) {
Serial.println("Connected");
} else {
// if we can’t connect, then we display an error.
Serial.println("error");
}
}
void loop() {
int val = analogRead(analogPin);
// No type set and the default one is char. Meaning in this case our Int will
// be converted to UTF8
client.print(val);
client.print(',');
Serial.println(val);
delay(100);
}
Server:
import socket
import sys
# grab the host name so that I can grab the ip address
IP = socket.gethostbyname(socket.gethostname())
#IP = socket.gethostname()
PORT = 9999
# create a TCP / IP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# bind the socket to a public host host and a port
server_socket.bind((IP, PORT))
# tell the socket to listen
# allows up to 5 queued connections
server_socket.listen(5)
# print out that we are listening
print("listening on: \n IP: " + IP + "\n PORT: " + str(PORT))
# accept connections from outside
(connection, client_address) = server_socket.accept()
print("waiting for a connection")
# main loop
while True:
try:
# let the user know it is connected to an photon
print("connected to argon: " + client_address)
data = connection.recv(2048)
# recieve the data in small chunks
except socket.error as e:
print(e)
finally:
# clean up the connection and close it
server_socket.close()
I have reformatted your code blocks but in the process I noticed that your Python code did not indent correctly (in the original version), but Python is paying close attention to the indentation.
Hence I adjusted the indentation as I’d assume you’d want it done.
Can you confirm whether this is the Python code (including indentation) you are using or not?
However, this is how I would setup the IP address in your Argon code
Thanks for the fast reply. I copied the code wrong but I do have it indented correctly on the python file. The code isn’t mine it was taken from here: Connecting photon client to a python server
I changed the IP address setup to your suggestion but same result unfortunately. I’ll attach the output of the serial terminal and server:
You may want to retry a connection in loop() once you find that client.connect() is not true.
For that I’d make the IP address a global variable and move the client.connect() call into a fitting conditional block inside loop().
I tried your code now and it seems to be an issue with your Python code.
This is what it throws at me
waiting for a connection
Traceback (most recent call last):
File ".\Server.py", line 29, in <module>
print("connected to argon: " + client_address)
TypeError: can only concatenate str (not "tuple") to str
However, I’ve altered the code for the Argon to allow for different IP addresses without the need to rebuild and flash.
const int analogPin = A0;
int port = 9999;
IPAddress ip;
TCPClient client;
void setup() {
Serial.begin(9600);
Particle.function("setServer", setServer);
}
void loop() {
if (client.connected()) {
int val = analogRead(analogPin);
// No type set and the default one is char. Meaning in this case our Int will
// be converted to UTF8
client.printf("%d, ", val);
Serial.print('.');
}
else if (ip) {
client.connect(ip, port);
}
delay(1000);
}
int setServer(const char* cmd) {
uint8_t octet[4];
int retVal = sscanf(cmd, "%d.%d.%d.%d:%d", &octet[0], &octet[1], &octet[2], &octet[3], &port);
Serial.printlnf("Input: %s -> Parsed: %d.%d.%d.%d:%d", cmd, octet[0], octet[1], octet[2], octet[3], port);
if (retVal >= 4) {
client.stop();
ip = IPAddress(octet[0], octet[1], octet[2], octet[3]);
retVal = octet[3];
}
else {
retVal *= -1;
ip.clear();
}
return retVal;
}
Thank you for that function its very handy. However I am not receiving that error you got as I can’t get that far in the first place. The server never accepts the connection in the first place. I set up a node.js server and still can’t connect the argon over my network to the server so either I am doing something really fundamental wrong or there is a problem with my network. I understand if you’re too fed up to look into it any further although any other feedback would be welcome
I saw a thread you posted on Particle community about your argon failing to connect to a python tcp server.
I have the same problem.
I did not find ScruffR’s suggestions helpful and am wondering if you ever found the cause of the problem. If so, could you explain to me how you fixed it?
In the end it was a simple error on the server side. The gethostbyname() function I was using to grab my machines IP address was actually grabbing my VMware virtual network adapters address instead, so I hard coded in the correct address. Maybe you can post some code and either I or someone else might be able to help?
Thx for your quick response. It got me thinking, and I reviewed my notes. Turns out I had ‘leftover’ Wifi credentials in the Argon, and when I let it connect automatically, it connected to the wrong network, which happened to be available. I fixed credentials and problem solved.