主頁 > 前端設計 > BLE 技術(五)--- Generic Access Profile + Security Manager(Core_v5.2)

BLE 技術(五)--- Generic Access Profile + Security Manager(Core_v5.2)

2020-09-19 08:45:07 前端設計

文章目錄

  • 前言
  • 一、GAP Roles and Requirements
  • 二、Operational Modes and Procedures
    • 2.1 Broadcast mode and Observation procedure
    • 2.2 Discovery modes and procedures
    • 2.3 Connection modes and procedures
    • 2.4 Bonding modes and procedures
    • 2.5 Periodic advertising modes and procedure
    • 2.6 Isochronous broadcast modes and procedures
  • 三、GAP Security Aspects
    • 3.1 Security Manager Protocol
    • 3.2 GAP security modes and procedures
  • 更多文章:

前言

前篇博文鏈路層廣播通信與連接通信介紹了藍牙協議在鏈路層是怎樣實作廣播通信與連接通信的,鏈路層可以說是藍牙控制器部分的協議實作主體,通過藍牙鏈路層提供的報文就可以實作藍牙的廣播通信與連接通信功能,

對于藍牙控制器與主機分體設計的方案,藍牙控制器芯片與藍牙主機芯片之間通過標準的HCI 命令互動資料,這里的HCI 命令實際上就是對藍牙鏈路層報文的簡單封裝,開發者不管是操作藍牙鏈路層報文還是HCI 命令,都不直觀方便,會大幅降低藍牙開發的效率,
BLE Protocol stack layer
藍牙主機部分為開發者提供了Profile 規范,比如GAP(Generic Access Profile) 和GATT(Generic Attribute Profile),讓藍牙應用開發更簡單高效,兩個藍牙設備之間要想實作通訊,首先應能夠發現彼此、建立連接,甚至完成系結,這些程序都是由GAP 規范定義的,開發者可以通過GAP 實作待通訊藍牙設備間的訪問控制,

一、GAP Roles and Requirements

要理解BLE,首先應了解兩個藍牙設備之間如何能發現對方、與對方協作以及不斷找到對方并彼此連接,這些都在GAP 中定義,GAP 為BLE 定義了四種主要角色:

  • Broadcaster role:發送advertising events 或 periodic advertising events 的設備,Bluetooth 5.2 版本設備還可以發送Broadcast Isochronous Stream (BIS) events,處于廣播者角色的設備應具有發射機功能,也可以具有接識訓功能;
  • Observer role:接收advertising events 或 periodic advertising events 的設備,Bluetooth 5.2 版本設備還可以接收Broadcast Isochronous Stream (BIS) events,處于觀察者角色的設備應具有接識訓功能,也可以具有發射機功能;
  • Central role:在LE 連接建立階段,支持中央角色的設備將處于“Initiating” 狀態以發起連接,當LE 連接建立后,處于中央角色的設備將處于“Connection” 狀態的Master 角色,處于中央角色的設備應同時具有發送機和接識訓功能;
  • Peripheral role:在LE 連接建立階段,支持外圍角色的設備可以接受來自中央角色設備的連接請求,當LE 連接建立后,處于外圍角色的設備將處于“Connection” 狀態的Slave 角色,處于外圍角色的設備應同時具有發送機和接識訓功能,

如果控制器支持,一個設備可以同時以多個GAP角色運行,比如既可以是Broadcaster role,又可以同時為Peripheral role,

為了便于說明低功耗藍牙的作業原理,下面給出一個典型的用戶場景:

一用戶剛購買一個支持BLE 的心率帶,可以通過一部支持BLE 的智能手機連接該心率帶設備,并通過特定的APP 訪問該藍牙心率帶采集到的心率值,

用戶打開心率帶包裝并啟動設備,該藍牙心率帶將處于Broadcaster role;打開智能手機藍牙功能并掃描或添加設備,該智能手機將處于Observer role,智能手機會掃描到附近的多個藍牙設備,如果藍牙心率帶離手機比較近,將會在藍牙設備串列頂部看到剛購買心率帶的設備名,甚至顯示該心率帶的圖示,用戶選擇要連接的心率帶設備,智能手機將會向心率帶設備發送連接請求報文(如果待連接設備需要安全認證則輸入說明書中給定的密碼即可),心率帶設備接受連接請求后雙方都進入連接狀態,此時智能手機處于Central role,心率帶設備處于Peripheral role,

