2台の端末をそれぞれサーバー、クライアントとしてペアリングさせて
 Bluetooth(SPP)接続によるデータ通信することができます。
 応用で端末以外でも制御等に使えます。
 この機能を使うには端末にBluetooth機能が付いている必要があります。

 接続データ
 プロファイル  RFCOMM
 SPP UUID = "00001101-0000-1000-8000-00805F9B34FB"
 NAME = "bt_spp_andbas"

 Bluetooth通信プログラムの流れ
 双方のBluetoothスイッチをオンにする。 (BT_ENABLE命令)
 クライアント側がサーバー側のデバイスを取得。 (BT_DEVICE命令)
 サーバー側は待ち受け[accept]状態 (BT_OPEN命令)、
 クライアント側がサーバー側デバイスへ接続信号[connect]を送り (BT_OPEN命令)
 サーバー側が受け取りソケットを確保、ファイルがオープンされる。
 データのやり取りを行う。 (BT_OUTPUT、BT_INPUT$命令)
 割り込み命令 (BLUETOOTH、ON-BLUETOOTH) の併用によりデータ受信時のみ
 BT_INPUT$でデータ受信する方法もあります。


 最小構成Bluetooth通信プログラム
 サーバー側 こちらを先に実行して'accept'状態にする。

  10 bt_open "accept"
  20 bt_output "From server"
  30 a$=bt_input$(30):print a$

 クライアント側 ダイアログ検知で相手端末名がでるのでタップして選択する。
 タップ後すぐに'connect'信号が送信されます。

  10 bt_device
  20 bt_open "connect"
  30 bt_output "From client"
  40 a$=bt_input$(30):print a$

 'connect'信号を送る時は、サーバー側は先に'accept'状態になって待ち受ける必要があります。

 ・注意 直前に別のBluetoothアプリが使用されていて終了時のソケットの開放処理が
  行われていないアプリであった場合に、接続ができなくなることがあります。この場合は一度リセットして下さい。



  BT_STATE$


 [機能] Bluetoothの状態を取得して返します。

 [書式] BT_STATE$([n])

 [説明]
  n=0  Bluetoothの状態を返します。
  返し値 (文字型)
   0 Bluetooth機能がない機種です。
   1 Bluetoothはオフ状態です。
   2 Bluetoothはオン状態です。
   3 接続先デバイスを発見している状態です。
   4 Bluetoothはペアリング接続されファイルがオープンされてる状態です。
  n=1  SPPのUUIDを返します。
  n=2  相手側(サーバー)のデバイスネームを返します。(相手側がクライアントの時は取得できません null文字になります)
  n=3  相手側(サーバー)のMACアドレスを返します。(相手側がクライアントの時は取得できません null文字になります)

 [例]
    bt_open
    if val(bt_state$(0))<4 then print"not connect":end



  BT_ENABLE


 [機能] Bluetooth機能のオン/オフの切り替えをします。

 [書式] BT_ENABLE ON|OFF

 [説明]
  ON  Bluetoothをオンにします。
  OFF Bluetoothをオフにします。Bluetoothファイルは閉ざされ、割り込みは'off'になります。

 [例]
    bt_enable on



  BT_SIGNAL


 [機能] 自分の端末を発見してもらうための信号を発信します。

 [書式] BT_SIGNAL [秒数]

 [説明]
  初めて接続する端末同士の時に、
  相手にこちらのデバイス名とMACアドレスを認識させるための信号を送ります。
  この作業は最初に一度だけ必要です。
  相手側がBT_DEVICEで'Search signal devices.'を選んだ時に
  重なるようにこちら側が'BT_SIGNAL'を発信することで、相手側にキャッチさせることができます。
  一度認識させた後は'BT_DEVICE'のリストの中に最初から表示されるようになるので
  以降は'BT_SIGNAL'の実行は必要ありません。
  {プログラムで繰り返し実行される部分にBT_SIGNALを書かないで下さい}
  この信号はメニューの'BT_Signal'からも同様の発信ができます。
  ('Search signal devices.'の時にメニューからこれを送るのが簡単な方法です)

  シグナルを出す[秒数]を指定できます。省略時は15秒です。
  確認のダイアログが出ます。
  この命令はダイアログがが閉じた後、すぐに次の命令に進みます。
  (通常は次のaccept待ちの流れになります)

 [例]
    bt_signal 20



  BT_DEVICE


 [機能] 接続するデバイスを発見、選択します。

 [書式] BT_DEVICE ["デバイス名"]

 [説明]
  最初にダイアログで接続したことのあるデバイス名とMACアドレスのリストが表示されます。
  "デバイス名"が指定されている場合で、それがリスト内に存在する場合は
  自動でデバイス選択がなされて次へ進みます。(ダイアログの選択は出ません)

  さらに発見信号を出しているデバイス(このBasicの場合'BT_SIGNAL')を
  検知したい場合は一番上の'Search signal devices.'を選びます。
  約12秒の検知が始まり、発見されたデバイスがリストに追加されます。
  発見信号(サーバー側:BT_SIGNAL)と検索(クライアント側:Search...)は
  どちらが先に実行されても構いませんが、この期間は重複している必要があります。

  Bluetoothがオフの時は自動で'bluetooth on'が実行されます。
  この命令は選択が行われるまで次の命令には進みません。
  接続ができなかった時とキャンセルが押された時はデバイスの取得はできませんがエラーにはなりません。
  直後に'BT_STATE$'で取得の可否を調べることができます。

 [例]
    bt_device
    bt_device "android01"



  BT_OPEN


 [機能] サーバー又はクライアントとしてBluetoothファイルをオープンします。

 [書式] BT_OPEN ["機能"] [,秒数]

 [説明]
  これはサーバー側とクライアント側の双方で行われます。
  受信[秒数]を指定できます。(デフォルト15秒)

  機能:"accept"はサーバーとしてオープンします。
  クライアント側からの'connect'信号を待ち受けて(accept状態)ソケットを確保、ファイルをオープンします。

  機能:"connect"はクライアントとしてオープンします。
  'BT_DEVICE'で取得したデバイスへ'connect'信号を発信し、ソケットを確保、ファイルをオープンします。
  'connect'信号の発信は先に相手側が受信状態(accept)になっていることが必要です。

  ["機能"]が省略された場合は事前に'BT_DEVICE'でデバイスが取得されていれば"connect"命令、
  そうでなければ"accept"命令と判別されます。

  BASIC起動後、一度接続があって
  繰り返し同じ設定での実行(同じ端末間でサーバーとクライアントの指定が同じ時)では
  "accept"は選択ダイアログが出ます。
  [同じデバイスに接続]  同じソケットでの接続になります。
  [新たに受信(Accept)] 新たに受信(accept)を開始します。(サーバー、クライアントが入れ替わった時もこちらです)

  "connect"の場合で'BT_DEVICE'で同じデバイスを選んでいた時は、同じソケットでの接続になります。
  この場合で'connect'信号を再度送信したい時は一度
  bt_enable off : bt_enable on を実行して(クリアされる)
  あらためて BT_DEVICE -> BT_OPEN "connect" と進んで下さい。
  (通常はサーバー側"accept"->[同じデバイスに接続] クライアント側:'BT_DEVICE'->同じデバイス選択 で繰り返し接続できます)

  Bluetoothがオフの時は自動で'bluetooth on'が実行されます。
  この命令はオープン作業が終わるか[秒数]が終わるまで次の命令には進みません。
  オープンができなかった場合もエラーにはなりません。
  直後に'BT_STATE$'でオープン成功の可否を調べることができます。

 [例]
   サーバー側
    10 bt_enable on
    20 bt_open "accept"
   クライアント側
    10 bt_enable on
    20 bt_device
    30 bt_open "connect"



  BT_INPUT$


 [機能] Bluetoothのソケットからデータ(文字列)を受け取ります。

 [書式] BT_INPUT$([秒数])

 [説明]
  入力待ちの秒数を指定できます。省略時は5秒です。
  入力があるか指定秒数が終わるまで次の命令には進みません。
  入力がなく指定秒数が終わるとヌル文字を返します。
  相手側から送信データがあり、すぐに'BT_INPUT$'での取得がなされていない場合は
  スタックに蓄積されて'BT_INPUT$'が実行された時にまとめて一連の文字列として取得されます。

 [例]
    a$=bt_input$(20)
    print a$



  BT_OUTPUT


 [機能] Bluetoothのソケットへデータ(文字列)を出力します。

 [書式] BT_OUTPUT 文字列データ

 [説明]
  文字列データを相手側端末に送信します。
  データの入出力命令はサーバー側、クライアント側両方で使用できます。

 [例]
    bt_output "data01"



  BLUETOOTH


 [機能] Bluetoothの割り込みのオン/オフの切り替えをします。

 [書式] BLUETOOTH ON|OFF

 [説明]
  データ受信が起こった時に ON BLUETOOTH GOSUB 行番号
  で指定された割り込み処理ルーチンの行にいき、
  return命令で元の実行行に帰ってきます。
  この命令は先にBluetoothファイルがオープンされていて
  on bluetooth 命令で飛び先が指定されていなければなりません。
  'ON'状態になると入力待ちのプロセスが常に働くので
  プログラム終了時には'OFF'にするようにして下さい。
  参照:on bluetooth (割り込み)

 [例]
    10 bt_open "server"
    20 on bluetooth gosub 100
    30 bluetooth on
    40 pause 1:goto 40
   100 print bt_input$();:return



 サンプル Bluetooth chat
 それぞれの端末で1と2を入力してスタート。

  100 bt_enable on
  110 input "1:Server 2:Client";sc
  120 if sc<>1 then bt_device
  130 if sc=1 then bt_open"accept" else bt_open"connect"
  140 on stop gosub 230:stop on
  150 on bluetooth gosub 220
  160 bluetooth on
  170 while -1
  180 a$=inkey$:pause 1
  190 if a$<>"" then print a$;:s$=s$+a$
  200 if a$=chr$(13) then bt_output s$:s$=""
  210 wend
  220 c$=bt_input$():print c$;:return
  230 bluetooth off:stop off:end


 解説
  100 Bluetoothをオンにする
  120 クライアントなら 'bt_device' を実行
  130 サーバー又はクライアントでオープン
  140 ,230 終了処理
  150 ,160,220 データ受信割り込み処理
  170 -210 ループ処理
  200 改行で bt_output にてデータ出力