2016年

4月

24日

Arduino iPhone Ethernet シールド 3Lチカ GET POST

ArduinoにEthernet シールドを取り付けてiPhoneでLED(緑色、赤色、青色)3個の Lチカをしてみました。

Arduinoのサイトによれば、デジタルI/Oピンの11、12、13番ピンはSPI通信に使われているようなので、それらのピンにはセンサなどを接続しないことにします。

今回は、Arduino 0012に含まれている「Web Server」というサンプル(File>Sketchbook>Examples>Library-Ethernet>Web Server)を参考にブラウザで閲覧可能なWebベージをアクセスさせます。
基本的な入力情報として、

・MACアドレス
・サーバのIPアドレス
・ポート番号

が必要となります。尚、ローカルネットワーク内から閲覧できる設定にします。

iOS Swift  iLampSwiftSW_GetPost

//

//  ViewController.swift

//  iLampSwiftSW_GetPost

//

//  Created by MAEDAHAJIME on 2016/04/09.

//  Copyright © 2016 MAEDAHAJIME. All rights reserved.

//  EthernetGetPost_00

//  GND PIN

//  LEDライト用PIN番号

//  int ledPin02 = 2;

//  int ledPin03 = 3;

//  int ledPin03 = 4;

 

import UIKit

 

class ViewController: UIViewController {

 

    var sw:String = ""

    

    var flag:Bool = true

    

    override func viewDidLoad() {

        

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        

    }

 

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    

    // セグメント GET/POST選択

    @IBAction func lbSegment(sender: UISegmentedControl) {

        

        print("sender:",sender.selectedSegmentIndex)

        

        switch sender.selectedSegmentIndex {

        case 0:

            

            // GET

            flag = true

            

        case 1:

            

            // POST

            flag = false

            

        default:

            print("Error")

        }

    }

 

    @IBAction func switchPressed01(sender: UISwitch) {

        if sender.on {

            

            //uiSwitch.onTintColor = UIColor.orangeColor()

            // スイッチがオフの時のアウトラインの色を設定

            //uiSwitch.onTintColor = UIColor.blueColor()

            // スイッチがオフの時の背景の色を設定

            

            // turn the LED on

            // スイッチを設定する.

            sw = "$1"

            

            // セグメント true:GET送信 false:POST送信

            GetPostSend()

            

        } else {

            

            // turn the LED off

            // スイッチを設定する.

            sw = "$2"

            

            // セグメント true:GET送信 false:POST送信

            GetPostSend()

        }

    }

    

    @IBAction func switchPressed02(sender: UISwitch) {

        if sender.on {

            

            // turn the LED on

            // スイッチを設定する.

            sw = "$3"

            

            // セグメント true:GET送信 false:POST送信

            GetPostSend()

            

        } else {

            

            // turn the LED off

            // スイッチを設定する.

            sw = "$4"

            

            // セグメント true:GET送信 false:POST送信

            GetPostSend()

        }

    }

    

    @IBAction func switchPressed03(sender: UISwitch) {

        if sender.on {

            

            // turn the LED on

            // スイッチを設定する.

            sw = "$5"

            

            // セグメント true:GET送信 false:POST送信

            GetPostSend()

            

        } else {

            

            // turn the LED off

            // スイッチを設定する.

            sw = "$6"

            

            // セグメント true:GET送信 false:POST送信

            GetPostSend()

        }

    }

    

    // セグメント true:GET送信 false:POST送信

    func  GetPostSend(){

        

        print("flag:",flag)

        

        if flag == true {

            // ArduinoGET送信

            sendValueGetToServer(sw)

        } else {

            // ArduinoPOST送信

            sendValuePostToServer(sw)

        }

    }

    

    // GET送信