智能手機與心率帶設備建立連接后,Central role 將會發現Peripheral role 支持的服務串列,以便更方便的使用外圍設備公開的各種服務,比如心率帶設備支持的讀取當前心率值的服務,通過特定的APP就可以在智能手機上訪問心率帶設備的當前心率值,為了實作設備間高效及時的資料傳輸,不僅Central role 可以主動訪問Peripheral role 公開的服務資料,Peripheral role 還可以主動通知Central role 自身服務資料的更新,為Peripheral role 公開服務開發的專有APP 還可以利用服務資料擴展新的功能(如果需要Peripheral role 提供更多的服務資料,則可以增加Peripheral role 公開的服務),比如利用一段時間持續采集的心率值繪制心電圖,

如果該心率帶設備后續有很大可能再次連接該智能手機,雙方在首次建立連接后可以建立系結關系,當心率帶設備與智能手機完成系結后,智能手機內將保存一部分該心率帶設備的資訊,下次啟動心率帶設備并打開智能手機藍牙功能后,雙方可以自動快速建立連接(使用High duty cycle connectable directed advertising,已完成系結設備不需要再次進行安全認證),如果有通信加密需求還可以對通信鏈路進行加密,

上面的應用場景中,可以分為兩部分理解:一部分是手機發現心率帶藍牙設備并建立連接的程序(包括系結程序和重連程序),該部分主要在GAP 中定義;另一部分是手機發現心率帶藍牙設備公開的服務并完成服務資料傳輸的程序,該部分主要在GATT 中定義,本文主要介紹GAP 相關規范,限于篇幅將在下一篇博文介紹GATT 相關規范,

GAP 規范比較靠近用戶層,主要由鏈路層實作,前面已經介紹過主要的四種GAP 角色(也即Broadcaster、Observer、Central、Peripheral),每個GAP 角色對物理層和鏈路層功能的合規性要求如下:
GAP compliance requirements
每個GAP 角色對物理層的功能要求比較簡單,也就是支持Transmitter 或Receiver 功能;對鏈路層的功能要求比較復雜,主要包括鏈路層States、Advertising event types、Scanning type、Link Layer control procedures、Broadcast control procedures 等部分,這些在前篇博客鏈路層廣播通信與連接通信中都有介紹過,

二、Operational Modes and Procedures

GAP 規范中有兩個基本概念用來描述藍牙設備的行為,即模式Mode 和程序Procedure:

  • Mode:當一個設備被配置為按照某種方式作業一段較長的時間,則稱該設備正處于某種模式,比如當一個設備正在進行廣播時,稱其為“廣播模式”;
  • Procedure:當一個設備被配置為在某一段有限的時間內執行某種特定的操作時,則稱該設備正執行某個程序,比如當一個設備正在找尋廣播者時,稱其為“觀察程序”,觀察程序往往持續一段較短的時間,用以構建用戶界面或者尋找需要的指定資訊,

Bluetooth 5.2 版本的GAP 定義了如下幾種模式與程序:

  • Broadcast mode and Observation procedure
  • Discovery modes and procedures
  • Connection modes and procedures
  • Bonding modes and procedures
  • Periodic advertising modes and procedure
  • Isochronous broadcast modes and procedures

上述模式和程序中的每一個組合彼此獨立,且又密切相關,藍牙設備也可以同時執行幾種不同的模式和程序(對于大多數藍牙設備的彼此通信,模式和程序的組合是必需的),

2.1 Broadcast mode and Observation procedure

廣播模式與觀察程序允許兩個藍牙設備使用廣播事件以單向無連接方式進行通信,下表定義了Broadcaster role 與Observer role 在廣播模式與觀察程序組合中的要求:
Broadcast mode and observation procedure requirements
廣播模式與觀察程序是廣播通信的典型組合,Broadcaster role 處于Broadcast mode,Observer role 處于Observation procedure,一個廣播者可以向一個或多個主動偵聽的觀察者通過廣播信道單向發送廣播報文,由于廣播報文沒有任何確認程序,無法保證觀察者接收到的廣播報文是正確的,因此廣播通信程序是不可靠的,

2.2 Discovery modes and procedures

