Raspberry Pi (Raspbian "wheezy") + D02HW + イオンSIM でRaspberry Pi を3G回線へ接続させた

どうもRamencozoです(゚∀゚)ノ

ヒャーッヒャッヒャッ(゚∀゚)笑いがとまりませんが(っ´ω`c)顔を戻して、と

Raspberry Pi を3G回線につなげることに成功しましたヾ(*´ω`*)ノシ

下記記事を参考にやってみたらイケましたのでまとめます(´ω`)っ
Linuxでモバイル:EMobile D02HWの認識を確かめる
Linuxでモバイル:EMobile D02HWの接続をminicomから確認
D02HW on Debian GNU/Linux
イーモバイルの D02NE (Debain 5.0)


必要なものはこちら(´ω`)っ
Raspberry Pi (Raspbian "wheezy" の2012/10/28版使用)
E-Mobile D02HW (SIMロック解除済み、本ブログではこの記事で取り上げました)
・イオンSIM (AEON系列店で取り扱ってるbmobileのSIM)


手順は下記の通り(´ω`)っ
1. D02HWRaspberry Piに挿して認識するか確認
2. pppconfigの導入と設定
3. 接続


1. D02HWの接続
まずD02HWを挿して認識してくれるかの確認をします。Raspberry Piが起動してデスクトップ環境が起動したのち、D02HWを挿します(起動前でもいいと思います)。挿した後、wheezy側で認識してくれてるか確認のため「lsusb」コマンドをLXTerminalで打ちます。

こちらで試した時は一発で認識してくれたので、認識しない場合の対策とかはちょっとわかんないです(´ω`)そういう症状が出なければいいなと祈ります
lsusbで確認した後、一応 /dev ディレクトリに ttyUSB0 と ttyUSB1 があることを確認します。このttyUSB0の方へあとで接続をかけることになります。


2. pppconfigの導入
bmobileの回線網へ接続するためにpppconfigというソフトをインストールします(´ω`)下記コマンドをLXTerminalにて入力します

sudo aptitude install pppconfig

しばらくしたらインストールが完了します。

3. bmobile3G回線への接続
先ほどインストールしたpppconfigにてイオンSIM用の設定を行います(´ω`)ノ下記コマンドでpppconfigを呼びます

sudo pppconfig

出てきたテキストベースGUIで設定していきます(´ω`)

「Create」を選択します


プロバイダ名はなんでもいいですがここでは「aeon」としておきます。


DNS設定は「Dynamic」を選択します。


認証方式は「PAP」を選択します。


ユーザー名は「bmobile@aeon」と入力します。


パスワードは「bmobile」と入力します。


モデムの通信速度は「115200」(デフォルト)にします。(´ω`)もっと早くできるかもしれないですがとりあえず。


ダイヤル方法は「Tone」を選択します。


ダイヤル先は「*99***1#」と入力します。


モデムのポートを手動で設定しますので「いいえ」を選択します。


「/dev/ttyUSB0」に書き換えます。


設定の最終確認です。「Finished」を選択します。


「了解」します。


設定は完了しました。「Quit」で終了します。


普通に戻ったLXTerminal上で下記コマンドを入力して接続します。(プロバイダ名が「aeon」の場合の例です)

sudo pon aeon

ここで /var/log/messages に次のようなログが出ていれば3G回線への接続がなされているはずです(´ω`)ノ

実際にbmobileな回線かどうかチェックしてみました(*´ω`*)確からしいです

これでRaspberry Piも単独でネットにイケます(*´ω`*三*´ω`*)こんなにすんなりいくとはー
それでは今回はこのへんで(´ω`)ノではまたー

Raspberry Pi キタ━━━━(゚∀゚)━━━━!!

どうもRamencozoです(゚∀゚)ノ

σ(゚∀゚)סもうずっとこんな顔なんですけども、タイトルの通り512MBモデルのRaspberry Piがウチに来ましたヾ(*´ω`*)ノシ

