EnglishRussian

Передача данных с помощью Cosmo WiFi Connect

В данном руководстве рассматриваются примеры реализации обмена данными по беспроводной сети WIFI посредством шилда «Cosmo WiFi Connect», построенного с использованием модема «WIZ610wi».

Технически, обмен данными осуществляется по схеме: «Serial to Wireless».
Модем реализует соединение в трех режимах:

  • в режиме сервера
  • в режиме клиента
  • в смешанном режиме

В режиме сервера шилд ожидает соединения со стороны клиента. Он принимает пакеты из беспроводной сети и направляет их в последовательный интерфейс (UART). Полученные пакеты можно направлять как на порт компьютера (подключенного к шилду), так и на микроконтроллер Ардуино.

В режиме клиента шилд организует соединение с удаленным сервером, на который с заданной периодичностью отправляет пакеты с данными. Данные можно отправлять как со стороны компьютера (подключенного к шилду), так и со стороны микроконтроллера Ардуино.

В смешанном режиме доступны оба варианта соединения.

Модем поддерживает соединения по протоколам TCP и UDP.

TCP — «гарантированный» транспортный механизм с предварительным установлением соединения, предоставляющий приложению надёжный поток данных, дающий уверенность в безошибочности получаемых данных, перезапрашивающий данные в случае потери и устраняющий дублирование данных. TCP позволяет регулировать нагрузку на сеть, а также уменьшать время ожидания данных при передаче на большие расстояния. Более того, TCP гарантирует, что полученные данные были отправлены точно в такой же последовательности.

UDP протокол передачи датаграмм без установления соединения. Также его называют протоколом «ненадёжной» передачи, в смысле невозможности удостовериться в доставке сообщения адресату, а также возможного перемешивания пакетов. В приложениях, требующих гарантированной передачи данных, используется протокол TCP. UDP обычно используется в таких приложениях, как потоковое видео и компьютерные игры, где допускается потеря пакетов, а повторный запрос затруднён или не оправдан, либо в приложениях вида запрос-ответ (например, запросы к DNS), где создание соединения занимает больше ресурсов, чем повторная отправка.

Для работы с WiFi-шилдом потребуется:

  • Базовая плата (Arduino, Cosmo Black Start или другие аналоги)
  • Шилд «Cosmo WiFi Connect» с подключенной антенной
  • USB-кабель, тип A-B
  • Программа «Device Terminal» (скачать)
  • Компьютер

Настройка сетевого соединения

Настройка сетевых параметров шилда «Cosmo WiFi Connect» возможна через UART и через WEB интерфейс.

Рассмотрим пример конфигурации сети через UART. В этом случае настройка сетевых параметров осуществляется с помощью управляющих команд через терминальную программу. Например, через «Device Terminal».

Вставьте шилд «Cosmo WiFi Connect» в базовую плату Ардуино. Для настройки конфирурации модема «WIZ610wi» установите джампера 1 и 2 в положение FTDI (1-2), а джампер 5 в положение 2-3.

Подключите базовую плату к компьютеру посредством USB-кабеля. Запустите программу «Device Terminal». В списке «Serial Port» укажите соответствующий порт, к которому подсоединен Ардуино. Выберите в списке «Baud Rate» скорость обмена 38400. И далее нажмите кнопку «Open». Наберите в строке ввода терминала команду <RF> и далее нажмите кнопку «Send». В ответ вернется строка с текущей версией прошивки. Если все получилось — значит все настройки джамперов выставлены верно и теперь можно приступить к конфигурации сети. Подробнее можно посмотреть в инструкции пользователя.

В качестве примера настройки сетевого подключения рассмотрим случай — использования шилда в режиме клиента. У нас есть развернутая беспроводная сеть, к которой мы хотим подключить наше устройство. Для этого в «Device Terminal» набираем последовательно следующие команды:

Запрос Ответ Комментарий
<RF>   запрашиваем версию прошивки
  <Sv1.1.24> модуль отвечает, что версия прошивки v1.1.24
<GO3>   выставляем модуль в режим клиента
  <S> ответ означает — Command was successful