在GAP 規范中,只有Peripheral role 才允許被發現,Central role 則執行發現外圍設備的程序,為了提供不同的可發現性,外圍設備提供了三種作業模式:不可發現模式、有限可發現模式、常規可發現模式,為了應對不同的可發現性,中央設備提供了兩種發現程序:有限發現程序、常規發現程序,中央設備和外圍設備都提供了一個名稱發現程序,
Device Discovery requirements

  • Non-Discoverable mode:正在執行常規發現程序或有限發現程序的任何設備都不會發現以不可發現模式配置的設備,處于不可發現模式的外圍設備可以發送廣播事件,如果設備發送廣播事件,則不得在Flags AD型別中設定“LE General Discoverable Mode”標志或“LE Limited Discoverable Mode”標志;
  • Limited Discoverable mode:配置為有限可發現模式的設備可以由執行有限或常規發現程序的設備在有限時間段TGAP(lim_adv_timeout)內發現,處于有限可發現模式的外圍設備應發送廣播事件,且應在Flags AD型別中設定“LE Limited Discoverable Mode flag” 為1,“LE General Discoverable Mode flag” 為0;
  • General Discoverable mode:執行常規發現程序的設備可以無限期的發現以常規可發現模式配置的設備,但執行有限發現程序的設備不會發現處于常規可發現模式的設備,處于常規可發現模式的外圍設備應發送廣播事件,且應在Flags AD型別中設定“LE Limited Discoverable Mode flag” 為0,“LE General Discoverable Mode flag” 為1;
  • Limited Discovery procedure:執行有限發現程序的中央設備只能發現配置為有限可發現模式的外圍設備;
  • General Discovery procedure:執行常規發現程序的中央設備可以發現配置為常規可發現模式或有限可發現模式的外圍設備;
  • Name Discovery procedure:執行名稱發現程序的設備(可以是中央設備,也可以是外圍設備)可以發現對端設備的名稱,

處于Limited Discoverable 或General Discoverable 模式的設備發送的廣播報文中,除了配置AD(Advertising Data) Type Flags 欄位的可發現性標識外,為了提高發現效率,還應該在廣播資料中包含下列有用資訊:

  • TX Power Level AD type:用于計算路徑損耗,判斷距離,實作發現設備串列的排序;
  • Local Name AD type:用于顯示設備的命令;
  • Service UUIDs AD type:可根據設備支持的服務對設備進行過濾,

上面談到的這些AD Type 欄位都屬于廣播報文資料的一部分,前篇博文鏈路層空口報文設計已經介紹了鏈路層的廣播報文結構,我們知道分層協議報文是層層封裝的,從上層至下層要逐層添加相應的報文頭部,更上層Host 部分的Advertising, Periodic Advertising, and Scan Response data 都屬于鏈路層廣播報文中的AdvData field,或者鏈路層擴展廣播報文中的ACAD(Additional Controller Advertising Data) field,藍牙Host 部分Advertising, Periodic Advertising, and Scan Response data 的格式如下:
Advertising and Scan Response data format
藍牙Host 中廣播或掃描相應報文資料分為重要部分和非重要部分,其中重要部分包含一系列AD structures,每個AD structure 包含Length 欄位、AD Type 欄位、AD Data 欄位 三部分,前面介紹的Flags、TX Power Level、Local Name、Service UUIDs 欄位都是屬于AD Type欄位的內容,下面給出一些常用的AD Types 欄位供參考:
AD Types

2.3 Connection modes and procedures

