Slide 1

Slide 1 text

%FWFMPQFST*0 ' ాத޹໌ɹϞόΠϧΞϓϦαʔϏε෦ ⡥$MBTTNFUIPE *OD ೥݄೔ શ෦ݟͤ·͢ʂ ࠷લઢΤϯδχΞ͕ޠΔ #-&ΞϓϦέʔγϣϯͷϋϚΓͲ͜ΖʢJ04ʣ #cmdevio2016

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

ΞδΣϯμ w J04ͷ#-&ʹ͍ͭͯ w ϋϚΓͲ͜Ζ w αϯϓϧίʔυ w ·ͱΊ ⡥$MBTTNFUIPE *OD

Slide 4

Slide 4 text

J04ͷ#-&ʹ͍ͭͯ

Slide 5

Slide 5 text

$PSF#MVFUPPUI w #-&୺຤ͱͷ઀ଓ w #-&୺຤ͱͷ઀ଓ͠ɺσʔλͷಡΈॻ͖Λߦ͏ɻ w όοΫάϥ΢ϯυͰ΋ಈ࡞͢Δɻ w #-&୺຤ͱͯ͠ৼΔ෣͏ w J04୺຤Λ#-&୺຤ͱͯ͠ଞͷ#-&୺຤ͱ઀ଓ͢Δ͜ͱ͕Ͱ ͖Δɻ w J04୺຤ಉ࢜΋઀ଓ͢Δ͜ͱ͕Ͱ͖Δɻ ⡥$MBTTNFUIPE *OD

Slide 6

Slide 6 text

J#FBDPO w #-&Λར༻ͨ͠ྖҬ؍ଌαʔϏε w ྖҬ΁ͷग़ೖΓΛ؂ࢹ͢Δɻ w ݕग़தͷ#FBDPO୺຤·Ͱͷڑ཭Λଌఆ͢Δɻ w $PSF-PDBUJPOͷػೳͷͻͱͭ w #FBDPOͷݕग़ʹʮ#MVFUPPUIʯΛ࢖༻͢Δɻ w όοΫάϥ΢ϯυͰ΋ಈ࡞͢Δɻ ⡥$MBTTNFUIPE *OD

Slide 7

Slide 7 text

ࢀߟจݙ w $PSF#MVFUPPUIϓϩάϥϛϯάΨΠυ w IUUQTEFWFMPQFSBQQMFDPNKQEPDVNFOUBUJPO $PSF#MVFUPPUI1(QEG w J04º#-&$PSF#MVFUPPUIϓϩάϥϛϯά w IUUQHPPHM.8EqT ⡥$MBTTNFUIPE *OD

Slide 8

Slide 8 text

ϋϚΓͲ͜Ζ

Slide 9

Slide 9 text

ϋϚΓͲ͜Ζ w ໨ʹݟ͑ͳ͍΋ͷͱͷઓ͍ w ి೾͕ຊ౰ʹग़͍ͯΔͷ͔Θ͔Βͳ͍ɻ w σʔλ͕ૹ৴͞Ε͍ͯΔͷ͔Θ͔Βͳ͍ɻ w 1FSJQIFSBMଆͷಈ࡞ w ࡞੒͢ΔΞϓϦ͸$FOUSBMͱͯ͠ৼΔ෣͏΋ͷ͕ଟ͍ɻ w ݪҼͷ੾Γ෼͚ͷͨΊʹ͸1FSJQIFSBMଆͷ஌͕ࣝඞཁɻ ⡥$MBTTNFUIPE *OD

Slide 10

Slide 10 text

ϋϚΓͲ͜Ζ ⡥$MBTTNFUIPE *OD

Slide 11

Slide 11 text

αϯϓϧίʔυ ʙ$FOUSBMͱ1FSJQIFSBMͷڍಈΛཧղ͠Α͏ʙ HJUIVCIUUQTHJUIVCDPNLPOHNJOHTUSBQ#-&4BNQMFS

Slide 12

Slide 12 text

J04୺຤ಉ࢜Ͱ#-&௨৴ w J04୺຤Λར༻ͯ͠#-&Λ஌Δ w ͦΕͧΕ$FOUSBMɺ1FSJQIFSBMͷ໾ׂΛ୲ΘͤΔɻ w 1FSJQIFSBMଆͷϘλϯͷԡԼ৘ใΛ$FOUSBMʹ௨஌͢Δɻ ⡥$MBTTNFUIPE *OD HJUIVCIUUQTHJUIVCDPNLPOHNJOHTUSBQ#-&4BNQMFS

