macsbug

Just another WordPress.com site

Communicate ESP8266 and iPad directly with UDP

leave a comment »

ESP8266 と iPad を UDP で 直接通信する方法。              2016.11.20

直接通信は インターネット無しで 接続が可能です。特に外出時に便利です。
相手側は ESP8266 や PC でも直接通信が可能になります。
既に ネット上で解説記事がありますが 備忘録として まとめました。

便利な直接通信:
以前の記事「Display the graph on the iPad」でセンサーの値を ネットワーク
経由 ( 家庭内LAN経由 ) iPadで受信し 表示する方法がありました。
しかし 目の前にある装置に ネット経由で接続する必要は無い事と 外では
無線環境が無い事や ネット経由で簡単に通信が出来ない 場合があります。
.
そこで ESP8266 と iPad を 直接通信する事により ネット環境が無くとも
接続が可能になります。さらに 通信費用もかかりません。
ESP8266 (192.168.4.1:9000) → iMac(192.168.4.2:9000) : IP,PORT
ESP8266 (192.168.4.1:7000) ← iMac(192.168.4.2:7000) : IP,PORT

フィードバックの必要性:
装置間の通信は 相手が指示通りの状態になったか 確認が必要です。
送信後に 相手の結果 を受信する必要があり 通信が回転します。



 

ESP8266 の設定: WiFiUDP を使用し PORT を設定する。

// ESP8266
#include <ESP8266WiFi.h>                 // WiFi
#include <WiFiUDP.h>                     // UDP
const char *ssid = "wifi";               // SSID
const char *pass = "";                   // PASSWORD
static WiFiUDP udp;                      // UDP Object
#define ESP_RX_PORT 7000                 // ESP Receiver port
#define ESP_TX_PORT 9000                 // ESP Transmit Port
IPAddress ESP_IP;                        // ESP IP 192.168.4.1
IPAddress EXT_IP;                        // ext IP 192.168.4.2
char buff[32];                           // receive buffer

void setup(){
 WiFi.mode(WIFI_AP);                     // AP Mode:direct connection
 WiFi.softAP(ssid, pass);                // ESP8266:SSID, password
 ESP_IP = WiFi.softAPIP();               // 192.168.4.1 localIP
 udp.begin(ESP_RX_PORT);                 // ESP:UDP Rx port=7000


 

iPad の設定: socket を使用し IP と PORT を設定する。

// iPad
import socket
HOST, PORT = '192.168.4.1', 7000          # ESP8266 ip,port
rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
rx.bind(('192.168.4.2', 9000))            # ipad tx port
tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


 

ESP8266 から 送信する。

// ESP8266 transmitt
String data = "t/0/0/0";                  // 送信データ
udp.beginPacket(EXT_IP, ESP_TX_PORT);     // Packet transmit
udp.print(data);                          // data   transmit
udp.endPacket();                          // end of transmit

iPad で 受信する。

// iPad receiver
udp udp_receiver('')                     # ipad を受信状態にする
while mode != 'd':                       # 受信データの中味を確認する

udp_receiver('1')                        # 音声出力時の為の socket を遮断する

def udp_receiver(s);                     # udp 受信ルーチン
 gloval rx, d1, d2, temp, humi           # 共通変数
 if s == "1": rx.setblocking(1)          # socketの遮断をする
 d1 = str(rx.recv(32), 'utf-8')          # rx : socket を受信する
 d2 = d1.split('/')                      # '/' で区切られたデータを d2[] に一括保存する
 mode = d2[0]                            # 受信データの先頭 [0]
 if mode == "d":                         # 先頭データが "d" の場合の処理をする
  temp = round(float(d2[1]), 1)          # 受信データの分類その1
  humi = round(float(d2[2]), 1)          # 受信データの分類その2


 

iPad から 送信する。

// iPad transmitt
udp_transceiver('1')                      # ipad -> ESP8266   '1' を送信する
udp_receiver('1')                         # '1' に対する ESP8266 の返事を受信する
ret = str(mode) + str(sw)                 # 受信したデータ
while (ret) != 't1':                      # 't1' の場合の処理をする

def udp_transceiver(s);                   # udp 送信ルーチン
 global tx, HOST, PORT                    # 共通変数
 tx.sendto(bytes(s,'utf-8'),(HOST,PORT))  # データ s を送信する

ESP8266 で 受信する。

// ESP8266 receiver
int rx = udp.parsePacket();              // Packet 受信状態を調べる
 if (rx) {                               // 受信がある場合の処理をする
  int len = udp.read(buff,rx);           // 受信(buff)の長さを調べる
  if (len>0)buff[len] = '\0';            // 受信がある場合の処理をする
   ipad_RX_IP = udp.remoteIP();          // iPad IP 192.168.4.2
   buff[len] = '\0';                     // Termination charactor
   int c = buff[0];                      // header:受信データの先頭
   if ( c == '1' ){                      // header:受信データの先頭
                                         // 受信データの処理をする


 

感想:
無線環境:目の前にある装置にインターネット経由で接続する必要は
_ 無い事とネット回線の無い所でも自由に接続して使用できる訳で
_ す。
.
IP アドレス:最初は 192.168.4.2 が自動的に割り振られます。
_ もう一台追加すると 192.168.4.3 が 割り振られます。
.
フィードバックの重要性:温度測定程度ならフィードバックは必要
_ ないかも知れませんが IoTで遠隔操作や特に電力をコントロール
_ する時はかならず必要です。航空機では2重3重の回路やソフト
_ がありフィードバックも含め 安全性が確保されています。
_ この様な視点で IoT 製品がどの程度 安全な製品であるかを仕様
_ として表示していない場面が多いのを見受けます。
_ 又 その商品を説明するメディアや記事も同様です。
.
ワイヤレス:直接通信の例として 3軸アクセレーターやジャイロの装置
_ から データをWiFiでPCに送り PCの画面に表示ができる様になり
_ ワイヤレスの小型モーションセンサー等が出来ます。
_ こうした装置のワイヤレス環境はなかなか面白い感覚です。次回!
_  



Written by macsbug

11月 20, 2016 @ 10:00 am

カテゴリー: ESP8266

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。