Microsoft Robotics Studioを用いてJ-Botを動かす

次の緑の部分にマウスカーソルを重ねてください。ここです。このように緑のテキストの部分にカーソルを乗せると簡単な説明が表示されるところがあります。

準備

  1. Microsoft Visual Studio 2005以上をインストールします。ここではC#でプログラミングしますのでフリーで配布されているExpress Editionを利用することもできます。
  2. このインストーラを実行してMicrosoft Robotics Studio(MSRS)をインストールします。
    この時場合によってAGEIA、DirectXなどのインストールも同時に行われます。
  3. USB→RS-232C変換アダプターのドライバをインストールします。
  4. J-Botのプログラム開発用IDEをインストールします。
  5. J-Botとの通信はBluetoothを用いますので各自Bluetoothデバイスを手に入れ、これのインストールをします。
  6. 通信のチェックなどをするためのTeraTermをインストールします。

Bluetoothの使い方を理解する

Bluetoothの通信を行うeb500を下図のようにコネクタに挿入します。
この時、電源が入っていたりするとBluetoothのインターフェイスが破壊されるので必ず電源を切っておくこと。また、P1とP5が出力状態で電源がONになると同様にこのBluetooth装置が破壊されるので、事前にこのポートが出力状態になっていると大変なことになります。これを防ぐには何もしないプログラムを送っておくことです。何もしないプログラムは、ポートを入力状態にするからです。これは装置を壊さないために必ず行ってください。

正しく通信ができているかのチェックプログラムです。teratermから送信した文字をそのまま戻すプログラムです。teratermでの設定は、BluetoothのCOM番号を指定するだけでデフォールトの設定で動作します。デフォールトの設定はポーレート9600bps、データ8bit、パリティnone、stopbit=1、フロー制御=noneの設定です。
文字をエコーするプログラム
import stamp.core.*;

public class echo {

  final static int SERIAL_TX_PIN  = CPU.pin1;
  final static int SERIAL_RTS_PIN = CPU.pin2;
  final static int SERIAL_CTS_PIN = CPU.pin3;
  final static int SERIAL_RX_PIN  = CPU.pin0;

  static Uart rxUart = new Uart( Uart.dirReceive, SERIAL_RX_PIN, Uart.dontInvert,
                           SERIAL_CTS_PIN,Uart.speed9600,
                           Uart.stop1 );
  static Uart txUart = new Uart( Uart.dirTransmit, SERIAL_TX_PIN,Uart.dontInvert,
                           SERIAL_RTS_PIN,  Uart.speed9600,
                           Uart.stop1 );
  public static void main() {
    int ch;
    while(true) {
      ch = rxUart.receiveByte();
      txUart.sendByte(ch);
    }
  }
}


正しくBluetoothで接続された場合はeb500上にあるD1と書いてある緑のLEDが光ります。


次に、Bluetoothのインターフェースのアドレスを取得するプログラムを作ります。
Bluetoothのインターフェースのアドレスを取得するプログラム
import stamp.core.*;
import stamp.util.text.*;

public class getAddress {

  final static int SERIAL_TX_PIN  = CPU.pin1;
  final static int SERIAL_RTS_PIN = CPU.pin2;
  final static int SERIAL_CTS_PIN = CPU.pin3;
  final static int SERIAL_RX_PIN  = CPU.pin0;

  static Uart rxUart = new Uart( Uart.dirReceive, SERIAL_RX_PIN, Uart.dontInvert,
                           SERIAL_CTS_PIN,Uart.speed9600,
                           Uart.stop1 );
  static Uart txUart = new Uart( Uart.dirTransmit, SERIAL_TX_PIN,Uart.dontInvert,
                           SERIAL_RTS_PIN,  Uart.speed9600,
                           Uart.stop1 );
  public static void main() {
    int ch;
    txUart.sendString("get address\r");
    waitString("ACK\r");
    int n = 17;
    char[] adr = getString(n);
    waitString(">");
    for(int i=0; i%lt;n; i++) Format.printf("%c",adr[i]);
    System.out.println("");
  }
  public static void waitString(String str){
    int i=0;
    while(i<str.length()) {
      if( rxUart.receiveByte() == str.charAt(i)) i++;
      else i=0;
    }
  }
  public static char [] getString(int n){
    char [] tmp = new char[n];
    for(int i=0; i<n; i++) tmp[i] = (char)rxUart.receiveByte();
    return tmp;
  }
}