Slide 13

Slide 13 text

J04୺຤ಉ࢜Ͱ#-&௨৴ ⡥$MBTTNFUIPE *OD HJUIVCIUUQTHJUIVCDPNLPOHNJOHTUSBQ#-&4BNQMFS

Slide 14

Slide 14 text

ಈ࡞֓ཁ w $FOUSBM w 1FSJQIFSBMͷεΩϟϯ w 1FSJQIFSBMͱ઀ଓ w 4FSWJDFͷݕग़ w $IBSBDUFSJTUJDTͷݕग़ w มߋ௨஌ઃఆ ⡥$MBTTNFUIPE *OD w 1FSJQIFSBM w ΞυόλΠζ։࢝ w $FOUSBMͱ઀ଓ HJUIVCIUUQTHJUIVCDPNLPOHNJOHTUSBQ#-&4BNQMFS

Slide 15

Slide 15 text

66*%ͷઃఆ ⡥$MBTTNFUIPE *OD static private let ServiceUUID = CBUUID(string: "A8C7922D-8849-4FBC-8692-4DBB291F99C8") static private let CharacteristicsUUID = CBUUID(string: "D2E2C5E2-B0B9-4AF6-9AD9-361A819FB30F") $ uuidgen A8C7922D-8849-4FBC-8692-4DBB291F99C8 w 4FSWJDFͱ$IBSBDUFSJTUJDTͷ66*%ΛܾΊΔ w VVJEHFOίϚϯυͰੜ੒ͨ͠66*%Λઃఆ͠·͢ɻ

Slide 16

Slide 16 text

NBOBHFSͷੜ੒ ⡥$MBTTNFUIPE *OD self.peripheralManager = CBPeripheralManager( delegate: self, queue: nil, options: [CBPeripheralManagerOptionShowPowerAlertKey: true]) w 1FSJQIFSBM w $FOUSBM self.centralManager = CBCentralManager( delegate: self, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey: true]) NBOBHFSͷੜ੒͸εΩϟϯɺ઀ଓͷ௚લʹߦΘͳ͍͜ͱɻ

Slide 17

Slide 17 text

NBOBHFSͷੜ੒ ⡥$MBTTNFUIPE *OD [CBPeripheralManagerOptionShowPowerAlertKey: true] w 1FSJQIFSBM w $FOUSBM [CBCentralManagerOptionShowPowerAlertKey: true] w ΞϥʔτͷΦϓγϣϯ w ࢦఆ͓ͯ͘͠ͱNBOBHFSੜ੒࣌ʹ୺຤ͷ #MVFUPPUI͕Φϑͩͬͨ৔߹ʹΞϥʔτ͕ දࣔ͞ΕΔɻ w ʮઃఆʯΛλοϓ͢Δͱ#MVFUPPUIͷઃఆ ը໘ʹભҠ͠·͢ɻ

Slide 18

Slide 18 text

ʢ1FSJQIFSBMʣ4FSWJDFͷ௥Ճ ⡥$MBTTNFUIPE *OD let service = CBMutableService( type: PeripheralViewController.ServiceUUID, primary: true) service.characteristics = [self.characteristic] self.peripheralManager?.addService(service) private let characteristic = CBMutableCharacteristic( type: PeripheralViewController.CharacteristicsUUID, properties: .Notify, value: nil, permissions: .Readable) w $IBSBDUFSJTUJDTΛઃఆ w 4FSWJDF͕࣋ͭ$IBSBDUFSJTUJDΛઃఆ͠·͢ɻ w $#1FSJQIFSBM.BOBHFSʹ4FSWJDFΛ௥Ճ w ࡞੒ͨ͠$IBSBDUFSJTUJDΛ௥Ճ͓͖ͯ͠·͢ɻ

Slide 19

Slide 19 text

ʢ1FSJQIFSBMʣ4FSWJDFͷ௥Ճ ⡥$MBTTNFUIPE *OD w 4FSWJDFͱ$IBSBDUFSJTUJDͷؔ܎

Slide 20

Slide 20 text

ʢ1FSJQIFSBMʣΞυόλΠζ։࢝ ⡥$MBTTNFUIPE *OD self.peripheralManager?.startAdvertising( [CBAdvertisementDataServiceUUIDsKey: ɹɹ [PeripheralViewController.ServiceUUID]]) w ΞυόλΠζΛ։࢝ w $FOUSBMʹରͯࣗ͠෼ͷଘࡏΛൃ৴͠·͢ɻ

Slide 21

Slide 21 text

ʢ$FOUSBMʣ1FSJQIFSBMͷεΩϟϯ ⡥$MBTTNFUIPE *OD self.centralManager?.scanForPeripheralsWithServices( [CentralViewController.ServiceUUID], options: nil) w 1FSJQIFSBMͷεΩϟϯ w ΞυόλΠζ͞Ε͍ͯΔ1FSJQIFSBMΛݕग़͠·͢ɻ PQUJPOTʹ $#$FOUSBM.BOBHFS4DBO0QUJPO"MMPX%VQMJDBUFT,FZΛ USVFͰࢦఆ͢Δͱಉ͡1FSJQIFSBM͕ Կ౓΋ݕग़͞ΕΔͷͰ஫ҙɻ

Slide 22

Slide 22 text

ʢ$FOUSBMʣ1FSJQIFSBMͷεΩϟϯ ⡥$MBTTNFUIPE *OD ࠶઀ଓ࣌͸ͳΔ΂͘εΩϟϯ͠ͳ͍Α͏ʹ͢Δ͜ͱ

Slide 23

Slide 23 text

ʢ$FOUSBMʣ1FSJQIFSBMͱ઀ଓ ⡥$MBTTNFUIPE *OD func centralManager( central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) { let foundIds = self.foundPeripherals.map { peripheral in peripheral.identifier.UUIDString } if !foundIds.contains(peripheral.identifier.UUIDString) { self.foundPeripherals.append(peripheral) } } w 1FSJQIFSBMͷݕग़ w σϦήʔτϝιουʹݕग़ͨ͠1FSJQIFSBM͕ฦ͖ͬͯ·͢ɻ

Slide 24

Slide 24 text

ʢ$FOUSBMʣ1FSJQIFSBMͱ઀ଓ ⡥$MBTTNFUIPE *OD self.centralManager?.stopScan() w εΩϟϯͷఀࢭ w 1FSJQIFSBMͷݕग़͕ऴΘͬͨΒεΩϟϯΛఀࢭ͠·͢ɻ w εΩϟϯ͠ଓ͚Δͱి஑Λফඅ͢Δɻ

Slide 25

Slide 25 text

ʢ$FOUSBMʣ1FSJQIFSBMͱ઀ଓ ⡥$MBTTNFUIPE *OD if peripheral.state != .Connected { self.centralManager?.connectPeripheral( peripheral, options: nil) } w ࢦఆͨ͠1FSJQIFSBMͱ઀ଓ w ݕग़ࡁΈͷ1FSJQIFSBM΁ͷ઀ଓΛ։࢝͠·͢ɻ

Slide 26

Slide 26 text

