久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

藍牙知識小結(jié)

時間:2019-05-13 16:25:48下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《藍牙知識小結(jié)》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《藍牙知識小結(jié)》。

第一篇:藍牙知識小結(jié)

藍牙協(xié)議知識總結(jié)

藍牙設備 和 主機進行連接和數(shù)據(jù)通信的 流程如下:外部設備發(fā)出廣告(帶有UUID信息等其他信息); 主機(集中器設備)收到廣告信息,進而發(fā)送掃描請求;表示我掃描到你的信息; 3 外部設備收到掃描請求后,返回掃描回應,表示我知道你掃描到我的信息; 4 主機進而發(fā)送連接請求信息,表示主機要跟設備建立無線連接; 5 設備收到連接請求后,發(fā)送相應請求回應;表示已經(jīng)建立連接;

數(shù)據(jù)讀寫流程如下進一步(在建立連接的基礎上): 主機發(fā)送主服務UUID(設備的廣告UUID)給設備;

服務發(fā)現(xiàn) 7 設備收到后回應服務信息; 主機發(fā)送特性UUID;

特性發(fā)現(xiàn) 9 設備收到后回應特性值句柄;(類似于存儲設備的地址)主機發(fā)送特性值句柄;

讀信息 11 設備收到后回應特性值; 主機發(fā)送特性值句柄和要寫入值;

寫信息 13 設備回應寫入成功響應;

在睡眠狀態(tài),耗電只有1微安(uA),而在連接事件中最高的是10幾個毫安

連接建立之后,再進行安全密鑰的交換配對,進而進行數(shù)據(jù)的讀寫;

主機和從機綁定之后,斷開連接后,可以快速的建立連接并進行加密讀寫,而不需要再次配對; 特點 低功耗藍牙速度只有100bps,傳統(tǒng)藍牙有3Mbps 2 低功耗藍牙不需要IOS 的MFI 認證,傳統(tǒng)藍牙必須; 3 低功耗藍牙能紐扣電池能用1年多,傳統(tǒng)藍牙不行;

頻道:

2.4G – 2.48G 總共40個頻段,每2M 一個頻段;

其中 37(2.40G),38(2.426G),39(2.48G)為 3個廣播頻道;這3個頻道避開了wifi 常用的頻道,與wifi可以共存; 其他37個為連接頻道;

1、BLE中主從機建立連接,到配對和綁定的過程如下圖。

正如上圖所示,最簡單一次藍牙通信需要以上相關步驟,包括discovery device,connect,pairing,bond等4個主要部分。

1)廣播:廣播包可以包含廣播數(shù)據(jù),廣播包可以無指定或者對指定的設備發(fā)送。可以聲明該器件是可連接的還是不可連接的。在一次廣播中,廣播包可以在三個廣播通道中同時發(fā)送。

廣播類型 :1 未指定可連接 2 指定可連接 3 未指定 不可見 4 未指定不可連接 #define GAP_ADTYPE_ADV_IND

0x00 //!< Connectable undirected advertisement #define GAP_ADTYPE_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement #define GAP_ADTYPE_ADV_DISCOVER_IND

0x02 //!< Discoverable undirected advertisement #define GAP_ADTYPE_ADV_NONCONN_IND

0x03 //!< Non-Connectable undirected advertisement #define GAP_ADTYPE_SCAN_RSP_IND

0x04 //!< Only used in gapDeviceInfoEvent_t 在peripheral.c中

GAPRole_Init(taskID++);進行了初始化設置

還有有以下函數(shù)bStatus_t GAPRole_SetParameter(uint16 param, uint8 len, void *pValue)GAPRole_GetParameter(…..)可以調(diào)用進行設置。2)scanning 1)被動掃描: 掃描者監(jiān)聽廣播頻道的廣播包,收到后將其上傳到host層

2)主動掃描:掃描者監(jiān)聽廣播頻道的廣播包,當收到廣播包后掃描者發(fā)送一個scan Request包,廣播設備回應一個scan reponse包

3)Connection 在掃描設備掃描到一個可連接的廣播消息后,掃描設備可以通過發(fā)送 connection reequst 包給廣播設備從而成為連接的發(fā)起者

Connection resqust 包含從機鏈路層一系列的參數(shù),這些參數(shù)聲明連接時的通道及時序要求。建立連接

GAPCentralRole_EstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,DEFAULT_LINK_WHITE_LIST,addrType, peerAddr);廣播設備接收了連接請求,就進入了連接狀態(tài),發(fā)起者成了主機,廣播設備成了從機。兩個已連接的設備的所有通信發(fā)生在連接事件中,連接事件周期性的發(fā)生,周期由連接間隔參數(shù)決定。

連接間隔:使用調(diào)頻的間隔;兩個連接事件之間的時間間隔,藍牙傳數(shù)據(jù)是在一個頻段發(fā)送數(shù)據(jù)后,然后跳到另一個頻段再傳數(shù)據(jù),從一個頻道另一個頻段的時間間隔就是連接間隔;即使沒有數(shù)據(jù)發(fā)送,也要調(diào)頻切換測試包是否連接斷開;所以,連接間隔是定時的存在;可以認為是一個固定的時序;每隔一段時間就自動調(diào)到另一個頻道的去建立連接;這個時間中,是很少功耗的,基本沒有;

單位是1.25毫秒;范圍是 6----3200個單位;也就是1.25ms到4s的范圍 不同的應用 時間間隔不一樣,時間間隔長,功耗就低,傳輸數(shù)據(jù)慢; 時間間隔短,功耗就高,傳輸數(shù)據(jù)就快。

