Bluetooth4_3執行流程(連線發射器SN00000009)
0,Android幫助文件
www.pinnace.cn/bluetooth/tech/1940.shtml
此示例程式碼中有錯:
在DeviceControlActivity類內:ExpandableListView.OnChildClickListener
中if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0)的|應該改成&
1,AndroidManifest.xml
2,DeviceScanActivity介面如下:
onCreate->onCreateOptionsMenu->onResume(new mLeDeviceListAdapter),單擊掃描onOptionsItemSelected->scanLeDevice搜尋到裝置會回撥LeScanCallback介面BluetoothAdapter.LeScanCallback,單擊搜尋到的藍芽裝置列表(使用者操作)onListItemClick(把搜到的藍芽裝置的地址和名稱放入Intent中傳給下個介面DeviceControlActivity)--》3DeviceControlActivity
3,DeviceControlActivity介面如下:呼叫BluetoothLeService中的方法:
onCreate
先取出上個介面DeviceScanActivity傳過來的藍芽裝置的地址和名稱並顯示在介面上,然後
(Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
//上面2句執行--》非同步呼叫(1)new 1個mServiceConnection介面的物件(2)執行BluetoothLeService類裡面的
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {BluetoothLeService getService() {return BluetoothLeService.this;}}//通過呼叫mBinder.getService()可以使用mBinder物件獲得BluetoothLeService
----》執行BluetoothLeService類裡面的
public IBinder onBind(Intent intent) {return mBinder}繫結成功
----》執行DeviceControlActivity
的onServiceConnected方法onServiceConnected:(1)BluetoothLeServicem.initialize()獲取BluetoothManager和mBluetoothAdapter初始化成功再執行(2)BluetoothLeService.connect(mDeviceAddress):第1次連線時通過mBluetoothAdapter獲得BluetoothDevice,通過BluetoothDevice獲得mBluetoothGatt,以後再連直接連就可以。連線狀態由mConnectionState初始值STATE_DISCONNECTED變為STATE_CONNECTING---》會執行BluetoothLeService的回撥函式BluetoothGattCallback。onConnectionStateChange中把連線狀態放到Intent中用廣播sendBroadcast(intent)的方式告知本介面中
非同步呼叫就是你 喊 你朋友吃飯 ,你朋友說知道了 ,待會忙完去找你 ,你就去做別的了。同步呼叫就是你 喊 你朋友吃飯 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你們一起去。
bindService是非同步呼叫和Service進行繫結, 如果繫結成功, 則會呼叫ServiceConnection的onServiceConnected。在這個方法中會向Activity中傳遞一個IBinder的例項,Acitity需要儲存這個例項。在Service中需要建立一個實現IBinder的內部類(這個內部類不一定在Service中實現,但必須在Service中建立它)。在OnBind()方法中需返回一個IBinder例項,不然onServiceConnected方法不會呼叫。
//已經註冊了此廣播(onResume中registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());在的廣播接收器中根據狀態進行更新介面
onResume: registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
註冊廣播:如果藍芽服務出現下列4種狀態BluetoothLeService.ACTION_GATT_CONNECTED,ACTION_GATT_DISCONNECTED,ACTION_GATT_SERVICES_DISCOVERED,ACTION_DATA_AVAILABLE
這個廣播private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver()
就通知我做下面的事情:連上了,更新ui上的文字(選單欄中)
invalidateOptionsMenu();//Menu ItemonCreateOptionsMenu()只有在menu剛被建立時才會執行,因此要想隨時動態改變OptionMenu就要實現onPrepareOptionsMenu()方法,該方法會傳給你Menu物件,供使用 Android2.3或更低的版本會在每次Menu開啟的時候呼叫一次onPrepareOptionsMenu(). Android3.0及以上版本預設menu是開啟的,所以必須呼叫invalidateOptionsMenu()方法,然後系統將呼叫onPrepareOptionsMenu()執行update操作。
mBluetoothLeService.connect(mDeviceAddress);第1次進入此介面,重新進入此介面,單擊選單欄的選單項:Connect都會去連線此藍芽裝置,所以要寫3個地方
4,BluetoothLeService
public class LocalBinder extends Binder {
BluetoothLeService getService() {
return BluetoothLeService.this;}}
private final IBinder mBinder = new LocalBinder();
onBind:return mBinder;通過此mBinder找到此BluetoothLeService
呼叫 bindService 會啟動 Service,Service.onBind如果返回null,不會連線上 Service,因此 ServiceConnection.onServiceConnected 不會被呼叫,但你任然需要使用 unbindService 函式斷開它,這樣 Service 才會停止。
Intent intent = new Intent(MainActivity.this,BindService.class),bindService(intent, conn, Context.BIND_AUTO_CREATE);->新建了BindService物件->新建了MyBinder物件->onBind()函式 -----傳遞MyBinder物件------->onServiceConnected()--> 通過傳遞的Binder物件獲取剛剛和Binder物件對應的BindService 物件 -->呼叫Service中定義的方法。
5,手機藍芽狀態的改變
呼叫mBluetoothLeService.connect(mDeviceAddress);手機和發射器的狀態由未連線-->已連線,執行BluetoothLeService的回撥函式onConnectionStateChange:--->broadcastUpdate(ACTION_GATT_CONNECTED)-->sendBroadcast(new Intent(ACTION_GATT_CONNECTED));-->執行DeviceControlActivity的BroadcastReceiver--->介面的選單欄上顯示
關閉藍芽同上面流程
6,手機和發射器藍芽連線上以後就會發現Services,BluetoothGattCallback的方法onServicesDiscovered就會執行,同上
public void onServicesDiscovered (BluetoothGatt gatt, int status)
Callback invoked when the list of remote services, characteristics and descriptors for the remote device have been updated, ie new services have been discovered.
--》DeviceControlActivitydisplayGattServices中(mBluetoothLeService.getSupportedGattServices());
引數:BluetoothLeService中的方法getSupportedGattServices()獲得BluetoothGatt
支援的所有Service
此方法可以獲取該發射器支援的所有Service和每個Service下面的Characteristic如下圖:
7,單擊上圖中的Characteristic UUID--->執行DeviceControlActivity:ExpandableListView.OnChildClickListener:
8,characteristic讀的流程
BluetoothGatt.
readCharacteristic(BluetoothGattCharacteristic characteristic)-->非同步呼叫BluetoothGattCallback.onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)
service:1800,1801,180a,fff0
(1)service:1800--》1800指00001800-0000-1000-8000-00805f9b34fb,下面一樣
characteristic 2a00資料:CGM Sensor
43 47 4D 20 53 65 6E 73 6F 72
characteristic 2a01資料:00 00
characteristic 2a02資料:00
characteristic 2a03資料:00
characteristic 2a04資料:P??
50 00 A0 00 00 00 E8 03
(2)service:1801--》
characteristic 2a05資料:No data
(3)service:180a--》Device informaton Service
characteristic 2a23資料:7o<??
37 6F 3C 00 00 98 80 00
characteristic 2a24資料:Model Number
4D 6F 64 65 6C 20 4E 75 6D 62 65 72
characteristic 2a25資料:Serial Number
53 65 72 69 61 6C 20 4E 75 6D 62 65 72
characteristic 2a26資料:Firmware Revision
46 69 72 6D 77 61 72 65 20 52 65 76 69 73 69 6F 6E
characteristic 2a27資料:Hardware Revision
48 61 72 64 77 61 72 65 20 52 65 76 69 73 69 6F 6E
characteristic 2a28資料:Software Revision
53 6F 66 74 77 61 72 65 20 52 65 76 69 73 69 6F 6E
Manufacture Name String 2a29資料:Manufacture Name
4D 61 6E 75 66 61 63 74 75 72 65 72 20 4E 61 6D 65
characteristic 2a2a資料:?expriamental
FE 00 65 78 70 65 72 69 6D 65 6E 74 61 6C
characteristic 2a50資料:
01 0D 00 00 00 10 01
(4)service:fff0--》
characteristic fff1資料:No data
characteristic fff2資料:No data
9,characteristic寫的流程
同上
10,android4.3.1連線總是會斷掉,是由於發射器的配置導致的
相關文章
- Facebook造出了巨型無人機 發射鐳射普及網際網路連線無人機
- SSH連線伺服器後執行多條命令伺服器
- 【讀書筆記】Postgresql連線方法及執行器筆記SQL
- CAEmitterLayer粒子發射器MIT
- Oracle中表連線的執行原理Oracle
- 表連線的執行步驟
- Modbus協議轉Profibus協議閘道器模組連PLC與鐳射發射器通訊協議
- 併發、多執行緒、HTTP連線數有何關係?執行緒HTTP
- java連線oracle執行sql語句JavaOracleSQL
- CAN轉PN閘道器模組連線鐳射切割機的配置方法
- 射蠟工序流程圖流程圖
- Mysql 執行流程MySql
- HA執行流程
- MapReduce執行流程
- php執行流程PHP
- MyBatis執行流程MyBatis
- php連線mysql並執行sql語句PHPMySql
- Spark Task 的執行流程② - 建立、分發 TaskSpark
- 【ASP.NET Core】MVC過濾器:執行流程ASP.NETMVC過濾器
- Pycharm連線遠端伺服器並編寫、執行python程式碼PyCharm伺服器Python
- 「MySQL」 MySQL執行流程MySql
- SpringMVC執行流程SpringMVC
- MapReduce程式執行流程
- javaWeb的執行流程JavaWeb
- Struts框架執行流程框架
- PostgreSQL SQL執行流程SQL
- 第二十篇:不為客戶連線建立子程式的併發回射伺服器(poll實現)伺服器
- 關於在執行java連線MongoDB時遇到的連線超時問題JavaMongoDB
- [MetalKit]30-Raymarching-in-Metal射線行進
- MySQL中介軟體之ProxySQL(5):執行緒、執行緒池、連線池MySql執行緒
- mysql關於最大連線數、最大併發執行緒數的區別MySql執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- 連線到 Linux 伺服器時首先要執行的 5 個命令Linux伺服器
- PHP直譯器引擎執行流程 - [ PHP核心學習 ]PHP
- 第十九篇:不為客戶連線建立子程式的併發回射伺服器(select實現)伺服器
- vscode連線遠端伺服器docker容器進行開發VSCode伺服器Docker
- Sqlserver執行計劃中表的四種連線方式SQLServer
- Kettle資料庫資源庫連線執行示例資料庫