ʢ$FOUSBMʣ4FSWJDFͷݕग़ ⡥$MBTTNFUIPE *OD func centralManager( central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { self.connectedPeripheral = peripheral self.connectedPeripheral?.delegate = self self.connectedPeripheral?.discoverServices( [CentralViewController.ServiceUUID]) w ઀ଓࡁΈͷ1FSJQIFSBMͷ4FSWJDFͷݕग़ w $#1FSJQIFSBM%FMFHBUFͷઃఆΛߦ͍·͢ɻ w ઀ଓࡁΈͷ1FSJQIFSBM͕ࢦఆͨ͠4FSWJDFΛݕग़͠·͢ɻ EJTDPWFS4FSWJDFTʹOJMΛࢦఆ͢Δͱෆඞཁͳ4FSWJDF·Ͱ ݕग़͢ΔͨΊɺඞཁͳ4FSWJDFͷΈࢦఆ͢Δ͜ͱɻ

Slide 27

Slide 27 text

ʢ$FOUSBMʣ$IBSBDUFSJTUJDTͷݕग़ ⡥$MBTTNFUIPE *OD func peripheral( peripheral: CBPeripheral, didDiscoverServices error: NSError?) { if let services = peripheral.services { services.filter { service in service.UUID.data == CentralViewController.ServiceUUID.data }.forEach { service in peripheral.discoverCharacteristics( [CentralViewController.CharacteristicsUUID], forService: service ) } } } w $IBSBDUFSJTUJDTͷݕग़ w ݕग़ࡁΈͷ4FSWJDFʹରͯ͠$IBSBDUFSJTUJDTΛݕग़͠·͢ɻ

Slide 28

Slide 28 text

ʢ$FOUSBMʣมߋ௨஌ઃఆ ⡥$MBTTNFUIPE *OD func peripheral( peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?) { if service.UUID.data == CentralViewController.ServiceUUID.data, let characteristics = service.characteristics { characteristics.filter { characteristic in characteristic.UUID.isEqual( CentralViewController.CharacteristicsUUID) }.forEach { [unowned self] characteristic in self.setNotify(true, peripheral: peripheral) } } w $IBSBDUFSJTUJDTͷมߋ௨஌ઃఆ w ݕग़ࡁΈͷ$IBSBDUFSJTUJDTʹରͯ͠มߋ௨஌ઃఆΛ͠·͢ɻ

Slide 29

Slide 29 text

ʢ1FSJQIFSBMʣมߋ௨஌ ⡥$MBTTNFUIPE *OD guard let data = "foo".dataUsingEncoding(NSUTF8StringEncoding) else { fatalError("Failed dataUsingEncoding") } self.peripheralManager?.updateValue( data, forCharacteristic: self.characteristic, onSubscribedCentrals: nil) w $FOUSBMʹ௨஌ w $FOUSBMʹରͯ͠஋ͷมߋΛ௨஌͠·͢ɻ

Slide 30

Slide 30 text

ʢ$FOUSBMʣมߋ௨஌ड৴ ⡥$MBTTNFUIPE *OD func peripheral( peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { if characteristic.UUID.data == CentralViewController.CharacteristicsUUID.data { guard let value = characteristic.value else { fatalError("invalid characteristic value.") } guard let string = String(data: value, encoding: NSUTF8StringEncoding) else { return } self.connectedPeripheralLabel.text = string } w 1FSJQIFSBMΑΓมߋ௨஌ w 1FSJQIFSBM͔Βͷมߋ௨஌Λड৴͠·͢ɻ

Slide 31

Slide 31 text

ʢ$FOUSBMʣ੾அΠϕϯτͷݕग़ ⡥$MBTTNFUIPE *OD w ੾அΠϕϯτΛϋϯυϦϯά w ෺ཧతʹ੾Εͨ৔߹ʹདྷΔΠϕϯτͰ͸ͳ͍ͷͰ஫ҙɻ w ͋͘·Ͱ1FSJQIFSBM͕ʮ੾அͨ͠ͱΈͳͯ͠΋ྑ͍ʯঢ়ଶʹͳͬͨ͜ͱΛ௨஌͠·͢ɻ func centralManager( central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) { if error != nil { let controller = UIAlertController( title: nil, message: NSLocalizedString( "The connection to the device closed.", comment: ""), preferredStyle: .Alert) let okAction = UIAlertAction( title: NSLocalizedString("OK", comment:""), style: .Default, handler: nil) controller.addAction(okAction) self.presentViewController( controller, animated: true, completion: nil) } } }

Slide 32

Slide 32 text

·ͱΊ

Slide 33

Slide 33 text

·ͱΊ ⡥$MBTTNFUIPE *OD w $FOUSBMͷॲཧ͕ϝΠϯͰ͸͋Δ͕ɺ1FSJQIFSBMଆ ͷॲཧͷ஌ࣝ΋͋ͬͨ΄͏͕Α͍ w ి೾ͷ࢖͍ํ΍ి஑ͷण໋ʹ஫ҙΛ෷͏͜ͱ w ࠶઀ଓ࣌͸஫ҙ͢Δඞཁ͕͋Δ

Slide 34

Slide 34 text

%FWFMPQFST*0 ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ εϥΠυ͸ޙ೔ϒϩάͰެ։͠·͢ɻ ' ⡥$MBTTNFUIPE *OD #cmdevio2016