從機延時: 從機如果沒有數(shù)據(jù)發(fā)送,可以跳過連接間隔,不用頻繁的定時去建立連接,從而過一段較長時間再去建立連接;這個時間就是從機延時時間;從而功耗降低很多;單位是和連接間隔一樣;范圍是 0---499

管理超時

超過這個時間,還沒有建立連接,則認為是連接丟失,斷開。回到未連接狀態(tài);

單位是10ms,范圍是 10(100ms)-----3200(32s)。超時值必須比有效連接間隔大;有效連接間隔= 連接間隔×(1+從機延時)

如果從機不想使用當前的連接參數(shù),可以向主機發(fā)送連接更新請求,從機設備可以在任何時候發(fā)送連接更新請求,使得從機可以動態(tài)的調(diào)整連接參數(shù)。

GAPCentralRole_UpdateLink(simpleBLEConnHandle,DEFAULT_UPDATE_MIN_CONN_INTERVAL,DEFAULT_UPDATE_MAX_CONN_INTERVAL,DEFAULT_UPDATE_SLAVE_LATENCY,DEFAULT_UPDATE_CONN_TIMEOUT);無論主機還是從機,都可以無條件的終止當前連接,一方請求終止,另一方必須在斷開連接狀態(tài)之前響應。

連接還可以由超時而終止。超時時間小于32s,大于有效連接間隔(連接間隔×(1+從機延時))

終止連接函數(shù):

GAPCentralRole_TerminateLink(simpleBLEConnHandle);主機和從機保存各自的超時計時器,每次收到數(shù)據(jù)包就清零,一旦達到超時數(shù)值,就認為連接已經(jīng)丟失就會斷開連接。

連接超時判斷,終止連接在程序中還沒找到。

2.BLE中的GAP和GATT GAP個人認為就是監(jiān)控上圖中的交互狀態(tài),比如從廣播變成連接,到配對等。

GATT通俗理解為用于主從機之間的客戶端和服務器端的數(shù)據(jù)交互,以Attribute Table來體現(xiàn)。

GAP Role Profile:在GAP所處的4個角色:廣播Advertise,主機central,從機Peripheral,觀察者Observer。GATT Attribute:通用屬性配置文件。

GAP作為Peripheral Role需要設置的核心參數(shù)如下 GAPROLE_ADVERT_ENABLED:廣播使能。GAPROLE_ADVERT_DATA:廣播時的參數(shù),GAPROLE_SCAN_RSP_DATA:從機掃描響應,返回的數(shù)據(jù)包

GAPROLE_MIN_CONN_INTERVAL:處于連接狀態(tài)后的設備,都會有個hop,一段時間內(nèi)進行數(shù)據(jù)交互,以保證兩者是連接的。當前后兩次交互時,需要等待的最小間隔時間 GAPROLE_MAX_CONN_INTERVAL:...需要等待的最大間隔時間

GAPROLE_SLAVE_LATENCY:處于連接后,從機可以做出不響應連接請求的間隔數(shù)目,即跳過n個交互的連接。

GAPROLE_TIMEOUT_MULTIPLIER:從上次成功連接到這次連接成功的最大允許延時。如果規(guī)定時間內(nèi)未成功則認為本次連接失敗,丟棄。該值必須比有效連接的間隔大。GAPROLE_PARAM_UPDATE_ENABLE:請求主機更新參數(shù),主機可以接受也可以拒絕。.GATT Server的相關設置函數(shù)。

// Initialize GATT attributes GGS_AddService(GATT_ALL_SERVICES);// GAP Service GATTServApp_AddService(GATT_ALL_SERVICES);// GATT attributes DevInfo_AddService();// Device Information Service SimpleProfile_AddService(GATT_ALL_SERVICES);// Simple GATT Profile 通常一個GATT中GAP server和GATT server是必須強制存在的,還有設備信息服務以及自己設計的profile server.SimpleProfile_AddService就是添加自己設計的profile server 在SimpleProfile_AddService函數(shù)中調(diào)用了如下函數(shù)

GATTServApp_RegisterService(simpleProfileAttrTbl, GATT_NUM_ATTRS(simpleProfileAttrTbl),&simpleProfileCBs);

} simpleProfileCBs 的函數(shù)定義如下:

