我修改了 Minddroid github Android 程序以读取 LEGO NXT 上的传感器(很棒的设备!)。现在我想读取蓝牙消息并将其写入在 NXT 中运行的 Mindstorms 程序。这样我就可以运行 NXT 程序并在 Android 要求时将结果/读数发送到 Android。
2 回答
我创建了一个项目,NXT 将数据发送回我的 Android 设备。这是一些应该工作的代码:
这是所有Android端代码:
这是我编写的一个类,它将负责通过蓝牙进行连接和通信。
public class Connector {
public static final String TAG = "Connector";
public static final boolean BT_ON = true;
public static final boolean BT_OFF = false;
public BluetoothAdapter bluetoothAdapter;
public BluetoothSocket bluetoothSocket;
public String address;
public Connector(String address) {
this.address = address;
this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
public void setBluetooth(boolean state) {
if(state == Connector.BT_ON) {
// Check if bluetooth is off
if(this.bluetoothAdapter.isEnabled() == false)
{
this.bluetoothAdapter.enable();
while(this.bluetoothAdapter.isEnabled() == false) {
}
Log.d(Connector.TAG, "Bluetooth turned on");
}
}
// Check if bluetooth is enabled
else if(state == Connector.BT_OFF) {
// Check if bluetooth is enabled
if(this.bluetoothAdapter.isEnabled() == true)
{
this.bluetoothAdapter.disable();
while(this.bluetoothAdapter.isEnabled() == true) {
}
Log.d(Connector.TAG, "Bluetooth turned off");
}
}
}
public boolean connect() {
boolean connected = false;
BluetoothDevice nxt = this.bluetoothAdapter.getRemoteDevice(this.address);
try {
this.bluetoothSocket = nxt.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
this.bluetoothSocket.connect();
connected = true;
}
catch (IOException e) {
connected = false;
}
return connected;
}
public Integer readMessage() {
Integer message;
if(this.bluetoothSocket!= null) {
try {
InputStreamReader input = new InputStreamReader(this.bluetoothSocket.getInputStream());
message = input.read();
Log.d(Connector.TAG, "Successfully read message");
}
catch (IOException e) {
message = null;
Log.d(Connector.TAG, "Couldn't read message");
}
}
else {
message = null;
Log.d(Connector.TAG, "Couldn't read message");
}
return message;
}
}
在您的活动类中,您可以创建一个Connector
对象。在 onCreate() 方法中,您必须像这样连接才能建立到 NXT 的连接:
// Establish a bluetooth connection to the NXT
this.connector = new Connector("00:16:53:12:B6:78");
this.connector.setBluetooth(Connector.BT_ON);
this.connector.connect();
现在要从 NXT(一个 Integer 对象)读取消息,您可以这样做:
this.connector.readMessage();
要关闭连接:
this.connector.setBluetooth(Connector.BT_OFF);
这是所有 NXT 端代码:
注意:下载leJOS以使所有代码都能正常工作(leJOS 将允许您在 java 中编写 NXT 代码)。
在主类中定义这两个对象:
public static DataOutputStream dataOutputStream;
public static NXTConnection bluetoothConnection;
要连接到您的手机:
bluetoothConnection = Bluetooth.waitForConnection();
bluetoothConnection.setIOMode(NXTConnection.RAW);
dataOutputStream = bluetoothConnection.openDataOutputStream();
以 Integer 对象的形式向手机发送数据:
dataOutputStream.write(100);
dataOutputStream.flush();
要断开连接,请运行:
dataOutputStream.close();
bluetoothConnection.close();
我希望这有帮助。
我对蓝牙命令有点困惑,但现在我看到你需要下载 leJOS!
我通常会尽量避免弄乱NXT上的固件,但是java更容易处理!
对于任何感兴趣的人,您可以从您的 android 以原始格式向 NXT 发送命令,尽管它不像上面列出的那样漂亮。这里有一个很棒的教程: http ://www.robotappstore.com/Knowledge-Base/Programming-LEGO-NXT-Mindstorms/92.html
但如果你想免费下载一个应用程序,这里有一个: http ://www.robotappstore.com/Apps/Lego-NXT-Mindstorms-Driver---Android-app.html?x=693A00AA-7F15-46E7 -9616-8101068DB58D
还有很多,如果你也在那里搜索的话
希望这可以帮助!