在GAP 中,只有Peripheral role 才可使用可連接模式,Central role 則執行連接建立程序, 就可連接性而言,可連接的外圍設備可處于下列三種模式:不可連接模式、定向可連接模式、不定向可連接模式,對中央設備而言,存在四種不同的連接建立程序:自動、常規、選擇、定向連接建立程序,
Connection modes and procedures requirements

  • Non-connectable mode:處于不可連接模式的設備不允許建立連接,但允許執行廣播模式和觀察程序,處于該模式的設備允許發送ADV_NONCONN_IND 或 ADV_SCAN_IND 廣播報文;
  • Directed connectable mode:處于定向可連接模式的外圍設備可以通過ADV_DIRECT_IND 廣播報文通告中央設備,并接受來自已知中央設備的連接請求,該請求會執行自動連接建立程序或常規連接建立程序;
  • Undirected connectable mode:處于不定向可連接模式的外圍設備可以通過ADV_IND 廣播報文通告中央設備,并接受來自執行自動連接建立程序或常規連接建立程序的設備的連接請求;
  • Auto connection establishment procedure:執行自動連接建立程序的中央設備通常將系結過的設備添加進白名單,當發現一個或多個處于定向可連接模式或不定向可連接模式的外圍設備,且該設備在白名單中,將自主向這些設備發起連接請求以建立連接,通過自動連接建立程序建立的連接只能使用一套基本的連接引數,連接建立成功后雙方可以更新連接引數;
  • General connection establishment procedure:執行常規連接建立程序的中央設備通常不使用白名單,當發現一個或多個處于定向可連接模式或不定向可連接模式的外圍設備,將使用定向連接建立程序向用戶選擇的設備發起連接請求以建立連接;
  • Selective connection establishment procedure:執行選擇連接建立程序的中央設備首先將選定的待連接設備添加進白名單,而后啟用白名單并開始掃描,當發現一個或多個處于可連接模式且在白名單中的外圍設備,將使用定向連接建立程序向這些設備發起連接請求以建立連接,中央設備可以查找并使用外圍設備期望的連接引數發起連接請求;
  • Direct connection establishment procedure:執行定向連接建立程序的中央設備可以忽略白名單,直接向指定外圍設備發起連接請求以建立連接,中央設備可以使用外圍設備建議的連接引數發起連接請求;

connection establishment procedure

  • Connection parameter update procedure:連接引數更新程序允許中央設備或外圍設備更新已建立的ACL連接的引數,
  • Terminate connection procedure:終止連接程序允許中央設備或外圍設備終止與對等設備的連接,如果存在CIS 連接,則應先終止CIS 連接,然后再終止ACL 連接;
  • Connected Isochronous Stream Central Establishment procedure:執行CIS 連接建立程序的中央設備可以使用主機選擇的引數向外圍設備發起建立CIS 的請求,中央設備與外圍設備可以使用已建立的CIS 傳輸同步資料流;
  • Connected Isochronous Stream Peripheral Establishment procedure:執行CIS 連接建立程序的外圍設備可以接受或拒絕中央設備發起的建立CIS 請求;
  • Connected Isochronous Stream Terminate procedure:CIS 終止程序允許中央設備或外圍設備終止與對等設備直接的CIS,當中央設備或外圍設備執行終止ACL 連接程式時,若存在CIS 則需先終止CIS 連接,

2.4 Bonding modes and procedures

系結允許兩個連接的設備之間交換或存盤安全性與身份資訊,以創建可信任的關系,像前面介紹的可發現性和可連接性類似,系結也定義了相應的模式與程序,外圍設備與中央設備之間的系結模式只有兩種:不可系結模式、可系結模式,程序也只有一種:系結程序,
Bonding compliance requirements

  • Non-Bondable mode:處于不可系結模式的設備不允許與對等設備創建系結,且應在配對程序中將Bonding_Flags設定為“ No Bonding”,雙方不得交換或存盤系結資訊;
  • Bondable mode:處于可系結模式的設備允許與處于可系結模式的對等設備創建系結,且應在配對程序中將Bonding_Flags設定為“ Bonding”,雙方交換并視情況存盤密鑰等系結資訊;
  • Bonding procedure:當非系結設備嘗試訪問需要系結的服務時可以執行系結程序,執行系結程序的設備應發起配對并設定Bonding_Flags,如果對等設備是可系結的則回復回應并同樣設定Bonding_Flags,一切順利的話,將在連接鏈路加密后進行密鑰的分發與存盤,也即交換并存盤系結資訊,

The bonding procedure

2.5 Periodic advertising modes and procedure

周期廣播模式和程序允許兩個或多個設備使用擴展廣播事件和周期廣播事件以單向無連接方式進行通信,下表定義了各GAP role 在周期廣播模式和程序中的要求:
Periodic advertising modes and periodic advertising procedure requirements

  • Periodic Advertising Synchronizability mode:處于周期性廣播同步模式的設備可以在擴展廣播事件中發送周期性廣播序列的同步資訊,處于該模式的設備也處于周期性廣播模式;
  • Periodic Advertising mode:處于周期性廣播模式的設備可以在確定時間間隔內,使用周期性廣播同步資訊中指定的跳頻序列發送周期性廣播事件;
  • Periodic Advertising Synchronization Establishment procedure:執行周期性廣播同步建立程序的設備可以掃描包含有關周期性廣播序列的同步資訊的廣播事件,也可以通過現有連接來接收周期性廣播同步資訊,當設備接收到用于周期性廣播同步的同步資訊時,可以使用在周期性廣播同步資訊中指定的時間間隔和跳頻序列來偵聽周期性廣播事件;
  • Periodic Advertising Synchronization Transfer procedure:執行周期性廣播同步傳輸程序的設備可以在現有連接上發送有關周期性廣播序列的同步資訊,

