Помогите дописать код Запрашиваю данные о статусе устройства через get запрос(статус прописан в mysql) с веб сервера , выводятся данные http://ip-адрес/status.php Выводятся в формате 1 0 Первое значение это статус 1 реле второе значение статус второго реле Как обработать данную строку, что бы потом включить или выкючить реле соответственно ее статусу Я понимаю что нужно парсить строку, но до меня не доходит принцип как это сделать Помогите дописать код или дайте ссылку на пример с комментариями данного процесса Код php странички PHP: <?php //соединяемся с mysql include_once("./config.php"); $db = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); //$db = mysql_connect("localhost","login","passwor"); mysql_select_db("db_terminal",$db); $query = "SELECT `ID` , `CUR_VALUE`, `LINKED_OBJECT` FROM `commands` WHERE `ID` = '118'"; // Формируем запрос $query_rele = mysql_query($query); // Выполняем запрос $row = mysql_fetch_array($query_rele); Do { $text = $row['CUR_VALUE'] ; $text2 = $row['LINKED_OBJECT'] ; } while ($row = mysql_fetch_array($query_rele)); echo $text.' '.$text2; mysql_query($query,$link); mysql_close($link); ?> Код написанный на ардуино Код (C++): #include <Ethernet.h> #include <SPI.h> #include <Wire.h> //mac address дл€ получени€ сети byte mac[] = { 0xee, 0x2b, 0xab, 0xa4, 0xd4, 0x9d }; // RESERVED MAC ADDRESS EthernetClient client; /////////////////////////////реле///////////////// int buff=0; // переменна€ дл€ установки значени€ 1 или 0 (вкл или выкл) и последующего приема запросас сервера const int rele = 9; //подключаем пин реле дл€ включени€ камеры int button = 3; // объ€вл€ем геркон на вход дверь void setup() { Serial.begin(9600); ////////////////////////////реле////////////////////////////// pinMode(rele, OUTPUT); digitalWrite(rele, LOW); // объ€вл€ем что слушают датчики pinMode(button, INPUT); //кнопка слушает вход if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); } Serial.print("IP = "); Serial.println(Ethernet.localIP()); } void loop() { rele_(); //считываем значение из файла на веб сервере Gerk(); } void Gerk(){ if (digitalRead(button) == HIGH/*LOW*/) { digitalWrite (rele, HIGH); Serial.println("connecting to server..."); if (client.connect("192.168.1.2",80)) { Serial.println("making HTTP request..."); // —оздаем GET HTTP-запрос: // client.println("GET /objects/?object=Lamp1&op=m&m=turnOn& HTTP/1.1");//отправл€ю переменную t со значением 1 client.println("GET /objects/?object=Lamp1&op=m&m=switch& HTTP/1.1"); client.println("HOST: 192.168.1.2"); client.println(); } if (client.connected()) { client.stop(); } delay(100); } } //////////////////////////////////////управл€ем реле/////////////////////// void rele_(){ ///////////////////////////////////////реле//////////////////////// if (client.connect("192.168.1.2",80)) { Serial.println("making HTTP request..."); delay(100); // —оздаем GET HTTP-запрос: client.print("GET /status.php?rele=");//считываем переменную с сервера client.println("HOST: 192.168.1.2"); client.println(); delay(100); while (client.available()) { char c = client.read(); Serial.write(c); if ( c=='1') //если 2 то ставим флаг в buff =1 { //Serial.println("c=1"); buff=1; } if ( c=='0') //если 3 то ставим флаг в buff =0 {//Serial.println("c=0"); buff=0; } } client.stop(); client.flush(); delay(100); } else { client.stop(); delay(400); client.connect("192.168.1.2",80); } //Serial.println("buff"); Serial.println(buff); if ( buff==1) //если флаг в buff =1 то включаем реле { digitalWrite (rele, HIGH); } if (buff==0)//было else //если флаг в buff =0 то выключаем реле { digitalWrite(rele, LOW); } delay(400); }
Я думаю, что выходную строку лучше снабдить идентификаторам, например: ID1=1 ID2=0. В скетче объявите переменную типа String, например String inString="", собирайте выводимую информацию в строке Код (C++): char c = client.read(); inString.concat(c); , а затем разбирайте ее стандартными методами для String.
Написал вот так, для просмотр Код (C++): char c = client.read(); String insString = ""; insString.concat(c); Serial.println(insString.charAt(2)); } В serial выдаются квадратики, что не так сделал???
Посмотрите, этот кусочек кода. тут как раз из строки берутся 2 переменные - topic и playload и записываются в стринговые переменные. Код (C++): void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; Serial.print(topic); Serial.print(" "); String strTopic = String(topic); String strPayload = String((char*)payload); Serial.println(strPayload); if (strTopic == "test/device/arduino01/rel1") { if (strPayload == "ON"){REL1 = 1;} else if (strPayload == "OFF"){REL1 = 0;} }
Тут разобрался Serial.println(insString.charAt(0)); поставил 0 и ардуино начала посимвольно выводить вот такой текст making HTTP request... HTTP/1c=1 ID1=1 ID2=0 OK Date: Thu, 24 Mar 20c=0 1c=1 6 0c=0 6:44:27 GMT Server: Apache/2.2.22 (Debian) X-Powered-By: PHP/5.4.45-0c=0 +deb7u2 Vary: Accept-Encoding Content-Length: 322 Connection: close Content-Type: text/html; charset=UTF-8 как получить только ID1=1 ID2=0 а все остальное откинуть???? Сказать что считывать символ поcле ID1= и ID2=
Спасибо, считывает А как сказать ардуине, что мне необходимо считать 4 символа в 10 строке Или придется символы пересчитывать )))) Код вывода 13 символа Код (C++): void rele_(){ String insString = ""; ///////////////////////////////////////реле//////////////////////// if (client.connect("192.168.1.87",36001)) { Serial.println("making HTTP request..."); delay(100); // Создаем GET HTTP-запрос: client.print("GET /status.php?");//считываем переменную с сервера client.println("HOST: 192.168.1.87"); client.println(); delay(100); while (client.available()) { char c = client.read(); insString.concat(c); Serial.println(insString.charAt(13)); delay (100); Выводит O это 13 символ со строчки HTTP/1.1 200 OK Если код Код (C++): void rele_(){ String insString = ""; ///////////////////////////////////////реле//////////////////////// if (client.connect("192.168.1.87",36001)) { Serial.println("making HTTP request..."); delay(100); // Создаем GET HTTP-запрос: client.print("GET /status.php?");//считываем переменную с сервера client.println("HOST: 192.168.1.87"); client.println(); delay(100); while (client.available()) { char c = client.read(); /*insString.concat(c); Serial.println(insString.charAt(13)); delay (100); */ Serial.write(c); То выводит следующее HTTP/1.1 200 OK Date: Fri, 25 Mar 2016 09:24:08 GMT Server: Apache/2.2.22 (Debian) X-Powered-By: PHP/5.4.45-0+deb7u2 Vary: Accept-Encoding Content-Length: 17 Connection: close Content-Type: text/html; charset=UTF-8 ID1=0 ID2=Lamp Как считать с последней строки
Вопрос по коду, можно его прокомментировать, я часть написал(может что то неправильно понял) void callback(char* topic, byte* payload, unsignedint length){ // char объявляем массив topic //byte не совсем понял что конкретно объявляется для типа данных byte тли длина строки можно прокомментировать payload[length]='\0'; //конец строки Serial.print(topic); // выводим массив топик Serial.print(" ");// выводим пробел, не понял для чего String strTopic = String(topic); //преобразуем topic в объект string String strPayload = String((char*)payload); // тоже преобразуем в объект string непонятно для чего Serial.println(strPayload); //выводим strPayload if(strTopic =="test/device/arduino01/rel1"){ // сравниваем массив strTopic с тут я понял , что должны стоять данные из get запроса if(strPayload =="ON"){REL1 =1;} // тут выполняем условие по полученным данным elseif(strPayload =="OFF"){REL1 =0;} }
Пробелы что бы вывод в мониторе был читабельным Для того что бы сравнивать строки и распознавать ON/OFF
Вы не просто объявляете массив, а возвращаете данные из брокера mqtt и записываете эти данные в топик и playload.
Данная функция как я понял записывает за каждый цикл по одному символу insString.concat(c); Время обработки увеличивается, пока он считает все символы получается около 20 секунд, а как передать String за один раз весь массив данных из char и какая функция отвечает за поиск в массиве объекта string
Нашел функцию indexOf Функция indexOf() возвращает самую первую позицию (т.е. индекс) определенного символа, находящегося в строке. Код (C++): while (client.available()) { char c = client.read(); String stringOne = String(c); int firstClosingBracket = stringOne.indexOf('='); Serial.println("string " + stringOne + " is " + firstClosingBracket); delay (30);}}} Выводит следующий результат, если значение нашлось то выводит 0 если нет то -1 ... string I is -1 string D is -1 string 1 is -1 string = is 0 string 0 is -1 string is -1 string I is -1 string D is -1 string 2 is -1 string = is 0 string L is -1 string a is -1 string m is -1 string p is -1 string 1 is -1 string is -1 .... Подскажите как с ее помощью можно наити совокупность символов ID1=1 Или как данные полученные с get запроса затолкать в string в одну строку
Помогите найти ошибку Написал вот такой код он обрабатывает условия, точнее находит к примеру слово HTTP или другое искомое значение, но в районе одной строчки. а дальше следующие строки данных не обрабатывает Код (C++): String readString = String(200); if (client.connect("192.168.1.44",80)) { Serial.println("making HTTP request..."); delay(100); // Создаем GET HTTP-запрос: client.print("GET /status.php?");//считываем переменную с сервера client.println("HOST: 192.168.1.44"); client.println(); delay(100); while (client.available()) { char c = client.read(); Serial.println(c); if (readString.length() < 200) { readString += c; } if (c == '\n') { if(readString.indexOf("HTTP") > 0) { Serial.println("device is on"); } if(readString.indexOf("ID1=1") > 0) { Serial.println("device is off"); } client.println("HOST: 192.168.1.44"); client.println(); readString=""; client.stop(); }}} Пример вывода IP = 192.168.1.38 making HTTP request... H T T P / 1 . 1 2 0 0 O K device is on Если прописываю строчку if (c == '\r\n') то он выдает весь переданный текст с сервера, но не работает поиск значения