Skip to content

Instantly share code, notes, and snippets.

@Magistol
Last active March 28, 2017 22:16
Show Gist options
  • Save Magistol/4426442 to your computer and use it in GitHub Desktop.
Save Magistol/4426442 to your computer and use it in GitHub Desktop.
OCN IPv6 を使って緊急地震速報を受信するメモ

OCN IPv6 マルチキャストを使って緊急地震速報を受信するメモ

参考1 IPv6マルチキャストのパケットが

参考2 Mac OS X で OCN IPv6 サービスに接続する (2)

その他、技術調査の結果のメモ。

  • 参考2は2006年の情報であり、OS X Mountaion Lion で実行するとメモリ関連のバグ?で落ちるので一部修正

OCN IPv6 に接続

参考2に従い、設定ファイルを作成する。ファイル名は options とする。

options

plugin L2TP.ppp
+ipv6
l2tpnoipsec

ファイルをpppの設定ディレクトリにコピーする。

sudo cp options /etc/ppp/options

次はGUIによる設定。

System Preferences -> Network -> 鍵マークの上の追加ボタン+を押す。

Interface を VPN
VPN Type を L2TP over IPsec
Server Name は任意の名前

として、Create する。

Server AddressをXXXXXX.ocn.ne.jp はプレフィックス用接続サーバ名で置き換える。

Account NameはアカウントID。

Authenication Settings…を開き、Passwordを入力してOK。

これで接続する。

  • この状態ではローカルリンクアドレスしか張られないが、マルチキャストを受信するにあたっては問題ないので無視。

ちなみに、GUIで設定したのは参考2の方法で、シェルで

pppd

を実行するとメモリ関連のバグで落ちるのが原因

受信プログラム

MulticastOCN.javaをコンパイルして実行。

環境によって、ネットワークインタフェース名が変わることに注意すること。

この場合は ppp0 が OCN IPv6 用インターフェイス。

javac MulticastOCN.java
java MulticastOCN

実行すると

name:ppp0 (ppp0)
name:utun0 (utun0)
name:en1 (en1)
name:lo0 (lo0)
interface = /fe80:0:0:0:5ab0:XXXX:XXXX:XXXX%10
0? from /2001:380:50c:99:0:0:0:51%0:32774
0? from /2001:380:50c:99:0:0:0:51%0:32774
0? from /2001:380:50c:99:0:0:0:51%0:32774
...

という感じに受信データが表示される。

ちなみに、同じデータが3回づつ流れてくる。

30秒ごとに疎通確認のデータ、実際に速報があったら適時、毎時0分にテスト電文が流れてくる。

受信データはバイナリで、ヌル文字が入っているので、表示した際にそこで途切れている。

詳しいバイナリフォーマットは後日。

その他

  • サーバで動かすなら OS X 使わないと思うけど手順をまとめてみた。

  • フレッツ網でもできるけど、マルチキャストアドレスとソースの Mac アドレスがわからないとできない。

  • フレッツ網の場合は MLDv2 でマルチキャスト参加要請を送る必要がある。

  • ちなみに筆者は Windows 7 + C# なプログラムで動かしています。

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.io.IOException;
public class MulticastOCN implements Runnable {
private static final int DATASIZE = 512;
private static final int TIMEOUT = 35 * 1000; // msec
private static final int PORT = 8001; // or 6101
private static final String MULTICAST_ADDRESS = "FF3E::8000:1000";
private InetAddress mcastAddress;
private MulticastSocket socket;
private byte[] data;
public MulticastOCN(String host, int port, String nic) throws IOException {
mcastAddress = InetAddress.getByName(host);
socket = new MulticastSocket(port);
NetworkInterface ifc = NetworkInterface.getByName(nic);
socket.setNetworkInterface(ifc);
socket.joinGroup(mcastAddress);
socket.setSoTimeout(TIMEOUT);
data = new byte[DATASIZE];
System.out.println("interface = " + socket.getInterface());
}
public void run() {
try {
while (true) {
DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet);
String recv = new String(data, 0, packet.getLength(), "Shift_JIS");
System.out.println( recv + " from " + packet.getAddress() + ":"
+ packet.getPort());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.leaveGroup(mcastAddress);
} catch (IOException e) {
e.printStackTrace();
}
socket.close();
System.out.println("exiting");
}
}
public static void main(String args[]) throws IOException {
viewNIC();
new Thread(new MulticastOCN(MULTICAST_ADDRESS, PORT, "ppp0")).start();
}
public static void viewNIC() throws IOException {
Enumeration<NetworkInterface> hoge = NetworkInterface.getNetworkInterfaces();
while (hoge.hasMoreElements())
{
System.out.println(hoge.nextElement().toString());
}
}
}
@omniwired
Copy link

thanks you so much for this!

Any idea where I can find the value for XXXXXX?

This part "Server AddressをXXXXXX.ocn.ne.jp"

すみません、私は日本語を話せません

ありがとう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment