Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » PHP получить данные от Aida64

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет!
В Aida64 есть возможность отправлять данные с датчиков в TCP/IP, например подключившись браузером по адресу где установлена AIDA64 (Например 10.0.5.1:8008) получим html страницу с нужными данными. Изучив код страницы я обнаружил, что данные приходят с адреса http://10.0.5.1:8008/sse и меюют заголовок "Content-Type: text/event-stream".
 
Вопрос как при помощи PHP можно получать эти даные и выводить пользователю?
 
Делал так

Код:
 
$ch = curl_init('http://10.0.5.1/sse');
curl_setopt($ch, CURLOPT_PORT, 8008);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(  
 "Accept: application/json, text/plain, */*",
 "Content-Type:  text/event-stream",
));  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 
$html = curl_exec($ch);
 

 
Понятное дело ничего не работает (((

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 14:44 30-01-2023
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я может не корректно вопрос задал.
Суть проблемы вот в чем, AIDA64 шлет данные по HTTP и по другому не умеет, панель мониторинга разного оборудования самописная, и данные получает простейшим POST запросом к устройствам (микроконтроллеры AVR), полученные данные обрабатываются на сервере и отображаются уже на страничке. Доступ к панели мониторинга исключительно по HTTPS и по HTTP ни как, ибо WebRTC требует HTTPS.
И получается, что не возможно будучи подключенным по HTTPS получать что либо по HTTP на клиенте. NodeJS почему то мне не хочется использовать.
Возможно ли при помощи PHP который стоит сервере и находится в одной внутренней сети с AIDA64 получать от последней данные и передавать уже на страницу?
Как то так.

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 17:36 30-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
 "Content-Type:  text/event-stream",

смысл?? вы же отправляете запрос, а не ответ.
 

Цитата:
Понятное дело ничего не работает

почему? выдается ошибка?
 

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 21:50 30-01-2023
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
почему? выдается ошибка?

Нет, просто по истечению timeout, cURL ничего не возвращает, какой бы timeout я не указывал.  
 
Если же сделать так:

Код:
 
$ch = curl_init('http://10.0.5.1');  
curl_setopt($ch, CURLOPT_PORT, 8008);  
curl_setopt($ch, CURLOPT_TIMEOUT, 2);  
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  
curl_setopt($ch, CURLOPT_POST, 0);  
curl_setopt($ch, CURLOPT_HEADER, 0);  
curl_setopt($ch, CURLOPT_HTTPHEADER, array(  
 "Accept: application/json, text/plain, */*"
));  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  
 
$html = curl_exec($ch)
 

 
То приходит в ответ вся страница с данным, но при следующих запросах данные идут одни и те же. То есть не обновляются

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 05:07 31-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
То приходит в ответ вся страница с данным, но при следующих запросах данные идут одни и те же. То есть не обновляются

сам CURL не кэширует данные.
 

Цитата:
Нет, просто по истечению timeout, cURL ничего не возвращает


Цитата:
curl_setopt($ch, CURLOPT_HEADER, 0);  

говорите, что нет заголовков.. но они же есть..
 

Цитата:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

не https, зачем?
 

Цитата:
curl_setopt($ch, CURLOPT_POST, 0);  

по умолчанию уже 0, можно не писать.
 
сделайте лог и посмотрите
https://stackoverflow.com/questions/3757071/php-debugging-curl

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 05:21 31-01-2023
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
сам CURL не кэширует данные.

Да я знаю, это на стороне AIDA64 создается страничка с данными Server-Sent Events, и cURL постоянно ее получает в первоначальном виде, так как она не обновляется на стороне AIDA64.
 

Цитата:
https://stackoverflow.com/questions/3757071/php-debugging-curl

Спасибо за ссылку, не натыкался на это. Но мысли были, что нужно читать поток

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 05:40 31-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
Нет, просто по истечению timeout, cURL ничего не возвращает, какой бы timeout я не указывал.  

может, все же, порт 8080?
 
https://forums.aida64.com/topic/2636-remotesensor-lcd-for-smartphones-and-tablets/

Цитата:
RemoteSensor uses HTML5 SSE (Server-Sent Events) to refresh the web page, without having to reload it all the time. SSE is supported by almost all major web browsers, including Android Browser, BlackBerry 10 Browser, Chrome, FireFox, Opera, and Safari. However, it is sadly not yet supported by Internet Explorer. AIDA64 implements a trick to get around that limitation, but it sometimes will result in a mixup of the browser. If you notice that after changing the LCD layout in the AIDA64 Preferences, a strange log replaces the LCD layout in your browser, just refresh the web page. Hopefully Microsoft will finally implement SSE support in Internet Explorer 12

 
https://developer.mozilla.org/ru/docs/Web/API/Server-sent_events/Using_server-sent_events
 
ps: по таймауту вылетает потому, что там поток который держится открытым. отправляются изменения, поэтому читать нужно не после того, как обрывается по таймауту.
 
https://jvns.ca/blog/2021/01/12/day-36--server-sent-events-are-cool--and-a-fun-bug/
 
что то типа такого
https://blog.axway.com/product-insights/amplify-platform/streams/php-curl-script-write-server-sent-events-responses-aws-s3-data-lakes

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 05:52 31-01-2023 | Исправлено: Mavrikii, 05:58 31-01-2023
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
может, все же, порт 8080?

Я перенастроил на 8008, в браузере то все работает.
 
Вот что я получил

Код:
 
*   Trying 10.0.5.1:8008...
* Connected to 10.0.5.1 (10.0.5.1) port 8008 (#0)
> GET /sse HTTP/1.1
 
Host: 10.0.5.1:8008\
Accept: application/json, text/plain, */*
Connection: close
 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: text/event-stream
< Cache-Control: no-cache
< Access-Control-Allow-Origin: *
< Access-Control-Expose-Headers: *
< Access-Control-Allow-Credentials: true
* no chunk, no close, no size. Assume close to signal end
* Operation timed out after 5000 milliseconds with 3959 bytes received
* Closing connection 0
 

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 07:52 31-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
в браузере то все работает

потому что браузер держит подключение и ждет обновлений.

Цитата:
3959 bytes received

почти 4 кб данных получено. написал же - event-stream это бесконечный поток.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 07:59 31-01-2023
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Вашими подсказками удалось получить то, что нужно!

Код:
 
$request_headers = array();
$url = 'http://10.0.5.1/sse';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_PORT, 8008);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'myfunc');
 
if(count($request_headers) > 0){
    curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
}
 
$result = curl_exec($ch);
curl_close($ch);
 
function myfunc($ch, $data){
 
    $bytes = strlen($data);
 
    static $buf = '';
    $buf .= $data;
 
    while(1){
 
        $pos = strpos($buf, "\n");
            if($pos === false){
            break;
        }
 
        $data = substr($buf, 0, $pos+1);
        $buf = substr($buf, $pos+1);
 
        if(strlen($data)>50){
            $results = str_replace("data:","",$data);
            echo $results;
        }
    }
}
 

 
На тестовой странице при каждом обновлении страницы актуальные данные из AIDA64.
 
Mavrikii огромное спасибо, что не бросаете нубов в биде!

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 08:05 31-01-2023
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » PHP получить данные от Aida64


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru