2013-09-27 115 views
5

Tôi đang mở rộng plugin/gatt_example.c trong các nguồn Bluez để thử chức năng Thông báo BLE mà không thành công. Tôi đang sử dụng Dịch vụ Pin mẫu được bao gồm trong nguồn Bluez. Nó có đặc tính 1 với các thuộc tính READ và NOTIFY. Tôi thêm phương thức dbus để gọi attrib_db_update() để cập nhật giá trị đặc trưng từ bên ngoài daemon bluetooth.Cách gửi Thông báo GATT Bluetooth Low Energy với Bluez?

Bây giờ, tôi có thể kết nối máy khách nào (Nexus4 với Android 4.3 và iPhone (ứng dụng miễn phí LightBlue)) và bắt đầu thông báo (thiết lập CCC mô tả thông báo cờ). (lưu ý: char mô tả ccc có quyền auth mặc định, do đó, từ iPhone sửa đổi CCC (bắt đầu thông báo) sẽ làm cho bluez trả về lỗi: không cho phép cấp phép. Vì tôi định xử lý ủy quyền sau, tôi tạm thời thay đổi quyền mặc định không, và iPhone có thể đặt cờ thông báo CCC).

Vấn đề là ngay cả khách hàng (cả Android hoặc iOS) đã bắt đầu thông báo, gọi attrib_db_update() không làm bluez gửi bất kỳ thông báo nào cho khách hàng (theo dõi với hcidump, không gửi gói cho khách hàng).

Câu hỏi: Có bước nào cần thiết bên cạnh attrib_db_update() để làm cho bluez gửi thông báo cho khách hàng không? Tôi đánh giá cao bất kỳ liên kết nào đến nguồn mẫu. PS. Tôi sử dụng bluez như cấu hình máy chủ ngoại vi + gatt (giống như dịch vụ pin trong plugin/gatt_example.c) không ngược lại.

Cảm ơn.

Cập nhật

=== (Tôi không biết làm thế nào bình luận định dạng công việc ... vì vậy tôi thêm cập nhật ở đây.)
Về hồ sơ/mẫu cảnh báo:
Có, tôi đã kiểm tra trên hồ sơ/cảnh báo trước khi đặt câu hỏi . Một vấn đề khác là tôi không thể chạy những mẫu đó (Đó là lý do tôi đặt câu hỏi ngay từ đầu).
hồ sơ/cảnh báo/máy chủ.c: attio_connected_cb() là một chức năng gọi lại, được đăng ký bởi filter_devices_notify() trong server.c. Nó sử dụng btd_device_add_attio_callback() (từ src/device.c). Kiểm tra thêm src/device.c, nó trông giống như nó kiểm tra thiết bị-> attrib nếu nó tồn tại để exec (chèn vào hàng đợi đầu tiên sau đó exec callback) gọi lại hoặc chỉ chèn vào hàng đợi cho đến khi thiết bị kết nối ?.
Gỡ lỗi, có vẻ như thiết bị-> attrib bị trống ngay cả khi tôi đã kết nối thiết bị.