Blootoothに関係するクラスを作る

上のプログラムが単純明快でないため、分かり易くするためにパッケージにします。
先頭にpackage JBot;とあるように、このファイルはJBotフォルダに入れます。
Blootoothに関係するプログラム
package JBot;

import stamp.core.*;
import stamp.util.text.*;

public class Bluetooth {

  final static int SERIAL_TX_PIN  = CPU.pin1;
  final static int SERIAL_RTS_PIN = CPU.pin2;
  final static int SERIAL_CTS_PIN = CPU.pin3;
  final static int SERIAL_RX_PIN  = CPU.pin0;
  protected 
  final static int CONNECTION     = CPU.pin6;

  static Uart rxUart = new Uart( Uart.dirReceive, SERIAL_RX_PIN, Uart.dontInvert,
                           SERIAL_CTS_PIN,Uart.speed9600,
                           Uart.stop1 );
  static Uart txUart = new Uart( Uart.dirTransmit, SERIAL_TX_PIN,Uart.dontInvert,
                           SERIAL_RTS_PIN,  Uart.speed9600,
                           Uart.stop1 );

  public static void waitString(String str){
    int i=0;
    while(i<str.length()) {
      if( rxUart.receiveByte() == str.charAt(i)) i++;
      else i=0;
    }
  }

  // n文字受信する
  public static char [] getString(int n){
    char [] tmp = new char[n];
    for(int i=0; i<n; i++) tmp[i] = (char)rxUart.receiveByte();
    return tmp;
  }

  // アドレスを得る
  public static String getAddress(){
    int ch;
    txUart.sendString("get address\r");
    waitString("ACK\r");
    int n = 17;
    char[] adr = getString(n);
    waitString(">");
    return new String(adr);
  }

  // EB500が接続されたのを待つ
  public static void waitConnection() {
    while(!CPU.readPin(CPU.pin5));
  }

  public static char getChar()
  {
    return (char)rxUart.receiveByte();
  }

  // 文字列を送る
  public static void sendString(String str)
  {
    rxUart.sendString(str);
  }
}


次のメインプログラムで動作することを確認してください。

このプログラムはEB500のアドレスを読み取るプログラムです。
メインプログラム
import stamp.core.*;
import JBot.*;

public class addressGet2 extends Bluetooth{
  public static void main() {
    String address = getAddress();
    System.out.println(address);
  }
}


サービスのテストをする

テスト回路を作る

Bluetoothと通信ができているかを確認するために以下のようにLEDを二つとスピーカーをつけます。LEDは220Ωの抵抗を直列に接続し、P15,P14に接続します。スピーカーはP4に接続します。




サービスを行うプログラムを作る

  1. C:\Microsoft Robotics Studio (1.5)\samples\Platforms\Parallaxの中にあるBASICStamp2.slnをダブルクリックしVisual Studioを起動させます。
    Visual Studioのバージョンによっては変換が行われますので、指示に従ってください。

  2. ソリューションエクスプローラの中のあるBasicStamp2.csをダブルクリックしてソースプログラムを表示させます。


  3. private const int DefaultSerialPort = 3;
    という行を探します(40行目)。この3と数字を実際にBluetoothが使用しているCOM番号に変更します。

  4. BSServicesのConfigフォルダの前にある+をクリックして開きます。Parallax.BoeBot.Config.xml と Parallax.MotorIrBumper.Config.xml をダブルクリックして開きます。<SerialPort> と </SerialPort> で囲まれた値を上記と同じように実際にBluetoothが使用しているCOM番号に変更します。

  5. コントロールキーを押しながらHを押します。クイック置換のダイアログが出ます。
    検索する文字列にhttp://schemas.microsoft.com/robotics/2006/06/basicstamp2.html
    置換後の文字列にhttp://schemas.microsoft.com/robotics/2007/06/basicstamp2.htmlを入れ、検索対象をソリューション全体になっていることを確認し、すべて置換ボタンを押します。7つの置換が行われるはずです。これはMSRS1.5のバグを訂正しています。



  6. これでビルドしてください。