Обратите внимание, что во время выполнения данной операции, на шилде загорелся красный светодиод, свидетельствующий об обмене по UART, операция займет 20 секунд.
<DO>   проверим в каком режиме находится модуль
  <S3> ответ S3, означает режим клиента
<DI>   сканируем окружение на наличие беспроводных сетей
  <SWIFI_0022b0625874
_1_67_WPA1-PSK>
ответ, обозначает SSID_BSSID_Channel_RSSI_Security
Т.е. имеется сеть, SSID которой WIFI. К ней мы и подключимся.
<GSWIFI>   выставляем SSID сети
  <S> ответ S, означает успешное выполнение команды
<DS>   проверим значение SSID записанное в настройках модуля
  <SWIFI> значение SSID соответствует WIFI
<GU5_4_0_0_0_
U17qGmb6eyHZMUv>
  выставляем параметры режима безопасности, пароль для доступа
AuthMode: 0(Open or Shared), 1(Open), 2(802.1x), 3(Shared), 4(WPA), 5(WPA-PSK), 6(WPA2), 7(WPA2-PSK)
Encrypt: 0(None), 1(WEP), 2(TKIP), 3(AES), 4(TKIP_AES) KeyLength: 0(None), 1(WEP64), 2(WEP128)
KeyFormat(WEP): 0(Ascii), 1(Hex)
KeyFormat(WPA-PSK): 0(Passphrase), 1(Hex)
  <S> ответ S, означает успешное выполнение команды
Ждем несколько секунд пока не перестанет светиться красный светодиод
<QP>   проверим подсоединение к беспроводной сети
  <S1_WIFI_0022b0625874
_1_54M_67>
ответ означает об успешном соединении с сетью под именем WIFI
При наличии соединения с сетью горит и мигает желтый светодиод.
<RI>   проверим выделенный маршрутизатором IP-адрес
  <S192.168.1.5> назначенный маршрутизатором айпишник 192.168.1.5

Запустите на вашем компьютере интернет-браузер и перейдите на полученный ip-адрес (192.168.1.5). Для авторизации в веб-интерфейсе модуля впишите логин/пароль (admin/admin). Обратите внимание, что доступ к данному ресурсу осуществляется по беспроводной сети. Теперь шилд подключен к сети, переходим следующему шагу.

Настройка режима соединения

Прежде всего вам необходимо определиться в требуемом вам режиме соединения — сервер, клиент, смешанный. Режимы задаются через команды по UART или через веб-интерфейс.

Для выставления режима «Сервер» нужно задать:

  • протокол <RK0> (TCP)
  • номер порта <WP8005> (8005)
  • активировать режим <WM2> (режим сервера)

Для выставления режима «Клиент» нужно задать:

  • протокол <RK0> (TCP)
  • адрес сервера <WWdemoserver.ru> (или его IP - WW195.168.1.58)
  • номер порта сервера <WP8005> (8005)
  • активировать режим <WM0> (режим клиента)

Примеры работы с данными

После настроек конфигурации шилда через последовательный интерфейс, необходимо джампер 5 выставить в положение 1-2. В этом случае активируется режим «Serial to Wireless». В другом положении джампера, этот интерфейс будет неактивным. Положение 2-3 используется только для настройки шилда через UART.

 

Пример кода: Шилд в режиме сервера

 

Этот режим полезен, когда нужно собирать данные от других устройств сети. Например, от удаленных датчиков для анализа и сохранения данных в хранилище. Другой пример реализации — это беспроводное управление, например роботом или какой-нибудь мобильной платформой. Шилд получает команды, которые анализируется в микроконтроллере и в зависимости от поступившей команды, устройство перемещается или выполняет какие-то заданные действия...

Рассмотрим случай, когда данные нам нужно обрабатывать на компьютере. Подсоединим Ардуино к компьютеру, на шилде выставим джампера 1 и 2 в режим FTDI (чтобы данные поступали сразу на ПК). Все, шилд к приему данных готов. Запустите любую терминальную программу для прослушивания последовательного порта. Например, можно запустить Arduino IDE и включить Serial Monitor для отслеживания поступающих от Ардуино данных.

