2009年11月27日

arduino Wake On LAN リピーターの作成

2012年11月22日更新:
 arduino WOL リピータのスケッチを最新の開発環境用に修正・更新


※なんだかよく分からないけど、arduino WOLリピーターを作りたい方は、こちらの初心者用の説明をどうぞ

職場のネットワークに勝手にルーターを追加することはできませんが、既存のルーターのポートを開けるくらいはできる。

Wake On LAN リピータ」を日本で買って送ってもらうよりは、こちらでも購入可能な「arduino+ethernet shield」を選択したわけです。

リピータ機能のみのものとそれに加え、可変抵抗器で登録した端末からターゲットを選択して押しボタン押下でマジックパケットを送信する機能を持たせたものを作りました。

この「arduino WOL リピーター」のIPは、192.168.1.200となっていますが、任意で変更してください。受信ポートは、7番になっていますが、マジックパケット送信アプリに応じて任意で変更してください。

私は、sndmagic (For Windows NT) Latest version 0.2 を使わせてもらっています。下記サイトから入手可能
http://www.st.rim.or.jp/~yumo/pub/sndmagic_chglog.html

このソフトを使う場合は、sndmagic.exeとmagic.exeをパスがとおっている場所(C:\Windows\system32)などにコピーして使うと、バッチファイルのクリックのみで、対象PCの遠隔電源オンが可能で便利です。

使い方は、対象パソコンがWOLに対応している場合、たとえば自宅のPCから、職場のグローバルIPのポート7番(前述の
sndmagicはポート7番に飛ばします)にマジックパケットを飛ばします。問題なく対象PCの電源が入ります。

当然ですが、
職場のルーターには、UDPの7番ポートをarduino WOL リピーター(192.168.1.200)に転送する設定が必要です。

対象パソコンがWOLに対応していない場合は、
arduino WOL リピーター & スイッチャー」をご覧ください。

以下にスケッチです。「arduino WOL リピーター」は、bjoern / arduino_oscというライブラリを利用してUDPを取り扱っています。リンクページからarduino_osc-tip.zipというファイルをダウンロードして、中にあるEthernet及び
Stringフォルダのファイルを、arduino IDEのフォルダ「\hardware\libraries\Ethernet」及び「\hardware\libraries\String」にコピーしてください。

あとは「arduino」と「ethernet shield」を合体させて、このスケッチを転送するだけで動作します。


// Wake On Lan リピーター
// http://yutakalife.net/article/133960795.html
// 販売などの商用利用はご遠慮ください
// Copyright love4nature All Rights Reserved.

#include <WString.h>
#include <Ethernet.h>
#include <UdpRaw.h>

// イーサネットの設定
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC address
byte ip[] = { 192, 168, 1, 200 }; // Arduino のIP address
byte gw[] = { 192, 168, 1, 1 }; // Gateway IP address
int localPort = 7; //local port to listen on

// ターゲットのブロードキャストアドレスを指定
byte targetIp[] = { 192, 168, 1, 255};
int targetPort = 8000;

#define MAX_SIZE 192
// パケットサイズの最大値を設定
byte packetBuffer[MAX_SIZE]; // 受信パケット用バッファ
int packetSize; // 受信パケットのサイズが格納される
byte remoteIp[4]; // 送信元のIPアドレスを格納
unsigned int remotePort; // 送信元のポート番号を格納

int i;

void setup() {

Ethernet.begin(mac,ip,gw);
UdpRaw.begin(localPort);
Serial.begin(38400);

}

void loop() {

// if there's data available, read a packet
if(UdpRaw.available()) {
packetSize = UdpRaw.readPacket(packetBuffer,MAX_SIZE,remoteIp,(uint16_t *)&remotePort);

Serial.print("Received packet of size ");
Serial.println(abs(packetSize));

Serial.print("From IP ");
for(i=0; i<3; i++) {
Serial.print(remoteIp[i],DEC);
Serial.print(".");
}
Serial.print(remoteIp[3],DEC);

Serial.print(" Port ");
Serial.println(remotePort);

if(packetSize < 0) {
// if return value <0 the packet was truncated to fit into our buffer
Serial.print("ERROR: Packet was truncated from ");
Serial.print(packetSize*-1);
Serial.print(" to ");
Serial.print(MAX_SIZE);
Serial.println(" bytes.");
}

Serial.println("Contents:");
for(i=0; i<min(MAX_SIZE,abs(packetSize)); i++) {
Serial.print(packetBuffer[i],HEX);
Serial.print(" ");
}
Serial.println("");

// マジックパケットを送信
UdpRaw.sendPacket(packetBuffer,packetSize,targetIp,targetPort);
Serial.println("Start port forwarding to broadcast address:");
for(i=0; i<3; i++) {
Serial.print(targetIp[i],DEC);
Serial.print(".");
}
Serial.print(targetIp[3],DEC);
Serial.println("");
Serial.println("Done!");
}
// 0.01秒待つ
delay(10);

}
posted by love4nature at 01:00| Comment(3) | TrackBack(0) | 趣味の部屋 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
こんにちは arduino Wake On LAN リピーターの作成を読ませて頂きました。

小生は
Aruduino+SDカード+イーサネットアダプタ を使ってLAN内BGM放送を考えています。

PCでは
sc_serv2_win32_07_31_2011+winamp563_lite_ja-jp+shoutcast-dsp-2-3-1-windows を使って、実現することは出来ました。

しかし、PCを立ち上げずにマイコン(aruuinoなど)を使って、実現できると、パソコンの前に行かなくとも、送信機のボタンを押すだけで、放送でき、LANに繋げてあるSHOUTcastラジオを聞きことが出来ます。

これについて何かご存じでしたら、御助言が頂ければと思っております。
Posted by どらねこ at 2012年11月13日 14:27
コメントありがとうございます

震災後、Arduinoを触っていないので、引っ越しなどでどこかにあるはずなのですが・・・。今はメインマシンがMACBOOKになっているので、見つかったらつないでみようと思います。

SHOUTcastですが全くの初耳でした。こんなのがあるんですね。今日は一つ賢くなりました。KeyholeTVみたいなものなんですかね。

少し調べてみました。私が思うにはArduino単体では難しいのではないかと思いました。

http://www.shoutcast.com/broadcast-tools
上記サイトによるとBroadcaster Toolsとして、Win、Mac、Linux用が提供されていますので、Linuxが動くマイコンボードの使用を考慮してみてはいかがでしょうか?

http://www.aitendo.com/product/4494
http://jp.rs-online.com/web/generalDisplay.html?id=raspberrypi
Posted by love4nature at 2012年11月13日 20:05
PCを使う分は成功したのですが(85%)
マイコンでSDカードから必要なデータを
ハンドリングするだけなのでラジオよりは易しいと思っています。
ただソフトには弱いのですが、arduinoは扱いやすそうなので、何とかがんばってみます。

arduinoの環境はやっと整えました。
(ダウンロードインストールではディスクトップに入ってしまい、c:\などに移した方がよいようです)
ttp://blogs.yahoo.co.jp/jun_constellation/37709481.html
じゅんのなんでもD.I.Y.さんより

仕組みは リスナーから要求「GET / HTTP/1.0
Host: localhost
User-Agent: Arduino
Accept: */*
Icy-MetaData: 1
[空return]」が来ると 最初のデータ「icy-name:局名
icy-genre:ジャンル
icy-metaint:メタデータが来るまでの長さ
[空return]」を出し、続いてストリーミングとメタデータを送り出す、(どこで止めるんだろう、おそらく時々要求を確認するのか?)
ではまた
Posted by どらねこ at 2012年11月14日 12:59
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。