Программируем Arduino. Основы работы со скетчами
Шрифт:
Рис. 12.6. Получение информации о погоде от веб-службы
Скетч для этого примера получился очень коротким, всего 45 строк кода (sketch_12_03_web_request). Наибольший интерес для нас представляет функция hitWebPage:
void hitWebPage
{
if (client.connect("api.openweathermap.org", 80))
{
client.println("GET /data/2.5/weather?q=Manchester,uk HTTP/1.0");
client.println;
while (client.connected)
{
if (client.available)
{
client.findUntil("description\":\"", "\0");
String description = client.readStringUntil('\"');
Serial.println(description);
}
}
client.stop;
}
}
Прежде
client.println("GET /data/2.5/weather?q=Manchester,uk HTTP/1.0");
Дополнительная команда println нужна, чтобы отметить конец заголовка запроса и побудить сервер прислать ответ.
Далее в цикле while инструкция if проверяет получение данных от сервера, пока соединение с ним не закрыто. Непосредственное чтение данных из потока помогает избежать необходимости сохранять все данные в памяти. Данные поступают в формате JSON:
{"coord":{"lon":-2.23743,"lat":53.480949},
"sys":{"country":"GB","sunrise":1371094771,
"sunset":1371155927},"weather":[{"id":520, "main":"Rain",
"description":"light intensity shower rain", "icon": "09d"}]
"humidity":87,"temp_min":283.15,"temp_max":285.93},
"wind":{"speed:5.1,"deg":270},"rain":{"1h":0.83},
"clouds":{"all":40},"dt":1371135000,"id":3643123,
"name":"Manchester","cod":200}
Функция hitWebPage с помощью функций findUntil и readStringUntil извлекает фрагмент текста, следующий за словом «description», с двоеточием и двойной кавычкой до следующей двойной кавычки.
Функция findUntil просто игнорирует все, пока не встретит указанную строку. Затем функция readStringUntil читает текст из потока, пока не встретит двойную кавычку.
Библиотека WiFi
Библиотека WiFi, как можно было ожидать, очень похожа на библиотеку Ethernet. Если в скетче заменить Ethernet на WiFi, EthernetServer на WiFiServer и EthernetClient на WiFiClient, остальной код останется почти неизменным.
Создание соединения
Главное отличие библиотеки WiFi от Ethernet заключается в подключении к сети. Прежде всего нужно импортировать библиотеку WiFi:
#include <SPI.h>
#include <WiFi.h>
Чтобы установить соединение с сетью, следует вызвать команду WiFi.begin и передать ей имя беспроводной сети и пароль:
WiFi.begin("MY-NETWORK-NAME", "mypassword");
Пример в разделе «Пример использования WiFi» иллюстрирует еще одно отличие, о котором вы должны знать.
Особые функции в библиотеке WiFi
Библиотека WiFi включает несколько специальных функций. Они перечислены в табл. 12.1.
Полное описание библиотеки WiFi можно найти по адресу http://arduino.cc/en/Reference/WiFi11.
Таблица 12.1. Специальные функции в библиотеке WiFi
Функция
Описание
WiFi.config
Позволяет установить статические IP-адреса платы, сервера имен (DNS) и шлюза
WiFi.SSID
Возвращает строку идентификатора беспроводной сети SSID
WiFi.RSSI
Возвращает значение мощности сигнала типа long
WiFi.encriptionType
Возвращает числовой код, соответствующий методу шифрования
WiFi.scanNetworks
Возвращает количество найденных сетей, но никакой дополнительной информации о них не возвращается
WiFi.macAddress
Помещает MAC-адрес адаптера WiFi в шестибайтный массив, переданный как параметр
Пример использования WiFi
Для этого примера я изменил скетч sketch_12_02_server, адаптировав его для работы с платой расширения WiFi. Полный исходный код можно найти в скетче sketch_12_04_server_wifi. Я не буду повторять пример целиком, только отмечу отличия от оригинальной версии.
Чтобы подключиться к беспроводной точке доступа, нужно указать имя беспроводной сети и пароль:
char ssid[] = "My network name"; // имя сети (SSID)
char pass[] = "mypassword"; // пароль для доступа к сети
Также нужно изменить имена классов сервера и клиента, EthernetServer и EthernetClient, на WiFiServer и WiFiClient:
WiFiServer server(80);
WiFiClient client;
При определении объекта сервера все так же требуется указать номер порта 80.
Следующее ракзличие между двумя платами заключается в инициализации подключения. В данном случае должна использоваться команда
WiFi.begin(ssid, pass);
Прочий код остался почти без изменений. В функции loop вы увидите команду delay(1) перед остановкой клиента, она дает клиенту время завершить чтение до того, как соединение будет закрыто. В версии на основе библиотеки Ethernet такая задержка не нужна. Обратите также внимание на то, что кое-где я объединил несколько вызовов client.print в один, чтобы каждый вызов выводил более длинные строки. Этот прием увеличивает скорость взаимодействий, потому что плата WiFi крайне неэффективно обрабатывает короткие строки. Но не забывайте, что каждый отдельный вызов client.print или client.println не может обрабатывать строки длиннее 90 байт — они просто не будут отправлены.