设备:客户端:小米8 Android 9.0,服务端:小米5 Android8.0

蓝牙通信步骤:【搜索,配对,连接,通信】

目录

一、蓝牙搜索功能的实现

1.判断设备是否支持蓝牙,取得蓝牙适配器:bluetoothAdapter

2.打开蓝牙:

3.搜索蓝牙

二、蓝牙配对功能的实现

三、蓝牙连接功能的实现

四、蓝牙通信功能的实现

五、AndroidManifest.xml


一、蓝牙搜索功能的实现

1.判断设备是否支持蓝牙,取得蓝牙适配器:bluetoothAdapter

private BluetoothAdapter bluetoothAdapter; //蓝牙适配器BluetoothAdapter/*** 判断是否设备是否支持蓝牙* @return 是否支持*/
private boolean isSupported(){//初始化bluetoothAdapter =  BluetoothAdapter.getDefaultAdapter();if (bluetoothAdapter == null){Log.i(TAG, "isSupported: 设备不支持蓝牙");return false;}else{return true;}
}

2.打开蓝牙:

1、判断蓝牙是否打开:bluetoothAdapter.isEnabled();

需要在 AndroidManifest.xml 中添加 android.permission.BLUETOOTH 权限

2、判断Android版本,现在版本高了需要在activity中添加动态权限,否则搜索时 无法发现蓝牙设备   。

也需在AndroidManifest.xml 添加 android.permission.ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限

3、打开蓝牙设备:bluetoothAdapter.enable();

需要在 AndroidManifest.xml 中添加 android.permission.BLUETOOTH_ADMIN 权限