とりあえず下記内容をヤッてみました(´ω`)ノ

1. Raspbian "wheezy" のブートSDカード作成
2. wheezyの日本語化
3. OpenJDK入れてJavaでHelloWorld


1. wheezyのブートSD作成
Raspbian "wheezy" とはDebianをベースとしたRaspberry Pi仕様のLinuxディストリビューションです(´ω`)
こちらを参考にブートSDカードを作成しますた(´ω`)っ
Linuxおやじ日記 様:Raspberry Pi


必要なものは下記のセット(´ω`)っ
MacまたはLinux系のOSが入ったPC(ddコマンド打てればおk)
Raspberry Pi本体
Raspberry Pi用のディスプレイ(HDMIまたはRCAジャック(赤白黄色のアレ)があるもの)
・SDカード(wheezyが2GBくらいなので4GB以上推奨)
・wheezyのイメージファイル(RaspberryPi.org/Downloadから)
※ 2012-10-28時点のwheezyをこの記事では使っています


Windowsでddコマンドの代わりになるのがあるかわかんないので、Windows PCしか持ってない方はUbuntuあたりのブートCDまたはブートUSBメモリ作って仮Linux環境で作業するといいと思います(´ω`)

SDカードをPCに挿してドライブへのパスを確認しておきます。ここでは仮にLinux系のOS上で「/dev/sdb」にマウントされたとします。

次にwheezyのzipを解凍して中のimgファイルを適当なディレクトリに置きます。ここでは仮に「/home/myokkun/Desktop/2012-10-28-wheezy-raspbian.img」に置いたとします。

んでターミナルから下記コマンドを入力(´ω`)っ1MBずつ/dev/sdbに.imgを書き込みます

sudo dd bs=1M if=/home/myokkun/Desktop/2012-10-28-wheezy-raspbian.img of=/dev/sdb

書き込みが終了したらSDカードをRaspberry Piに挿して電源を入れます(´ω`)ノ
最初のwheezy起動時にはSDカード内の余ったパーティションのフォーマットとか画面の設定等を行うダイアログ(というかなんというか…真っ青背景にキーボードのみで操作するあのテキストベースGUIみたいなアレです)が出ます。
その設定関連はこちらを参考に行いました(´ω`)っというかぶっちゃけまんま行いました

Jun's homepage 様:Raspberry Piのブート用SDカードの作成
info
 このツールの情報が表示されますが、特に内容はありません。
expand_rootfs
 【重要】容量の大きいSDカードを使用しても、最初は先頭の2GB程度の
 パーティションを使うだけになっていて無駄になるため、このコマンドを選択して
 SDカードの容量全体を使うように設定できます。設定後、再起動が必要です。
overscan
 画面の周囲をちょっと空けるオーバースキャンを設定します。
 画面周囲が切れるような場合(テレビ?)に使用します。
configure_keyboard
 キーボードの配列を指定します。
 普通は「Generic 105-key (Intl) PC」を選択して
 「Japanese - Japanese (OADG 109A) 」でいいでしょう。
change_pass
 【重要】'pi' ユーザのパスワードを変更
change_locale
 ロケールの設定です。最初は設定しないほうがいいでしょう。
 「ja_JP.UTF-8 UTF-8」を選択するとメニューなどが日本語化されますが、
 最初は日本語フォントがインストールされていないため、文字化けします。
change_timezone
 時間の設定です。日本時間は 「Asia」、「Tokyo」 と指定します。
memory_split
 CPUとGPUへのメモリの配分を変更します。
 GPUへは32MiBのまま変更しないほうがいいでしょう。
ssh
 ネットワーク越しにコマンドラインに接続する場合には
 「Enable」を選択します。
boot_behaviour
 起動時に直接GUIな画面(Xのデスクトップを表示)に
 移行する場合は「Yes」を選択します。
update
 この raspi-config の新しいバージョンがあれば取得します。

もろもろやって再起動後、Loginをpi、Passwordを自分で設定したものにしてログインし、「startx」と打つとLXDEなデスクトップ環境が稼働します。


2. wheezyの日本語化
デフォだと全部英語+日本語を入力できないっていうアレな状態なのでフォントなりIMEなりを入れます(´ω`)
こちらを参考に行いました(´ω`)っ
ダークマターが晴れる時 様:Raspberry Pi を日本語化

まずデスクトップ環境全体で日本語を使うよーっていう設定を行います。
Raspberry PiにてLXTerminalを起動して下記コマンドを入力(´ω`)

sudo dpkg-reconfigure locales

するとまた青背景のテキストベースGUIが出てきますので下記項目をスペースキーでチェック付けます(´ω`)ノ

