Android 和 Lego Mindstorm NXT 之间的蓝牙连接 [英] Bluetooth-connection between Android and Lego Mindstorm NXT

查看:23
本文介绍了Android 和 Lego Mindstorm NXT 之间的蓝牙连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人知道如何在Android和LEGO-Mindstorm-NXT之间建立蓝牙连接吗?两个 NXT 之间的连接工作正常.但是其他的 Connection 类型就没有那么容易了.我正在使用 LeJOS 固件 0.85 和 Android SDK 工具 (2.2 Froyo).

Does anybody know, how to build a bluetooth connection between Android and LEGO-Mindstorm-NXT? The connection between two NXTs works fine. But the other Connection-type likes not so easy. I am working with the LeJOS Firmware 0.85 and the Android SDK Tools (2.2 Froyo).

推荐答案

所以我已经解决了它,并将展示它是如何工作的,因为我看到很多人都遇到了这个问题.

So i've solved it and will show all how does it works, because i've seen that a lot of people have problems with that.

该类包括4个函数:

  • 蓝牙启用,如果之前没有启用 -> enableBT()
  • 连接到 2 个 NXT -> connectToNXTs()
  • 将消息写入 NXT 之一 -> writeMessage(byte msg, String nxt)
  • 从 NXT 之一读取消息 -> readMessage(String nxt)

这里是安卓设备的代码(BT_comm.java):

Here is the code for the android device (BT_comm.java):

package de.joen.android.CubeScan;


import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.UUID;


import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;

import android.util.Log;

public class BT_Comm {

  //Target NXTs for communication
  final String nxt2 = "00:16:53:04:52:3A";
  final String nxt1 = "00:16:53:07:AA:F6";

  BluetoothAdapter localAdapter;
  BluetoothSocket socket_nxt1, socket_nxt2;
  boolean success = false;

  // Enables Bluetooth if not enabled
  public void enableBT(){
    localAdapter = BluetoothAdapter.getDefaultAdapter();
    // If Bluetooth not enable then do it
    if (!localAdapter.isEnabled()) {
      localAdapter.enable();
      while(!(localAdapter.isEnabled()));
    }
  }

  // Connect to both NXTs
  public boolean connectToNXTs() {

    // Get the BluetoothDevice of the NXT
    BluetoothDevice nxt_2 = localAdapter.getRemoteDevice(nxt2);
    BluetoothDevice nxt_1 = localAdapter.getRemoteDevice(nxt1);
    // Try to connect to the nxt
    try {
      socket_nxt2 = nxt_2.createRfcommSocketToServiceRecord(UUID
          .fromString("00001101-0000-1000-8000-00805F9B34FB"));

      socket_nxt1 = nxt_1.createRfcommSocketToServiceRecord(UUID
          .fromString("00001101-0000-1000-8000-00805F9B34FB"));

      socket_nxt2.connect();    
      socket_nxt1.connect();      

      success = true;

    } catch (IOException e) {
      Log.d("Bluetooth","Err: Device not found or cannot connect");
      success=false;
    }
    return success;    
  }


  public void writeMessage(byte msg, String nxt) throws InterruptedException {
    BluetoothSocket connSock;

    // Swith nxt socket
    if (nxt.equals("nxt2")) {
      connSock=socket_nxt2;
    } else if(nxt.equals("nxt1")) {
      connSock = socket_nxt1;
    } else {
      connSock=null;
    }

    if (connSock!=null) {
      try {

        OutputStreamWriter out = new OutputStreamWriter(connSock.getOutputStream());
        out.write(msg);
        out.flush();

        Thread.sleep(1000);

      } catch (IOException e) {
        // TODO: Auto-generated catch block
        e.printStackTrace();
      }
    } else {
      // Error
    }
  }

  public int readMessage(String nxt) {
    BluetoothSocket connSock;
    int n;

    // Swith nxt socket
    if (nxt.equals("nxt2")) {
      connSock=socket_nxt2;
    } else if (nxt.equals("nxt1")) {
      connSock=socket_nxt1;
    } else {
      connSock=null;
    }

    if (connSock!=null) {
      try {

        InputStreamReader in = new InputStreamReader(connSock.getInputStream());
        n = in.read();
        return n;

      } catch (IOException e) {
        // TODO: Auto-generated catch block
        e.printStackTrace();
        return -1;
      }
    } else {
      // Error
      return -1;
    }
  }
}

要从 Android 智能手机获取消息,您必须在 NXT 端进行读取呼叫.这是 NXT 端的代码,它将接受来自智能手机的连接并从中读取消息:

To get messages from the Android Smartphone you must have a read call on the NXT-side. Here is the code from the NXT-side wich will accept the connection from the Smartphone and read messages from it:

Boolean isrunning = true;

// Main loop   
while (true)
{
  LCD.drawString(waiting,0,0);
  LCD.refresh();

  // Listen for incoming connection

  NXTConnection btc = Bluetooth.waitForConnection();

  btc.setIOMode(NXTConnection.RAW);

  LCD.clear();
  LCD.drawString(connected,0,0);
  LCD.refresh();  


  // The InputStream for read data 
  DataInputStream dis = btc.openDataInputStream();


  // Loop for read data  
  while (isrunning) {
    Byte n = dis.readByte();
    LCD.clear();
    LCD.drawInt(n, 4, 4);
  }

  dis.close();

  // Wait for data to drain
  Thread.sleep(100); 

  LCD.clear();
  LCD.drawString(closing,0,0);
  LCD.refresh();

  btc.close();

  LCD.clear();
}

希望这会帮助其他人...

Hope this will help others...

这篇关于Android 和 Lego Mindstorm NXT 之间的蓝牙连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