    func sendValueGetToServer(stringer: String) {

            

            // slider数値

            // cr(\r) LF(\n) CR:0x0dLF:0x0A '\0':0x00

            let switch01:String = stringer

            let str = "http://192.168.1.10/?sw=\(switch01)"

            //let str = "http://192.168.2.10/?sw=\(switch01)"

            let url = NSURL(string: str)

            let req = NSURLRequest(URL: url!)

        

            print("URL",url)

            

            /*

             * Sessionを生成.

             * NSURLSession:バックグランドで通信できるクラス

             * 使用できる通信プロトコルは HTTP 通信のみ

             */

            let task = NSURLSession.sharedSession()

                       .dataTaskWithRequest(req,completionHandler: {

                ( data, res, err ) in

                if data != nil {

                    

                    // NSData to String 文字コード:UTF-8エンコーディング

                    let text:NSString = NSString(data: data!,

                                  encoding: NSUTF8StringEncoding)!

                    

                    // バックグラウンド処理

                    dispatch_async(dispatch_get_main_queue(), {

                        

                        // データが空ではなかったら

                        //self.label1.text = text as String?

                        print("送信内容",text as String?)

                    })

                } else {

                    dispatch_async(dispatch_get_main_queue(), {

                        

                        //self.label1.text = "error"

                        print("送信error")

                    })

                }

            })

            // タスクの実行.

            task.resume()

        }

    

 

    // POST送信

    func sendValuePostToServer(stringer: String) {

        // slider数値

        // cr(\r) LF(\n) CR:0x0dLF:0x0A '\0':0x00

        let switch01:String = stringer

        

        let post = "Switch=\(switch01)"

        

        print("post:",post)

        

        // String to NSData 文字コード:UTF-8エンコーディング

        let postdata:NSData =

                     post.dataUsingEncoding(NSUTF8StringEncoding)!

        // 通信先のURLを生成.

        let url = NSURL(string: "http://192.168.1.10/")

        //let url = NSURL(string: "http://192.168.2.10/")

     

        print("url:",url)

        

        // POST用のリクエストを生成.

        let req = NSMutableURLRequest(URL: url!)

        

        print("POST req:",req)

        

        // HTTPサーバー送信 POSTのメソッドを指定.

        req.HTTPMethod = "POST"

        

        /*

         * "application/x-www-form-urlencoded"

         * アプリケーション・エックス・フォーム・ユーアーエルエンコーディド

         * フォームの送信のさい、クライアントがWebサーバーに送信する

           Content-Type名の一つ。

         * データはid=dataの形式で、formが複数ある場合は&で区切られる

           (form1=data1&form2=data2)

         * dataURLエンコードされる。

         * 英数字と3種類の記号 _ . - はそのまま、スペースは+に変換され、

         * それ以外の文字は%xx16進形式になる。

         */

        req.setValue("application/x-www-form-urlencoded",

            forHTTPHeaderField: "Content-Type")

        

        // エンコーディングされた「postdata」の長さ(桁数)を算出

        let length:Int = postdata.length

        

        //print("length:",length)

        

        // ヘッダにコンテンツの長さ(桁数)をセット

        req.setValue("\(length)", forHTTPHeaderField:

                                             "Content-Length")

        

        // HTTPBody:NSData型に渡す

        req.HTTPBody = postdata

        

        /*

         * Sessionを生成.

         * NSURLSession:バックグランドで通信できるクラス

         * 使用できる通信プロトコルは HTTP 通信のみ

         */

        let task = NSURLSession.sharedSession()

             .dataTaskWithRequest(req,completionHandler: {

            ( data, res, err ) in

            // データが空ではなかったら

            if data != nil {

                let text = NSString(data: data!, encoding:

                                          NSUTF8StringEncoding)

                dispatch_async(dispatch_get_main_queue(), {

                    

                    // Slider値を表示

                    //self.label1.text = text as String?

                    print("送信内容",text as String?)

                })

            } else {

                dispatch_async(dispatch_get_main_queue(), {

                    

                    // errorを表示

                    //self.label1.text = "error"

                    print("送信error")

                })

            }

        })

        

        // タスクの実行

        task.resume()

    }

}

 