en_GB.UTF-8 UTF-8
ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8

チェックつけてOKしたらデフォルトのロケーションどうするん?って聞いてくるのでja_JP UTF-8にカーソル合わせてOKします。その後しばらくロケーションの設定をGeneratingしてくれますので終わるまで待ちます(´ω`)

終わったらフォントのインストールを行います。下記コマンドでフォントを取得(´ω`)っ

sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname

終わったら最後にIMEのインストールを行います。iBusanthyを入れます(´ω`)。oO(ホントはmozcがいいなぁ)

sudo apt-get install ibus-anthy

これで日本語環境は整いましたヾ(*´ω`*)ノシ 再起動すると日本語が使えます d(´ω`)


3. OpenJDK入れてHelloWorld
wheezyはOpenJDKを入れることができるので入れちゃいます(´ω`)っ下記コマンドでインストールします。

sudo aptitude install openjdk-6-jdk

(´ω`)。oO(ここ何故だかapt-getだと失敗したんですよねー…コレで入ったからいいんだけど)

java -versionとか打ってバージョン返してくれたらインストール完了です d(´ω`)カンタン
でもってとりあえずHelloWorld(´ω`)

class HelloRaspberryPi{
  public static void main(String[] args){
    System.out.println("Hello, Raspberry Pi!");
  }
}

結果がこちら(*´ω`*)ちゃんとHelloWorldしてますね

とりあえずRaspberry Piで遊んでみました(*´ω`*)今度はGPIOとかUSBカメラとかいじってみます

mbedでInterruptInのテスト

どうもRamencozoです(´ω`)ノ

DigitalIn/OutとAnalogInの記事書いたあとでめっちゃ簡単にポート割込みなコードできたので即投げ(ノ´ω`)ノ

と言ってもほとんどUsers » okini3939 » Notebook » InterruptIn - ピン変化割込みを丸パクでやってみたというだけなのですがががが(´ω`)

main.cpp / TestInterruptIn

#include "mbed.h"

InterruptIn intButton(p21);

DigitalOut actionLED(LED1);
DigitalOut statusLED(LED4);

void actionPerformed(){
    actionLED = !actionLED;
    wait(0.2);
}

int main() {
    intButton.rise(&actionPerformed);

    while(1) {
        statusLED = !statusLED;
        wait(0.25);
    }
}

ちなみにInterruptInについていくつか付記(これも参考まんまです)

初期化 -> InterruptIn name(pin);

※ name: 名前(自由に決めて良い)
※ pin: ピン名(p19, p20以外)


立ち上がり割り込み -> name.rize(fptr);
Class中での利用 -> name.rize(&this, T::mptr);

※ fptr: 割り込み処理関数のポインタ


立ち下がり割り込み -> name.fall(fptr);
Class中での利用 -> name.fall(&this, T::mptr);

※ fptr: 割り込み処理関数のポインタ


プルアップ・プルダウン -> name.mode(mode);

※ モードは以下の3つ
・PullUp -> プルアップ
・PullDown -> プルダウン
・PullNone -> なし(フロート)


(*´ω`*)めっちゃカンタンでした

mbedでDigitalInとDigitalOutとAnalogInのテスト

どうもRamencozoです(´ω`)ノ

最近mbedネタをmakeboothの方でなかよしぼっととかTumblr廃人リモコンとかとして出してます(^q^)
アレらの中ではHTTPClientがどうとかUSBKeyboardがなんだとか色々やってるんですが、今回はとりあえず基本的な入出力のイジり方を備忘録的に書いてみます(´ω`)ノ

(´ω`)。oO(この記事書いてる時にUSBKeyboardとかイジれる環境じゃなかったのでorz)

てなワケで下記仕様のLEDチカチカプログラムをやってみます(´ω`)

[ポート割り当て]
・DigitalOut:LED1, LED2, LED3, LED4
・DigitalIn:p21, p22, p23, p24
・AnalogInput:p20, p19, p18, p17
※先頭から順番にInとOutを対応させます

[動作内容]
・DigitalInが'1'になるたびDigitalOutの出力を反転 -> p21を'1'にするとLED1がONになる
・AnalogInが0.6以上になるたびDigitalOutの出力を0.5秒ごとに4回反転 -> p20を手で触るとLED1がチカチカする

コードは下記のとおり(っ´ω`)っ

