{
"kind": "youtube#channelListResponse",
"items": [
{
"kind": "youtube#channel",
"etag": "\"_gJQceDMxJ8gP-8T2HLXUoURK8c/Ea_ipJwsnrECB064UURA_RcRR0Y\"",
"id": "UCzz4CoEgSgWNs9ZAvRMhW2A",
"statistics": {
"viewCount": "30872448",
"commentCount": "313",
"subscriberCount": "258797",
"hiddenSubscriberCount": false,
"videoCount": "303"
}
}
]
}
Фигурными скобками обозначается элемент dictionary, доступ к элементам которого осуществляется через квадратные скобки - data["items"] вернет раздел items. Дальше смотрим на сам items: квадратные скобки в json обозначают массив, таким образом "items": [{... }] это массив из одного элемента типа dictionary, обратиться к нему можно как data["items"][0]. Дальше все аналогично, внутри есть еще один вложенный dictionary statistics, внутри него есть поле subscriberCount. Кстати, что такое dictionary, хорошо видно по полю statistics. Это так называемый “словарь” из парных элементов вида “имя”-”значение”, например { "viewCount": "30872448", "commentCount": "313", "subscriberCount": "258797" }.
Формат json сейчас является де-факто стандартом в web, за счет возможности описывать сложные иерархические структуры данных. Примеры разных файлов json желающие могут посмотреть на http://json.org/example.html. Поэтому при желании получать данные с различных веб-сервисов, нужно будет понимать как этот формат устроен.
Кстати, для отладки удобно выводить json прямо из Python, для этого достаточно стандартной функции print:
data = json.load(urllib2.urlopen(url))
print data["items"]
print data["items"][0]
print data["items"]["statistics"]
Так легко видеть, не ошиблись ли мы где-нибудь с полями данных.
4.9. Выходим в Web: запускаем свой серверТеперь рассмотрим обратную задачу - запустим свой сервер, который пользователь сможет открыть в браузере. Разумеется, Raspberry Pi имеет полноценную ОС Linux, и здесь можно запустить хоть Apache, хоть FTP. Но это не так интересно - мы запустим собственный сервер, который напишем на языке Python.
Для начала - самое простое, чего в 95% случаев будет вполне достаточно. Если мы хотим просто дать пользователю доступ к текущей папке, то в консоли достаточно ввести команду:
python -m SimpleHTTPServer 8000
Пользователь сможет зайти из браузера и увидеть (и скачать) любой файл:
Если нужно что-то посложнее, например управлять каким-либо устройством, придется написать свой код.
Рассмотрим минимальный пример работающего web-сервера на Python. Для примера, будем управлять светодиодом, как и в случае c ESP32. Но в отличие от ESP32, Raspberry Pi полноценно может работать с файлами, так что хранить HTML прямо в коде не требуется, просто сохраним файл как index.html.
<html>
<head><title>Raspberry Pi server</title></head>
<body>
Turn <a href="/H">LED ON</a><br>
Turn <a href="/L">LED OFF</a><br>
</body>
</html>
Сам код сервера будет весьма прост. Естественно, это минимальный пример, реальный веб-сервер может поддерживать практически все современные технологии - POST и GET-запросы, Javascript и пр. Полет фантазии тут неограничен. Нам же будет достаточно следующего кода:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class Server(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
with open('index.html', 'r') as myfile:
data = myfile.read()
self.wfile.write(data)
if "/H" in self.path:
print "LED ON"
if "/L" in self.path:
print "LED OFF"
if __name__ == "__main__":
server_address = ('', 8000)
httpd = HTTPServer(server_address, Server)
print 'Starting httpd...'
try:
httpd.serve_forever()
except:
pass
print 'Done'
Самостоятельная работа: дописать код включения и выключения светодиода вместо функции print "LED ON" и print "LED OFF". Перед вызовом сервера serve_forever также нужно будет дописать код инициализации GPIO.
4.10. Дистанционное управление со смартфонаС помощью портов ввода-вывода мы уже можем управлять внешними устройствами, например платой управления двигателем. Мы также можем запустить собственный сервер, как было показано выше. Добавим в наш сервер возможность реакции на нажатие и отпускание кнопок, это позволит использовать смартфон как полноценный пульт дистанционного управления. Такой интерфейс сейчас весьма популярен и используется, например, для управления мини-дронами.
Наш интерфейс, впрочем, будет попроще - сделаем страницу с всего двумя кнопками LEFT и RIGHT, при нажатии на которые на Raspberry Pi будут генерироваться соответствующие события.
Основная работа здесь будет в модификации файла index.html - в него мы добавим код, срабатывающий при нажатии и отпускании кнопок. Это позволит например, управлять радиоуправляемым танком, если поставить на него Raspberry Pi.
Для создания кнопки в HTML есть тег button, а для подписки на события нажатия и отпускания мы будем использовать Javascript, который поддерживается всеми браузерами.
Обновленный код index.html приведен ниже.
<html>
<head><title>Raspberry Pi server</title></head>
<body>
<button id="btn_left" type="button" style="height:60px;width:60px">Left</button>
<button id="btn_right" type="button" style="height:60px;width:60px">Right</button>
<script>
document.getElementById("btn_left").onmousedown = function() { mouseDownL() };
document.getElementById("btn_left").onmouseup = function() { mouseUpL() };
document.getElementById("btn_left").onmouseleave = function() { mouseUpL() };
document.getElementById("btn_right").onmousedown = function() { mouseDownR() };
document.getElementById("btn_right").onmouseup = function() { mouseUpR() };
document.getElementById("btn_right").onmouseleave = function() { mouseUpR() };
function httpGetAsync(theUrl, callback) {
console.log('httpGetAsync: ' + theUrl);
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
// callback(xmlHttp.responseText);
console.log(xmlHttp.responseText);