CONST gattServiceCBs_t simpleProfileCBs = { simpleProfile_ReadAttrCB,// Read callback function pointer

simpleProfile_WriteAttrCB, // Write callback function pointer

NULL

// Authorization callback function pointer };實際上就是底層讀寫數(shù)據(jù)的函數(shù),主機讀數(shù)據(jù)時從機會調(diào)用simpleProfile_ReadAttrCB函數(shù),寫數(shù)據(jù)時從機會調(diào)用simpleProfile_WriteAttrCB函數(shù)。這兩個函數(shù)在simpleGaatprofile.c 中實現(xiàn)。

注意在simpleProfile_WriteAttrCB,函數(shù)中有如下語句 if((notifyApp!= 0xFF)&& simpleProfile_AppCBs && simpleProfile_AppCBs->pfnSimpleProfileChange)

{

simpleProfile_AppCBs->pfnSimpleProfileChange(notifyApp);

} 注意函數(shù)指針的用法,實際是在接收到主機數(shù)據(jù)發(fā)過來的數(shù)據(jù)后調(diào)用simpleProfileChangeCB函數(shù)來處理接收到的數(shù)據(jù)。這個函數(shù)在初始化時注冊,下面會講到。作為GATT的server和client,主要通過Attribute來進行交互,當client請求server讀取數(shù)據(jù)時,通過如下注冊的回調(diào)函數(shù)來進行訪問。

// Register callback with SimpleGATTprofile

VOID SimpleProfile_RegisterAppCBs(&simpleBLEPeripheral_SimpleProfileCBs);//給應用注冊回調(diào)函數(shù),這個函數(shù)非常重要 在回調(diào)函數(shù)中對數(shù)據(jù)做出處理。

static simpleProfileCBs_t simpleBLEPeripheral_SimpleProfileCBs = {

simpleProfileChangeCB

// Charactersitic value change callback };

在SimpleProfile_RegisterAppCBs 函數(shù)中賦值。simpleProfile_AppCBs = simpleProfileChangeCB

在simpleProfileChangeCB函數(shù)中可以啟動定時器來給主機發(fā)送Notification數(shù)據(jù)

發(fā)送數(shù)據(jù)函數(shù)為GATT_Notification(noti_cHandle,&pReport,FALSE);

如下:

{ static attHandleValueNoti_t pReport;//聲明attHandleValueNoti_t這個結(jié)構體

uint16 noti_cHandle;//存放handle

pReport.handle = simpleProfileAttrTbl[11].handle;//讀取notification對應的handle

GAPRole_GetParameter(0x30E, ¬i_cHandle);//獲取Connection Handle

pReport.len = 1;//數(shù)據(jù)長度

pReport.value[0] = 0x03;//賦值

GATT_Notification(noti_cHandle,&pReport,FALSE);}

主機使能Notification:

這個handle應該是相應的characteristic value的handle的后面一個, 就是characteristic value的handle加 1.例子: { attWriteReq_t writeReq;writeReq.handle =;writeReq.len = 2;writeReq.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);

這里是 0x01 writeReq.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);

這里是 0x00 writeReq.sig = 0;writeReq.cmd = 0;GATT_WriteCharValue(simpleBLEConnHandle, &writeReq, simpleBLETaskId);}

這兩個值目的是打開Notification功能.CCC的參數(shù)有兩個, 一個Notification, 一個indication.value[0]就是打開關閉notification, value[1]是打開關閉indication.主機數(shù)據(jù)處理:

simpleBLECentral.c 這個文件, 里面有個函數(shù):simpleBLECentralProcessGATTMsg()這個函數(shù)就是處理各種從peripheral過來的數(shù)據(jù).但是在示例代碼中并沒有加入通知, 就是notification的接收, 所以你得自己添加代碼.很簡單, 類似 if((pMsg->method == ATT_READ_RSP)||........), 添加 else if((pMsg->method == ATT_HANDLE_VALUE_NOTI)||......)就可以處理從機Notification的數(shù)據(jù)。

value 被寫的時候首先 simpleProfile_WriteAttrCB()會被調(diào)到.最后才會調(diào)用 simpleProfileChangeCB()

GAP通過在啟動設備事件的任務處理中啟動設備,其實主要是向GAP中注冊回調(diào)函數(shù),讓系統(tǒng)在發(fā)現(xiàn)自身運行狀態(tài)變化時,調(diào)用該函數(shù),方便應用層進行相關操作。if(events & SBP_START_DEVICE_EVT)

{

// Start the Device VOID GAPRole_StartDevice(&simpleBLEPeripheral_PeripheralCBs);//啟動設備,注冊回調(diào)函數(shù),用于監(jiān)督設備的狀態(tài)變化:廣播、連接、配對、綁定等。

// Start Bond Manager VOID GAPBondMgr_Register(&simpleBLEPeripheral_BondMgrCBs);} simpleBLEPeripheral_PeripheralCBs函數(shù)定義如下

static gapRolesCBs_t simpleBLEPeripheral_PeripheralCBs = {

peripheralStateNotificationCB, // Profile State Change Callbacks

NULL

// When a valid RSSI is read from controller(not used by application)};static void peripheralStateNotificationCB(gaprole_States_t newState)//傳入?yún)?shù)由GPA自己輸入,內(nèi)部調(diào)用回調(diào)函數(shù)給用戶,處理連接狀態(tài)的改變 simpleBLEPeripheral_BondMgrCBs函數(shù)定義如下: static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs = {

ProcessPasscodeCB,// 生成配對密碼,發(fā)送給主機

ProcessPairStateCB

//主機密碼的校驗處理。配對狀態(tài)管理 };

一、修改廣播功率 { #define LL_EXT_TX_POWER_MINUS_23_DBM

0 //-23dbm 功率 最小 #define LL_EXT_TX_POWER_MINUS_6_DBM

//-6dbm

#define LL_EXT_TX_POWER_0_DBM

// 0dbm

#define LL_EXT_TX_POWER_4_DBM // +dbm 功率 最大

HCI_EXT_SetTxPowerCmd(gTxPower);

更新廣播內(nèi)容

GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID, TRUE, sizeof(advertData_Ex), advertData_Ex);}

二、數(shù)據(jù)加密解密 { uint8 key[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

// 需要加密的數(shù)據(jù)

uint8 plaintextData[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

// 加密后數(shù)據(jù)存放區(qū)

uint8 encryptedData[16];

// 解密后數(shù)據(jù)存放區(qū)

uint8 deccryptedData[16];

// 開始加密

LL_Encrypt(key, plaintextData, encryptedData);

// 開始解密

LL_EXT_Decrypt(key, encryptedData, deccryptedData);}

三、設置從機廣播時間 1)、廣播模式必須是Limited Discoverable mode 在advertData 中加入此AD string: 0x02, GAP_ADTYPE_FLAGS, GAP_ADTYPE_FLAGS_LIMITED| GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED 2)、設置時間

//Maximum time to remain advertising, when in Limited Discoverable mode.unit is seconds #define USER_DEF_ADV_TIMEOUT

GAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT, USER_DEF_ADV_TIMEOUT);