main.cpp / TestInOut

#include "mbed.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

DigitalIn in1(p21);
DigitalIn in2(p22);
DigitalIn in3(p23);
DigitalIn in4(p24);

AnalogIn ain1(p20);
AnalogIn ain2(p19);
AnalogIn ain3(p18);
AnalogIn ain4(p17);

void ledBlink(char num);

int main() {
  float ain1Value;
  float ain2Value;
  float ain3Value;
  float ain4Value;

  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;

  while(1) {
    ain1Value = ain1.read();
    ain2Value = ain2.read();
    ain3Value = ain3.read();
    ain4Value = ain4.read();

    if(ain1 > 0.6){
      printf("ain1: %f", ain1Value);
      ledBlink(1);
    }
    if(ain2 > 0.6){
      printf("ain2: %f", ain2Value);
      ledBlink(2);
    }
    if(ain3 > 0.6){
      printf("ain3: %f", ain3Value);
      ledBlink(3);
    }
    if(ain4 > 0.6){
      printf("ain4: %f", ain4Value);
      ledBlink(4);
    }
      
    if(in1){
      led1 = !led1;
      wait(0.1);
    }
    if(in2){
      led2 = !led2;
      wait(0.1);
    }
    if(in3){
      led3 = !led3;
      wait(0.1);
    }
    if(in4){
      led4 = !led4;
      wait(0.1);
    }
        
    wait(0.1);
  }
}

void ledBlink(char num){
  char i;

  for(i=0; i<4; i++){
    switch(num){
      case 1:
        led1 = !led1;
        break;
      case 2: 
        led2 = !led2;
        break;
      case 3: 
        led3 = !led3;
        break;
      case 4: 
        led4 = !led4;
        break;
    }
    wait(0.5);
  }
}

動作してる様子はこちらの動画の通りです(´ω`)ノ

入出力ポートをいじることができましたとさ(*´ω`*)次は割込みでも試してみますー

XBee WiFiでPCとTCPなおしゃべりをしてみた

どうも、Ramencozoです(´ω`)ノ

某所でナニして手元にXBee WiFiを用意することができましたヾ(´ω`)ノシ


とりあえず下記項目を順にやってみることに(´ω`)

1. X-CTUファームウェア書き込み
2. XBee WiFi ⇔ PC の通信

1. X-CTUファームウェア書き込み
Xbeeは買った当初は接続設定等が記述されたファームウェアが書き込まれていないので、XBeeのメーカーであるDigi社が提供しているユーティリティソフト(X-CTU)を使って各種設定をして書き込みます。

設定は下記の項目だけいじりました(´ω`)っ
Networking
SSID:MYOK
・NetworkType:INFRASTRUCTURE (WiFiルータとかのアクセスポイントにつなぐ形式、AdHocじゃない方)
・IP Protocol:TCP
・IP Addressing Mode:DHCP

Addressing
Destination IP Address:192.168.100.1 (宛先、アクセスポイント自体 = PC本体)
Destination Port:8888 (16進数で22B8)
・Source Port:9750 (16進数で2616、XBee WiFiのデフォルトポート)

Security
・Encryption Enable:WPA (TKIP)
・Pass Phrase:ないしょ(´ω`)

XBee WiFi ⇔ PC の通信
X-CTUにてXBee WiFiにアクセスポイントのSSID等を書き込んだら、次は通信テストをやってみます。下図のようなネットワーク構成でPCとXBee WiFi間でTCPソケットの通信テストを行います。PCにUSBタイプのWiFiドングルを挿してアクセスポイントモードで動作させ、XBee WiFiの接続を待ち受けます。
PC - XBee WiFi間の通信はPC内でTCP Socketの送受信を行うアプリとシリアルコンソール(Tera Term)で確認します。

実際の環境写真はこちら(´ω`)っ

