2012-12-26 59 views
1

對心臟率測量特性字節順序:蘋果公司的心臟速率監測例如與藍牙心臟率測量特性

http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml

我想確保我正確地閱讀它。這實際上是說5個領域?強制性的C1,C2,C3和C4?第一個字節是強制性的,C4是最後兩個字節,C1和C2是8位字段,C3到C4每個都是16位。這總共是8個字節。我正確閱讀本文檔嗎?

編輯:

我獲悉,強制性標誌字段表示東西是0,這意味着它只是不存在。例如,如果第一位是0,則C1是下一個字段,如果是1,則C2代替。

編輯完

在蘋果的OSX heart rate monitor example

- (void) updateWithHRMData:(NSData *)data 
{ 
    const uint8_t *reportData = [data bytes]; 
    uint16_t bpm = 0; 

    if ((reportData[0] & 0x01) == 0) 
    { 
     /* uint8 bpm */ 
     bpm = reportData[1]; 
    } 
    else 
    { 
     /* uint16 bpm */ 
     bpm = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[1])); 
    } 

    ... // I ignore rest of the code for simplicity 
} 

它檢查第一位爲零,如果它不是,它改變了小字節序到任何主機字節順序,由將CFSwapInt16LittleToHost應用於reportData[1]

該位檢查如何工作?我並不完全確定自己的內疚。難道說它是小還是大,第一個字節總是強制字段,第二個字節是C1等?由於reportData是一個8位指針(typedef到unsigned char),它將檢查必填字段的位0或位8。

如果該位是位8,該位保留供將來使用,爲什麼它在那裏讀取?

如果該位爲0,它是小端,不需要轉換?但是,如果它是小尾數,根據規格,第一位可以是1,意思是「心率數值格式設置爲UINT16。單位:每分鐘跳動次數(bpm)」,是不是可能會被誤讀?

我不明白它是如何做檢查。

編輯: 我一直在說有C5,這是一個錯誤。這隻適用於C4,我在上面進行了編輯。

回答

3

我正確閱讀本文件嗎?

恕我直言,你讀它有點不對。

C1至C4應該讀爲條件1至條件4.並且在org.bluetooth.characteristic.heart_rate_measurement的表中,如果標誌字節的最低位爲0,則滿足C1,否則C2爲。

您可以認爲它是C編程語言中的運行時可配置聯合類型(由flag決定,注意這並非總是如此,因爲情況因C3和C4而變得複雜)。

// Note: this struct is only for you to better understand a simplified case. 
// You should still stick to the profile documentations to implement. 

typedef struct { 
    uint8_t flag; 
    union { 
     uint8_t bpm1; 
     uint16_t bpm2; 
    }bpm; 
} MEASUREMENT_CHAR; 

那如何位檢查工作?

if ((reportData[0] & 0x01) == 0)使用按位與運算符有效地檢查位。如果有任何疑問,請去找一本C/C++編程介紹書。

在這種情況下,第一個字節總是標誌。標誌的值動態確定應該如何處理剩餘的字節。 C3和C4都是可選的,如果標誌中的相應位被設置爲0,則可以省略。 C1和C2是互斥的。

藍牙標準中沒有字節順序的模糊性,因爲它已經得到很好的解決,應該始終使用小端。您應該始終假定那些uint16_t字段以小尾數形式傳輸。蘋果公司的預防措施只是爲了保證代碼的最大可移植性,因爲它們不能保證在未來產品中使用的體系結構的端到端性。

+0

有兩個問題:1.你寫的結構在那裏有標誌,但是我沒有在表格中看到它?所有標誌似乎都在第一個字節中。 2.我確實知道按位運算符,但這不是我要求的,但我認爲它正在檢查錯誤的字段。根據蘋果公司的代碼,它看起來像我檢查一下是否存在不良現象(如CFSwapInt16LittleToHost所示)。你能澄清一下它爲什麼要檢查第一點嗎? – huggie

2

我明白了。這不是測試Endianness。而是測試字段是8位還是16位,在16位的情況下,它將從小字節序轉換爲主機序。但是我看到在轉換之前和轉換之後它是相同的數字。所以我想這個系統是小端的,所以我不知道這有什麼意義。