はじめてのMSRS

  1. BoeBotControl.csをソリューションエクスプローラで探し、ダブルクリックしソースを表示させます。

    bool _autonomousMode = false;

    の行を探し(30行目)。falseであることを確認します。

  2. J-Botの電源を入れます。スイッチのポジションは2です。
    次のプログラムをJ-Botに転送し実行させます。
    サービスプログラムからのコマンドを表示する
    import stamp.core.*;
    import stamp.util.text.*;
    
    /**
     * Microsoft Robot Studio用
     */
    
    public class JBotControlForMsrs {
      static byte ResetOnOff = 0;
      static int[] RequestConnect    = {0xFF, 0, 1, 0, 0};
      static int[] ConnectionGranted = {0xFF, 0, 2, 0, 0};
      static int[] RequestCommand    = {0xFF, 0, 3, 0, 0};
      static int[] ServoSpeeds       = {0xFF, 0, 4, 0, 0};
    
      static int tLeft;     // Servo control pulse durations
      static int tRight;
      static int [] buffer = {0xff,0,0,0,0};
    
      static byte duration;
      static byte frequency;
      static int msgIndex=0;                // message index
      static boolean Error=false;
    
      final static int SERIAL_TX_PIN  = CPU.pin1;
      final static int SERIAL_RTS_PIN = CPU.pin2;
      final static int SERIAL_CTS_PIN = CPU.pin3;
      final static int SERIAL_RX_PIN  = CPU.pin0;
    
      static Uart rxUart = new Uart( Uart.dirReceive, SERIAL_RX_PIN, Uart.dontInvert,
                               SERIAL_CTS_PIN,Uart.speed9600,
                               Uart.stop1 );
      static Uart txUart = new Uart( Uart.dirTransmit, SERIAL_TX_PIN,Uart.dontInvert,
                               SERIAL_RTS_PIN,  Uart.speed9600,
                               Uart.stop1 );
    
      static byte routine;                  // Routine selector
      static byte counter;
    
      static boolean flagWhiskers;          // Act on Whisker values
      static boolean flagDigSens;           // Send back digital sensors 1/0s
                                            // with every reply
      static boolean flagIr;
      static boolean tempBit;
    
      final static int LED  = CPU.pin15;             // To control the L.E.D.
      final static int LED2 = CPU.pin14;             // To control the L.E.D.
      final static int SPEAKER = CPU.pin4;           // To speaker
      final static boolean ONSTATE = true;           // Button Pressed Down
      final static boolean OFFSTATE = false;         // Button Normal State
    
      static Freqout freqout = new Freqout ( SPEAKER ) ;
      public static void main() {
        CPU.writePin(LED,ONSTATE);
        freqout.freqout ( 450, 750 ) ;      // 4.5kHz, 75ms
        CPU.writePin(LED,OFFSTATE);
        do {
          init();
        //---------------------- Main Routine --------------------------;
          do {
            getNextCommand();
            // エラーがあった場合スピーカーを鳴らす
            if(Error) freqout.freqout ( 400, 500 );
    
               //リクエストコマンド
            RequestCommand[1] = ++msgIndex;
            for(int i=0; i<5; i++)
              txUart.sendByte(RequestCommand[i]);
           } while (CPU.readPin(CPU.pin5));
        } while(true);
     }
    
      public static void init() {
        do {
          // eb500が準備できたのを待つ
          CPU.writePin(LED,ONSTATE);
          CPU.delay(1000);                   // 1秒
          CPU.writePin(LED,OFFSTATE);
    
          // EB500が接続されたのを待つ
          while(!CPU.readPin(CPU.pin5));
    
          // 接続リクエスト
          for(int i=0; i<5; i++)
            txUart.sendByte(RequestConnect[i]);
    
          // 接続確認
          buffer[0] = 0xff;
    Confirm_Connect:
          do {
            for(int i=0; i<5; i++)
            txUart.sendByte(ConnectionGranted[i]);
            while( (rxUart.receiveByte()& 0xff) != 0xff);
            for(int i=1; i<5; i++) buffer[i] = rxUart.receiveByte()&0xff;
            for(int i=0; i<5; i++) Format.printf("%02x ",buffer[i]);
            System.out.println(" ");
            if((buffer[0]==0xff)&&(buffer[2]==2)) break Confirm_Connect;
          } while(true);
          //リクエストコマンド
          RequestCommand[1] = (++msgIndex)&0xff;
          for(int i=0; i<5; i++)
            txUart.sendByte(RequestCommand[i]);
         } while (!CPU.readPin(CPU.pin5));
       }
       public static int getNextCommand(){
         int oldIndex = buffer[1];
         Error = false;;
         buffer[0] = 0xff;
         do {
           do {
             while( (rxUart.receiveByte()& 0xff) != 0xff);
             buffer[1] = rxUart.receiveByte()& 0xff;
             if(oldIndex == buffer[1]) continue;
             for(int i=2; i<5; i++) buffer[i] = rxUart.receiveByte()&0xff;
           } while(oldIndex == buffer[1]);
           if(((oldIndex+1)&0xff) != buffer[1]) {
             Error = true;
           }
           for(int i=0; i<5; i++) Format.printf("%02x ",buffer[i]);
           Format.printf("\n");
           if(buffer[2] == 192 ) {
             freqout.freqout ( 100, 900 ) ;
             System.out.println("reset command");
             msgIndex=0;
             init();
          }
          else  break;
         }while(true);
         return buffer[2];
      }
    }


    このプログラム中にFormat.printfというC言語のprintfに相当するメソッドを利用しています。このFormatというクラスは標準では付属していないので、ダウンロードして「C:\Program Files\Parallax Inc\Javelin Stamp IDE\lib\stamp\util\text」の中に入れてください。

  3. Visual Studioのプログラムを実行します。それには緑の三角をクリックします。


    すると、コマンドプロンプトのウィンドウが開き、下図のように表示されます。



    EB500のD1と書いてある緑のLEDが点灯し、LEDがon/offしスピーカーが鳴ります。Javelin Stamp IDEのJavelin Terminalには次のような表示がされます。



    20はサーボモーターへのコマンドで、次の二つの数字が左、右のスピードになります。100が停止で0が時計回りに最大スピード、200が反時計回りに最大スピードになっています。
    上図では両方64ですから、10進数に直すと100ですので停止状態です。

  4. Internet Explorerを起動し、アドレス入力部にhttp://localhost:50000/controlpanelを入れ、接続します。
    すると、下図のような表示になります。



    Boe-Bot Generic Driveを探し、その右側にある「Create」ボタンを押します。
    次に、Simple Dashboardを探し、同様に「Create」ボタンを押します。
    すると、下図のようなウィンドウが出現します。いくつかウィンドウが開いていると上に出てこない場合があるので、その時は選択して上に持ってきます。


    Machineのところにlocalhost、Portのところに50001を入れてConnectボタンを押します。するとMachineのところにはそのパソコンの名前、Service Directoryのところには/bsdrive/driveと表示されます。この/bsdrive/driveをダブルクリックします。次にDriveボタンを押します。
    円の中に十字がある部分をマウスでドラッグするとJ-Botのサーボモータのスピードを変えることが出来ます。ここではそのコマンドをJavelin Terminalで見ていますから、ドラッグすると数字が変わることを確認してください。



