public static void FindCity() { // Set ACK message string ackmsg = "CCNCS"; // Fetch ips in a list SQLHelper getips = new SQLHelper("SELECT ip FROM units"); getips.Run_Cmd(); getips.SetIPs(); // Fetch unit ids in a list SQLHelper getids = new SQLHelper("SELECT unit_id FROM units"); getids.Run_Cmd(); getids.SetIDs(); // Make a new list for the ips and ids List <string> iplist = getips.Get_List(); List <string> idlist = getids.Get_List(); // Now go through down each ip and id in the lists and request the data foreach (var address in iplist) { foreach (var id in idlist) { // Create a new TCP Client with the address and default port number var client = new TcpClient(address, portNum); // Establish a network Stream NetworkStream ns = client.GetStream(); // Setup a byte array byte[] incoming_msg = new byte[1024]; // Read the bytes from the network stream into the array int bytesRead = ns.Read(incoming_msg, 0, incoming_msg.Length); // Format to string string received = Encoding.ASCII.GetString(incoming_msg, 0, bytesRead); // if the message that is received is our defined acknowledement message, we have the town control. if (received == ackmsg) { //Change the unit_ID to CCNCS SQLHelper changeID = new SQLHelper("UPDATE units SET unit_id='CCNCS' WHERE ip= '" + address + "'"); changeID.Run_Cmd(); // Then send the city ACK message byte[] outgoing_msg = new byte[1024]; // populate the byte array with our acknowledgement message byte[] byte_cityack = Encoding.ASCII.GetBytes(townackmsg); // try to write the acknowledgement message try { ns.Write(byte_cityack, 0, byte_cityack.Length); ns.Close(); client.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } } } }
public static void TcpTownClient() { // Fetch ips in a list Console.WriteLine("Fetching IPs"); SQLHelper getips = new SQLHelper("SELECT ip FROM units"); getips.Run_Cmd(); getips.SetIPs(); // Fetch unit ids in a list Console.WriteLine("Fetching IDs"); SQLHelper getids = new SQLHelper("SELECT unit_id FROM units"); getids.Run_Cmd(); getids.SetIDs(); // Make a new list for the ips and ids List <string> iplist = getips.Get_List(); List <string> idlist = getids.Get_List(); // Now go through down each ip and id in the lists and request the data foreach (var address in iplist) { foreach (var id in idlist) { // if the id is not our city identifier, proceed with asking for levels if (id.ToString() != cityID) // !potential logic error != continues code, == skips... no idea why? { //debugging //var checkme = id; // Tell who we are connecting to Console.WriteLine("Connecting to Unit" + id + "..."); // Create a new TCP Client with the address and default port number var client = new TcpClient(address, portNum); // Establish a network Stream NetworkStream ns = client.GetStream(); // Setup a byte array byte[] bytes = new byte[1024]; // Read the bytes from the network stream into the array int bytesRead = ns.Read(bytes, 0, bytes.Length); // Format to string string received = Encoding.ASCII.GetString(bytes, 0, bytesRead); // Turn the input levels to an array string[] levels = received.Split(','); // Turn each level into a double double wat = Convert.ToDouble(levels[0]); double sew = Convert.ToDouble(levels[1]); double pow = Convert.ToDouble(levels[2]); // Generate a timestamp Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; // Insert values with associated unit id into Database SQLHelper insertcmd = new SQLHelper("INSERT INTO status VALUES(" + unixTimestamp + "," + "'" + id + "'," + wat + "," + sew + "," + pow + ")"); insertcmd.Run_Cmd(); // Report levels Console.WriteLine("Unit " + id + " reports " + wat + " water, " + sew + " sewage, " + pow + " power"); } // if we are dealing with a city, we need to send the acknowledgement message - sp spin up a server else { // echo we're ignoring Console.WriteLine("Skipping City..."); } } } }