Đối với những người quan tâm để chạy/debug mẫu hồ sơ alert (Kể từ khi không có doc :().
luận ra như sau if (khoảng dòng 564), chúng tôi không quan tâm đến những séc ...

 

    /* 
     if (!g_str_equal(alert->srv, sender)) { 
      DBG("Sender %s is not registered in category %s", sender, 
            category); 
      return btd_error_invalid_args(msg); 
     } 
    */ 

Run bluetoothd: cựu bluetoothd -n -d -p cảnh báo
Kết nối điện thoại của bạn cho đến khi startNotify

Đăng ký cảnh báo từ console khác:.

 

    dbus-send --system --dest=org.bluez --type=method_call "/org/bluez" "org.bluez.Alert1.RegisterAlert" string:"simple" objpath:"/org/bluez/AlertAgent1" 

Tạo cảnh báo mới:

 

    dbus-send --system --dest=org.bluez --type=method_call "/org/bluez" "org.bluez.Alert1.NewAlert" string:"simple" uint16:"1" string:"test" 

tôi đã log các bluetoothd sau của:

 

    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x001c 
    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x0021 
    bluetoothd[1928]: profiles/alert/server.c:register_alert() RegisterAlert("simple", "/org/bluez/AlertAgent1") 
    bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x001e 
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() 0x1b6e718 registered ATT connection callback 
    bluetoothd[1928]: src/device.c:device_set_auto_connect() 10:68:3F:E1:4E:F2 auto connect: 1 
    bluetoothd[1928]: src/adapter.c:adapter_connect_list_add() /org/bluez/hci0/dev_10_68_3F_E1_4E_F2 added to BlueZ 5.14's connect_list 
    bluetoothd[1928]: src/adapter.c:trigger_passive_scanning() 
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() device->attrib = false 
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() cfunc = true 
    bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() no idle 
    bluetoothd[1928]: profiles/alert/server.c:new_alert() NewAlert("simple", 1, "simple") 
    bluetoothd[1928]: src/adapter.c:passive_scanning_complete() status 0x03 
    bluetoothd[1928]: Wrong size of start scanning return parameters 

Memo: thêm một số kết xuất debug trong device.c. Dường như thiết bị-> attrib trống.Và tự động kết nối (tại sao máy chủ gatt/thiết bị ngoại vi phải kết nối với trung tâm?) Không thành công vì lý do không xác định.

Trả lời

3

Chỉnh sửa: Tôi đã chạy thành công mẫu cảnh báo bằng tập lệnh python cảnh báo thử nghiệm trong mã.

Tôi liên hệ trực tiếp với nhà phát triển và được yêu cầu. Hóa ra rằng có một lỗi khi chạy bluez như thiết bị ngoại vi, do đó, ông đã tạo ra một số bản vá lỗi trong danh sách gửi thư.

http://marc.info/?l=linux-bluetooth&m=139092431515560&w=2

Sau khi áp dụng bản vá, chạy máy chủ và thử sử dụng thử nghiệm cảnh báo:

  1. Connect và ghi vào tay cầm ccc phù hợp với thông báo về phía khách hàng
  2. Về phía server, chạy kiểm tra cảnh báo như (-w là để giữ cho cảnh báo kiểm tra liên tục, -r để đăng ký email cảnh báo, -u cho email chưa đọc, 30 là số lượng email chưa đọc):

    test-alert -w -r email -u email 30

+0

Cảm ơn thông tin Isa. Có vẻ như bản vá chưa có trong bản phát hành mới nhất (5.14). Tôi sẽ lấy nguồn mới nhất từ ​​git, để tìm hiểu. Nhưng như Anderson đã nói, nó có thể không hoàn toàn hoạt động. (Tôi cảm thấy hiểu tại sao Android chuyển ngăn xếp bluetooth từ 4.3 trở lên ...). Tôi cũng đang tìm một giải pháp khác, như bleno. Thời gian qua tôi kiểm tra nó chưa có thông báo, nhưng như tôi chỉ kiểm tra nó đã được thực hiện nó. – user1012131

+0

Tin xấu. Unfortunatelly nó không hoạt động (sử dụng kiểm tra cảnh báo). Tôi sử dụng iOS7 BlueLight để kết nối, nhật ký giống như bản cập nhật của tôi (thiết bị-> attrib là không, kích thước sai ...) Ngoài ra kiểm tra với Nexus 4 (cần 4.4.2 cho BLE, có rất nhiều sửa lỗi bạn có thể 't kết nối với bluez với 4.3 hoặc 4.4) Lần này nhật ký là khác nhau. Nhưng tôi vẫn không nhận được thông báo gửi đến nexus hay hcidump gửi gói thông báo. Sẽ thử bleno. – user1012131