Arduinoスケッチ EthernetGetPost_00

// iOS iLampSwiftSW_GetPost
// イーサネットライブラリを読み込み
#include <SPI.h>
#include <Ethernet.h>

// Arduino Ethernet ShieldのMACアドレスをセット
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

// サーバーとなるArduinoのIPアドレス
IPAddress ip(192, 168, 1, 10);

// HTTP通信をするのでサーバーのポートは80でセット
EthernetServer server(80);

// GND PIN
// LEDライト用PIN番号
int ledPin02 = 2;
int ledPin03 = 3;
int ledPin04 = 4;

void setup() {
  
  // デバッグログ用
  Serial.begin(9600);

  pinMode(ledPin02, OUTPUT);
  pinMode(ledPin03, OUTPUT);
  pinMode(ledPin04, OUTPUT);

  // LEDの明かりは初期状態では切っておく
  digitalWrite(ledPin02, LOW);
  digitalWrite(ledPin03, LOW);
  digitalWrite(ledPin04, LOW);

  //イーサネット通信開始
  Ethernet.begin(mac, ip);

  //サーバ開始
  server.begin();
  
  Serial.print("Serving on http://");
  Serial.println(Ethernet.localIP());
}


void loop() {
  
  // クライアントからのデータ受信
  EthernetClient client = server.available();

  // スイッチでLEDのオンオフ trueかfalse
  // 初期値「0」
  boolean incoming = 0;
  
  // クライアントからの受信がある場合
  if (client) {

    // クライアントと接続を確立している場合に処理を繰り返す
    while (client.connected()) {

      // クライアントとの接続中の処理
      if (client.available()) {

        // HTTPリクエスト(受信データ)を一つずつ読み込む
        char c = client.read();
        
        // c変数の内容をシリアルに吐き出し中身確認
        Serial.write(c);

        /*
        * 行の最後に得ている場合(改行文字を受け取った)およびラインは、
        * httpリクエストが終了した空白ですので、
        * あなたは応答を送信することができます
        */

        // URL文字列を読み込みデータが「incoming:初期値「0」」
           そして「c」が' '空白だとincoming に「0」を代入
        if (incoming && (c == ' ' || c== '\n')) {
          incoming = 0;
        }
        
        // URL文字列を読み込みCが'#39;だとincoming に「1」を代入
        if(c == '$'){ 
          incoming = 1; // LED ON
        }
        
        // URL文字列をチェックします$1、$2 「incoming:true」
        if(incoming == 1){
          
          if (c == '1'){
            //Serial.println("[Green_ON]");
            // LEDの明かりを入れる
            digitalWrite(ledPin02, HIGH);
          }
        
          if (c == '2'){
            //Serial.println("[Green_OFF]");
            // LEDの明かりを切る
            digitalWrite(ledPin02, LOW);
          }

          if (c == '3'){
            //Serial.println("[Red_ON]");
            // LEDの明かりを入れる
            digitalWrite(ledPin03, HIGH);
          }

          if (c == '4'){
            //Serial.println("[Red_OFF]");
            // LEDの明かりを切る
            digitalWrite(ledPin03, LOW);
          }

          if (c == '5'){
            //Serial.println("[Blue_ON]");
            // LEDの明かりを入れる
            digitalWrite(ledPin04, HIGH);
          }

          if (c == '6'){
            //Serial.println("[Blue_OFF]");
            // LEDの明かりを切る
            digitalWrite(ledPin04, LOW);
          }
          
        }
        
        if (c == '\n' || c == '\r')
          /*
          *CR ¥r キャリッジリターン 行の先頭まで戻す
          *LF ¥nは ラインフィード(行送り)行を一行進める
          */
          //sendPage(client);
          // 続ける
          continue;
        }else
          // 中断
          break;
        }
      }
    // データを受信するために、Webブラウザの時間を与える
    delay(1);
    // 接続を閉じます。
    client.stop();
    //Serial.println("client disconnected");
}

 

目 次