TCP Socketの送受信を行うJavaアプリケーションは下記コードのようにしました(´ω`)ノリでSwingなGUIアプリにしました

TestSocketServer.java / TestSocketServer

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class TestSocketServer extends JFrame{
  static final String TITLE = "TestSocketServer";
  static final int WIDTH = 640;
  static final int HEIGHT = 480;
  
  static final String DEFAULT_URL = "192.168.100.4:9750";

  static final int SERVERSOCKET_PORT = 8888;
  
  JTextField urlTextField;  // XBee WiFiのIPアドレス:ポートの指定

  JTextField messageTextField;  // XBee WiFiに送信する文字列を記述
  JButton sendButton;           // 送信ボタン
  
  JTextArea logArea;    // ログ用のTextArea
  JScrollPane logPane;  // スクロールできるように
  
  public TestSocketServer() {
    setTitle(TITLE);
    setSize(WIDTH, HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    Container container = getContentPane();
    JPanel parentPanel = new JPanel(new BorderLayout());
    
    // 接続とデータ送信関係のJPanel
    JPanel sendPanel = new JPanel();
    
    urlTextField = new JTextField(20);
    urlTextField.setText(DEFAULT_URL);
    sendPanel.add(urlTextField);
    
    messageTextField = new JTextField(20);
    sendPanel.add(messageTextField);
    
    sendButton = new JButton("送信");
    sendButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        // IP Address:Port を分離
        final String[] url = urlTextField.getText().split(":");

        // 簡易的な書式チェック
        if(url.length > 1){
          String address = url[0];
          int port = Integer.parseInt(url[1]);
  
          try {
            String msg = messageTextField.getText();
            
            Socket socket = new Socket(address, port);
            OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
            writer.write(msg + "\r\n");
            writer.flush();
            writer.close();
            socket.close();
            
            addLog("Send message \"" + msg + "\" to " + address + ":" + port);
          } catch (UnknownHostException e1) {
            e1.printStackTrace();
            addLog(e1.getMessage());
          } catch (IOException e1) {
            e1.printStackTrace();
            addLog(e1.getMessage());
          }
        }else {
          addLog("URLは[address:port]の形式で記述してください");
        }
      }
    });
    sendPanel.add(sendButton);

    parentPanel.add(sendPanel, BorderLayout.NORTH);    
    
    // ログ関係のJPanel
    JPanel logPanel = new JPanel(new BorderLayout());
    logArea = new JTextArea();
    logPane = new JScrollPane(logArea,
                              JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                              JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    logPanel.add(logPane, BorderLayout.CENTER);

    parentPanel.add(logPanel, BorderLayout.CENTER);
    
    container.add(parentPanel);
    addLog("------ TestSocketServer------");
    
    // Socket受信用Thread
    new Thread(){
      public void run() {
        try {
          ServerSocket serverSocket = new ServerSocket(SERVERSOCKET_PORT);

          while (true){
            addLog("+++ServerSocket Open+++");
            Socket socket = serverSocket.accept();  // 相手からデータが来るまでここでロック
            SocketAddress address = socket.getRemoteSocketAddress();
            addLog("Connection from " + address);
  
            InputStream inputStream = socket.getInputStream();
            
            byte[] dataArray = new byte[1024];
            
            int data = 0;
            int count = 0;
  
            boolean isOverFlow = false; // 一応バッファあふれ対策
            
            while ((data = inputStream.read()) != -1 && !isOverFlow) {
              dataArray[count] = (byte)data;
              count++;
              
              if(count > dataArray.length - 1){
                isOverFlow = true;
              }
            }
            
            String receiveString = new String(dataArray);
            
            addLog("Received: " + receiveString);
            
            inputStream.close();
            inputStream = null;
            socket.close();
            socket = null;
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }.start();
  }
  
  // JTextAreaにログを書き出すメソッド
  public void addLog(String msg){
    logArea.append(msg + "\n");
    logArea.setCaretPosition(logArea.getText().length());  // カーソル位置を一番下へ
  }
  
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        new TestSocketServer().setVisible(true);  // 起動と可視化
      }
    });
  }
}

送受信の結果は下記のような感じです(´ω`)っ

赤線でマークしている箇所がPC -> XBee WiFiの通信です。
オレンジの線でマークしている箇所が XBee WiFi -> PCの通信です。
Tera Termで文字入力すると入力の区切りごとに送信されるみたいです(´ω`)たぶん半角直接入力だったら一文字ずつ送信されます
あと3段目のReceiveの空白はTera Term内で改行したのが送信されますた(´ω`)ゞムフン