//判断蓝牙是否打开:bluetoothAdapter.isEnabled()
//Missing permissions required by BluetoothAdapter.isEnabled: android.permission.BLUETOOTH
//出现这个是因为没有在 AndroidManifest.xml 中添加权限
if(bluetoothAdapter.isEnabled()){//已经打开蓝牙,判断Android版本是否需要添加权限,解决:无法发现蓝牙设备的问题getPermission();
}else{//开启蓝牙bluetoothAdapter.enable();//关闭蓝牙:bluetoothAdapter.disable();
}
/*** 动态权限** 解决:无法发现蓝牙设备的问题** 对于发现新设备这个功能, 还需另外两个权限(Android M 以上版本需要显式获取授权,附授权代码):*/
private final int ACCESS_LOCATION=1;
@SuppressLint("WrongConstant")
private void getPermission() {if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {int permissionCheck = 0;permissionCheck = this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);permissionCheck += this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);if (permissionCheck != PackageManager.PERMISSION_GRANTED) {//未获得权限this.requestPermissions( // 请求授权new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},ACCESS_LOCATION);// 自定义常量,任意整型}}
}/*** 请求权限的结果回调。每次调用 requestpermissions(string[],int)时都会调用此方法。* @param requestCode 传入的请求代码* @param permissions 传入permissions的要求* @param grantResults 相应权限的授予结果:PERMISSION_GRANTED 或 PERMISSION_DENIED*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {switch (requestCode) {case ACCESS_LOCATION:if (hasAllPermissionGranted(grantResults)) {Log.i(TAG, "onRequestPermissionsResult: 用户允许权限");} else {Log.i(TAG, "onRequestPermissionsResult: 拒绝搜索设备权限");}break;}
}private boolean hasAllPermissionGranted(int[] grantResults) {for (int grantResult : grantResults) {if (grantResult == PackageManager.PERMISSION_DENIED) {return false;}}return true;
}

        

3.搜索蓝牙

1、在当前activity的 onStart() 中注册广播

2、按钮点击进行搜索设备

3、写一个广播来接收查询到的设备数据

4、在当前activity的 onStop() 中取消广播

/*** 1.在当前activity的 onStart() 中注册广播*/
@Override
protected void onStart() {super.onStart();IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);//创建一个查找蓝牙设备的广播意图filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);// 创建一个结束查找蓝牙设备结束的广播意图//注册一个广播接收者,开启查找蓝牙设备意图后将结果以广播的形式返回this.registerReceiver(mReceiver, filter);
}/*** 2. 按钮点击进行搜索设备的方法** 搜索未配对的设备*/
private void SearchDevices(){//判断是否正在搜索if (bluetoothAdapter.isDiscovering()) {//如果正在搜索则取消搜索后再搜索bluetoothAdapter.cancelDiscovery();}// 开始搜索蓝牙设备,搜索到的蓝牙设备通过广播接受者返回boolean startDiscovery= bluetoothAdapter.startDiscovery();if(startDiscovery){//开始搜索:// 清空之前的记录devicesUnpaired.clear();nameUnpaired.clear();}
}//存放未配对的蓝牙设备
ArrayList<BluetoothDevice> devicesUnpaired=new ArrayList<>();
//存放未配对的蓝牙设备的名称或地址【方便ListView中展示】
ArrayList<String> nameUnpaired=new ArrayList<>();/*** 3. 写一个广播来接收查询到的设备数据*      BroadcastReceiver 广播接收者*      BluetoothDevice 蓝牙设备*/
private final BroadcastReceiver mReceiver = new BroadcastReceiver(){public void onReceive(Context context, Intent intent){String action = intent.getAction();BluetoothDevice device;switch (action) {case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:Log.i(TAG, "ACTION_DISCOVERY_FINISHED: 搜索完毕");showToast("搜索完毕");break;case BluetoothDevice.ACTION_FOUND:Log.i(TAG, "ACTION_FOUND: 正在搜索设备...");device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//搜索到的蓝牙设备【未配对+已配对】//取得未配对设备集合if (device.getBondState() != BluetoothDevice.BOND_BONDED) {showToast(device.getName()==null?device.getAddress():device.getName());devicesUnpaired.add(device);nameUnpaired.add(device.getName()==null?device.getAddress():device.getName());}break;}}
};/*** 4. 取消注册广播*/
@Override
protected void onStop() {super.onStop();this.unregisterReceiver(mReceiver);
}

    

二、蓝牙配对功能的实现

该方法会弹出蓝牙配对确认框

//【手动配对】会弹出 配对确认框
private void unpairedDevicesList(){//viewUnpaired:是listView。nameUnpaire:是之前取得的未配对的蓝牙名称。devicesUnpaired:是之前取得的未配对的蓝牙设备ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, nameUnpaired);viewUnpaired.setAdapter(adapter);viewUnpaired.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {try {BluetoothDevice device=devicesUnpaired.get((int) id);// 调用配对的方法,此方法是异步的,系统会触发BluetoothDevice.ACTION_PAIRING_REQUEST的广播// 收到此广播后,设置配对的密码Method createBondMethod = device.getClass().getMethod("createBond");createBondMethod.invoke(device);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}});
}

客户端: 服务端: 结果:

三、蓝牙连接功能的实现

取的已配对的设备进行连接:

1、网上有个建立和管理蓝牙连接的工具类:BluetoothChatUtil.java

2、取得已配对设备列表,选择设备进行连接

3、在onCreate中获取实例BluetoothChatUtil,且注册Handler

4、写Handler

工具类:BluetoothChatUtil.java

/***该类的工作:建立和管理蓝牙连接。*共有三个线程。mAcceptThread线程用来监听socket连接(服务端使用).*mConnectThread线程用来连接serversocket(客户端使用)。*mConnectedThread线程用来处理socket发送、接收数据。(客户端和服务端共用)*/
public class BluetoothChatUtil {private static final String TAG = "BluetoothChatClient";private static final boolean D = true;// 服务名 SDPprivate static final String SERVICE_NAME = "BluetoothChat";// uuid SDPprivate static final UUID SERVICE_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");// 蓝牙适配器private final BluetoothAdapter mAdapter;private Handler mHandler;private AcceptThread mAcceptThread;private ConnectThread mConnectThread;private ConnectedThread mConnectedThread;private int mState;private static BluetoothChatUtil mBluetoothChatUtil;private BluetoothDevice mConnectedBluetoothDevice;//常数,指示当前的连接状态public static final int STATE_NONE = 0;       // 当前没有可用的连接public static final int STATE_LISTEN = 1;     // 现在侦听传入的连接public static final int STATE_CONNECTING = 2; // 现在开始连接public static final int STATE_CONNECTED = 3;  // 现在连接到远程设备public static final int STATAE_CONNECT_FAILURE = 4; //连接失败public static final int MESSAGE_DISCONNECTED = 5;   //断开连接public static final int STATE_CHANGE = 6; //连接状态改变public static final int MESSAGE_READ = 7;public static final int MESSAGE_WRITE= 8;public static final String DEVICE_NAME = "device_name";public static final String READ_MSG = "read_msg";/*** 构造函数。准备一个新的bluetoothchat会话。* @param context*/private BluetoothChatUtil(Context context) {mAdapter = BluetoothAdapter.getDefaultAdapter();mState = STATE_NONE;}public static BluetoothChatUtil getInstance(Context c){if(null == mBluetoothChatUtil){mBluetoothChatUtil = new BluetoothChatUtil(c);}return mBluetoothChatUtil;}public void registerHandler(Handler handler){mHandler = handler;}public void unregisterHandler(){mHandler = null;}/*** 设置当前状态的聊天连接* @param state  整数定义当前连接状态*/private synchronized void setState(int state) {if (D) Log.d(TAG, "setState() " + mState + " -> " + state);mState = state;// 给新状态的处理程序,界面活性可以更新mHandler.obtainMessage(STATE_CHANGE, state, -1).sendToTarget();}/*** 返回当前的连接状态。 */public synchronized int getState() {return mState;}public BluetoothDevice getConnectedDevice(){return mConnectedBluetoothDevice;}/*** 开始聊天服务。特别acceptthread开始* 开始服务器模式。 */public synchronized void startListen() {if (D) Log.d(TAG, "start");// 取消任何线程正在运行的连接if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}// 启动线程来监听一个bluetoothserversocketif (mAcceptThread == null) {mAcceptThread = new AcceptThread();mAcceptThread.start();}setState(STATE_LISTEN);}/*** 开始connectthread启动连接到远程设备。* @param device 连接的蓝牙设备*/public synchronized void connect(BluetoothDevice device) {if (D) Log.d(TAG, "connect to: " + device);// 取消任何线程试图建立连接if (mState == STATE_CONNECTING) {if (mConnectThread != null) {mConnectThread.cancel();mConnectThread = null;}}// 取消任何线程正在运行的连接if (mConnectedThread != null) {mConnectedThread.cancel();mConnectedThread = null;}//启动线程连接到远程设备mConnectThread = new ConnectThread(device);mConnectThread.start();setState(STATE_CONNECTING);}/*** 开始ConnectedThread开始管理一个蓝牙连接,传输、接收数据.* @param socket socket连接* @param device 已连接的蓝牙设备*/public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) {if (D) Log.d(TAG, "connected");//取消任何线程正在运行的连接if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}// 启动线程管理连接和传输mConnectedThread = new ConnectedThread(socket);mConnectedThread.start();//把连接设备的名字传到 ui ActivitymConnectedBluetoothDevice =  device;Message msg = mHandler.obtainMessage(STATE_CONNECTED);Bundle bundle = new Bundle();bundle.putString(DEVICE_NAME, device.getName());msg.setData(bundle);mHandler.sendMessage(msg);setState(STATE_CONNECTED);}/*** 停止所有的线程*/public synchronized void disconnect() {if (D) Log.d(TAG, "disconnect");if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread = null;}setState(STATE_NONE);}/*** Write to the ConnectedThread in an unsynchronized manner* @param out The bytes to write* @see ConnectedThread#write(byte[])*/public void write(byte[] out) {//创建临时对象ConnectedThread r;// 同步副本的connectedthreadsynchronized (this) {if (mState != STATE_CONNECTED) return;r = mConnectedThread;}// 执行写同步r.write(out);}/*** Indicate that the connection attempt failed and notify the UI Activity.*/private void connectionFailed() {// 发送失败的信息带回活动Message msg = mHandler.obtainMessage(STATAE_CONNECT_FAILURE);mHandler.sendMessage(msg);mConnectedBluetoothDevice = null;setState(STATE_NONE);}/*** Indicate that the connection was lost and notify the UI Activity.*/public void connectionLost() {// 发送失败的信息带回ActivityMessage msg = mHandler.obtainMessage(MESSAGE_DISCONNECTED);mHandler.sendMessage(msg);mConnectedBluetoothDevice = null;setState(STATE_NONE);}/***本线程 侦听传入的连接。*它运行直到连接被接受(或取消)。*/private class AcceptThread extends Thread {// 本地服务器套接字private final BluetoothServerSocket mServerSocket;public AcceptThread() {BluetoothServerSocket tmp = null;// 创建一个新的侦听服务器套接字try {tmp = mAdapter.listenUsingRfcommWithServiceRecord(SERVICE_NAME, SERVICE_UUID);//tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(SERVICE_NAME, SERVICE_UUID);} catch (IOException e) {Log.e(TAG, "listen() failed", e);}mServerSocket = tmp;}public void run() {if (D) Log.d(TAG, "BEGIN mAcceptThread" + this);setName("AcceptThread");BluetoothSocket socket = null;// 循环,直到连接成功while (mState != STATE_CONNECTED) {try {// 这是一个阻塞调用 返回成功的连接// mServerSocket.close()在另一个线程中调用,可以中止该阻塞socket = mServerSocket.accept();} catch (IOException e) {Log.e(TAG, "accept() failed", e);break;}// 如果连接被接受if (socket != null) {synchronized (BluetoothChatUtil.this) {switch (mState) {case STATE_LISTEN:case STATE_CONNECTING:// 正常情况。启动ConnectedThread。connected(socket, socket.getRemoteDevice());break;case STATE_NONE:case STATE_CONNECTED:// 没有准备或已连接。新连接终止。try {socket.close();} catch (IOException e) {Log.e(TAG, "Could not close unwanted socket", e);}break;}}}}if (D) Log.i(TAG, "END mAcceptThread");}public void cancel() {if (D) Log.d(TAG, "cancel " + this);try {mServerSocket.close();} catch (IOException e) {Log.e(TAG, "close() of server failed", e);}}}/*** 本线程用来连接设备**/private class ConnectThread extends Thread {private BluetoothSocket mmSocket;private final BluetoothDevice mmDevice;public ConnectThread(BluetoothDevice device) {mmDevice = device;BluetoothSocket tmp = null;// 得到一个bluetoothsockettry {mmSocket = device.createRfcommSocketToServiceRecord(SERVICE_UUID);} catch (IOException e) {Log.e(TAG, "create() failed", e);mmSocket = null;}}public void run() {Log.i(TAG, "BEGIN mConnectThread");try {// socket 连接,该调用会阻塞,直到连接成功或失败mmSocket.connect();} catch (IOException e) {Log.e(TAG, "IOException");connectionFailed();try {//关闭这个socketmmSocket.close();} catch (IOException e2) {e2.printStackTrace();}return;}// 启动连接线程connected(mmSocket, mmDevice);}public void cancel() {try {mmSocket.close();} catch (IOException e) {Log.e(TAG, "close() of connect socket failed", e);}}}/*** 本线程server 和client共用.* 它处理所有传入和传出的数据。*/private class ConnectedThread extends Thread {private final BluetoothSocket mmSocket;private final InputStream mmInStream;private final OutputStream mmOutStream;public ConnectedThread(BluetoothSocket socket) {Log.d(TAG, "create ConnectedThread");mmSocket = socket;InputStream tmpIn = null;OutputStream tmpOut = null;// 获得bluetoothsocket输入输出流try {tmpIn = socket.getInputStream();tmpOut = socket.getOutputStream();} catch (IOException e) {Log.e(TAG, "没有创建临时sockets", e);}mmInStream = tmpIn;mmOutStream = tmpOut;}public void run() {// 监听输入流while (true) {try {byte[] buffer = new byte[512];// 读取输入流int bytes = mmInStream.read(buffer);// 发送获得的字节的ui activityMessage msg = mHandler.obtainMessage(MESSAGE_READ);Bundle bundle = new Bundle();bundle.putByteArray(READ_MSG, buffer);msg.setData(bundle);mHandler.sendMessage(msg);} catch (IOException e) {Log.e(TAG, "disconnected", e);connectionLost();break;}}}/*** 向外发送。* @param buffer  发送的数据*/public void write(byte[] buffer) {try {mmOutStream.write(buffer);// 分享发送的信息到ActivitymHandler.obtainMessage(MESSAGE_WRITE, -1, -1, buffer).sendToTarget();} catch (IOException e) {Log.e(TAG, "Exception during write", e);}}public void cancel() {try {mmSocket.close();} catch (IOException e) {Log.e(TAG, "close() of connect socket failed", e);}}}public static int ByteArrayToInt(byte b[]) throws Exception {ByteArrayInputStream buf = new ByteArrayInputStream(b);DataInputStream dis = new DataInputStream(buf);return dis.readInt();}
}

【客户端】

private BluetoothChatUtil mBlthChatUtil;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mBlthChatUtil = BluetoothChatUtil.getInstance(this);mBlthChatUtil.registerHandler(mHandler);
}//存放已配对的蓝牙设备
ArrayList<BluetoothDevice> devicesPaired=new ArrayList<>();
/*** 我这的方法是:*  取得已经配对的蓝牙设备的 名称或者地址 显示在listView中*  且listView的选项设置点击事件,以便进行设备连接*/
private void PairedDevicesList(){//已配对设备集合Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();//listView需要string类型,所以提取名称或者地址以方便展示ArrayList<String> mArrayAdapter = new ArrayList<>();if(pairedDevices.size() > 0){//如果有配对的设备for(BluetoothDevice device : pairedDevices){//通过array adapter在列表中添加设备名称和地址if(device.getName()==null){mArrayAdapter.add(device.getAddress());}else{mArrayAdapter.add(device.getName());}devicesPaired.add(device);}}else{mArrayAdapter.add("暂无已配对设备");}//将已配对的设备添加到listView中ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, mArrayAdapter);viewPaired.setAdapter(adapter);viewPaired.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {BluetoothDevice device=devicesPaired.get((int) id);if (bluetoothAdapter.isDiscovering()) {//取消搜索bluetoothAdapter.cancelDiscovery();}if (mBlthChatUtil.getState() == BluetoothChatUtil.STATE_CONNECTED) {Toast.makeText(MainActivity.this, "蓝牙已连接!!!!!!!", Toast.LENGTH_SHORT).show();}else {mBlthChatUtil.connect(device);}}});
}private Handler mHandler = new Handler(){public void handleMessage(Message msg) {String deviceName = msg.getData().getString(BluetoothChatUtil.DEVICE_NAME);switch(msg.what){case BluetoothChatUtil.STATE_CONNECTED:showToast("连接成功");break;case BluetoothChatUtil.STATAE_CONNECT_FAILURE:showToast("连接失败");break;case BluetoothChatUtil.STATE_CHANGE:showToast("正在连接设备..");break;case BluetoothChatUtil.MESSAGE_DISCONNECTED:showToast("与设备断开连接");break;//读到另一方传送的消息case BluetoothChatUtil.MESSAGE_READ:{byte[] buf = msg.getData().getByteArray(BluetoothChatUtil.READ_MSG);String str = new String(buf,0,buf.length);Toast.makeText(getApplicationContext(), "读成功" + str, Toast.LENGTH_SHORT).show();break;}//发送消息给另一方case BluetoothChatUtil.MESSAGE_WRITE:{byte[] buf = (byte[]) msg.obj;String str = new String(buf,0,buf.length);Toast.makeText(getApplicationContext(), "发送成功" + str, Toast.LENGTH_SHORT).show();break;}default:break;}};
};
//toast提示
public void showToast(String msg){Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}

【服务端】:就比客户端多了一项启动监听

/*** 活动和用户进行交互时调用【服务端】*/
@Override
protected void onResume() {super.onResume();if (mBlthChatUtil != null) {if (mBlthChatUtil.getState() == BluetoothChatUtil.STATE_NONE) {// 启动蓝牙聊天服务mBlthChatUtil.startListen();}else if (mBlthChatUtil.getState() == BluetoothChatUtil.STATE_CONNECTED){BluetoothDevice device = mBlthChatUtil.getConnectedDevice();if(null != device && null != device.getName()){showToast("已成功连接到设备" + device.getName());}else {;showToast("未连接到设备");}}}
}

客户端:服务端:

四、蓝牙通信功能的实现

//调用write写需要发送的数据就行
mBlthChatUtil.write("openIR#".getBytes());
//在mHandler方法中,接收方可对数据进行处理

五、AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.bluetoothdome"><uses-permission android:name="android.permission.BLUETOOTH" /> <!-- BLUETOOTH:请求或者建立蓝牙连接并传递数据 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- ACCESS_FINE_LOCATION:允许一个程序访问精确位置(如GPS) --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- ACCESS_COARSE_LOCATION:允许一个程序访问CellID或WiFi热点来获取大致的位置 --><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- BLUETOOTH_ADMIN:初始化设备发现功能或者对蓝牙设置进行更改 --><!--<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> &lt;!&ndash; RECEIVE_BOOT_COMPLETED:允许一个程序接收到ACTION_BOOT_COMPLETED 广播在系统完成启动 &ndash;&gt;--><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

好了简单记录一下

Dome源码:https://github.com/van9420/android-BluetoothDome

Android-蓝牙通信相关推荐

  1. Android蓝牙通信

    Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用.单片机的蓝牙模块连接与程序暂且略过,此文主要 ...

  2. Android 蓝牙通信开发

    Android 蓝牙通信开发 Receiver的设置 一.Receiver1(蓝牙状态的改变通过广播接收) 二.Receiver2(蓝牙搜索到设备.绑定设备(配对)通过广播接收) 服务端代码 客户端代 ...

  3. Android 蓝牙通信

    Android 蓝牙通信 一.现在的无线通信方案及差别 二.蓝牙传输功能开发 1.准备阶段 1)权限 2)蓝牙的开启/关闭/状态 判断设备是支持蓝牙 获取蓝牙状态 启动/关闭 2.查找设备 1) 让设 ...

  4. Android蓝牙通信具体解释

    蓝牙通信的大概过程例如以下: 1.首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket.获取输入输出流 4,读取和写入数据 5.断开连接关闭蓝牙 还要发送配对码发送进行推断! 以下是全部的源码:不 ...

  5. Qt on Android 蓝牙通信开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

  6. android 蓝牙通信编程

    http://blog.csdn.net/yudajun/article/details/8362916 公司项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助. ...

  7. android 输出字节数组,Android蓝牙通信字节数组的数据类型转换 求教!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 单片机和安卓手机进行蓝牙通信,发送电压数据到手机,恰好每次8位数据(1字节)传给上位机.采用以下代码获得16进制字符输出,以下是蓝牙通信接收并显示数据部分 ...

  8. android蓝牙通信_Flutter通过BasicMessageChannel实现Flutter 与Android iOS 的双向通信

    题记: --不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧. 通过 Flutter 来进行移动应用开发,打包 Android .iOS 双平台应用程序,在调用如相机 ...

  9. android蓝牙通信_使用Arduino构建OLED显示屏与Android手机接口的智能手表

    背景知识视频教程 Arduino 训练营:通过项目学习​viadean.com 通过制作Arduino UNO FM收音机接收器学习Arduino I2C​viadean.com 通过构建实际应用程序 ...

  10. Android蓝牙通信功能开发

    1. 概述 Bluetooth 是几乎现在每部手机标准配备的功能,多用于耳机 mic 等设备与手机的连接,除此之外,还可以多部手机之间建立 bluetooth 通信,本文就通过 SDK 中带的一个聊天 ...

最新文章

  1. golang和php哪个性能更强,相同逻辑的php与golang代码效率对比,最好语言落谁家…...
  2. i标签content属性输入空白
  3. 【itext学习之路】--2.设置pdf的一些常用属性
  4. 直面最大挑战双11 阿里数据中台为商家带来确定性保障
  5. 事件图谱是什么?它能预测未来吗?
  6. Java内存模型(Java Memory Model,简称JMM)
  7. Spring AOP体系学习
  8. 这台计算机上缺少此项目引用的 NuGet 程序包,DotNetCompilerPlatform
  9. 接活,你为啥不行,之懒
  10. UNIX网络编程电子书
  11. 网易2018校园招聘编程题真题集合
  12. Android 使用第三方SDK 一般流程
  13. 安排 , 2021新冠疫情防控指挥作战平台(视频+课件+代码+资料)
  14. IntelliJ idea连接不上git仓库问题
  15. 雷达感应人体存在,雷达感应原理
  16. 2018,青云QingCloud CEO黄允松关于云服务的预言会应验吗?
  17. 在 Java 中将毫秒转换为天、小时、分钟和秒
  18. 如何搜索下载到自己要的东西,避免病毒(捆绑广告)
  19. Dameware问题汇总
  20. 爬虫爬取相亲网站信息

热门文章

  1. python脚本名_python获取类名函数名、脚本路径
  2. 掘安杯原题复现---Web签到题
  3. 音频电平vu显示表软件下载_正点原子开拓者 Nios II资料连载第十章MCU TFT-LCD图片显示实验...
  4. Python实战之数字、日期和时间的高级处理
  5. 数仓 - 促销敏感度、评论敏感度
  6. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上/下造型,main方法,抽象类,接口,设计模式,异常,内部类
  7. 多张图片转换成一个swf文件播放
  8. 安卓设置keychain_简单实现KeyChain实例
  9. Amino——用户反馈
  10. Embedding Label Structures:细粒度特征表示的标签结构嵌入