2014-05-19 9 views
6

Ich habe vor kurzem begonnen zu lernen, ein mircontroller-based Gerät zu entwickeln, das BLE-Modul haben wird. Das Gerät soll analoges Lesen vom Sensor an eine Android-Anwendung senden, die ich entwickeln werde.
Für das, was ich über die Art und Weise studiert habe GATT funktioniert, ist:Das GATT-Protokoll in BLE verstehen

  1. Das micron-basiertes Gerät wird GATT-Server sein.
  2. Die Android-Anwendung wird GATT-Client sein.
  3. Aus Sicht der Kommunikation gesehen, ist das Gerät auf Mikrocontroller-Basis Slave und die Android-Anwendung Master.

Fragen:

  1. Wie entscheide ich, die Anzahl der Attribute, die ich, um zu definieren, müssen Befehl von GATT-Client zu empfangen und die Antwort senden (die ein Float-Wert sein wird)? Muss ich zwei verschiedene Attribute haben: Einen für Android, um Befehle zu senden, und einen für das auf dem Mikrocontroller basierende Gerät, um Daten an Android zu senden. Oder ich kann ein einzelnes Attribut verwenden?
  2. GATT scheint ein ereignisgesteuertes System zu sein.
    2.1: Welche Ereignisse werden generiert, wenn Android einen Befehl an ein Mikrocontroller-basiertes Gerät sendet: (Client zu Server)?
    2.2: Wird ein Ereignis generiert, wenn die Daten auf das Attribut geschrieben werden, das von einer Android-Anwendung gelesen werden soll: (Server zu Client)?
  3. Die Android-Anwendung (GATT-Client) sollte Lese-/Schreibbefehle verwenden, um mit dem Microncontroller-basierten Gerät (GATT-Server) zu kommunizieren. Außerdem sollte der GATT-Server Notify/Indicate verwenden, um die Daten an den GATT-Client zu übergeben. Ist mein Verständnis richtig?

Ich verwende this BlueGiga BLE112 Module für die Entwicklung.

Die gatt.xml-Datei, die ich bisher geschrieben ist:

<?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> 

Antwort

8

ich einen GATT-Server wie ein Teil des Speichers auf einer anderen Maschine zu sehen. Sie können bestimmte Abschnitte durch Handles anfordern und verschiedene Informationen erhalten. Sie können die andere Maschine dazu bringen, verschiedene Dinge zu tun oder auf verschiedene Arten zu reagieren, indem Sie Werte in diese Handles schreiben. Der Unterschied zum Speicherplatz besteht darin, dass jedes Handle unterschiedliche Größen von Informationen enthalten kann und dass jedes Handle über eine UUID verfügt, die angibt, wie die darin enthaltenen Daten zu interpretieren sind. In einem regulären Speicherbereich wäre jeder "Handle" eine Adresse, jeder Chunk wäre ein einzelnes Byte und es gibt keine Möglichkeit herauszufinden, wie diese Daten ohne irgendeine andere Information zu interpretieren sind.

So ... Fragen:

  1. Wie die meisten Fragen auf hier "hängt es" ist die Antwort. Wenn Sie nur den Wert abrufen möchten, haben Sie nur ein einzelnes Attribut mit den Daten, die der Client abrufen kann. Wenn Sie die Einrichtung auch so einrichten möchten, dass der GATT-Server bei jeder Änderung des Werts Benachrichtigungen sendet, müssen Sie diesem Attribut auch einen Handle-Merkmalskonfigurations-Handle hinzufügen. (Bsp .: Ich habe einen Beschleunigungssensor mit 3 Attributen für die X-, Y- und Z-Werte und ein anderes Gerät, das alle 3 Werte als einzelnes Attribut meldet. Da dies ein Werttyp ist, der nicht standardisiert wurde, können sie dies tun indem Sie ihre eigene benutzerdefinierte UUID definieren.Wenn Sie etwas messen, das bereits ein Standardlayout hat, sollten Sie das wahrscheinlich stattdessen verwenden)

  2. GATT hat einige ereignisgesteuerte Aspekte und andere Aspekte, die seriell durchgeführt werden. Beispielsweise können Sie jeweils nur eine Verbindungsanforderung aushandeln. Sie können jedoch zu jeder Zeit Benachrichtigungen in beliebiger Reihenfolge von einer beliebigen Anzahl von Attributen erhalten.

    1. Sie können nicht wirklich Ihre eigenen Befehle mit GATT definieren. Sie sind auf Dinge wie "Lesen von Handle" oder "Schreiben in Handle" beschränkt, ähnlich wie das Manipulieren eines Stücks Speicher. Die zugrundeliegende Implementierung kann von der Hardware abhängen, aber normalerweise können Sie eine Art von Ereignis auslösen, wenn ein Handle manipuliert wird.

    2. Sie können Ereignisse anfordern, indem Sie Benachrichtigungen oder Hinweise zu einem bestimmten Attribut abonnieren.

  3. Ja, das ist richtig.