終於到的這個階段
這階段主要目的是要得知哪幾個特徵值是和客製化藍芽裝置通訊的介面,在上一階段可以看到每個 characteristic 的 property 屬性有些一權限,例如 Read / Wirte / Notify … 等等
而客製化的藍芽裝置到底是用哪些 characteristic 來做通訊呢?其實在我實際遇到的情況,根本沒有參考文件或者說明文件的條件下,只能一個一個測看看,然後需要硬體方面能夠看到藍芽到底有沒有收到訊號,不然傳了也不知道藍芽收到沒,藍芽有沒有傳東西我這邊也不知道,所以最有效率的方法是聯絡硬體的工程師,如果硬體工程師也不清楚( 我的情況就是這樣 ),那就只能請他幫忙一起測試了
這個階段跟每家硬體做的通訊協定不同而不太一樣,而不方便將公司的通訊協定公開,所以這邊就是將方法流程和程式碼貼上來跟大家分享
- 所需物件
- 1.peripheral : 就是該藍芽裝置從一開始的 centralManager 拿到且進行連線的 peripheral。而這個 peripheral 的 delegate 要設定成所需要監聽的 UIViewController
- 2.含有 Read 屬性的 characteristic : 這邊以 readChar 這個變數表示,要使用就呼叫
peripheral.readValueForCharacteristic(readChar)
,這個方法。就會在 peripheral 的 delegate 中的func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic:CBCharacteristic, error: NSError?)
- read 實做區塊 :
func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) {
if let value = characteristic.value {
let log = "read: \(value.getByteArray()!)"
print(log)
self.tvResponse.text = log + "\n\n" + self.tvResponse.text
}
}
其中把收到的 NSData 用 byte array 表示出來,也是將 NSData 轉成 byte array
-
3.含有 Write 屬性的 characteristic : 這邊以 writeChar 變數表示,使用 Write 屬性的 characteristic 去做寫入時,使用
peripheral.writeValue
的方法,這邊注意如果是 Write 屬性,那最後一個參數要使用 WithResponse :peripheral.writeValue(data, forCharacteristic: writeChar, type: CBCharacteristicWriteType.WithResponse)
-
4.含有 WriteWithoutResponse 屬性的 characteristic : 以 worChar 變數表示,使用 Write 屬性的 characteristic 去做寫入時,使用 peripheral.writeValue 的方法,這邊注意如果是 WriteWithoutResponse 屬性,那最後一個參數要使用 WithoutResponse :
peripheral.writeValue(data, forCharacteristic: writeChar, type: CBCharacteristicWriteType.WithoutResponse)
- 5.含有Notify 屬性的 characteristic,使用 Notify 屬性的 characteristic,是監聽藍芽裝置有觸發通知的事件。要先用 peripheral 設定要啟動該 characteristic 的監聽為 true :
peripheral.setNotifyValue(true, forCharacteristic: notiChar)
然後當裝置有通知觸發時就會在didUpdateValueForCharacteristic
中收到。是的!收到的部分和 Read 收到的部分是一樣的地方
因為各個裝置的通訊協定和介面都不一定相同,所以很難說就是怎樣怎樣就可以通訊,之後有時間會將專案整理一下放到github上
沒有留言:
張貼留言