我已经成功编写了一个与蓝牙设备连接的代码,发现必须发送一个字节数组来对其进行控制。
01 99 02 00 99(Hex)-开 01 99 02 01 99(Hex)-关闭
这是一个五字节的数组。是否可以通过蓝牙发送?如果可以,怎么办?
到目前为止,我尝试了类似的方法, 我尝试了第一种情况(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();
}
}
}
}
但是到目前为止,蓝牙设备未收到正确的消息。任何帮助/建议将不胜感激。
答案 0 :(得分:0)
当我尝试从头开始编写代码而不是定制现有的BTchat源代码时,我是自己做的。
逻辑很简单。发送十六进制代码 i)对于ON开关
ON.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
char[] test = {0x01, 0x99, 0x02, 0x00, 0x99};
write(test);
}
});
,写功能将类似于
private void write(char[] ch) {
try {
for (int k = 0; k < ch.length; k++) {
new DataOutputStream(socket.getOutputStream()).writeByte(ch[k]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
ii)整个代码
package com.example.arun.bt_ledrevised;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.ParcelUuid;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
Button connect, list_btn,ON,OFF;
ListView lv;
BluetoothDevice[] btArray;
int REQUEST_ENABLE_BLUETOOTH = 1;
int A_R_E=0;
private OutputStream os;
private InputStream is;
private BluetoothSocket socket;
private static final String APP_NAME = "BTLED";
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);
connect = (Button) findViewById(R.id.connect);
list_btn = (Button) findViewById(R.id.list_btn);
ON = (Button) findViewById(R.id.on);
OFF = (Button) findViewById(R.id.off);
lv = (ListView) findViewById(R.id.lv);
final BluetoothAdapter blueAdapter = BluetoothAdapter.getDefaultAdapter();
if (blueAdapter == null) {
finish();
}
if (!blueAdapter.isEnabled()) {
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BLUETOOTH);
}
connect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!blueAdapter.isDiscovering()){
Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(intent,A_R_E);
}
}
});
list_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Set<BluetoothDevice> bt = blueAdapter.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);
lv.setAdapter(arrayAdapter);
}
}
});
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
BluetoothDevice device = (BluetoothDevice) btArray[i];
//uuids = device.getUuids();
try {
socket = device.createRfcommSocketToServiceRecord(MY_UUID);
socket.connect();
} catch (IOException e) {
e.printStackTrace();
}
}
});
ON.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
char[] test = {0x01, 0x99, 0x02, 0x00, 0x99};
write(test);
}
});
OFF.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
char[] test1 = {0x01, 0x99, 0x02, 0x01, 0x99};
write(test1);
}
});
}
private void write(char[] ch) {
try {
for (int k = 0; k < ch.length; k++) {
new DataOutputStream(socket.getOutputStream()).writeByte(ch[k]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
final int BUFFER_SIZE = 1024;
byte[] buffer = new byte[BUFFER_SIZE];
int bytes = 0;
int b = BUFFER_SIZE;
while (true){
try {
bytes = socket.getInputStream().read(buffer, bytes, BUFFER_SIZE - bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}