您的位置:首页 > 移动开发 > Android开发

Android手机与BLE终端通信

2017-08-13 10:20 357 查看
      Android 开发BLE通信,代码只能接收数据,没有写发送数据部分,接收数据时间间隔可自己修改,是工程中的一部分,只涉及蓝牙部分。代码中的UUID部分需要按自己的设备修改。

    代码下载地址:http://download.csdn.net/download/auroraexecue/9931371

布局部分:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.hp.blecaresystem.MainActivity">

<TextView
android:layout_centerInParent="true"
android:id="@+id/stata_data_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数据显示"
android:textSize="20dp"/>

<LinearLayout
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<Button
android:id="@+id/start_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="连接蓝牙"/>

<TextView
android:layout_width="40dp"
android:layout_height="wrap_content" />

<Button
android:id="@+id/stop_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="断开设备"/>
</LinearLayout>
</RelativeLayout>


Activity部分:

public class MainActivity extends AppCompatActivity {
private Button start_button;
private TextView stata_data_show;
private Button stop_button;
public final static String ACTION_DEVICE_CONECT = "com.example.hp.blecaresystem.ACTION_DEVICE_CONECT";
public final static String ACTION_DEVICE_DISCONECT = "com.example.hp.blecaresystem.ACTION_DEVICE_DISCONECT";
private BluetoothAdapter mBluetoothAdapter;
private BluetoothManager mBluetoothManager;
private static final int ENABLE_BT_REQUEST_ID = 1;
private final static int msg_deviceconnected = 1;
private final static int msg_devicedisconnected = 2;
private final static int msg_bluedatachaged = 3;
private static short[] raw_data;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

serviceinit();
viewInit();
blueInit();
regesterReciver();
}

private void viewInit(){
stata_data_show = (TextView) findViewById(R.id.stata_data_show);
start_button = (Button)findViewById(R.id.start_button);
stop_button = (Button)findViewById(R.id.stop_button);
start_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

Intent intent= new Intent(ACTION_DEVICE_CONECT);
sendBroadcast(intent);

}
});
stop_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent= new Intent(ACTION_DEVICE_DISCONECT);
sendBroadcast(intent);
}
});
}

private void serviceinit(){
Intent intent = new Intent(MainActivity.this,BLEService.class);
startService(intent);
}

private void blueInit(){
mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = mBluetoothManager.getAdapter();
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, ENABLE_BT_REQUEST_ID);
}
}

private void regesterReciver(){
IntentFilter mfilter = new IntentFilter();
mfilter.addAction(BLEService.ACTION_GATT_CONNECTED);
mfilter.addAction(BLEService.ACTION_GATT_DISCONNECTED);
mfilter.addAction(BLEService.ACTION_DATA_AVAILABLE);
registerReceiver(mReciver,mfilter);
}
private void unregesterReciver(){
unregisterReceiver(mReciver);
}
private BroadcastReceiver mReciver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(BLEService.ACTION_GATT_CONNECTED)){
mHandler.sendEmptyMessage(msg_deviceconnected);
}else if (action.equals(BLEService.ACTION_GATT_DISCONNECTED)){
mHandler.sendEmptyMessage(msg_devicedisconnected);
}else if (action.equals(BLEService.ACTION_DATA_AVAILABLE)){
raw_data = intent.getShortArrayExtra("rawdata");
mHandler.sendEmptyMessage(msg_bluedatachaged);
}
}
};
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case msg_deviceconnected:
Toast.makeText(MainActivity.this,"蓝牙已连接!",Toast.LENGTH_SHORT).show();
break;
case msg_devicedisconnected:
Toast.makeText(MainActivity.this,"蓝牙已断开!",Toast.LENGTH_SHORT).show();
break;
case msg_bluedatachaged:
if (raw_data!=null && raw_data.length>0)
stata_data_show.setText("" + raw_data[0] + " " + raw_data[1] + " " + raw_data[2]);
break;
default:
break;
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
unregesterReciver();
}
}