2.6 Isochronous broadcast modes and procedures

等時同步廣播模式和程序允許兩個或多個設備使用擴展廣播事件、周期性廣播事件、等時同步事件,以單向、無連接的方式進行通信,下表定義了Broadcaster role 和 Observer role 支持這些模式和程序的要求:
Isochronous Broadcast modes and procedure requirements

  • Broadcast Isochronous Synchronizability mode:處于廣播等時同步模式的設備可以通過AUX_SYNC_IND 廣播報文中的ACAD欄位發送BIGInfo,處于該模式的設備也處于廣播等時廣播模式;
  • Broadcast Isochronous Broadcasting mode:處于廣播等時廣播模式的設備可以在BIG 的BIS 子事件中發送加密或未加密的廣播等時同步資料流;
  • Broadcast Isochronous Synchronization Establishment procedure:執行廣播等時同步建立程序的設備應首先執行周期性廣播同步建立程序,并接收廣播等時同步資訊BIGInfo,當完成BIG 中BIS 的建立后,Broadcaster 和 Observer 之間就可以進行單向、無連接的等時同步通信了;
  • Broadcast Isochronous Channel Map Update procedure:廣播等時信道映射更新程序允許Broadcaster 使用和發送BIG 的新信道映射,或者允許Observer 接收和使用BIG 的新信道映射;
  • Broadcast Isochronous Terminate procedure:廣播等時終止程序允許Broadcaster 終止BIG,或者允許Observer 終止與BIG 的同步,

三、GAP Security Aspects

在介紹GAP 安全模式與程序之前,先介紹下BLE 的Security Manager Protocol,從下圖可以看出GAP 安全模式與程序主要靠SM 協議來承載:
Relationship of the Security Manager to the rest of the LE Bluetooth architecture

3.1 Security Manager Protocol

在無線通信中,如何保證資訊的安全可靠傳輸一直是不可或缺的一環,BLE 的通信安全主要由Security Manager Protocol (SMP) 保證,保證通信安全最簡單直接的方法是對資訊進行加密傳輸,BLE 使用的加密演算法是AES-CMAC(可參考博文:TLS 加密原理),AES-CMAC 加密演算法可以保證通信的機密性和完整性,但共享密鑰的生成和分發如何解決呢?

BLE 借鑒了TLS 安全傳輸協議的設計思想,共享密鑰的交換也使用了Diffie-Hellman 密鑰交換演算法,為了提高密鑰交換效率,也引入了橢圓曲線運算,所以BLE 使用的密鑰交換演算法是ECDH(Elliptic Curve Diffie-Hellman,可參考博文:TLS 加密原理),BLE 建立安全鏈路前的握手程序稱為配對(Pairing),配對程序如下(可參考博文:TLS 握手程序):
LE pairing phases
從上圖可知,BLE 排隊程序主要有三個階段:

  • Phase 1(Pairing Feature Exchange):通過Pairing Request與Pairing Response報文交換I/O 能力、OOB身份認證資料可用性、身份認證請求(包括是否系結、是否請求中間人攻擊防護、是否支持安全連接等)、最大密鑰大小、生成/分發哪些密鑰等配對資訊,I/O 能力和OOB資料也是跟身份認證相關的,跟TLS 遠程網路協議需要數字證書驗證身份不同的是,藍牙設備一般都是近場局域網通信,可以直接由使用者辨識通信設備的身份,受限于藍牙設備的I/O 能力,首次配對可以通過掃描MAC 地址、輸入配對密鑰、OOB資料傳輸(比如NFC 通信)等方式驗證要連接的藍牙設備身份,并交換配對資訊(當重新連接已系結過的設備時,由于雙方都保存有之前的配對資訊,可以直接通過一個簽名資料完成身份驗證,比首次連接更簡單些);
    Pairing Request/Response packet
  • Phase 2(Long Term Key Generation):最初每個設備都會生成自己的ECDH public-private key pair,要配對的設備雙方會在Phase 1 交換public key,然后在本階段通過ECDH 密鑰交換演算法生成共享長期密鑰LTK(Long Term Key) ,通信雙方可使用LTK 加密在連接鏈路上傳輸的資訊,這就完成了安全加密連接的建立(在重新連接已系結過的設備后,可以直接用LTK 加密,不需要再執行完整的配對程序);
  • Phase 3(Transport Specific Key Distribution):雙方建立安全加密通信鏈路后,還需要生成并分發一些特殊的密鑰,比如IRK(Identity Resolving Key) 和CSRK(Connection Signature Resolving Key),其中IRK 可用于決議Resolvable Private Address(由亂數和IRK生成的隨機設備地址,只能被擁有相同IRK 的設備掃描到,防止被未知設備掃描和跟蹤),CSRK 可用于決議連接對端設備生成的資料簽名(當重新連接已系結過的設備時,可以通過驗證配對資訊的資料簽名,直接完成身份認證),如果還需要后續重新建立安全連接,則可以將配對資訊(包括LTK、IRK、CSRK 等密鑰資訊)保存到本地安全資料庫中,這個程序稱為系結(當重新連接已系結過的設備時,只需驗證配對資訊,不需要再執行完整的配對程序),