ともあれXBee WiFiとおしゃべりできました(´ω`)ノ 実際にコレを利用した製作物がみょっくんミニ(makebooth)です(*´ω`*)よかったら見てみてください
それでは今回はこのへんで(´ω`)ノシ

E-Mobile の D02HW をゲット & すぐさまSIMロック解除 & AEON-SIM 導入

※この記事の内容を読んでやってみて生じた損害等について一切責任を負いませんのでご了承の上でお読みくださいc(´ω`)っ※


どもー(´ω`)ノ Ramencozoです

こないだAmazonさんとか白ロムさんとかでSIM挿すタイプのデータ通信カード or ドングル的なのを探して回ってたところ、AmazonさんにD02HW(USB接続 SIM挿しデータ通信カード)を出品なさっていた方がいたのですぐさま注文ヾ(´ω`)ノシ 500円で購入致しました。

でもってすぐさまイオン系列の店舗で契約できるb-mobileの3G SIMカード、イオンSIM(AEON-SIM)を挿すため、SIMロック解除しました(´ω`)以下手順です。

―参考サイト様―
SIMロック手順等全般的に参考
イーモバイルD02HWでb-mobileイオンsimを使ってみる
b-mobile U300 のSIMをD02HWで活用するためのメモ
イーモバイル D02HW SIM ロック解除

Unlockツールについて
How to Unlock Huawei USB Modem For Free

ドライバインストール周辺について
イーモバイル D02HW
D02HWって…
―参考サイト様おわり―


1. 必要なアプリ
(´ω`)今回は下記アプリケーションを使用しました。
D02HWユーティリティインストール用データ : ドライバ等含めて最新版をとりあえずゲット
Universal MasterCodeSIMロック解除用のキーを知るためのソフト
HUAWEI MODEM CODE WRITERSIMロックの解除作業を行うソフト