UUID 类部分:

public class BleDefinedUUIDS {
final static public UUID CHARACTER_UUID = UUID.fromString("00001527-1212-efde-1523-785feabcd123");
final static public UUID SERVICE_UUID = UUID.fromString("00001526-1212-efde-1523-785feabcd123");
}


Service部分:

public class BLEService extends Service {
private final static String TAG = BLEService.class.getCanonicalName();
public final static String ACTION_GATT_CONNECTED = "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
public final static String ACTION_GATT_DISCONNECTED = "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
public final static String ACTION_DATA_AVAILABLE = "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
public final static String ACTION_EXTRA_DATA = "com.example.bluetooth.le.ACTION_EXTRA_DATA";
private final static int msg_startconnect = 1;
private final static int msg_connectdevice = 2;
privat
10a8c
e final static int msg_disconnecte = 3;
private final static int msg_getbluedata = 4;
private final static int msg_datagetted = 5;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothManager mBluetoothManager;
private BluetoothGattCharacteristic mCharacteristic;
private static short[] GESONSOR_DATA;
private BluetoothGatt mBluetoothGatt = null;
private final static String BLUE_ADRESS = "F7:96:42:E4:8C:57";
private BluetoothDevice DEVICE = null;
private static boolean bluedatastate = false;
private final static int GET_DATA_TIME = 100; //间隔100毫秒获得一次数据

public BLEService() {
}

@Override
public void onCreate() {
super.onCreate();
regesterReciver();

mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = mBluetoothManager.getAdapter();
}
public void startScanning() {
final UUID[] uuids = new UUID[] { BleDefinedUUIDS.SERVICE_UUID };
mBluetoothAdapter.startLeScan(uuids,mDeviceFoundCallback);
}

/* stops current scanning */
public void stopScanning() {
mBluetoothAdapter.stopLeScan(mDeviceFoundCallback);
}

private BluetoothAdapter.LeScanCallback mDeviceFoundCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int i, byte[] bytes) {
if (IsTargetBlueDecive(device)){
stopScanning();
}
}
};

private boolean IsTargetBlueDecive(BluetoothDevice device){
if (device == null)
return false;
if (device.getAddress().equals(BLUE_ADRESS)){
this.DEVICE = device;
mHandler.sendEmptyMessage(msg_connectdevice);
return true;
}
return false;
}

private boolean connectDevice(String address){
if (mBluetoothAdapter==null || address==null)
return false;
//如果之前有连接过就直接连接,重新连接
if (mBluetoothGatt != null)
return mBluetoothGatt.connect();
mBluetoothGatt = DEVICE.connectGatt(this,false,mGattCallback);
return true;
}

public void disconnectDevice()
{
if (mBluetoothGatt != null)
{
mBluetoothGatt.disconnect();
}
}

public void closeDevice()
{
if (mBluetoothGatt != null)
{
mBluetoothGatt.close();
}
}
public void requestCharacteristicValue(BluetoothGattCharacteristic ch) {
if (mBluetoothAdapter == null || mBluetoothGatt == null)
return;
mBluetoothGatt.readCharacteristic(ch);
}

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
/**
* 连接状态改变回调
* @param gatt
* @param status
* @param newState
*/
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
if (newState == BluetoothProfile.STATE_CONNECTED){
mBluetoothGatt.discoverServices();
Log.w(TAG, "onConnectionStateChange" + " = " + mBluetoothGatt);
Intent intent = new Intent(ACTION_GATT_CONNECTED);
sendBroadcast(intent);
Log.w(TAG, "handleMessage" + " = 连接成功!");
}else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Intent intent = new Intent(ACTION_GATT_DISCONNECTED);
sendBroadcast(intent);
bluedatastate = false;
Log.w(TAG, "handleMessage" + " = 连接断开!");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
if (status == BluetoothGatt.GATT_SUCCESS) {
// now, when services discovery is finished, we can call getServices() for Gatt
mCharacteristic = mBluetoothGatt.getService(BleDefinedUUIDS.SERVICE_UUID)
.getCharacteristic(BleDefinedUUIDS.CHARACTER_UUID);
mHandler.sendEmptyMessage(msg_getbluedata);
Log.w(TAG, "onServicesDiscovered" + " = " + mCharacteristic);
}else {

Log.w(TAG, "onServicesDiscovered" + "获取失败");
}
}