第二篇:Android藍牙開發(fā)小結(jié)

學習之前先了解兩個基本概念:

一、RFCOMM協(xié)議:

一個基于歐洲電信標準協(xié)會ETSI07.10規(guī)程的串行線性仿真協(xié)議。此協(xié)議提供RS232控制和狀態(tài)信號,如基帶上的損壞,CTS以及數(shù)據(jù)信號等,為上層業(yè)務(如傳統(tǒng)的串行線纜應用)提供了傳送能力。

RFCOMM是一個簡單傳輸協(xié)議,其目的是針對如何在兩個不同設備上的應用之間保證一條完整的通信路徑,并在它們之間保持一通信段。

RFCOMM是為了兼容傳統(tǒng)的串口應用,同時取代有線的通信方式,藍牙協(xié)議棧需要提供與有線串口一致的通信接口而開發(fā)出的協(xié)議。RFCOMM協(xié)議提供對基于L2CAP協(xié)議的串口仿真,基于ETSI07.10。可支持在兩個BT設備之間同時保持高達60路的通信連接。

RFCOMM只針對直接互連設備之間的連接,或者是設備與網(wǎng)絡接入設備之間的互連。通信兩端設備必須兼容于RFCOMM協(xié)議,有兩類設備:DTE(Data Terminal Endpoint,通信終端,如PC,PRINTER)和DCE(Data Circuit Endpoint,通信段的一部分,如Modem)。此兩類設備不作區(qū)分。

二、MAC硬件地址

MAC(Medium/MediaAccess Control, 介質(zhì)訪問控制)MAC地址是燒錄在NetworkInterfaceCard(網(wǎng)卡,NIC)里的.MAC地址,也叫硬件地址,是由48比特長(6字節(jié)),16進制的數(shù)字組成.0-23位叫做組織唯一標志符(organizationally unique,是識別LAN(局域網(wǎng))節(jié)點的標識.24-47位是由廠家自己分配。其中第40位是組播地址標志位。網(wǎng)卡的物理地址通常是由網(wǎng)卡生產(chǎn)廠家燒入網(wǎng)卡的EPROM(一種閃存芯片,通常可以通過程序擦寫),它存儲的是傳輸數(shù)據(jù)時真正賴以標識發(fā)出數(shù)據(jù)的電腦和接收數(shù)據(jù)的主機的地址。

Android平臺提供的藍牙API去實現(xiàn)藍牙設備之間的通信,藍牙設備之間的通信主要包括了四個步驟:設置藍牙設備、尋找局域網(wǎng)內(nèi)可能或者匹配的設備、連接設備和設備之間的數(shù)據(jù)傳輸。以下是建立藍牙連接的所需要的一些基本類:

BluetoothAdapter類:代表了一個本地的藍牙適配器。它是所有藍牙交互的的入口點。利用它你可以發(fā)現(xiàn)其他藍牙設備,查詢綁定了的設備,使用已知的MAC地址實例化一個藍牙設備和建立一個BluetoothServerSocket(作為服務器端)來監(jiān)聽來自其他設備的連接。

BluetoothDevice類:代表了一個遠端的藍牙設備,使用它請求遠端藍牙設備連接或者獲取遠端藍牙設備的名稱、地址、種類和綁定狀態(tài)。(其信息是封裝在bluetoothsocket中)。

Bluetoothsocket類:代表了一個藍牙套接字的接口(類似于tcp中的套接字),它是應用程序通過輸入、輸出流與其他藍牙設備通信的連接點。

Blueboothserversocket類:代表打開服務連接來監(jiān)聽可能到來的連接請求(屬于server端),為了連接兩個藍牙設備必須有一個設備作為服務器打開一個服務套接字。當遠端設備發(fā)起連接連接請求的時候,并且已經(jīng)連接到了的時候,Blueboothserversocket類將會返回一個bluetoothsocket。

Bluetoothclass類:描述了一個藍牙設備的一般特點和能力。它的只讀屬性集定義了設備的主、次設備類和一些相關服務。然而,它并沒有準確地描述所有該設備所支持的藍牙文件和服務,而是作為對設備種類來說的一個小小暗示。下面說說具體的編程實現(xiàn) 1.啟動藍牙功能:

首先通過調(diào)用靜態(tài)方法getDefaultAdapter()獲取藍牙適配器BluetoothAdapter,以后你就可以使用該對象了。如果返回為空,the story is over。例如:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if(mBluetoothAdapter == null){ // Device does not support Bluetooth } 其次,調(diào)用isEnabled()來查詢當前藍牙設備的狀態(tài),如果返回為false,則表示藍牙設備沒有開啟,接下來你需要封裝一個ACTION_REQUEST_ENABLE請求到intent里面,調(diào)用startActivityForResult()方法使能藍牙設備,例如:

if(!mBluetoothAdapter.isEnabled()){ Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);}

2.查找設備:

使用BluetoothAdapter類里的方法,你可以查找遠端設備(大概十米以內(nèi))或者查詢在你手機上已經(jīng)匹配(或者說綁定)的其他手機了。當然需要確定對方藍牙設備已經(jīng)開啟或者已經(jīng)開啟了“被發(fā)現(xiàn)使能”功能(對方設備是可以被發(fā)現(xiàn)的是你能夠發(fā)起連接的前提條件)。如果該設備是可以被發(fā)現(xiàn)的,會反饋回來一些對方的設備信息,比如名字、MAC地址等,利用這些信息,你的設備就可以選擇去向?qū)Ψ匠跏蓟粋€連接。