下2つのアプリケーションのリンクがあやしいですが、どうやらそういう流通の仕方をしているようなので
たぶんアプリケーション名でググったら他でも配っているかもしれません(´ω`)逆に、こちらで提示した上記のリンクが潰れていた場合、
アプリケーション名でググって他所で配布しているところを探してみてください。



2. D02HWのドライバインストール
まずD02HWのドライバインストールから始めます。
前章で拾ってきたD02HWユーティリティインストール用データを使うワケですが、
D02HWは内部にUSBストレージと3Gモデムを内蔵した複合デバイスらしく、
こちらの環境ではUSBストレージだけが認識されて、デフォルトでは3Gモデム機能がインストールされませんでした。
その時にやった対処手順を示します。

(1). D02HWを刺さずにドライバユーティリティインストール(インストール自体は「次へ」をポンポン押すだけです)
(2). D02HWを刺して認識させてみる(このときに3Gモデムまで認識してくれたら下の(3).〜(6).はしなくていいです)
(3). デバイスマネージャから「ポート(COMとLPT)」の項目に「HUAWEI Mobile Connect - 3G PC UI Interface (COM20)」とかが出ていない場合、USBストレージしか認識されてません(COM20の番号は多少変わってもOKです)。その場合、D02HWを刺したまま、さっきインストールしたドライバユーティリティをアンインストールします。
(4). アンインストール後に「Data Interface」等の名前でインストールしますか?的なダイアログが出てきます。出てこなかったら何回か抜き差ししてみてください。(こちらの環境ではソレが起きなかったのでここでつまづいた場合の対処法はわかりません)
(5). そのダイアログを開いたまま再度ユーティリティソフトウェアをインストールします。インストールし終わったらさっきのダイアログの「一覧または特定の場所からインストールする」にチェックつけて次へ、「次の場所で最適のドライバを検索する」にチェックをつけて、「参照」からユーティリティソフトをインストールした場所の中にあるDriverフォルダの中の各OSのフォルダを選択して次へ、インストール完了させます。(Windows XPならWinXPVistaまたは7ならたぶんVistaかと)
(6). 3Gモデムのインストールのダイアログも出ると思うのでそれも同様にドライバ選択してインストール。すべて完了です。



3. SIMロック解除キーの取得
1.で拾ってきたUniversal MasterCodeを使います。
アプリケーションを起動後、「Huawei」のタブを選択してIMEIナンバー(D02HWの裏面のシールに書いてある番号)の、「/」を抜いたものを入力してください。その後「Calculate」を押すと右側の「UNLOCK」の窓に解除キーが出てきますのでソレをコピーしてメモしておいてください。

(なお、下記画像の番号は本物の番号とは異なるダミーイメージです)



4. SIMロック解除
1.で拾ってきた HUAWEI MODEM CODE WRITER を使います。zipを解凍して中のアプリを起動します。

起動したあと、アプリ内の「Please Select Com Port」をクリックして、出てきたダイアログの「Detect」を押すと3GモデムのCOMポートを選べるようになります。
「COM00 : HUAWEI Mobile Connect - 3GModem」みたいな感じで表記されてるヤツを選択して「Accept」をクリックしてください。(COM00のとこは多少変わってもOKです)

(なお、下記画像のログ画面中の「Revision」と「Phone IMEI」はダミーに書き換えてあります)

メインのログ画面にD02HWの情報が表示されてて、IMEIがさきほどUniversal MasterCodeに入力したものと同じであることを確認しましたら、
「Unlock Modem」ボタンを押してください。すると上の画像のようにUnlock Codeの入力を求められますので先ほどメモしたヤツを入力して「OK」。
ログ画面に「Unlock success」とか「Unlock OK」とか「Unlock done」みたいな文字が見えたら完了してます。「error」とか出てたら入力したUnlockコード等が間違ってるかもしれないので適宜やりなおしてみてください。



5. イオンSIM設定
最後に、イオンSIMの接続設定をします。基本的にはイオンSIM契約時に「自分でこれこれこういう設定してね」と言い渡されたものをこっちでも設定するソレです。
2.でインストールしたユーティリティソフト(EMOBILE HW ユーティリティ)を起動します。

メニューの「ツール」→「オプション」をクリック。


左メニューの「設定管理」をクリックして、右の「新規」をクリックし、設定項目を入力します。
・プロファイル名:なんでもいいです(こちらでは「AEON-SIM」としました)
・APN:「スタティック」にチェックを入れて、「dm.jplat.net」と入力
・接続番号:「*99***1#」と入力
・ユーザ名:「bmobile@aeon」と入力
・パスワード:「bmobile」と入力

入力し終わったら右メニューの「保存」をクリックして、右下の「OK」で閉じます。


ユーティリティのメイン画面に戻って中央の「接続先」をクリックし、先ほど作ったプロファイル名を選んで「接続」ボタンをクリックします。
設定が正しければ認証が完了して接続されます。



以上がSIMロック解除から接続までの手順でした(´ω`)ノシ それではまたー

dotCloudにJava HttpServletなものをデプロイしてみる

どもー(´ω`)ノ Ramencozoです

最近dotCloudさんとこにアプリをポイポイ投げてるます(´ω`)

でもってdotCloudに素のJava Servlet(Jettyのソレ)を投げる方法を探してましたが、ネット上にズバリコレ的なのが見つかんなくてでして(´ω`)みなさんPython(Django)だとかJava Framework(Play!)だとかでの話がほとんどでウッヒャーすごいスなーと思いつつ、「もっと素での実装ないの」と思いつつ。

どうにかこうにかヤッてみたらイケました(´ω`)ふぃー

下記環境で試行錯誤。
JDK 1.6 (dotCloudの環境がソレなので)
eclipse indigo (なんでもいいです)
・Jetty8 (dotCloudのはJetty6ですが、ダウソ先が見つからず)
-> servlet-api-3.0.jar

とりあえずHelloWorld的なナニを書くこととします。
まずはJava Projectのフォルダ構成。

src以下は.javaなソースを置くところ、dotcloudフォルダは実際にdotCloudにデプロイするwarファイル(クラスファイルとかをまとめたもの)等を置くところ、libフォルダはプロジェクト内で使用するjarファイルを置くところ、WEB-INFフォルダはwarファイルの中身に当たるフォルダで、この中にclassesフォルダ(.classファイルを置くところ、画像では見えてませんが実際は存在してます)、libフォルダ(上位のlibフォルダと同じもの)、web.xml(Servletの各種設定)を配置します。

