❶ android_studio手機藍牙串口通信源代碼
初涉android的藍牙操作,按照固定MAC地址連接獲取Device時,程序始終是異常終止,查了好多天代碼都沒查出原因。今天改了一下API版本,突然就成功連接了。總結之後發現果然是個坑爹之極的錯誤。
為了這種錯誤拚命查原因浪費大把時間是非常不值得的,但是問題不解決更是揪心。可惜我網路了那麼多,都沒有給出確切原因。今天特此mark,希望後來者遇到這個問題的時候能輕松解決。
下面是我的連接過程,中間崩潰原因及解決辦法。
1:用AT指令獲得藍牙串口的MAC地址,地址是簡寫的,按照常理猜測可得標准格式。
2:開一個String adress= "************" //MAC地址, String MY_UUID= "************"//UUID根據通信而定,網上都有。
3:取得本地Adapter用getDefaultAdapter(); 遠程的則用getRemoteDevice(adress); 之後便可用UUID開socket進行通信。
如果中途各種在getRemoteDevice處崩潰,大家可以查看一下當前的API版本,如果是2.1或以下版本的話,便能確定是API版本問題,只要換成2.2或者以上就都可以正常運行了~ 這么坑爹的錯誤的確很為難初學者。 唉·········· 為這種小trick浪費很多時間真是難過。
(另外有個重要地方,別忘了給manifest裡面加以下兩個藍牙操作許可權哦~)
<uses-permissionandroid:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
下面附上Android藍牙操作中用固定MAC地址傳輸信息的模板,通用搜索模式日後再補刪模板:
=null;
=null;
privateOutputStreamoutStream=null;
privateInputStreaminStream=null;
privatestaticfinalUUIDMY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//這條是藍牙串口通用的UUID,不要更改
privatestaticStringaddress="00:12:02:22:06:61";//<==要連接的藍牙設備MAC地址
/*獲得通信線路過程*/
/*1:獲取本地BlueToothAdapter*/
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter==null)
{
Toast.makeText(this,"Bluetoothisnotavailable.",Toast.LENGTH_LONG).show();
finish();
return;
}
if(!mBluetoothAdapter.isEnabled())
{
Toast.makeText(this,"-runthisprogram.",Toast.LENGTH_LONG).show();
finish();
return;
}
/*2:獲取遠程BlueToothDevice*/
BluetoothDevicedevice=mBluetoothAdapter.getRemoteDevice(address);
if(mBluetoothAdapter==null)
{
Toast.makeText(this,"Can'tgetremotedevice.",Toast.LENGTH_LONG).show();
finish();
return;
}
/*3:獲得Socket*/
try{
btSocket=device.(MY_UUID);
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Socketcreationfailed.",e);
}
/*4:取消discovered節省資源*/
mBluetoothAdapter.cancelDiscovery();
/*5:連接*/
try{
btSocket.connect();
Log.e(TAG,"ONRESUME:BTconnectionestablished,datatransferlinkopen.");
}catch(IOExceptione){
try{
btSocket.close();
}catch(IOExceptione2){
Log.e(TAG,"ONRESUME:",e2);
}
}
/*此時可以通信了,放在任意函數中*/
/*try{
outStream=btSocket.getOutputStream();
inStream=btSocket.getInputStream();//可在TextView里顯示
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Outputstreamcreationfailed.",e);
}
Stringmessage="1";
byte[]msgBuffer=message.getBytes();
try{
outStream.write(msgBuffer);
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Exceptionringwrite.",e);
}
*/
通用搜索模式代碼模板:
簡潔簡潔方式1 demo
作用: 用VerticalSeekBar控制一個 LED屏幕的亮暗。
直接上碼咯~
packagecom.example.seed2;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.app.Dialog;
importandroid.os.Bundle;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.UUID;
importandroid.bluetooth.BluetoothAdapter;
importandroid.bluetooth.BluetoothDevice;
importandroid.bluetooth.BluetoothSocket;
importandroid.content.DialogInterface;
importandroid.util.Log;
importandroid.view.KeyEvent;
importandroid.widget.Toast;
{
privatestaticfinalStringTAG="BluetoothTest";
=null;
=null;
privateOutputStreamoutStream=null;
privateInputStreaminStream=null;
privateVerticalSeekBarvskb=null;
privatestaticfinalUUIDMY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//這條是藍牙串口通用的UUID,不要更改
privatestaticStringaddress="00:12:02:22:06:61";//<==要連接的藍牙設備MAC地址
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.vskb=(VerticalSeekBar)super.findViewById(R.id.mskb);
this.vskb.setOnSeekBarChangeListener(newOnSeekBarChangeListenerX());
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter==null)
{
Toast.makeText(this,"Bluetoothisnotavailable.",Toast.LENGTH_LONG).show();
finish();
return;
}
if(!mBluetoothAdapter.isEnabled())
{
Toast.makeText(this,"-runthisprogram.",Toast.LENGTH_LONG).show();
finish();
return;
}
}
.OnSeekBarChangeListener{
publicvoidonProgressChanged(VerticalSeekBarseekBar,intprogress,booleanfromUser){
//Main.this.clue.setText(seekBar.getProgress());
/*Stringmessage;
byte[]msgBuffer;
try{
outStream=btSocket.getOutputStream();
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:OutputStreamcreationfailed.",e);
}
message=Integer.toString(seekBar.getProgress());
msgBuffer=message.getBytes();
try{
outStream.write(msgBuffer);
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Exceptionringwrite.",e);
}*/
}
(VerticalSeekBarseekBar){
Stringmessage;
byte[]msgBuffer;
try{
outStream=btSocket.getOutputStream();
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:OutputStreamcreationfailed.",e);
}
message=Integer.toString(seekBar.getProgress());
msgBuffer=message.getBytes();
try{
outStream.write(msgBuffer);
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Exceptionringwrite.",e);
}
}
publicvoidonStopTrackingTouch(VerticalSeekBarseekBar){
Stringmessage;
byte[]msgBuffer;
try{
outStream=btSocket.getOutputStream();
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:OutputStreamcreationfailed.",e);
}
message=Integer.toString(seekBar.getProgress());
msgBuffer=message.getBytes();
try{
outStream.write(msgBuffer);
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Exceptionringwrite.",e);
}
}
}
@Override
publicvoidonStart()
{
super.onStart();
}
@Override
publicvoidonResume()
{
super.onResume();
BluetoothDevicedevice=mBluetoothAdapter.getRemoteDevice(address);
try{
btSocket=device.(MY_UUID);
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Socketcreationfailed.",e);
}
mBluetoothAdapter.cancelDiscovery();
try{
btSocket.connect();
Log.e(TAG,"ONRESUME:BTconnectionestablished,datatransferlinkopen.");
}catch(IOExceptione){
try{
btSocket.close();
}catch(IOExceptione2){
Log.e(TAG,"ONRESUME:",e2);
}
}
//.
/*try{
outStream=btSocket.getOutputStream();
inStream=btSocket.getInputStream();
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Outputstreamcreationfailed.",e);
}
Stringmessage="read";
byte[]msgBuffer=message.getBytes();
try{
outStream.write(msgBuffer);
}catch(IOExceptione){
Log.e(TAG,"ONRESUME:Exceptionringwrite.",e);
}
intret=-1;
while(ret!=-1)
{
try{
ret=inStream.read();
}catch(IOExceptione)
{
e.printStackTrace();
}
}
*/
}
@Override
❷ Android-Ble藍牙開發Demo示例–掃描,連接,發送和接收數據,分包解包(附源碼)
萬物互聯的物聯網時代的已經來臨,ble藍牙開發在其中扮演著舉重若輕的角色。最近剛好閑一點,抽時間梳理下這塊的知識點。
涉及ble藍牙通訊的客戶端(開啟、掃描、連接、發送和接收數據、分包解包)和服務端(初始化廣播數據、開始廣播、配置Services、Server回調操作)整個環節以及一些常見的問題即踩過的一些坑。
比如
1、在Android不同版本或不同手機的適配問題,掃描不到藍牙設備
2、如何避免ble藍牙連接出現133錯誤?
3、單次寫的數據大小有20位元組限制,如何發送長數據
藍牙有傳統(經典)藍牙和低功耗藍牙BLE(Bluetooth Low Energy)之分,兩者的開發的API不一樣,本文主講Ble藍牙開發,傳統藍牙不展開,有需要的可以自行了解。
相對傳統藍牙,BLE低功耗藍牙,主要特點是快速搜索,快速連接,超低功耗保持連接和數據傳輸。
客戶端
服務端
Android4.3(API Level 18)開始引入BLE的核心功能並提供了相應的 API。應用程序通過這些 API 掃描藍牙設備、查詢 services、讀寫設備的 characteristics(屬性特徵)等操作。
BLE藍牙協議是GATT協議, BLE相關類不多, 全都位於android.bluetooth包和android.bluetooth.le包的幾個類:
android.bluetooth.
.BluetoothGattService 包含多個Characteristic(屬性特徵值), 含有唯一的UUID作為標識
.BluetoothGattCharacteristic 包含單個值和多個Descriptor, 含有唯一的UUID作為標識
.BluetoothGattDescriptor 對Characteristic進行描述, 含有唯一的UUID作為標識
.BluetoothGatt 客戶端相關
.BluetoothGattCallback 客戶端連接回調
.BluetoothGattServer 服務端相關
.BluetoothGattServerCallback 服務端連接回調
android.bluetooth.le.
.AdvertiseCallback 服務端的廣播回調
.AdvertiseData 服務端的廣播數據
.AdvertiseSettings 服務端的廣播設置
.BluetoothLeAdvertiser 服務端的廣播
.BluetoothLeScanner 客戶端掃描相關(Android5.0新增)
.ScanCallback 客戶端掃描回調
.ScanFilter 客戶端掃描過濾
.ScanRecord 客戶端掃描結果的廣播數據
.ScanResult 客戶端掃描結果
.ScanSettings 客戶端掃描設置
BLE設備分為兩種設備: 客戶端(也叫主機/中心設備/Central), 服務端(也叫從機/外圍設備/peripheral)
客戶端的核心類是 BluetoothGatt
服務端的核心類是 BluetoothGattServer 和 BluetoothLeAdvertiser
BLE數據的核心類是 BluetoothGattCharacteristic 和 BluetoothGattDescriptor
下面詳細講解下客戶端和服務端的開發步驟流程
安卓手機涉及藍牙許可權問題,藍牙開發需要在AndroidManifest.xml文件中添加許可權聲明:
在搜索設備之前需要詢問打開手機藍牙:
注意: BLE設備地址是動態變化(每隔一段時間都會變化),而經典藍牙設備是出廠就固定不變了!
通過掃描BLE設備,根據設備名稱區分出目標設備targetDevice,下一步實現與目標設備的連接,在連接設備之前要停止搜索藍牙;停止搜索一般需要一定的時間來完成,最好調用停止搜索函數之後加以100ms的延時,保證系統能夠完全停止搜索藍牙設備。停止搜索之後啟動連接過程;
BLE藍牙的連接方法相對簡單只需調用connectGatt方法;
參數說明
與設備建立連接之後與設備通信,整個通信過程都是在BluetoothGattCallback的非同步回調函數中完成;
BluetoothGattCallback中主要回調函數如下:
上述幾個回調函數是BLE開發中不可缺少的;
當調用targetdDevice.connectGatt(context, false, gattCallback)後系統會主動發起與BLE藍牙設備的連接,若成功連接到設備將回調onConnectionStateChange方法,其處理過程如下:
判斷newState == BluetoothGatt.STATE_CONNECTED表明此時已經成功連接到設備;
mBluetoothGatt.discoverServices();
掃描BLE設備服務是安卓系統中關於BLE藍牙開發的重要一步,一般在設備連接成功後調用,掃描到設備服務後回調onServicesDiscovered()函數,函數原型如下:
BLE藍牙開發主要有負責通信的BluetoothGattService完成的。當且稱為通信服務。通信服務通過硬體工程師提供的UUID獲取。獲取方式如下:
具體操作方式如下:
開啟監聽,即建立與設備的通信的首發數據通道,BLE開發中只有當客戶端成功開啟監聽後才能與服務端收發數據。開啟監聽的方式如下:
BLE單次寫的數據量大小是有限制的, 通常是20位元組 ,可以嘗試通過requestMTU增大,但不保證能成功。分包寫是一種解決方案,需要定義分包協議,假設每個包大小20位元組,分兩種包,數據包和非數據包。對於數據包,頭兩個位元組表示包的序號,剩下的都填充數據。對於非數據包,主要是發送一些控制信息。
監聽成功後通過向 writeCharacteristic寫入數據實現與服務端的通信。寫入方式如下:
其中:value一般為Hex格式指令,其內容由設備通信的藍牙通信協議規定;
若寫入指令成功則回調BluetoothGattCallback中的onCharacteristicWrite()方法,說明將數據已經發送給下位機;
若發送的數據符合通信協議,則服務端會向客戶端回復相應的數據。發送的數據通過回調onCharacteristicChanged()方法獲取,其處理方式如下:
通過向服務端發送指令獲取服務端的回復數據,即可完成與設備的通信過程;
當與設備完成通信之後之後一定要斷開與設備的連接。調用以下方法斷開與設備的連接:
源碼上傳在CSDN上了,有需要的可以借鑒。
=====> Android藍牙Ble通訊Demo示例源碼–掃描,連接,發送和接收數據,分包解包
BLE單次寫的數據量大小是有限制的,通常是20位元組,可以嘗試通過requestMTU增大,但不保證能成功。分包寫是一種解決方案,需要定義分包協議,假設每個包大小20位元組,分兩種包,數據包和非數據包。對於數據包,頭兩個位元組表示包的序號,剩下的都填充數據。對於非數據包,主要是發送一些控制信息。
總體流程如下:
1、定義通訊協議,如下(這里只是個舉例,可以根據項目需求擴展)
2、封裝通用發送數據介面(拆包)
該介面根據會發送數據內容按最大位元組數拆分(一般20位元組)放入隊列,拆分完後,依次從隊列里取出發送
3、封裝通用接收數據介面(組包)
該介面根據從接收的數據按協議里的定義解析數據長度判讀是否完整包,不是的話把每條消息累加起來
4、解析完整的數據包,進行業務邏輯處理
5、協議還可以引入加密解密,需要注意的選演算法參數的時候,加密後的長度最好跟原數據長度一致,這樣不會影響拆包組包
一般都是Android版本適配以及不同ROM機型(小米/紅米、華為/榮耀等)(EMUI、MIUI、ColorOS等)的許可權問題
藍牙開發中有很多問題,要靜下心分析問題,肯定可以解決的,一起加油;
❸ 誰能給一份開發基於藍牙4.0的android的demo源碼
請參考如下WIKI頁面,基本上目前有提供的BLE的參考代碼都集中到這個頁面了:http://processors.wiki.ti.com/index.php/Category:BluetoothLE
❹ 如何實現Android藍牙開發 自動配對連接,並不彈出提示框
實現android藍牙開發 自動配對連接,並不彈出提示框: 源碼 BluetoothDevice 類中還有兩個隱藏方法:cancelBondProcess()和cancelPairingUserInput(),這兩個方法一個是取消配對進程一個是取消用戶輸入 下面是自動配對的代碼 Mainfest,xml注冊 <receiver android:name="." > <intent-filter> <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" /> </intent-filter> </receiver> 自己在收到廣播時處理並將預先輸入的密碼設置進去 public class extends BroadcastReceiver { String strPsw = "0"; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if (intent.getAction().equals( "android.bluetooth.device.action.PAIRING_REQUEST")) { BluetoothDevice btDevice = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // byte[] pinBytes = BluetoothDevice.convertPinToBytes("1234"); // device.setPin(pinBytes); Log.i("tag11111", "ddd"); try { ClsUtils.setPin(btDevice.getClass(), btDevice, strPsw); // 手機和藍牙採集器配對 ClsUtils.createBond(btDevice.getClass(), btDevice); ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } <b>/************************************ 藍牙配對函數 * **************/ import java.lang.reflect.Field; import java.lang.reflect.Method; import android.bluetooth.BluetoothDevice; import android.util.Log; public class ClsUtils { /** * 與設備配對 參考源碼:platform/packages/apps/Settings.git * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java */ static public boolean createBond(Class btClass, BluetoothDevice btDevice) throws Exception { Method createBondMethod = btClass.getMethod("createBond"); Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice); return returnValue.booleanValue(); } /** * 與設備解除配對 參考源碼:platform/packages/apps/Settings.git * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java */ static public boolean removeBond(Class btClass, BluetoothDevice btDevice) throws Exception { Method removeBondMethod = btClass.getMethod("removeBond"); Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice); return returnValue.booleanValue(); } static public boolean setPin(Class btClass, BluetoothDevice btDevice, String str) throws Exception { try { Method removeBondMethod = btClass.getDeclaredMethod("setPin", new Class[] {byte[].class}); Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice, new Object[] {str.getBytes()}); Log.e("returnValue", "" + returnValue); } catch (SecurityException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (IllegalArgumentException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } // 取消用戶輸入 static public boolean cancelPairingUserInput(Class btClass, BluetoothDevice device) throws Exception { Method createBondMethod = btClass.getMethod("cancelPairingUserInput"); // cancelBondProcess() Boolean returnValue = (Boolean) createBondMethod.invoke(device); return returnValue.booleanValue(); } // 取消配對 static public boolean cancelBondProcess(Class btClass, BluetoothDevice device) throws Exception { Method createBondMethod = btClass.getMethod("cancelBondProcess"); Boolean returnValue = (Boolean) createBondMethod.invoke(device); return returnValue.booleanValue(); } /** * * @param clsShow */ static public void printAllInform(Class clsShow) { try { // 取得所有方法 Method[] hideMethod = clsShow.getMethods(); int i = 0; for (; i < hideMethod.length; i++) { Log.e("method name", hideMethod[i].getName() + ";and the i is:" + i); } // 取得所有常量 Field[] allFields = clsShow.getFields(); for (i = 0; i < allFields.length; i++) { Log.e("Field name", allFields[i].getName()); } } catch (SecurityException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (IllegalArgumentException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }</b> 執行時直接使用: <b>public static boolean pair(String strAddr, String strPsw) { boolean result = false; BluetoothAdapter bluetoothAdapter = BluetoothAdapter .getDefaultAdapter(); bluetoothAdapter.cancelDiscovery(); if (!bluetoothAdapter.isEnabled()) { bluetoothAdapter.enable(); } if (!BluetoothAdapter.checkBluetoothAddress(strAddr)) { // 檢查藍牙地址是否有效 Log.d("mylog", "devAdd un effient!"); } BluetoothDevice device = bluetoothAdapter.getRemoteDevice(strAddr); if (device.getBondState() != BluetoothDevice.BOND_BONDED) { try { Log.d("mylog", "NOT BOND_BONDED"); ClsUtils.setPin(device.getClass(), device, strPsw); // 手機和藍牙採集器配對 ClsUtils.createBond(device.getClass(), device); remoteDevice = device; // 配對完畢就把這個設備對象傳給全局的remoteDevice result = true; } catch (Exception e) { // TODO Auto-generated catch block Log.d("mylog", "setPiN failed!"); e.printStackTrace(); } // } else { Log.d("mylog", "HAS BOND_BONDED"); try { ClsUtils.createBond(device.getClass(), device); ClsUtils.setPin(device.getClass(), device, strPsw); // 手機和藍牙採集器配對 ClsUtils.createBond(device.getClass(), device); remoteDevice = device; // 如果綁定成功,就直接把這個設備對象傳給全局的remoteDevice result = true; } catch (Exception e) { // TODO Auto-generated catch block Log.d("mylog", "setPiN failed!"); e.printStackTrace(); } } return result; }
❺ Android開發之藍牙(Bluetooth)
在上一篇中有介紹了Wifi與網路連接處理
Android開發之WiFi與網路連接處理
下面,來繼續說說Android中藍牙的基本使用。
Bluetooth是目前使用的最廣泛的無線通訊協議之一,主要針對短距離設備通訊(10米),常用於連接耳機、滑鼠和移動通訊設備等。
值得一提的是:
android4.2新增了部分新功能,但是對於Bluetooth熟悉的人或許開始頭疼了,那就是Android4.2引入了一個新的藍牙協議棧針BLE。谷歌和Broadcom之間的合作,開發新的藍牙協議棧,取代了基於堆棧的Bluez。因此市場上出現了老設備的兼容問題,很多藍牙設備在android4.2手機上不能正常使用。
BluetoothAdapter簡單點來說就是代表了本設備(手機、電腦等)的藍牙適配器對象。
first:we need permission
要操作藍牙,先要在AndroidManifest.xml里加入許可權
**下面來看看如何使用藍牙。 **↓↓↓****
Demo已就緒:
返回值:如果設備具備藍牙功能,返回BluetoothAdapter 實例;否則,返回null對象。
打開藍牙設備的方式:
1.直接調用函數enable()去打開藍牙設備 ;
2.系統API去打開藍牙設備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設備。
注意: 1.如果藍牙已經開啟,不會彈出該Activity界面。2.在目前大多數Android手機中,是不支持在飛行模式下開啟藍牙的。如果藍牙已經開啟,那麼藍牙的開關 ,狀態會隨著飛行模式的狀態而發生改變。
1. 搜索藍牙設備
使用BluetoothAdapter的startDiscovery()方法來搜索藍牙設備
startDiscovery()方法是一個非同步方法,調用後會立即返回。該方法會進行對其他藍牙設備的搜索,該過程會持續12秒。該方法調用後,搜索過程實際上是在一個System Service中進行的,所以可以調用cancelDiscovery()方法來停止搜索(該方法可以在未執行discovery請求時調用)。
系統開始搜索藍牙設備
^( *  ̄(oo) ̄ ) ^ 系統會發送以下三個廣播:
2.掃描設備
3.定義廣播接收器接收搜索結果
4.注冊廣播
獲取附近的藍牙設備
第一步建立連接:首先Android sdk(2.0以上版本)支持的藍牙連接是通過BluetoothSocket建立連接,服務端BluetoothServerSocket和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,因為建立連接的方法會阻塞線程,所以伺服器端和客戶端都應啟動新線程連接。
(這里的服務端和客戶端是相對來說的)
兩個藍牙設備之間的連接,則必須實現服務端與客戶端的機制。
當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。
服務端設備與客戶端設備獲取BluetoothSocket的途徑是不同的。
1,服務端設備是通過accepted一個incoming connection來獲取的,
2,客戶端設備則是通過打開一個到服務端的RFCOMM channel來獲取的。
服務端
通過調用BluetoothAdapter的(String, UUID)方法來獲取BluetoothServerSocket(UUID用於客戶端與服務端之間的配對)
客戶端
調用BluetoothService的(UUID)方法獲取BluetoothSocket(該UUID應該同於服務端的UUID)。
調用BluetoothSocket的connect()方法(該方法為block方法),如果UUID同服務端的UUID匹配,並且連接被服務端accept,則connect()方法返回。
數據傳遞,通過以上操作,就已經建立的BluetoothSocket連接了,數據傳遞無非是通過流的形式
獲取流
該類就是關於遠程藍牙設備的一個描述。通過它可以和本地藍牙設備---BluetoothAdapter連接通信。
好多東西我也不知道怎麼描述,下面給出Demo:
剛好有剛學習的小夥伴問我ListView怎麼用,那我就用ListView。
源碼:
RairDemo
GitHub: https://github.com/Rairmmd/android-demo
Coding: https://coding.net/u/Rair/p/RairDemo/git
❻ 誰能給一份開發基於藍牙4.0的android的demo源碼
這個就是藍牙通信的demo
源代碼給上傳了,請採納
❼ 如何實現android藍牙開發 自動配對連接,並不彈出提示框
我就開始查找怎麼關閉這個藍牙配對提示框,後面還是偉大的android源碼幫助了我。
在源碼 BluetoothDevice 類中還有兩個隱藏方法
cancelBondProcess()和cancelPairingUserInput()
這兩個方法一個是取消配對進程一個是取消用戶輸入
下面是自動配對的代碼
Mainfest,xml注冊
1 <</code>receiver android:name="." >
2 <</code>intent-filter>
3 <</code>action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
4 </</code>intent-filter>
5 </</code>receiver>
自己在收到廣播時處理並將預先輸入的密碼設置進去
01 public class extends BroadcastReceiver
02 {
03
04 String strPsw = "0";
05
06 @Override
07 public void onReceive(Context context, Intent intent)
08 {
09 // TODO Auto-generated method stub
10 if (intent.getAction().equals(
11 "android.bluetooth.device.action.PAIRING_REQUEST"))
12 {
13 BluetoothDevice btDevice = intent
14 .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
15
16 // byte[] pinBytes = BluetoothDevice.convertPinToBytes("1234");
17 // device.setPin(pinBytes);
18 Log.i("tag11111", "ddd");
19 try
20 {
21 ClsUtils.setPin(btDevice.getClass(), btDevice, strPsw); // 手機和藍牙採集器配對
22 ClsUtils.createBond(btDevice.getClass(), btDevice);
23 ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice);
24 }
25 catch (Exception e)
26 {
27 // TODO Auto-generated catch block
28 e.printStackTrace();
29 }
30 }
31
32
33 }
34 }
001
002 import java.lang.reflect.Field;
003 import java.lang.reflect.Method;
004
005 import android.bluetooth.BluetoothDevice;
006 import android.util.Log;
007 public class ClsUtils
008 {
009
010
014 static public boolean createBond(Class btClass, BluetoothDevice btDevice)
015 throws Exception
016 {
017 Method createBondMethod = btClass.getMethod("createBond");
018 Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
019 return returnValue.booleanValue();
020 }
021
022
026 static public boolean removeBond(Class btClass, BluetoothDevice btDevice)
027 throws Exception
028 {
029 Method removeBondMethod = btClass.getMethod("removeBond");
030 Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);
031 return returnValue.booleanValue();
032 }
033
034 static public boolean setPin(Class btClass, BluetoothDevice btDevice,
035 String str) throws Exception
036 {
037 try
038 {
039 Method removeBondMethod = btClass.getDeclaredMethod("setPin",
040 new Class[]
041 {byte[].class});
042 Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice,
043 new Object[]
044 {str.getBytes()});
045 Log.e("returnValue", "" + returnValue);
046 }
047 catch (SecurityException e)
048 {
049 // throw new RuntimeException(e.getMessage());
050 e.printStackTrace();
051 }
052 catch (IllegalArgumentException e)
053 {
054 // throw new RuntimeException(e.getMessage());
055 e.printStackTrace();
056 }
057 catch (Exception e)
058 {
059 // TODO Auto-generated catch block
060 e.printStackTrace();
061 }
062 return true;
063
064 }
065
066 // 取消用戶輸入
067 static public boolean cancelPairingUserInput(Class btClass,
068 BluetoothDevice device)
069
070 throws Exception
071 {
072 Method createBondMethod = btClass.getMethod("cancelPairingUserInput");
073 // cancelBondProcess()
074 Boolean returnValue = (Boolean) createBondMethod.invoke(device);
075 return returnValue.booleanValue();
076 }
077
078 // 取消配對
079 static public boolean cancelBondProcess(Class btClass,
080 BluetoothDevice device)
081
082 throws Exception
083 {
084 Method createBondMethod = btClass.getMethod("cancelBondProcess");
085 Boolean returnValue = (Boolean) createBondMethod.invoke(device);
086 return returnValue.booleanValue();
087 }
088
089
093 static public void printAllInform(Class clsShow)
094 {
095 try
096 {
097 // 取得所有方法
098 Method[] hideMethod = clsShow.getMethods();
099 int i = 0;
100 for (; i < hideMethod.length; i++)
101 {
102 Log.e("method name", hideMethod[i].getName() + ";and the i is:"
103 + i);
104 }
105 // 取得所有常量
106 Field[] allFields = clsShow.getFields();
107 for (i = 0; i < allFields.length; i++)
108 {
109 Log.e("Field name", allFields[i].getName());
110 }
111 }
112 catch (SecurityException e)
113 {
114 // throw new RuntimeException(e.getMessage());
115 e.printStackTrace();
116 }
117 catch (IllegalArgumentException e)
118 {
119 // throw new RuntimeException(e.getMessage());
120 e.printStackTrace();
121 }
122 catch (Exception e)
123 {
124 // TODO Auto-generated catch block
125 e.printStackTrace();
126 }
127 }
128 }
執行時直接使用:
01 public static boolean pair(String strAddr, String strPsw)
02 {
03 boolean result = false;
04 BluetoothAdapter bluetoothAdapter = BluetoothAdapter
05 .getDefaultAdapter();
06
07 bluetoothAdapter.cancelDiscovery();
08
09 if (!bluetoothAdapter.isEnabled())
10 {
11 bluetoothAdapter.enable();
12 }
13
14 if (!BluetoothAdapter.checkBluetoothAddress(strAddr))
15 { // 檢查藍牙地址是否有效
16
17 Log.d("mylog", "devAdd un effient!");
18 }
19
20 BluetoothDevice device = bluetoothAdapter.getRemoteDevice(strAddr);
21
22 if (device.getBondState() != BluetoothDevice.BOND_BONDED)
23 {
24 try
25 {
26 Log.d("mylog", "NOT BOND_BONDED");
27 ClsUtils.setPin(device.getClass(), device, strPsw); // 手機和藍牙採集器配對
28 ClsUtils.createBond(device.getClass(), device);
29 remoteDevice = device; // 配對完畢就把這個設備對象傳給全局的remoteDevice
30 result = true;
31 }
32 catch (Exception e)
33 {
34 // TODO Auto-generated catch block
35
36 Log.d("mylog", "setPiN failed!");
37 e.printStackTrace();
38 } //
39
40 }
41 else
42 {
43 Log.d("mylog", "HAS BOND_BONDED");
44 try
45 {
46 ClsUtils.createBond(device.getClass(), device);
47 ClsUtils.setPin(device.getClass(), device, strPsw); // 手機和藍牙採集器配對
48 ClsUtils.createBond(device.getClass(), device);
49 remoteDevice = device; // 如果綁定成功,就直接把這個設備對象傳給全局的remoteDevice
50 result = true;
51 }
52 catch (Exception e)
53 {
54 // TODO Auto-generated catch block
55 Log.d("mylog", "setPiN failed!");
56 e.printStackTrace();
57 }
58 }
59 return result;
60 }
❽ 藍牙晶元最大支撐多大的解析度
經過幾年的發展,藍牙的應用已經很普遍,電腦、手機、汽車等等都有用到,藍牙使短距離的通信變得簡單,能實現的功能也漸漸變得復雜,網羅各色藍牙相關製作,藍牙耳機、藍牙音響...........有基礎有創新,讀透便能更全面了解藍牙技術。
智能WiFi小車開發技術大揭秘_智能WiFi小車_物聯網開發工程師-創客學院
1、攜帶型手機移動藍牙、wifi通訊MPOS機電源設計方案(原理圖+PCB+bom等
MPOS機電源設計方案功能概述:
a) 該手機移動MPOS機電源通過採用1S1P鋰電池來縮小其體積大小和設計成本,這樣設計,有利於用戶便於攜帶方便;
b) MPOS機電源採用負荷集成開關用於降低待機功耗,確保最大化電池使用壽命;
c) MPOS機電源電路採用USB c型充電埠,支持更高的功率輸出和減少充電時間。
2、基於STM32藍牙控制小車系統設計(硬體+源代碼+論文)
該藍牙控制小車是一個基於意法半導體與ARM公司生產的STM32F4 DISCOVERY開發板完成,外接集電機驅動模塊、電源管理模塊、stm32f4主控模塊、藍牙串口通信模塊、android控制端模塊。
電機驅動模塊使用了兩個L298N晶元來驅動4路電機,使能端連接4路來自主控板的PWM波信號,8個輸入端接主控板的8個輸出埠;
電源管理模塊使用了LM2940-5.0晶元進行12V到5V的轉換,12V用於電機模塊的供電,5V用於藍牙模塊、感測器等的供電;
主控模塊採用了MDK編輯程序,然後下載到主控板,實現硬體與軟體的交互;
藍牙串口通信模塊則是採用了FBT06_LPDB針插藍牙模塊,與主控板進行串口通信,同時與android手機進行通信;
android控制端模塊是一個集開啟藍牙、搜索藍牙、控制小車等功能。
用戶可以通過android控制端進行控制小車的運動,實現一些用戶需要的功能和服務。
3、支持藍牙4.0的智能恆溫箱(半導體致冷)
1) 藍牙晶元採用TI CC2541
2) 溫度感測器用的是DS18B20
3) 製冷模塊用的是半導體製冷片,就是飲水機里常用的那種
4) 外殼用的是亞克力切割的
5) 製冷效果還不錯,我設置的恆定溫度是4度,打開之後,溫度迅速的降低到了4度。
6) 程序里設置了恆溫功能,溫度超過了指定溫度,製冷片就開始工作。降到了指定溫度,製冷片就停止了工作,夠智能吧。歡迎各位同學直接拿去用。
4、軟硬體開源製作Arino藍牙智能手錶,12864oled顯示
閑暇時間試著用開源的arino做了一個藍牙智能手錶,簡述過程把經驗分享給大家,這個藍牙手錶可以顯示時間,連接手機顯示通知數量,電池,wifi等。
Arino藍牙智能手錶硬體如下:
Arino pro mini開發板一塊
hc-06藍牙模塊
12864oled顯示屏
鋰電池
USB轉TTL 調試器
導線,烙鐵等
5、DIY製作智能藍牙防丟定位器(詳細製作教程+安卓app工程源碼)
所謂智能藍牙(Smart Bluetooth)防丟器,是採用藍牙技術專門為智能手機設計的防丟器。其工作原理主要是通過距離變化來判斷物品是否還控制在你的安全范圍。主要適用於手機、錢包、鑰匙、行李等貴重物品的防丟,也可用於防止兒童或寵物的走失。
藍牙防丟器的主要構造:
目前比較成熟的產品一般是採用藍牙4.0 技術,具有低功耗、雙向防丟、自動報警等優點。雖然市場上該類產品種類繁多、層出不窮,但其核心構成一般包括:藍牙4.0 晶元、藍牙晶元輔助電路、藍牙天線、蜂鳴器、開關、電源等。
該防丟器採用HC-05/06設計而成,並為之設計了配套的安卓應用。
6、藍牙手機控制的懶人專用智能房間控制器設計資料(轉載、開源原理圖、源碼)
硬體設計:使用的是單片機STC12C5A60S2,共有8路輸入,其中4路是隔離的,低電平為開,輸出也是8路,4個繼電器,4個可控硅,為了簡化可控硅的控制電路,採用5V的隔離電源隔開,有6個開關,開關1-5分別對應的4個可控硅及1個繼電器輸出,開關6是用於顯示翻頁及設置用,短按為翻頁,長按為進入當前頁的設置,再短按為改變設置項目,再長按為保存設置,開關5當處於設置時,就為調整參數,如不處於設置狀態時,為繼電器1控制。繼電器2設置有一組定時開關功能,是採用觸發方式的。顯示用0.96寸的OLED顯示器,溫度濕度用DHT11模塊。帶有無線遙控功能……
7、藍牙小車(搖桿控制)設計分享(原理圖+源代碼+製作教程等)
該小車基於arino開發環境,硬體組成包括BTboard開發板、搖桿擴展板、Mboard小車。
設計說明:
遙控方面的硬體很簡單,BTboard是一款帶藍牙(兼容主從機模式)功能的uno開發板。搖桿擴展板,帶按鍵,教程暫時沒有使用到按鍵功能,小夥伴可以自行添加開發,控制燈光、打開攝像頭等等。
給BTboard燒寫控制代碼,燒寫前一定要把板子上的跳線帽拔掉,否則燒不進代碼(board類型選擇Arino Duemilanove),控制代碼詳見附件內容。
燒寫完成,把跳線帽插到BTboard上的B的一邊,開關撥到DAT的一邊。(如截圖)
最後把搖桿擴展板疊加上去,搖桿擴展板上的跳帽接到5V的一邊,然後上電,USB供電用5V,適配器供電用9v-23V都可以。打開小車的開關,藍牙就會自動配對,此時黃色指示燈常亮。試試轉動搖桿吧!
8、安卓手機藍牙通信源碼+手機APP文件等
該設計是基於Kinetis開發板完成的安卓手機藍牙通信功能。
具體介紹如下:
利用開發板的串口通信功能,實現開發板通過藍牙與安卓手機進行通信的功能。藍牙模塊在淘寶上有很多,感興趣的可以去淘寶上搜索,下面有我現在使用的藍牙模塊的資料以及配置藍牙模塊是的一寫AT指令照片(包括修改藍牙的串口通信波特率、奇偶校驗模式等)。設計流程主要包括:藍牙與開發板的連接,手機連接藍牙模塊,通信數據等等。附件內容包括手機APP文件及程序源碼。
9、STM32實現的兩輪自平衡車,藍牙APP遙控(原理圖、源代碼、APP、視頻)
兩輪自平衡車特點:
小車底盤使用的是一體成型的鈑金件,且表面做了黑色陽極化處理,更耐臟,更堅固,而非其他的使用亞克力固定電機座的做法。
上兩層使用黑色亞克力,與底盤渾然一體,更加時尚美觀。
電機光柵碼盤有保護蓋,避免了小車行進碰撞導致損壞光柵,如果光柵損壞了,小車想再站起來就不可能了。
使用的是減速電機而非步進電機,反應更迅速。
電路板完全自主設計成單板模式,而非模塊拼湊。
使用安卓藍牙APP進行遙控。
電路控制使用雙主控,與現有市面上的載人兩輪自平衡車方案相同,一顆用於運動控制,一顆用於姿態解算,具備更高的可靠性。
電路提供了2部分3.3V電源,一個用於姿態感測器單獨供電,另一個用於除姿態感測器其他的所有部分3.3V電源,避免了電源交叉影響,給姿態解算帶來了更高的精確度。
10、無線音頻完整解決方案—藍牙、兼備耳機和免提
描述 :此參考設計使用經過全面認證的 LMX9838 藍牙模塊提供完整的無線音頻解決方案。實施了藍牙耳機和免提模式,是單聲道音頻通信和控制的完美選擇。由於支持可訂購評估模塊、內置藍牙配置文件和免費支持軟體,此經濟高效且簡單的設計可大幅加快產品上市步伐。TIDA-00186 設計基於 LMX9838DONGLE。
11、【PADS9.5】小鋼炮藍牙音箱BGA兩層板設計
藍牙模塊使用的是RDA5850,是一個高度集成、低成本、低功耗的藍牙立體聲帶通話功能+TF卡+FM+Line in全功能單晶元模塊,符合Bluetooth2.1+EDR規范。同時預留有LCD點陣屏,還可以做mic錄音,支持紅外遙控等。
可以播放MP3/WMA/WAV/SBC;藍牙立體聲傳輸,藍牙通話;TF/SD卡控制,支持USB(slave)功能,從而可以實現讀卡器功能……其他更多詳細功能可以參見數據書冊(RDA5850數據手冊)。
藍牙音箱的市場價格大家都是知道的,不超過百元,硬體成本肯定不會超過50元,那麼想想這個RDA5850的價格也如何低了,功能卻如此強大。PCB是兩層板,也省下了一筆成本。
12、智能藍牙手錶Oneda-Watch-2設計資料分享
Oneda-Watch-2智能手錶採用聯發科MTK6260設計方案
MTK6260特點:
1) 350MHz主頻
2) 內置64M RAM,支持NAND FLASH,最大解析度320*480
3) 內置128M FLASH,最大解析度480*480
Oneda-Watch-2功能特點:1.54英寸240*240像素,支持音樂播放、通話、計步器、睡眠監測、久坐提醒,支持藍牙3.0
13、手機藍牙控制LED廣告屏電路設計分享
該設計實現的功能是:
手機通過藍牙連接方式控制LED廣告屏,無需電腦,能夠隨時更改屏幕顯示內容,顯示方式等。LED屏是在網上淘的二手F3.75雙色LED顯示屏。自己做得是個基於LM3S811的LED屏控制驅動器。
14、分享藍牙4.0防丟器源碼+原理圖+PCB源文件+視頻講解
藍牙4.0防丟器概述:
該藍牙4.0 防丟器基於GB2540模塊設計。GB254X 是一款採用美國德州儀器 TI 藍牙 4.0 CC2540 or CC2541作為核心處理器的高性能、超低功耗(Bluetooth Low Energy)射頻收發系統模塊,遵循低功耗藍牙協議,適合單模式低功耗藍牙應用。
具體功能是:
出圍欄模式:當手機和防丟器連接時,如果信號強度小於手機設定值或無信號,手機響,防丟器響。
入圍欄模式:當手機掃描到防丟器時,如果信號強度大於手機設定值,手機響,防丟器響。
來電提醒功能:當手機來電,防丟器蜂鳴器響,這樣冬天手機放包包里,就不會聽不到啦。
15、無線鍵鼠 藍牙飛鼠 空中飛鼠 基於 Kinetis Cortex-M0+ MCU設計(源碼開源)
藍牙無線空中鍵鼠,能夠同時實現傳統的鍵盤和滑鼠雙功能。它的空中使用功能,可以將你從電腦、電視旁邊徹底解放出來,只需要通過在空中揮動RC16空鼠,就迅速響應轉換成在屏幕上的游標移動,使用3D陀螺儀完美結合,用戶可以以360度隨意精準操作。手持操作手感舒適、方便,完全避免了傳統滑鼠需要以靜止的桌面為參照物操作或紅外遙控器按鍵操作的弊端,讓您躺著玩電腦、電視都不累,輕松休閑,完全 「掌」控你的電腦、電視娛樂
飛思卡爾藍牙飛鼠以Kinetis KL16單片機、加速度計、陀螺儀和電子羅盤為基礎,並通過藍牙與目標主機通信。使用了藍牙 HID/HFP/SSP配置文件,並可以將滑鼠和鍵盤的輸入數據和感測器數據發送至目標主機。
16、手感遙控車 藍牙無線 51單片機控制
本製作以STC89C52RC單片機和ADXL345(ADXL345數據手冊)加速度模塊。加速度模塊固定在手上時,當手向左傾斜,小車左轉;手向右傾斜,小車右轉;手向前傾斜,小車前進;手向後傾斜,小車倒退;手水平不動,小車停止任何動作。有效控制范圍 10米(開闊地)。
原理:ADXL345加速度模塊可以測量X Y Z三軸的加速度和傾角。人的手做動作時,勢必會改變模塊的加速度大小和傾角。由於測量加速度較繁瑣,所以測量的是傾角數據。當傾角數據滿足一定范圍時,通過藍牙模塊傳輸控制指令到小車,實現小車的動作。
17、全彩LED燈時鍾設計,藍牙控制(硬體+APP+硬體驅動+BOM等)
探索者號智能自平衡車_嵌入式-創客學院
輝光管使用了 QS30-1,通過四個氖燈顯示時間的冒號。每個輝光管下面各安裝一個全彩 LED,可控制其顯示顏色。該時鍾使用MC34063ADR2G電源晶元,配合 MOS 管和電感等構成 DC-DC 升壓電路,將 12V 電壓升至 170V,供輝光管使用。通過 HV57708PG 驅動輝光管。LPD6803用於控制全彩 LED。主控晶元採用 STC15F2K60S2,時鍾晶元採用 SD2405ALPI,藍牙電路模塊採用 RF-BM-S02(具體詳見整個藍牙控制控制全彩LED燈電路設計)。
18、(課程設計)自製藍牙MP3電路+源程序+課程設計報告
本課程設計是基於MCS51系列單片機所設計的,用STC89C52晶元控制的智能數字音樂盒,整個系統可以由電路硬體控制,也可由Android手機客戶端軟體進行控制。本系統包括STC89C52單片機最小系統、按鍵電路、蜂鳴器及LCD1602顯示電路、藍牙模塊、安卓手機客戶端組成,共可以播放6首歌曲,按鍵電路可以實現進入藍牙控制、播放、暫停、下一首等功能,手機客戶端可以實現釋放藍牙控制、上一首、下一首、播放等功能;LCD1602可以顯示正在播放的歌曲和時間,蜂鳴器播放音樂。其中手機客戶端是由谷歌公司開發的手機編程軟體AppInventor開發的。
❾ 安卓手機間藍牙文件傳輸 源碼
請在Eclipse的ADT中安裝官方相關API的SDK,有若干個藍牙demo。
❿ 誰能給一份開發基於藍牙4.0的android的demo源碼
android藍牙串口通信的demo源碼已經增加到附件啊,可以直接下載運行的。