XBox用コントローラーでデータを送る





Tutorial1-A

C#言語で触角で物体検出する
  1. 以下のような回路を組み上げてください。

    今のところ触角のところを実験するのでその部分だけでもOKです。



    これに伴い、J-Bot側のプログラムも変更します。青で書いてあるところを付け加えます。

    触角・IRのデータを送る部分
               //リクエストコマンド
            RequestCommand[1] = ++msgIndex;
            RequestCommand[3] = 0xff;
            
            if(CPU.readPin(CPU.pin7) == false)  RequestCommand[3]&=0xf7;
            if(CPU.readPin(CPU.pin8) == false)  RequestCommand[3]&=0xfb;
            if(CPU.readPin(CPU.pin9) == false)  RequestCommand[3]&=0xfd;
            if(CPU.readPin(CPU.pin10) == false) RequestCommand[3]&=0xfe;
    
    
    
            for(int i=0; i<5; i++)
              txUart.sendByte(RequestCommand[i]);
    
    
    


  2. C:\Microsoft Robotics Studio (1.5)\samples\RoboticsTutorials\Tutorial1\CSharpの中にあるRoboticsTutorial1.slnをダブルクリックする。
  3. RoboticsTutorial1.csの後ろのほうにある"Ouch - the bumper was pressed."の文字列を"前方に不審物体検出!"の文字列に変更する。
  4. メニューのプロジェクト→RoboticsTutorial4のプロパティ→デバッグ →開始オプションのコマンドライン引数の中を
    「-p:50000 -t:50001 -m:"Samples\Config\RoboticsTutorial1.manifest.xml" -m:"samples\config\Parallax.MotorIrBumper.manifest.xml"」にして、ビルドする。
  5. エラーがないことを確認して実行する。 コマンドプロンプトが開き、J-Botのスピーカーが鳴り、同時にLEDが光ります。これが通信開始の合図です。いろいろな設定が終わってから、触角をON/OFFしてみます。すると以下のような文字が表示されます。表示されたらば成功です。終了するにはコマンドプロンプトでコントロールCを押します。



