簡體   English   中英

BlueZ:如何從命令行設置 GATT 服務器

[英]BlueZ: How to set up a GATT server from the command line

我想知道是否有辦法從 Linux 命令行設置 gatt 服務器。 我知道 BlueZ gatttool 命令允許您充當 gatt 客戶端並詢問遠程 gatt 服務器,但是,我認為此工具不能用於設置服務器。

我想要實現的是一個 gatt 服務器,從命令行創建,可以被任何中央設備(例如 iOS 或 Android 設備)詢問以連接到 GATT 服務器,發現服務和特征,並操縱其中的數據特征。

例子:

具有 1 個服務的 Gatt 服務器,其中包含 3 個特征。

  • 服務 uuid = 0xFFFF
  • 字符 1 uuid = 0xAAAA,值 = 01,屬性 = 可讀
  • 字符 2 uuid = 0xBBBB,值 = 00,屬性 = 可讀可寫
  • 字符 3 uuid = 0xCCCC,值 = 02,屬性 = 可通知

我正在使用內核版本 3.11.0 和 BlueZ 5.19

因此,現在使用新的bluetoothctl工具處理此問題。 可以使用此工具設置 gatt 表,如下所示:-

#bluetoothctl
[bluetoothctl] menu gatt
[bluetoothctl] register-service 0xFFFF # (Choose yes when asked if primary service)
[bluetoothctl] register-characteristic 0xAAAA read       # (Select a value of 1 when prompted)
[bluetoothctl] register-characteristic 0xBBBB read,write # (Select a value of 0 when prompted)
[bluetoothctl] register-characteristic 0xCCCC read       # (Select a value of 2 when prompted)
[bluetoothctl] register-application # (This commits the services/characteristics and registers the profile)
[bluetoothctl] back
[bluetoothctl] advertise on

我已經嘗試了一些服務/特性組合,並且能夠讓它工作。 GAP (0x1800) 和 GATT (0x1801) 服務在默認情況下可用,並且在您發布廣告時將成為 GATT 表的一部分。 您還可以使用以下命令查看可用服務:-

[bluetoothctl] show
Controller 00:AA:BB:CC:DD:EE (public)
    Name: MyMachine
    Alias: MyMachine
    Class: 0x000c0000
    Powered: yes
    Discoverable: no
    Pairable: yes
    UUID: Headset AG                (00001112-0000-1000-8000-00805f9b34fb)
    UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
    UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
    UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
    UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
    UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
    UUID: Audio Source              (0000110a-0000-1000-8000-00805f9b34fb)
    UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
    **UUID: Unknown                   (0000ffff-0000-1000-8000-00805f9b34fb)**
    UUID: Headset                   (00001108-0000-1000-8000-00805f9b34fb)
    Modalias: usb:v1D6Bp0246d0532
    Discovering: no

我也遇到了同樣的問題,但可以找到任何合適的解決方案,在 Ubuntu 機器上使用 bluez 堆棧最好的方法是使用一些 hci 命令來通告 LE 數據包。 如果它是 LE 服務器,這些數據包將不斷公布,如果您使用 GATT 客戶端進行掃描,您將在掃描列表中獲得您的 bluez 設備的名稱。

使用以下命令:

通過以下命令設置 LE 廣告數據包:

sudo hcitool -i hcix cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00

· 現在通過以下命令通告 LE 數據包:

sudo hciconfig hcix leadv

我相信從 CLI 設置 GattServer 是不可能的。 主要是因為它是一個上層功能,所以沒有可用的工具來做到這一點(因為大多數工具都提供了下層功能)。

但是您可以使用模擬 bluez 使用 dbus 創建服務的方式。

我們需要一個具有兩個特征(R、W、N)的 GattService

我們最終做的是以下 - 1. 使用 libgdbus(來自 bluez 源)它具有向 bluez 注冊服務的所有 dbus 包裝器。

  1. 創建了一個翻譯器(socket IPC)來分離許可問題(GPL)

  2. 向服務注冊器發送命令以創建服務 e,g - op_code = create_service, uuid = 'service_uuid'

op_code = create_charac, uuid='charac_uuid' flags='rwn'

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM