【发布时间】:2019-01-29 05:07:59
【问题描述】:
我已经成功编写了一个连接蓝牙设备的代码,我发现我必须发送一个字节数组来控制它。
01 99 02 00 99(十六进制) - 开 01 99 02 01 99(十六进制)-关闭
这是一个五字节数组。可以通过蓝牙发送吗?如果有怎么办?
到目前为止,我尝试过这样的事情, 我尝试了第一种情况(On 方法)
i) 我将十六进制转换为十进制并创建了一个整数数组。 ii) 将整数数组转换为字节数组 iii) 将字节数组传递给 write 函数。
ON.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int[] intarr = new int[]{1, 153, 2, 0, 153}; //hex to
//decimal(manual)
ByteBuffer byteBuffer= ByteBuffer.allocate(intarr.length *4);
IntBuffer intBuffer =byteBuffer.asIntBuffer();
intBuffer.put(intarr);
byte[] array= byteBuffer.array();
sendReceive.write(array);
}
});
ii) 写函数
public void write(byte[] bytes)
{
try {
outputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
iii) 整个代码
package com.example.arun.bluet;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.util.Arrays;
import java.util.Set;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
Button listen,send, listDevices;
ListView listView;
TextView msg_box,status;
EditText writeMsg;
BluetoothAdapter bluetoothAdapter;
BluetoothDevice[] btArray;
SendReceive sendReceive;
static final int STATE_LISTENING = 1;
static final int STATE_CONNECTING=2;
static final int STATE_CONNECTED=3;
static final int STATE_CONNECTION_FAILED=4;
static final int STATE_MESSAGE_RECEIVED=5;
int REQUEST_ENABLE_BLUETOOTH=1;
private static final String TAG = "BluetoothChatService";
private static final String APP_NAME = "BTChat";
private static final UUID MY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewByIdes();
bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
if(!bluetoothAdapter.isEnabled())
{
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent,REQUEST_ENABLE_BLUETOOTH);
}
implementListeners();
}
private void implementListeners() {
listDevices.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Set<BluetoothDevice> bt=bluetoothAdapter.getBondedDevices();
String[] strings=new String[bt.size()];
btArray=new BluetoothDevice[bt.size()];
int index=0;
if( bt.size()>0)
{
for(BluetoothDevice device : bt)
{
btArray[index]= device;
strings[index]=device.getName();
index++;
}
ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,strings);
listView.setAdapter(arrayAdapter);
}
}
});
listen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ServerClass serverClass=new ServerClass();
serverClass.start();
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
ClientClass clientClass=new ClientClass(btArray[i]);
clientClass.start();
status.setText("Connecting");
}
});
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int[] intarr = new int[]{1, 153, 2, 0, 153}; //hex to
//decimal(manual)
ByteBuffer byteBuffer= ByteBuffer.allocate(intarr.length *4);
IntBuffer intBuffer =byteBuffer.asIntBuffer();
intBuffer.put(intarr);
byte[] array= byteBuffer.array();
sendReceive.write(array);
}
});
}
Handler handler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what)
{
case STATE_LISTENING:
status.setText("Listening");
break;
case STATE_CONNECTING:
status.setText("Connecting");
break;
case STATE_CONNECTED:
status.setText("Connected");
break;
case STATE_CONNECTION_FAILED:
status.setText("Connection Failed");
break;
case STATE_MESSAGE_RECEIVED:
byte[] readBuff= (byte[]) msg.obj;
String tempMsg=new String(readBuff,0,msg.arg1);
msg_box.setText(tempMsg);
break;
}
return true;
}
});
private void findViewByIdes() {
listen=(Button) findViewById(R.id.listen);
send=(Button) findViewById(R.id.send);
listView=(ListView) findViewById(R.id.listview);
msg_box =(TextView) findViewById(R.id.msg);
status=(TextView) findViewById(R.id.status);
writeMsg=(EditText) findViewById(R.id.writemsg);
listDevices=(Button) findViewById(R.id.listDevices);
}
private class ServerClass extends Thread
{
private BluetoothServerSocket serverSocket;
public ServerClass(){
try {
serverSocket=bluetoothAdapter.listenUsingRfcommWithServiceRecord(APP_NAME,MY_UUID);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run()
{
BluetoothSocket socket=null;
while (socket==null)
{
try {
Message message=Message.obtain();
message.what=STATE_CONNECTING;
handler.sendMessage(message);
socket=serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
Message message=Message.obtain();
message.what=STATE_CONNECTION_FAILED;
handler.sendMessage(message);
}
if(socket!=null)
{
Message message=Message.obtain();
message.what=STATE_CONNECTED;
handler.sendMessage(message);
sendReceive=new SendReceive(socket);
sendReceive.start();
break;
}
}
}
}
private class ClientClass extends Thread
{
private BluetoothDevice device;
private BluetoothSocket socket;
public ClientClass (BluetoothDevice device1)
{
device=device1;
try {
socket=device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run()
{
try {
socket.connect();
Message message=Message.obtain();
message.what=STATE_CONNECTED;
handler.sendMessage(message);
sendReceive=new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
e.printStackTrace();
Log.i(TAG,"Socket failed");
Message message=Message.obtain();
message.what=STATE_CONNECTION_FAILED;
handler.sendMessage(message);
}
}
}
private class SendReceive extends Thread
{
private final BluetoothSocket bluetoothSocket;
private final InputStream inputStream;
private final OutputStream outputStream;
public SendReceive (BluetoothSocket socket)
{
bluetoothSocket=socket;
InputStream tempIn=null;
OutputStream tempOut=null;
try {
tempIn=bluetoothSocket.getInputStream();
tempOut=bluetoothSocket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
inputStream=tempIn;
outputStream=tempOut;
}
public void run()
{
byte[] buffer=new byte[1024];
int bytes;
while (true)
{
try {
bytes=inputStream.read(buffer);
handler.obtainMessage(STATE_MESSAGE_RECEIVED,bytes,-1,buffer).sendToTarget();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void write(byte[] bytes)
{
try {
outputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
但蓝牙设备目前没有收到正确的消息。任何帮助/建议将不胜感激。
【问题讨论】:
-
你不应该声明一个 int 数组。用这些十六进制值声明一个字节数组。
-
好吧,我做到了,但它不起作用。
-
要提供更多帮助,请添加更多代码,特别是在您打开套接字并创建输出流对象时。另外,请准确定义“不工作”的含义
-
感谢您的评论。我已经添加了整个代码。
-
你为什么要为客户端和服务器发布代码?如果您尝试连接到蓝牙设备,对我来说毫无意义。如果你发送这五个字节,那么会收到什么?或者你到底有什么问题?为什么不删除以 int 数组开头的代码?非常混乱。
标签: android arrays bluetooth send