作業しやすいように、通常binフォルダに吐かれるclassファイルをWEB-INFのclassesフォルダに吐くように設定します。Build Path → Configure Build Path → Sourceタブ → 下部の Default output folder のところをBrowseして指定します。

でもってHelloWorld的なHttpServletを書きます。HelloWorldだけじゃさびしいんで現在時刻も表示するようにしてます。

Hello.java / HelloDotCloud

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet{
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    Calendar calendar = Calendar.getInstance();
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    int second = calendar.get(Calendar.SECOND);
    
    resp.setContentType("text/html; charset=UTF-8");
    
    PrintWriter writer = resp.getWriter();
    writer.print("<html>");
    writer.print("<head>");
    writer.print("<title>Hello, dotCloud !</title>");
    writer.print("</head>");
    writer.print("<body>");
    writer.print("<p>Hello, dotCloud !</p>");
    writer.print("<p>" + hour + ":" + minute + ":" + second + "</p>");
    writer.print("</body>");
    writer.print("</html>");
    writer.flush();
    writer.close();
  }
}

次にweb.xmlを編集します。「http://サーバURL/」にアクセスするとServletが起動するようにします。servlet-nameはXML内での変数名みたいなものでなんでもいいです。servlet-classは実際に動かすHttpServletクラスのクラス名(ここではHello)です。url-patternはサーバドメインの後に続くURLをどうするか決める項です。ここでは"/"なのでサーバURLにペッてアクセスするとそのまま起動します。"/hello"とかにすると"http://サーバURL/hello"とかでアクセスできるようになります。

web.xml / HelloDotCloud

<?xml version="1.0" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
        version="2.4">
  
  <display-name>HelloDotCloud</display-name>
  
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>Hello</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
</web-app>

ここまで書いたらeclipseですと自動ビルドONならもうclassファイル等整ってるハズなのでwarファイルを作ります。(ビルドされてない場合は手動で)
warファイルはWEB-INFフォルダをzipで圧縮して拡張子をwarに変えただけです。僕は7zipマネージャでzip化した後リネームしました。
ここで、「ROOT.war」という名前にするようにしてください。詳細は後ほど。

次にdotCloudにアプリをデプロイする際の設定ファイルdotcloud.ymlを作成します。文字コードUTF-8にしてください。(Shift-JISだと認識してくれず動きませんでした…改行コードはたぶんCR+LFでもLFでもOKだと思いますが、一応LFにしといてください)
dotcloud.yml / HelloDotCloud

www:
  type: java

dotcloud.ymlとROOT.warをdotcloudフォルダに置いてください。
ここでROOT.warと名前を付ける理由ですが、dotCloud上でアプリを動かす際のアクセスURLが「http://アプリ名-ユーザ名.dotcloud.com/WARファイルの名前」という指定になります。これをROOT.warと指定すると「http://アプリ名-ユーザ名.dotcloud.com/」だけで済むようになります。
例えばアプリ名が「hellodotcloud」、ユーザ名が「ramencozo」、warファイル名が「hello.war」だった場合、「http://hellodotcloud-ramencozo.dotcloud.com/hello」にアクセスすることになります。

ここまで整ったらデプロイです。dotCloudの環境構築についてはすいませんググってください。(dotCloud本家にも説明ありますし、他ブログ等でも記事たくさんありますので)
コマンドラインの端末(Windowsだとたぶんcygwinになると思います。MacLinuxは標準のターミナルで)にてプロジェクトフォルダ内のdotcloudフォルダまで移動して、下記コマンドを入力してください。

  dotcloud create hellodotcloud
  dotcloud push hellodotcloud .

最初のコマンドでdotCloud上にhellodotcloudという名前のアプリのSandboxが生成され、続くコマンドでROOT.warファイルとdotcloud.ymlのデプロイとアプリ動作環境の構築がdotCloud上で行われます。

コマンドライン出力で最後にURLが示されますのでコピペしてブラウザにてアクセス。

Hello, dotCloud!(ただし時間はdotCloudのサーバのある現地時間っぽいですね…時差9時間くらいあるので、日本時間に直す際はそこ含めた実装がよさそうです)

※ dotCloudはFree Planだと最大2サービスしか利用できないので、そのうちhellodotcloudは消すことになると思います(´ω`)他の試したいときにソレなので