• Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
Sign in to follow this  
Followers 0
Админ

Управление Omega 2 через WebSocket-сервер

1 post in this topic

Всем привет!

Сегодня мы рассмотрим простой, но интересный пример коммуникации с Омегой через WebSocket.

omega2-tornado-websocket-example.gif

Для начала определимся, что нам необходимо для этого проекта:

  • Onion Omega2+
  • Onion Omega2 Expansion Dock
  • Onion Omega2 OLED Display

Можно использовать и Omega2 (вместо Omega2+), но необходимо будет расширить память.

В проекте будет использоваться Python 2.7+. Итак, начнем.

Подключаемся к Омеге и прописываем следующие команды:

opkg update
opkg install python python-pip pyOledExp

Вышеупомянутые команды установят Python вместе с менеджером пакетов PIP и модулем OLED Python. Используя pip, мы можем скачать пакет websocket под названием Tornado. Его можно установить, выполнив следующую команду:

pip install tornado

Принимающим концом нашего websocket-соединения будет websocket-сервер. Клиенты, такие как веб-браузеры, мобильные приложения, игры и т. д., могут подключаться к нему и отправлять ему сообщения. Далее принимается решение, что делать с этим сообщением, должно ли оно выполнять какое-то действие или возвращаться обратно каким-то другим сообщением.

Создадим новый файл на Вашей Омеге, к примеру по адресу /root/example.py. Как работать с файловой системой рассказано здесь: 

И наполняем файл следующим кодом:

from OmegaExpansion import oledExp
import tornado.ioloop
import tornado.websocket

class IoTWebsocket(tornado.websocket.WebSocketHandler):

    def check_origin(self, origin):
        return True

    def open(self):
        print("Websocket Opened")

    def on_message(self, message):
        oledExp.clear()
        oledExp.setCursor(3, 0)
        oledExp.write("RECEIVED MESSAGE:")
        oledExp.setCursor(4, 0)
        oledExp.write(message)

    def on_close(self):
        print("Websocket Closed")

def make_app():
    return tornado.web.Application([
        (r"/", IoTWebsocket),
    ])

if __name__ == "__main__":
    oledExp.driverInit()
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Немного подробнее о коде. Сначала мы импортируем модуль OLED вместе с Tornado. Затем мы создаем класс, называемый IoTWebsocket, который будет действовать в качестве маршрута, когда Tornado определит, что это соединение с websocket. Этот класс IoTWebsocket будет следить за событиями open, close и messaging. Поскольку наш клиент будет находиться на другом хосте и порту, мы также сообщаем Tornado, что мы хотим разрешить перекрестные подключения.

Когда клиент отправляет сообщение Omega2, мы определяем позицию курсора OLED и печатаем сообщение на экране.

При запуске приложения мы инициализируем экран и запускаем наш сервер по адресу http: //omaga-yyy.local: 8888, где yyy - это аппаратный адрес вашего устройства.

Наше Python-приложение можно запустить на Omega2, выполнив следующую команду:

python /root/example.py

Теперь нам нужно "состряпать" простенький клиент, для отправки сообщения на наше устройство. Для этого на компьютере создаем HTML файл со следующим кодом (только поменяйте адрес на тот, что у Вас):

<!DOCTYPE html>
<html lang="en">
    <body>

        <input type="text" placeholder="Message" id="textbox">
        <button id="button">Send</button>

        <script>
            var socket = new WebSocket("ws://omega-6c4f.local:8888");
            var button = document.getElementById("button");

            button.addEventListener("click", function(event){
                var text = document.getElementById("textbox").value;
                socket.send(text);
                document.getElementById("textbox").value = "";
            });

            window.onbeforeunload = function(event){
                socket.close();
            }
        </script>

    </body>
</html>

В приведенном выше HTML-коде у нас есть поле ввода и кнопка отправки. Во встроенном скрипте мы устанавливаем соединение с сервером Omega2 Tornado и "прослушиваем" клики на кнопке. Если обнаружено нажатие, мы отправляем значение сообщения на другой конец нашего открытого сокета. Полученное сообщение будет представлено на OLED-дисплее.

Подведем итоги

Вы только что видели, как связываться с вашим Onion Omega2 через WebSockets. В этом примере мы взяли информацию WebSocket и отобразили его на OLED-дисплее, но эти концепции можно легко применить и к более сложным проектам, таким как домашняя автоматизация, связь с робототехникой или что-то еще. Например, если у вас есть датчики для Omega2, вы можете отправлять свои данные в режиме реального времени другим пользователям.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0