2014-05-19 22 views
6

Gần đây tôi đã bắt đầu tìm hiểu phát triển một thiết bị dựa trên mircocontroller sẽ có mô-đun BLE. Thiết bị này được cho là để gửi đọc tương tự lấy từ cảm biến đến một ứng dụng Android mà tôi sẽ phát triển.
Đối với những gì tôi đã nghiên cứu về cách thức GATT hoạt động là:Hiểu giao thức GATT trong BLE

  1. Thiết bị dựa trên microntroller sẽ là máy chủ GATT.
  2. Ứng dụng android sẽ là ứng dụng khách GATT.
  3. Khi nhìn từ quan điểm truyền thông, thiết bị dựa trên microntroller là Slave và ứng dụng android là Master.

Câu hỏi:

  1. Làm thế nào để quyết định số lượng các thuộc tính mà tôi cần phải xác định để nhận lệnh từ GATT khách hàng và gửi response (mà sẽ là một giá trị float)? Tôi có cần phải có hai thuộc tính riêng biệt: Một cho Android để gửi lệnh và một cho thiết bị dựa trên microncontroller để gửi dữ liệu đến android? Hoặc tôi có thể sử dụng một thuộc tính duy nhất?
  2. GATT dường như là một hệ thống hướng sự kiện.
    2.1: Sự kiện nào sẽ được tạo khi Android gửi lệnh tới thiết bị dựa trên vi điều khiển: (Máy khách đến Máy chủ)?
    2.2: Sự kiện sẽ được tạo khi dữ liệu được ghi trên thuộc tính sẽ được ứng dụng Android đọc: (Server to Client)?
  3. Ứng dụng android (GATT Client) nên sử dụng lệnh đọc/ghi để giao tiếp với thiết bị dựa trên vi điều khiển (GATT Server). Và, GATT Server nên sử dụng Notify/Indicate để chuyển dữ liệu cho GATT Client. Tôi hiểu có đúng không?

Tôi đang sử dụng this BlueGiga BLE112 Module để phát triển.

File gatt.xml mà tôi cho đến nay đã được viết là:

<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
<!-- 1800: org.bluetooth.service.generic_access --> 
<service uuid="1800" id="generic_access"> 
    <description>Generic Access</description> 
    <!-- 2A00: org.bluetooth.characteristic.gap.device_name --> 
    <characteristic uuid="2A00" id="c_device_name"> 
     <description>Device Name</description> 
     <properties read="true" const="true" /> 
     <value>MyBLEDev</value> 
    </characteristic> 
    <!-- 2A01: org.bluetooth.characteristic.gap.appearance --> 
    <characteristic uuid="2A01" id="c_appearance"> 
     <description>Appearance</description> 
     <properties read="true" const="true" /> 
     <value type="hex">0300</value> 
    </characteristic> 
    </service> 

    <!-- custom service --> 
    <service uuid="624e957f-cb42-4cd6-bacc-84aeb898f69b" advertise="true"> 
    <description>Custom Device Service</description> 

    <!-- custom write-only characteristic for Client to send commands to fetch reading --> 
    <characteristic uuid="a57892fe-4f58-97d4-a5245-78a4125d3e6" id="c_cmd_TxReading"> 
     <description>Request for Reading</description> 
     <properties write="true" /> 
     <value length="4" /> 
    </characteristic> 

    <characteristic uuid="8fde302a-56ac-b289-65ed-a577ed66b89c" id="c_reading"> 
     <description>Measurement</description> 
     <properties read="true" write="true" /> 
     <value length="4" type="float32" /> 
    </characteristic> 
</service> 

Trả lời

8

tôi nhìn thấy một máy chủ GATT như một đoạn bộ nhớ trên máy khác. Bạn có thể yêu cầu các khối đặc biệt bằng cách xử lý và nhận thông tin khác nhau. Bạn có thể làm cho máy khác làm những việc khác nhau hoặc trả lời theo những cách khác nhau bằng cách viết các giá trị cho các tay cầm đó. Sự khác biệt từ không gian bộ nhớ là mỗi tay cầm có thể chứa các kích cỡ thông tin khác nhau cũng như mỗi thông tin có UUID xác định cách diễn giải dữ liệu bạn tìm thấy ở đó. Trong một không gian bộ nhớ thông thường, mỗi "xử lý" sẽ là một địa chỉ, mỗi đoạn sẽ là một byte duy nhất, và không có cách nào để tìm hiểu cách diễn giải dữ liệu đó mà không có một số thông tin khác.

... Vì vậy, câu hỏi:

  1. Giống như hầu hết các câu hỏi trên đây, câu trả lời là "nó phụ thuộc". Nếu bạn chỉ muốn lấy giá trị, bạn chỉ có một thuộc tính duy nhất với dữ liệu trong đó khách hàng có thể tìm nạp. Nếu bạn cũng muốn thiết lập nó để máy chủ GATT gửi thông báo bất cứ khi nào giá trị thay đổi thì bạn cũng phải thêm một xử lý cấu hình đặc trưng máy khách cho thuộc tính đó. (Ví dụ, tôi có một gia tốc có 3 thuộc tính cho các giá trị X, Y và Z và một thiết bị khác báo cáo tất cả 3 giá trị dưới dạng một thuộc tính. Bởi vì đây là một loại giá trị chưa được chuẩn hóa, chúng có thể thực hiện điều này bằng cách xác định UUID tùy chỉnh của riêng họ.Nếu bạn đang đo lường thứ gì đó đã có bố cục chuẩn thì có thể bạn nên sử dụng bố cục đó)

  2. GATT có một số khía cạnh hướng sự kiện và các khía cạnh khác được thực hiện một cách serially. Ví dụ: bạn chỉ có thể thương lượng một yêu cầu kết nối tại một thời điểm. Tuy nhiên, bạn có thể nhận được thông báo theo bất kỳ thứ tự nào từ bất kỳ số thuộc tính nào vào bất kỳ lúc nào.

    1. Bạn không thể xác định các lệnh của riêng mình bằng GATT. Bạn bị hạn chế với những thứ như "đọc từ xử lý" hoặc "viết để xử lý" tương tự như thao tác một đoạn bộ nhớ. Việc triển khai cơ bản có thể phụ thuộc vào phần cứng, nhưng thông thường bạn có thể kích hoạt một số loại sự kiện khi xử lý được thao tác.

    2. Bạn có thể yêu cầu sự kiện bằng cách đăng ký nhận thông báo hoặc chỉ dẫn trên một thuộc tính cụ thể.

  3. Vâng, đúng vậy.

Các vấn đề liên quan