如果你是第一次與該設備連接,那么一個配對的請求就會自動的顯示給用戶。當設備配對好之后,他的一些基本信息(主要是名字和MAC)被保存下來并可以使用藍牙的API來讀取。使用已知的MAC地址就可以對遠端的藍牙設備發(fā)起連接請求。

匹配好的設備和連接上的設備的不同點:匹配好只是說明對方設備發(fā)現(xiàn)了你的存在,并擁有一個共同的識別碼,并且可以連接。連接上:表示當前設備共享一個RFCOMM信道并且兩者之間可以交換數(shù)據(jù)。也就是是說藍牙設備在建立RFCOMM信道之前,必須是已經(jīng)配對好了的。

3.查詢匹配好的設備:

在建立連接之前你必須先查詢配對好了的藍牙設備集(你周圍的藍牙設備可能不止一個),以便你選取哪一個設備進行通信,例如你可以你可以查詢所有配對的藍牙設備,并使用一個數(shù)組適配器將其打印顯示出來:

Set pairedDevices = mBluetoothAdapter.getBondedDevices();// If there are paired devices if(pairedDevices.size()> 0){ //Loop through paired devices for(BluetoothDevice device : pairedDevices){ // Add the name and address to an array adapter to show in a ListView mArrayAdapter.add(device.getName()+ “n” + device.getAddress());} 建立一個藍牙連接只需要MAC地址就已經(jīng)足夠了。

4.掃描設備:

掃描設備,只需要簡單的調(diào)用startDiscovery()方法,這個掃描的過程大概持續(xù)是12秒,應用程序為了ACTION_FOUND動作需要注冊一個BroadcastReceiver來接受設備掃描到的信息。對于每一個設備,系統(tǒng)都會廣播ACTION_FOUND動作。例如: // Create a BroadcastReceiver for ACTION_FOUND private final BroadcastReceiver mReceiver = new BroadcastReceiver(){ public void onReceive(Context context, Intent intent){ String action = intent.getAction();// When discovery finds a device if(BluetoothDevice.ACTION_FOUND.equals(action)){ // Get the BluetoothDevice object from the Intent BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);// Add the name and address to an array adapter to show in a ListView mArrayAdapter.add(device.getName()+ “n” + device.getAddress());} } };// Register the BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver, filter);// Don't forget to unregister during onDestroy 注意:掃描的過程是一個很耗費資源的過程,一旦你找到你需要的設備之后,在發(fā)起連接請求之前,確保你的程序調(diào)用cancelDiscovery()方法停止掃描。顯然,如果你已經(jīng)連接上一個設備,啟動掃描會減少你的通信帶寬。

5.使能被發(fā)現(xiàn):Enabling discoverability 如果你想使你的設備能夠被其他設備發(fā)現(xiàn),將ACTION_REQUEST_DISCOVERABLE動作封裝在intent中并調(diào)用startActivityForResult(Intent, int)方法就可以了。他將在不使你應用程序退出的情況下使你的設備能夠被發(fā)現(xiàn)。缺省情況下的使能時間是120秒,當然你可以可以通過添加EXTRA_DISCOVERABLE_DURATION字段來改變使能時間(最大不超過300秒,這是出于對你設備上的信息安全考慮)。例如: Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);startActivity(discoverableIntent);運行該段代碼之后,系統(tǒng)會彈出一個對話框來提示你啟動設備使能被發(fā)現(xiàn)(此過程中如果你的藍牙功能沒有開啟,系統(tǒng)會幫你開啟),并且如果你準備對該遠端設備發(fā)現(xiàn)一個連接,你不需要開啟使能設備被發(fā)現(xiàn)功能,因為該功能只是在你的應用程序作為服務器端的時候才需要。

6.連接設備:

在應用程序中,想建立兩個藍牙設備之間的連接,必須實現(xiàn)客戶端和服務器端的代碼(因為任何一個設備都必須可以作為服務端或者客戶端)。一個開啟服務來監(jiān)聽,一個發(fā)起連接請求(使用服務器端設備的MAC地址)。當他們都擁有一個藍牙套接字在同一RFECOMM信道上的時候,可以認為他們之間已經(jīng)連接上了。服務端和客戶端通過不同的方式或其他們的藍牙套接字。當一個連接監(jiān)聽到的時候,服務端獲取到藍牙套接字。當客戶可打開一個FRCOMM信道給服務器端的時候,客戶端獲取到藍牙套接字。

注意:在此過程中,如果兩個藍牙設備還沒有配對好的,android系統(tǒng)會通過一個通知或者對話框的形式來通知用戶。RFCOMM連接請求會在用戶選擇之前阻塞。如下圖:

7.服務端的連接:

當你想要連接兩臺設備時,一個必須作為服務端(通過持有一個打開的BluetoothServerSocket),目的是監(jiān)聽外來連接請求,當監(jiān)聽到以后提供一個連接上的BluetoothSocket給客戶端,當客戶端從BluetoothServerSocket得到BluetoothSocket以后就可以銷毀BluetoothServerSocket,除非你還想監(jiān)聽更多的連接請求。