Tutorial1-B

MVPLで同じことをやってみる
「C:\Microsoft Robotics Studio (1.5)\samples\RoboticsTutorials\Tutorial1\mvpl」をダブルクリックすると基本的なプログラムができていますが、これでは正しく動きません。これまでのMVPLでは、単にサービスをデータフローのところにドラッグして置いただけでした。裏で通信して使えるのでしたが、今回は正しく配線、設定をしなければいけません。
先ずは出来上がりのプログラムです。これは上のC#のプログラム同様チェックプログラムで、目的は触角をさわったら何か文字を表示して知らせることです。多少動作がおかしくても目をつむります。



  1. 左側下のServicesからBoeBotBASICStamp2とSimpleDialogをドラッグし、Dataflowのウィンドウに貼り付けます。左側上のウィンドウからDataをドラッグし、同様に貼り付けます。出来上がりのように並べます。
  2. BoeBotBASICStamp2には出来上がりのように右端にオレンジの丸だけではなく、左側と右側にオレンジの四角があります。接続方法により、接続できない部分は見えなくなるようになっています。基本的に左側は入力側で、右側が出力側です。Dataの方も左下にはintと書いてあって出来上がりのようにstringではありません。このため保持するデータの型を指定する必要がありますから、右下の▼をクリックしてください。すると色々なデータ型がリストされるのでそこからstringを選んで下さい。これで、左下がstringに変わったと思います。次にDataの真ん中のゼロを目的の文字に変更します。ここでは「前方に不審物体検出!」となります。

  3. ロボットから接触したという情報が来たときに(正確には変化したときに)Dataで設定されている文字列をSimple Dialogに出すのが目的です。
    この情報の流れを接続していきます。BoeBotBASICStamp2の右側の丸オレンジをクリックしてドラッグすると線が出てきます。これをDataの丸オレンジに繋げてマウスを放します。すると次のようなウィンドウが出てきます。



    BoeBotBASICStamp2には5種類の出力があり、Dataの方はCreateの一つだけの入力となっています。From側(BoeBotBASICStamp2)のSensorsChangedを選択してOKボタンを押します。これで触角に変化が起きたら知らせてきます。

  4. 次に、DataとSimple Dialogを同様に繋ぎます。次のようなウィンドウが出ます。



    ここでは、AlertDialogを選びます。OKボタンを押します。

    するとすぐに下のようなダイアログがでますが、出なかった場合は、今接続した線を右クリックします。



    ここで、Data Connectionsを選びます。これはどんなデータを繋ぐかの設定になります。これを選択すると次のようなウィンドウが出ます。nullは何もないデータが繋がっていることになるので、何も表示されない設定になっています。nullの場所をクリックしてリストを表示させ「value」を選択し、OKボタンを押します。



  5. BoeBotBASICStamp2を右クリックすると次のような選択肢が出ます。この中から「Set Configuration」を選びます。



    Initial Stateタブを選び、BasicStampStateとConfigurationを開き、SerialPortのところにBluetoothのCOM番号を入れます。下の例では40になっています。



    これで設定(プログラミング)が終わりました。

    緑の三角を押して実行します。



    次のようなAlartDialogが触角をONにすると表示されます。



Tutorial1-C

接触したのは左右のどちらの触角かを表示
下図のようにプログラムします。



Tutorial2

