Home / Posts / Электроника / Arduino клиент, чтение RSS и API, парсинг статистики /


Arduino клиент, чтение RSS и API, парсинг статистики



Arduino и Ethernet shield позволяют конструировать различные интересные устройства - серверы, с которых можно читать показания датчиков и управлять реальной схемой, и клиенты, которые могут заходить на сайты и парсить информацию - погоду, расписание, социальные сети и тд.

Мне было интересно сделать счетчик посещаемости для сайта, который выводил бы число посещений на lcd дисплей.

Для этого удобно использовать API Яндекс Метрики. Просмотрев документацию, можно сформировать ссылку, по которой будут доступны параметры посещений.

В моем скетче периодически формируется запрос к Метрике, загружается строка с параметрами, и с помощью довольно неуклюжего парсинга извлекается число просмотров, которое выводится на lcd экран.

 

#include <SPI.h>
#include <Ethernet.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,0,104);
// fill in your Domain Name Server address here:
IPAddress myDns(85, 95, 165, 60);
// initialize the library instance:
EthernetClient client;
char server[] = "api-metrika.yandex.ru";
//IPAddress server(64,131,82,241);
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 10L * 1000L; // delay between updates, in milliseconds
// the "L" is needed to use long type numbers
String currentLine = "";
String par = "page_views";
boolean readnum = false;
String num = "";
String num_ = "";
int visits = 0;
void setup() {
// start serial port:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// give the ethernet module time to boot up:
delay(1000);
// start the Ethernet connection using a fixed IP address and DNS server:
Ethernet.begin(mac, ip, myDns);
// print the Ethernet board/shield's IP address:
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
display.begin();
display.setContrast(50);
display.clearDisplay();
}
void loop() {
// if there's incoming data from the net connection.
// send it out the serial port. This is for debugging
// purposes only:
if (client.available()) {
char c = client.read();
if (c != '"' && c != ' ' && c != ','){
currentLine += c;
}
if (c == '\n') {
currentLine = "";
readnum = false;
num = "";
}
if (readnum){
if (c != '"' && c != ' ' && c != ',' && c != ':' && c != '\n') {
num += c;
num_ = num;
}
}
if (currentLine == par){
readnum = true;
}
}
// if ten seconds have passed since your last connection,
// then connect again and send data:
if (millis() - lastConnectionTime > postingInterval) {
httpRequest();
}
}
// this method makes a HTTP connection to the server:
void httpRequest() {
// close any connection before send a new request.
// This will free the socket on the WiFi shield
display.clearDisplay();
client.stop();
int v = num_.toInt();
if (visits < v){
visits = v;
tone(8, 300, 1000);
}
Serial.println(visits);
display.setTextSize(3);
display.println(visits);
display.setTextSize(1);
num_ = "";
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println("connecting...");
display.println("connecting...");
// send the HTTP PUT request:
client.println("GET /stat/traffic/summary.json?id=27271130&pretty=1&date1=today&oauth_token=3542d886aef54a75871b76d13601fc9f HTTP/1.1");
client.println("Host: api-metrika.yandex.ru");
client.println("User-Agent: arduino-ethernet");
client.println("Connection: close");
client.println();
// note the time that the connection was made:
lastConnectionTime = millis();
} else {
// if you couldn't make a connection:
Serial.println("connection failed");
display.println("connection failed");
delay(3000);
}
display.display();
}

 

Вот как все это выглядит на практике.

 

 

Еще есть интересная идея парсить rss - ленту с сайта, чтобы всегда быть в курсе новых статей.

Я пробовал парсить rss ленту сайта masculist.ru.

Не особо вникая в приемы парсинга, я воспользовался тем фактом, что rss у данного сайта выводится построчно, а значит, можно вычислить номер нужной нам строки с датой последней публикации, извлечь ее и вывести на экран. И заодно подать звуковой сигнал, если статья новая.

В любой rss ленте есть тег <pubDate>, который нам и нужен. Строка под номером 27 (с учетом ответа сервера)

 

#include <SPI.h>
#include <Ethernet.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,0,104);
// fill in your Domain Name Server address here:
IPAddress myDns(85, 95, 165, 60);
// initialize the library instance:
EthernetClient client;
char server[] = "www.masculist.ru";
//IPAddress server(64,131,82,241);
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 10L * 1000L; // delay between updates, in milliseconds
// the "L" is needed to use long type numbers
String currentLine = "";
String num = "";
int visits = 0;
int numstring = 27;
int buttonState = 0;
void setup() {
// start serial port:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
pinMode(9, OUTPUT);
pinMode(8, INPUT);
digitalWrite(9, HIGH);
// give the ethernet module time to boot up:
delay(1000);
// start the Ethernet connection using a fixed IP address and DNS server:
Ethernet.begin(mac, ip, myDns);
// print the Ethernet board/shield's IP address:
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
display.begin();
display.setContrast(60);
display.clearDisplay();
}
void loop() {
buttonState = digitalRead(8);
if (buttonState == LOW) {
digitalWrite(9, HIGH);
}
// if there's incoming data from the net connection.
// send it out the serial port. This is for debugging
// purposes only:
if (client.available()) {
char c = client.read();
// Serial.print(c);
currentLine += c;
if (c == '\n') {
visits ++;
if (visits<numstring){
currentLine = "";
} else {
visits = 0;
client.stop();
}
}
}
// if ten seconds have passed since your last connection,
// then connect again and send data:
if (millis() - lastConnectionTime > postingInterval) {
httpRequest();
}
}
// this method makes a HTTP connection to the server:
void httpRequest() {
// close any connection before send a new request.
// This will free the socket on the WiFi shield
display.clearDisplay();
client.stop();
if (num != currentLine){
num = currentLine;
tone(9, 300, 1000);
digitalWrite(9, LOW);
}
Serial.println(num);
display.setTextSize(1);
display.println(num);
display.setTextSize(1);
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println("connecting...");
display.println("connecting...");
// send the HTTP PUT request:
client.println("GET /rss/feed.rss HTTP/1.1");
client.println("Host: www.masculist.ru");
client.println("User-Agent: arduino-ethernet from catgotobed");
client.println("Accept-Language: ru");
client.println("Accept-Charset: windows-1251;q=0.7,*;q=0.7");
client.println("Connection: close");
client.println();
// note the time that the connection was made:
lastConnectionTime = millis();
} else {
// if you couldn't make a connection:
Serial.println("connection failed");
display.println("connection failed");
delay(3000);
}
display.display();
}

 

 

Не копал эту тему, но предполагаю что с таким же успехом можно сделать аппаратного бота, который будет общаться в социальных сетях, хранить пароли, и тд и тп.


,






Еще статьи по теме


Arduino и Ethernet shield, подключение к интернету
Управление сервоприводом на Arduino и принцип работы




Свежие статьи


Часы на газоразрядных индикаторах ИН-8
Инфракрасный барьер своими руками
Светодиодное освещение - продолжение эволюции
Часы на газоразрядных индикаторах ИН-12 (Nixie Clock)
Светодиодное освещение своими руками



Главная



Комментарии (0)











Мужской Проект

Подписка


Поиск