建立服務套接字和監(jiān)聽連接的基本步驟:

首先通過調(diào)用listenUsingRfcommWithServiceRecord(String, UUID)方法來獲取BluetoothServerSocket對象,參數(shù)String代表了該服務的名稱,UUID代表了和客戶端連接的一個標識(128位格式的字符串ID,相當于PIN碼),UUID必須雙方匹配才可以建立連接。其次調(diào)用accept()方法來監(jiān)聽可能到來的連接請求,當監(jiān)聽到以后,返回一個連接上的藍牙套接字BluetoothSocket。最后,在監(jiān)聽到一個連接以后,需要調(diào)用close()方法來關閉監(jiān)聽程序。(一般藍牙設備之間是點對點的傳輸)

注意:accept()方法不應該放在主Acitvity里面,因為它是一種阻塞調(diào)用(在沒有監(jiān)聽到連接請求之前程序就一直停在那里)。解決方法是新建一個線程來管理。例如: private class AcceptThread extends Thread { private final BluetoothServerSocket mmServerSocket;public AcceptThread(){ // Use a temporary object that is later assigned to mmServerSocket, // because mmServerSocket is final BluetoothServerSocket tmp = null;try { // MY_UUID is the app's UUID string, also used by theclient code tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);} catch(IOException e){ } mmServerSocket = tmp;} public void run(){ BluetoothSocket socket = null;// Keep listening until exception occurs or a socket is returned while(true){ try { socket = mmServerSocket.accept();} catch(IOException e){ break;} // If a connection was accepted if(socket!= null){ // Do work to manage the connection(in a separate thread)manageConnectedSocket(socket);mmServerSocket.close();break;} } } /** Will cancel the listening socket, and cause the thread to finish */ public void cancel(){ try { mmServerSocket.close();} catch(IOException e){ } } }

8.客戶端的連接:

為了初始化一個與遠端設備的連接,需要先獲取代表該設備的一個BluetoothDevice對象。通過BluetoothDevice對象來獲取BluetoothSocket并初始化連接,具體步驟:

使用BluetoothDevice對象里的方法createRfcommSocketToServiceRecord(UUID)來獲取BluetoothSocket。UUID就是匹配碼。然后,調(diào)用connect()方法來。如果遠端設備接收了該連接,他們將在通信過程中共享RFFCOMM信道,并且connect()方法返回。例如: private class ConnectThread extends Thread { private final BluetoothSocket mmSocket;private final BluetoothDevice mmDevice;public ConnectThread(BluetoothDevice device){ // Use a temporary object that is later assigned to mmSocket, // because mmSocket is final BluetoothSocket tmp = null;mmDevice = device;// Get a BluetoothSocket to connect with the given BluetoothDevice try { // MY_UUID is the app's UUID string, also used by the server code tmp = device.createRfcommSocketToServiceRecord(MY_UUID);} catch(IOException e){ } mmSocket = tmp;}

public void run(){ // Cancel discovery because it will slow down the connection mAdapter.cancelDiscovery();try { // Connect the device through the socket.This will block // until it succeeds or throws an exception mmSocket.connect();} catch(IOException connectException){ // Unable to connect;close the socket and get out try { mmSocket.close();} catch(IOException closeException){ } return;} // Do work to manage the connection(in a separate thread)manageConnectedSocket(mmSocket);}

注意:conncet()方法也是阻塞調(diào)用,一般建立一個獨立的線程中來調(diào)用該方法。在設備discover過程中不應該發(fā)起連接connect(),這樣會明顯減慢速度以至于連接失敗。且數(shù)據(jù)傳輸完成只有調(diào)用close()方法來關閉連接,這樣可以節(jié)省系統(tǒng)內(nèi)部資源。

9.管理連接(主要涉及數(shù)據(jù)的傳輸):

當設備連接上以后,每個設備都擁有各自的BluetoothSocket。現(xiàn)在你就可以實現(xiàn)設備之間數(shù)據(jù)的共享了。

1> 首先通過調(diào)用getInputStream()和getOutputStream()方法來獲取輸入輸出流。然后通過調(diào)用read(byte[])和write(byte[]).方法來讀取或者寫數(shù)據(jù)。

2> 實現(xiàn)細節(jié):以為讀取和寫操作都是阻塞調(diào)用,需要建立一個專用現(xiàn)成來管理。3>

private class ConnectedThread extends Thread { private final BluetoothSocket mmSocket;private final InputStream mmInStream;private final OutputStream mmOutStream;public ConnectedThread(BluetoothSocket socket){ mmSocket = socket;InputStream tmpIn = null;OutputStream tmpOut = null;// Get the input and output streams, using temp objects because // member streams are final try { tmpIn = socket.getInputStream();tmpOut = socket.getOutputStream();} catch(IOException e){ } mmInStream = tmpIn;mmOutStream = tmpOut;} public void run(){ byte[] buffer = new byte[1024];// buffer store for the stream int bytes;// bytes returned from read()// Keep listening to the InputStream until an exception occurs while(true){ try { // Read from the InputStream bytes = mmInStream.read(buffer);// Send the obtained bytes to the UI Activity mHandler.obtainMessage(MESSAGE_READ, bytes,-1, buffer).sendToTarget();} catch(IOException e){ break;} } } /* Call this from the main Activity to send data to the remote device */ public void write(byte[] bytes){ try { mmOutStream.write(bytes);} catch(IOException e){ } } /* Call this from the main Activity to shutdown the connection */ public void cancel(){ try { mmSocket.close();} catch(IOException e){ } } }

第三篇:iOS 藍牙使用小結(jié) bluetooth

iOS 藍牙使用小結(jié) bluetooth

現(xiàn)將創(chuàng)建藍牙工程的要點總結(jié)一下,由于工程主要涉及中心模式,所以只總結(jié)中心模式的用法 1,引入CoreBluetooth.framework 2,實現(xiàn)藍牙協(xié)議,如:.h文件如下

@protocol CBCentralManagerDelegate;

@protocol CBPeripheralDelegate;@interface ViewController : UIViewController.m文件如下

#import “CoreBluetooth/CoreBluetooth.h”

另外還有代理部分請自行添加3,下面是使藍牙動起來的過程

3.1創(chuàng)建CBCentralManager實例

self.cbCentralMgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

設置代理,比如:

self.cbCentralMgr.delegate = self;創(chuàng)建數(shù)組管理外設

self.peripheralArray = [NSMutableArray array];3.2掃描周圍的藍牙

實際上周圍的藍牙如果可被發(fā)現(xiàn),則會一直往外發(fā)送廣告消息,中心設備就是通過接收這些消息來發(fā)現(xiàn)周圍的藍牙的

NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:false],CBCentralManagerScanOptionAllowDuplicatesKey, nil];

[self.cbCentralMgr scanForPeripheralsWithServices:nil options:dic];3.3發(fā)現(xiàn)一個藍牙設備

也就是收到了一個周圍的藍牙發(fā)來的廣告信息,這是CBCentralManager會通知代理來處理

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

}

如果周圍的藍牙有多個,則這個方法會被調(diào)用多次,你可以通過tableView或其他的控件把這些周圍的藍牙的信息打印出來

3.4連接一個藍牙

[self.cbCentralMgr connectPeripheral:peripheral options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];

一個中心設備可以同時連接多個周圍的藍牙設備

當連接上某個藍牙之后,CBCentralManager會通知代理處理-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { }因為在后面我們要從外設藍牙那邊再獲取一些信息,并與之通訊,這些過程會有一些事件可能要處理,所以要給這個外設設置代理,比如: peripheral.delegate = self;

3.5查詢藍牙服務

[peripheral discoverServices:nil];返回的藍牙服務通知通過代理實現(xiàn)

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {for(CBService* service in peripheral.services){

} }

3.6查詢服務所帶的特征值

[peripheral discoverCharacteristics:nil forService:service];

返回的藍牙特征值通知通過代理實現(xiàn)-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {for(CBCharacteristic * characteristic in service.characteristics){ } }

3.7給藍牙發(fā)數(shù)據(jù)

[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];

這時還會觸發(fā)一個代理事件

-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { }

3.8處理藍牙發(fā)過來的數(shù)據(jù)

-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { }3.9 retrievePeripheralsWithIdentifiers 使用例子

-(IBAction)Retrieve:(id)Sender { [self.tvLog setText:@“"];

NSMutableArray * Identifiers = [NSMutableArray array];

for(CBPeripheral * peripheral in self.peripheralArray){ [Identifiers addObject:peripheral.identifier];}[self addLog:@”[self.cbCentralMgr retrievePeripheralsWithIdentifiers:self.PeripheralIdentifiers]“];

self.retrievePeripherals = [self.cbCentralMgr retrievePeripheralsWithIdentifiers:Identifiers];

for(CBPeripheral* peripheral in self.retrievePeripherals){ [self addLog:[NSString stringWithFormat: @”%@ name:%@“,peripheral,peripheral.name]];}

[self.tableViewPeripheral reloadData];}3.10 retrieveConnectedPeripheralsWithServices 使用例子-(IBAction)Retrieve:(id)Sender { [self.tvLog setText:@”“];

NSMutableArray * services = [NSMutableArray array];

for(CBPeripheral * peripheral in self.peripheralArray){

if(peripheral.isConnected){

for(CBService *service in peripheral.services){ [services addObject:service.UUID];} } }[self addLog:@”[self.cbCentralMgr retrieveConnectedPeripheralsWithServices:peripheral.services]“];

self.retrievePeripherals = [self.cbCentralMgr retrieveConnectedPeripheralsWithServices:services];

for(CBPeripheral* peripheral in self.retrievePeripherals){ [self addLog:[NSString stringWithFormat: @”%@ name:%@",peripheral,peripheral.name]];}

[self.tableViewPeripheral reloadData];}

第四篇:藍牙通信原理

藍牙耳機的工作原理:

關于音頻流的藍牙傳輸可以通過兩個方式:

1)通過PCM接口來傳送

2)通過模擬UART來傳送

下面分別來講述:

1)通過PCM接口來傳送

通過音頻播放器(eg: Media Player)來打開音頻文件,調(diào)用Audio驅(qū)動,音頻文件通過解碼后,由PCM輸出到Host端藍牙模塊的PCM輸入端,接著,經(jīng)過藍牙模塊的處理后,由RF無線模塊發(fā)送給Client 端藍牙設備。

Client 端藍牙設備經(jīng)由無線接收模塊后,濾波,穩(wěn)壓,經(jīng)微處理芯片處理后,直接由Speaker播放。

2)通過模擬UART來傳送

通過設置注冊表【HKEY_LOCAL_MACHINEServicesBTAGSVC】IsEnabled =1 使得系統(tǒng)引導時自動加載語音網(wǎng)關(AG)服務。

首先,通過手動配置建立Host端藍牙設備與Client端藍牙設備ACL鏈接(面向無連接的異步鏈路),接著在Applicaiton或Audio Driver中調(diào)用

IOCTL_AG_OPEN_AUDIO,重新建立Host端藍牙設備與Client端藍牙設備SCO鏈接(面向連接的同步鏈路),接著AG自動發(fā)送

waveOutMessage((HWAVEOUT)i, WODM_BT_SCO_AUDIO_CONTROL, 0, TRUE);從而建立了Audio至藍牙芯片之間的通道,也即,實現(xiàn)了音頻流到藍牙模塊的傳送。

然后,經(jīng)由主機端藍牙模塊將音頻流打包經(jīng)由RF模塊發(fā)送出去。

客戶端藍牙耳機接收到無線音頻包后,濾波,穩(wěn)壓,經(jīng)微處理芯片處理后,由PCM傳送給音頻編解碼器芯片,最后,由Speaker播放。

第五篇:藍牙工程師崗位職責

1.藍牙產(chǎn)品原理圖,PCB圖設計(新產(chǎn)品設計)。

2.樣機調(diào)試。

3.工程文件的擬定。

4.產(chǎn)品試產(chǎn)、量產(chǎn)的跟進及問題分析處理。

下載藍牙知識小結(jié)word格式文檔
下載藍牙知識小結(jié).doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發(fā)現(xiàn)有涉嫌版權的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權內(nèi)容。

相關范文推薦

    HC05藍牙模塊學習心得

    第一步:打開藍牙測試軟件 進入軟件界面 注:配置藍牙模塊時,模塊的TX引腳連接模塊的RX引腳 , 單片機TX引腳 連接 單片機RX引腳 操作界面步驟如圖所示再對右側(cè)欄中需要更改的數(shù)據(jù)......

    關于藍牙的安全機制

    關于藍牙的安全機制 藍牙技術提供短距離的對等通信,它在應用層和鏈路層上都采取了保密措施以保證通信的安全性,所有藍牙設備都采用相同的認證和加密方式。在鏈路層,使用4個參數(shù)......

    改裝車載藍牙(五篇材料)

    大眾途安專用改裝車載藍牙 專業(yè)派諾特藍牙免提改裝 派諾特車載藍牙免提的品牌影響力是眾所周知的,如何用最少的錢實現(xiàn)最完美的效果,靠腦力生存的今天,借助于我們的專業(yè)性,我們幫......

    藍牙音箱市場行情分析

    藍牙音箱市場行情分析 不可否認的是,一種新型的高科技產(chǎn)品,必將改變我們每一代人的生活方式。從第一次的科技革命,再到當今的數(shù)字信息化時代,科技改變世界的力量不容置疑,而能改......

    基于藍牙的智能項鏈

    基于Bluetooth Smart的智能項鏈 CSR公司日前宣布推出一款基于其最新Bluetooth Smart解決方案的智能項鏈。該智能型吊墜項鏈內(nèi)置電子產(chǎn)品,使佩戴者能夠根據(jù)自身的心情或特定服......

    藍牙問題解決方案[精選五篇]

    藍牙問題解決方案對于藍牙不穩(wěn)定的問題的整體解決方案如下: 一、由我們公司技術人員自己解決: 在確保硬件沒問題的情況下:(因為硬件問題比較容易解決,可以買最好和最穩(wěn)定的藍牙和......

    藍牙~科技文英語翻譯

    什么是"藍牙"? 藍牙是一個頻率為2.45GHz的通用無線電通信接口,它通過一個特殊的網(wǎng)絡可以在各種便攜設備之間建立起無線連接并進行短程通信。在一個微微網(wǎng)中,每個單元都能同時......

    Android藍牙連接總結(jié)

    藍牙連線時首先會定義一個專門用來連接的函數(shù)體BtconnectDevice,當按下Btconnect(為一個Buttton名時)時,程序會判斷此時Btconnect鍵是什么狀態(tài),當Btconnect鍵為連接狀態(tài)時,因為按......

主站蜘蛛池模板: 国产免费内射又粗又爽密桃视频| 国产欧美色一区二区三区| 国产精品videossex久久发布| 久久96国产精品久久久| 狼友av永久网站免费观看| 国语自产少妇精品视频蜜桃| 97高清国语自产拍| 波多野结衣av一区二区无码| 免费特级毛片| 18岁日韩内射颜射午夜久久成人| 国产成人av在线免播放观看新| 人妻暴雨中被强制侵犯在线| 青青青在线香蕉国产精品| 亚洲成亚洲乱码一二三四区软件| 久久精品国产亚洲精品| 先锋五月婷婷丁香草草| 天天天天躁天天爱天天碰2018| 国产精品久久国产精麻豆99网站| 无码人妻一区二区三区免费| 国产亚洲精品97在线视频一| 97香蕉碰碰人妻国产欧美| 亚洲色欲色欲www在线看小说| 久久人人玩人妻潮喷内射人人| 波多野结衣初尝黑人| 在线视频夫妻内射| 中国少妇xxxx做受| 亚洲最大天堂无码精品区| 98色精品视频在线| 亚洲中文字幕久久精品无码喷水| 精品人无码一区二区三区| 中文精品久久久久人妻不卡| 欧美一区二区三区成人片在线| 成人欧美一区二区三区a片| 午夜福利无码不卡在线观看| av国产传媒精品免费| 国产欧美日韩一区二区三区| 欧美丰满熟妇xxxx| 午夜福利视频合集1000| 亚洲日本中文字幕乱码在线电影| 国产美女脱的黄的全免视频| 熟妇人妻中文字幕无码老熟妇|