3.2 GAP security modes and procedures

在GAP 規范中,也定義了與ACL 連接或廣播的安全性相關的模式和程序如下(與CIS 安全相關的模式/程序與其關聯的ACL 中使用的模式/程序相同):
Requirements related to security modes and procedures

  • LE Security mode 1:主要用于在建立連接的Peripheral 和Central 之間,提供不同級別的資訊加密,該模式為連接加密提供四個等級:無身份認證且無加密、有加密但未經身份認證的配對、有加密且已經過身份認證的配對、使用128位強度加密且已經過身份認證的安全連接配對,這四個等級的安全性逐級增強;
  • LE Security mode 2:主要用于在建立連接的Peripheral 和Central 之間,提供不同等級的資料簽名,該模式為資料簽名提供兩個等級:帶有資料簽名但未經身份認證的配對、帶有資料簽名且已經過身份認證的配對,這兩個等級的安全性逐級增強;
  • LE Security mode 3:主要用于在同步廣播的Broadcaster 和Observer 之間,提供不同等級的BIS 同步廣播資訊加密,該模式為BIS 資訊加密提供三個等級:無身份認證且無加密、使用未經過身份認證的Broadcast_Code來加密在BIS中傳輸的資料、使用已經過身份認證的Broadcast_Code來加密在BIS中傳輸的資料,這三個等級的安全性逐級增強;
  • Authentication procedure:執行認證程序的設備要求對端設備提供身份認證資訊,通過身份認證后才能繼續安全通信,防止出現中間人攻擊,Central 與Peripheral 之間發起服務請求和回應服務請求時的身份認證程序如下圖示:
    Flow chart for a local device issuing and handling a service request
  • Authorization procedure:執行授權程序的設備可以授予對端設備訪問某個服務的權限,只有對端設備擁有相應的權限才能繼續訪問對應的服務;
  • Connection data signing procedure:執行連接資料簽名程序的設備會為與其連接的對端設備生成一個新的連接簽名決議密鑰CSRK,并通過加密鏈路將其發送給對端設備,以便對端設備使用CSRK 驗證來自本設備的簽名資料;
  • Authenticate signed data procedure:執行認證資料簽名程序的設備使用CSRK 驗證來自對端設備的簽名資料,從而驗證簽名資料發送方的身份,防止第三方偽裝身份發送虛假訊息,資料簽名常用于只需要身份認證不需要加密的連接通信中,比如需要快速建立連接和快速資料傳輸的服務(資料加密程序比資料簽名程序更慢);
  • Encryption procedure:執行加密程序的設備可以對當前連接進行加密,為連接通信提供機密性和完整性,

更多文章:

  • 《BLE 技術(四)— Broadcast communication + Connection communication (Core_v5.2)》
  • 《Bluetooth Core Specification_v5.2》
  • 《BLE技術揭秘》
  • 《藍牙協議分析》

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/80059.html

標籤:其他

上一篇:九號電動國標車B&C系列區別于傳統電動車之新穎功能全覽

下一篇:QT模塊學習——UDP通訊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more