触覚をON/OFFすると片方のモーターがON/OFFする
C:\Microsoft Robotics Studio (1.5)\samples\RoboticsTutorials\Tutorial2\CSharpの中にあるRoboticsTutorial2.slnをダブルクリックする。
メニューのプロジェクト→RoboticsTutorial2のプロパティ→デバッグ →開始オプションのコマンドライン引数の中を
「-p:50000 -t:50001 -m:"Samples\Config\RoboticsTutorial2.manifest.xml" -m:"samples\config\Parallax.MotorIrBumper.manifest.xml"」にして、ビルドする。
エラーがないことを確認して実行する。
課題 触覚をON/OFFすると二つのモーターが逆回転させる
ヒント
MotorState.HardwareIdentifierの値を1、あるいは2にすると左右のモーターの指定になる。 その指定の変更にはSetMotorPowerRequest.Replace()を用いる。
課題 モーターが逆回転する度にスピーカーを鳴らす
ヒント
BoeBotControl.csを修正する。

Tutorial4

C:\Microsoft Robotics Studio (1.5)\samples\RoboticsTutorials\Tutorial4\CSharpの中にあるRoboticsTutorial4.slnをダブルクリックする。
メニューのプロジェクト→RoboticsTutorial4のプロパティ→デバッグ →開始オプションのコマンドライン引数の中を
「-p:50000 -t:50001 -m:"Samples\Config\RoboticsTutorial4.manifest.xml" -m:"samples\config\Parallax.BoeBot.Drive.manifest.xml"」にして、ビルドする。
エラーがないことを確認して実行する。
課題

以下のコマンドセットに従うように例題を改造しなさい。

コマンドセット

Start ByteMessage IndexCommandData1Data2
0 ---- PCにハンドシェークを繰り返すように指示する。(PCからの指示の場合は192)
255index0don't caredon't care
1 ---- Javelinがハンドシェークを開始する。
255index1don't caredon't care
2 ---- PCがハンドシェークの開始の受け取りを確認する。
255index2don't caredon't care
3 ---- JavelinがPCに次のコマンドを要求する。
255index3don't caredon't care
32 ---- 左右のサーボモーターのスピードを指定する。
左右のサーボモーターの数字の範囲は0から200である。
  • 0: 時計回りに最大スピード
  • 200: 反時計回りに最大スピード
  • 100: 停止
  • 255index32left speedright speed
    33 ---- 予め設定してある動作をさせる。
  • "U": 停止し、Uターンする。
  • "L": 停止し、左ターンする。
  • "R": 停止し、右ターンする。
  • 255index33characterdon't care
    64 --- PCがIr検出器の状態を送れと要求。
  • xはdon't care
  • Lは左のIr検出器の状態
  • Rは左のIr検出器の状態
  • [注]各bitの状態はActive-Low
    255index64xxxxxxLRdon't care
    65 ---- PCが触角の状態を送れと要求。
  • xはdon't care
  • Lは左の触角器の状態
  • Rは左の触角の状態
  • [注]各bitの状態はActive-Low
    255index65xxxxLRxxdon't care
    96 ---- スピーカーに音を出すように要求。
  • 持続時間は50msの単位(例 20→1秒)
  • 周波数は50Hz単位(例 20→1kHz)
  • 255index96durationfrequency
    97 ---- 二ヶ所までのI/Oピンの状態を設定する。
    各々のbyteの上位nibbleには命令(0~4)、下位nibbleにはピン番号(0~15)を保持している。

    命令
  • 0 - 何もしない
  • 1 - ピンを出力に設定
  • 2 - ピンを入力に設定
  • 3 - ピンをhigh出力
  • 4 - ピンをlow出力
  • 255index97command/pincommand/pin
    98 ---- 指定された時間(ms)止まる。
  • 指定されたミリ秒何もしない(16bit値)。
  • 255index98low bytehigh byte
    128 ---- デジタルセンサーを利用可能にする。
    返答データbyteはxxxxlrLRとなる
  • l - 左の触角
  • r - 右の触角
  • L - 左のIR
  • R - 右のIR
  • 255index128don't caredon't care
    129 ---- IRを使用可能にする。
    IRは実装されているので、この時点でenable/disableする必要はない。
    255index129don't caredon't care
    130 ---- 触角を使用可能にする。
    PCからの指令なしで触角に接触した場合、前進を停止するように設定する。物体に接触してからPCから次の命令が来るまで時間がかかりぶつかってしまうのを防ぐ。
    255index130don't caredon't care
    160-162 ---- 128-130の機能を無効にする。
    255index160, 161 or 162don't caredon't care
    192 --- メッセージインデックスをリセットし、ハンドシェークを開始する。
    255index192don't caredon't care