Далее — напишем простенький скрипт на питоне, который будет осуществлять функцию клиента — т.е. будет отправлять данные на наш шилд. Причем скрипт сперва отправит данные (hello, world!), подождет от сервера ответ и лишь потом соединение будет разорвано.

Итак, создаем на компьютере файл client.py и вставляем в него следующий код. Не забудьте указать в вашем скрипте правильный IP и порт вашего сервера (шилда).

#!/usr/bin/env python
#-*- coding: utf-8 -*-
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
from twisted.internet import reactor, protocol
class EchoClient(protocol.Protocol):
    """Once connected, send a message, then print the result."""
    def connectionMade(self):
        self.transport.write("hello, world!")
    def dataReceived(self, data):
        "As soon as any data is received, write it back."
        print "Server said:", data
        self.transport.loseConnection()
    def connectionLost(self, reason):
        print "connection lost"
class EchoFactory(protocol.ClientFactory):
    protocol = EchoClient
    def clientConnectionFailed(self, connector, reason):
        print "Connection failed - goodbye!"
        reactor.stop()
    def clientConnectionLost(self, connector, reason):
        print "Connection lost - goodbye!"
        reactor.stop()

# this connects the protocol to a server runing on port 8005
def main():
    f = EchoFactory()
    reactor.connectTCP("192.168.1.5", 8005, f)
    reactor.run()

# this only runs if the module was *not* imported
if __name__ == '__main__':
    main()

Запустите в вашей операционной системе скрипт client.py. И затем посмотрите в окошко программы Serial Monitor, в ней должно появиться строка «hello, world!» Если это так, значит программа-клиент успешно отправила пакет на сервер и ожидает от него ответной реакции. Напишите в Serial Monitor произвольный текст и нажмите кнопку Send. Набранный вами текст отправится в ответ клиентской программе (client.py) и в терминале программы отобразится полученная строка, соединение закроется.

 

Пример кода: Шилд в режиме клиента

 

Этот режим полезен, когда с удаленного устройства нужно передать данные на центральное устройство. Отправка данных с датчиков, например в системе «Умный дом» и т.п.

Рассмотрим пример отправки данных с шилда на удаленный компьютер. Например, к аналоговому порту (пин 0) Ардуино подключен датчик, микроконтроллер считывает его показания и отправляет данные на удаленный хост. Напишем несложный скетч для микроконтроллера, который будет опрашивать каждые 5 секунд датчик и отсылать значения в последовательный порт.

long previousMillis = 0;
long interval = 5000;

void setup() {
  Serial.begin(86400);
}

void loop() {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    Serial.println(analogRead(0));
  }

}

Запишите этот скетч в микроконтроллер Ардуино. Затем вставьте шилд в базовую плату Ардуино и на шилде «Cosmo WiFi Connect» переключите джампера 1 и 2 в положение ATMEGA. Включите устройство. Теперь шилд отправляет данные на указанный IP сервера. Проверим какие данные получает сервер.

Для этого напишем простенький скрипт, который будет осуществлять роль сервера — т.е. будет принимать данные. Создайте на вашем компьютере файл server.py и вставьте в него следующий код.

#!/usr/bin/env python
#-*- coding: utf-8 -*-
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
class Echo(Protocol):
	def dataReceived(self, data):
	    print "data:", data
	    self.transport.write(data.upper())
def main():
	f = Factory()
	f.protocol = Echo
	PORT = 8005
	print "simple ECHO server start! on port:", PORT
	reactor.listenTCP(PORT, f)
	reactor.run()

if __name__ == '__main__':
    main()

Запустите в вашей операционной системе скрипт server.py. В открывшемся терминале программы будут выводится данные, присылаемые шилдом.

Обратите внимание, что скрипт server.py должен быть запущен на компьютере, IP которого был указан в настройках режима соединения. Иначе данные будут уходить по другому адресу.

Если у вас возникли какие-либо вопросы по конфигурации или использованию шилда — пишите на наш форум.