##前提・実現したいこと
iOS同士のBLE通信で、Centralが固有IDをPeripheralへwriteし、
Peripheralがそれを保持するプログラムが組みたいです。
##発生している問題
PeripheralがIDを書き込まれ、didReceiveWrite起動しますが、書き込まれたデータを取り出せません。
後述のプログラムにおいて、requestsがポインタで渡されているようで、その扱いがわかりません。
requests内では2byteのデータが_value内にあるのがXcodeデバック時に確認できています。
##該当のソースコード
Swift
1/* Central */ 2private var my_peripheral: CBPeripheral? = nil 3private var ID_characteristic: CBCharacteristic? = nil 4private let ID_UUID: CBUUID = CBUUID(string: "ID_UUID") 5private var peripheral_ID: UInt = 1111 // writeするID 6 7...... 8 9func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { 10 print("didDiscoverCharacteristicsFor") 11 12 guard ( (peripheral == my_peripheral! ) 13 && (service.characteristics != nil) ) else{ 14 return 15 } 16 17 for characteristic in service.characteristics!{ 18 /* characteristicの識別 */ 19 correspond_characteristic(characteristic: characteristic) 20 } 21 } 22 23 24func correspond_characteristic(characteristic: CBCharacteristic){ 25 if (characteristic.uuid == ID_UUID) { 26 /* peripheralへIDを書き込みにいく */ 27 if (ID_characteristic == nil){ 28 ID_characteristic = characteristic 29 write_ID() 30 } else { 31 ...... 32 } 33 } else { 34 ...... 35 } 36} 37 38 39func write_ID(){ 40 guard my_peripheral != nil else { 41 print("no peripheral") 42 return 43 } 44 guard ID_characteristic != nil else{ 45 Log.d("no characteristic") 46 return 47 } 48 var data: [UInt8] = [] 49 var write_ID: UInt16 = UInt16(peripheral_ID) 50 51 data.append(contentsOf: withUnsafeBytes(of: &write_ID){ $0.map{ UInt8($0) } }) 52 53 let write_data = Data(data) 54 55 print("write_data = (String(describing: write_data))") 56 // write_data = 2byte 57 58 my_peripheral!.writeValue(write_data, for: ID_characteristic!, type: CBCharacteristicWriteType.withResponse) 59}
Swift
1/* Peripheral */ 2private var ID_characteristic: CBMutableCharacteristic? = nil 3private let ID_UUID: CBUUID = CBUUID(string: "ID_UUID") 4private let ID_property: CBCharacteristicProperties = [.notify,.write,.read] 5private let ID_permission: CBAttributePermissions = [.readable,.writeable] 6 7...... 8 9func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveWrite requests: [CBATTRequest]){ 10 guard ID_characteristic != nil else{ 11 print("no chracteristic") 12 return 13 } 14 for request in requests { 15 if ( request.characteristic.uuid == ID_UUID ){ 16 /* 正常にIDをwriteできなかった時 */ 17 if ( (request.characteristic.value == nil) || (request.characteristic.value!.isEmpty) ) { 18 print("ID not recv") 19 print("request ID = (request.characteristic.value)") 20 // request ID = nil 21 peripheralManager.respond(to: request, withResult: CBATTError.invalidHandle) 22 return 23 } 24 25 let value = NSData(data: request.characteristic.value!) 26 let elements_num = request.value!.count 27 var recv_ID: UInt16 = 0 28 29 value.getBytes(&recv_ID ,range: NSRange(location: 0, length: elements_num)) 30 print("new ID = (recv_ID)") 31 } else { 32 ...... 33 } 34 } 35}
##使っているツールのバージョンなど補足情報
Swift 5.0
Xcode 11.0
iOS 12.3
MacOS Mojave 10.14.6
都合上、アップデートができません。
ご助力いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。