@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
Log.w(TAG, "onCharacteristicRead" + " = 获得数据一次!");
getCharacteristicValue(characteristic);
}

@Override
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
super.onReadRemoteRssi(gatt, rssi, status);
}

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicRead(gatt, characteristic, status);
if (status == BluetoothGatt.GATT_SUCCESS){
Log.w(TAG, "onCharacteristicRead" + " = 获得数据一次!");
getCharacteristicValue(characteristic);
}
}
};

public void getCharacteristicValue(BluetoothGattCharacteristic ch) {
if (mBluetoothAdapter == null || mBluetoothGatt == null || ch == null)
return;
byte[] rawValue = ch.getValue();
UUID uuid = ch.getUuid();
if (uuid.equals(BleDefinedUUIDS.CHARACTER_UUID)){
GESONSOR_DATA = toShortArray(rawValue);
mHandler.sendEmptyMessage(msg_datagetted);
Log.w(TAG, "getCharacteristicValue=" + GESONSOR_DATA[0] + " " + GESONSOR_DATA[1] + " " + GESONSOR_DATA[2]
+ " " + GESONSOR_DATA[3] + " " + GESONSOR_DATA[4] + " " + GESONSOR_DATA[5]);
}
}

public static short[] toShortArray(byte[] src) {
int count = src.length >> 1;
short[] dest = new short[count];
for (int i = 0; i < count; i++) {
dest[i] = (short) (src[i * 2] << 8 | src[2 * i + 1] & 0xff);
}
return dest;
}

Handler mHandler = new Handler(){
@Override
public void handleMessage(final Message msg) {
super.handleMessage(msg);
switch (msg.what){
case msg_startconnect:
Log.w(TAG, "handleMessage" + " = get commond!");
startScanning();
break;
case msg_connectdevice:
connectDevice(DEVICE.getAddress());
Log.w(TAG, "handleMessage" + " = " + DEVICE.getName());
break;
case msg_disconnecte:
bluedatastate = false;
disconnectDevice();
break;
case msg_getbluedata:
bluedatastate = true;
new Thread(new Runnable() {
@Override
public void run() {
while (bluedatastate){
if (mCharacteristic == null){
Log.w(TAG, "run" + " = 启动异常!");
}else {
requestCharacteristicValue(mCharacteristic);
Log.w(TAG, "run" + " = 正常启动!");
}
try {
Thread.sleep(GET_DATA_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
break;
case msg_datagetted:
Intent intent = new Intent(ACTION_DATA_AVAILABLE);
intent.putExtra("rawdata",GESONSOR_DATA);
sendBroadcast(intent);
break;
default:
break;
}
}
};

private void regesterReciver(){
IntentFilter mfilter = new IntentFilter();
mfilter.addAction(MainActivity.ACTION_DEVICE_CONECT);
mfilter.addAction(MainActivity.ACTION_DEVICE_DISCONECT);
registerReceiver(mReciver,mfilter);
}
private void unregesterReciver(){
unregisterReceiver(mReciver);
}
private BroadcastReceiver mReciver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(MainActivity.ACTION_DEVICE_CONECT)){
mHandler.sendEmptyMessage(msg_startconnect);
}else if (action.equals(MainActivity.ACTION_DEVICE_DISCONECT)){
mHandler.sendEmptyMessage(msg_disconnecte);
}
}
};

@Override
public void onDestroy() {
super.onDestroy();
unregesterReciver();
closeDevice();
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息