post Image
GoからBLE制御でPLAYBULB Candleの操作をしてみる

 昨日のGo Conference 2015 winterお疲れ様でした。 #gocon
昨日のGoConでBLE話をした@n0bisukeです。

昨日のスライドはこちらです。

GoでIoT ~BLE入門してみた話~

今日は昨日の話を応用して衝動買いしたPlayBulbを使ってみたいと思います。

PlayBulb Candleとは

スマホから制御可能な光るキャンドルスタンドです。 BLEで制御できます。

上野のヨドバシカメラで衝動買いしてみました。
2700円くらいで買えましたよ。

Amazon PlayBulb Candle

プログラム可能な照明といえばPhilips Hueが有名ですが一個あたり7000円くらいで、電球一個にしては高いなぁという印象です。

Hueの代替になるか検証したいなとヨドバシカメラ内で思ったので買ってみました。

ServiceとCharacteristicのUUIDを調べる

GATTについて分からない人は色々調べてみましょう。または昨日の#gocon時のスライドを見て下さい。

http://yegang.hatenablog.com/entry/2014/08/09/195246

APIっぽいリポジトリがあるけど…

https://github.com/Phhere/Playbulb

ここがあまり参考にならず。

こっちの方が参考になりました。

Web Bluetoothすごい https://www.code-labs.io/codelabs/candle-bluetooth/#0

Node.js実装 (試してはない) https://github.com/danielsmith-eu/playbulb-live

1. サービスUUID

Service UUID: 0xFF02

この値がPlayBulb Candle制御用のサービスUUIDみたいです。

1.1 Local Name(ガジェット名)の変更/読み込み

Characteristic UUID: 0xFFFF

デフォルトはPlayBulb

1.2 色の変更

Characteristic UUID: 0xFFFC

1.3 エフェクトの変更

Characteristic UUID: 0xFFFB

※他のCharacteristic UUIDが分かったら追記したいと思います。

Goからの制御

PayPalが公開しているgatt用のパッケージを使うのがいい感じです。
https://github.com/paypal/gatt
https://godoc.org/github.com/paypal/gatt

PeripheralのUUIDを調べる

discoverer.goを動かしてみます。
https://github.com/paypal/gatt/blob/master/examples/discoverer.go

$ go run discover.go
・
・
・
Peripheral ID:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, NAME:()
  Local Name        = PlayBulb
  TX Power Level    = -2
  Manufacturer Data = [77 73 80 79 87]
  Service Data      = []

・
・
・

近くのデバイスの数だけ出てきます。 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxとしている部分がperipheralのuuidです。Local Nameで名前がそれっぽいものを探しましょう。

接続してみる

またサンプルを動かしてみましょう。 explorer.goです。
https://github.com/paypal/gatt/blob/master/examples/explorer.go

には先ほど調べたものを入れます。

$ go run explorer.go <Peripheral ID>

・
・
・

Service: ff02
  Characteristic  2a37 (Heart Rate Measurement)
    properties    notify
  Descriptor      2902 (Client Characteristic Configuration)
    value         0000b2b3dd0c8f01000000b516000cfc6500ea09 | "\x00\x00\xb2\xb3\xdd\f\x8f\x01\x00\x00\x00\xb5\x16\x00\f\xfce\x00\xea\t"
  Characteristic  fff8
    properties    read
2015/12/07 20:17:03 Unhandled event: xpc.Dict{"kCBMsgId":81, "kCBMsgArgs":xpc.Dict{"kCBMsgArgConnectionInterval":37, "kCBMsgArgConnectionLatency":0, "kCBMsgArgSupervisionTimeout":500, "kCBMsgArgDeviceUUID":xpc.UUID{0xe6, 0x57, 0xb9, 0x78, 0x7d, 0x53, 0x47, 0xc1, 0x87, 0x30, 0xa4, 0xd0, 0xb8, 0xa0, 0x59, 0x5f}}}
    value         0000000000000000000000000000000000000000 | "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  Characteristic  fff9
    properties    read write
    value         000000ffffffff000000000000 | "\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00"
  Characteristic  fffa
    properties    read writeWithoutResponse
    value         00 | "\x00"
  Characteristic  fffb
    properties    read writeWithoutResponse
    value         00000000ff002300 | "\x00\x00\x00\x00\xff\x00#\x00"
  Characteristic  fffc
    properties    read writeWithoutResponse
    value         00ff0000 | "\x00\xff\x00\x00"

 ・
 ・
 ・

こんな感じで、peripheral内のServiceCharacteristicの情報が取れます。

書き込んでみましょう。

WriteCharacteristicというメソッドがあります。
ここに値を書き込めばOKです。
explorer.goの79-80行目のところに以下のコードを入れ込んでみました。

explorer.go



      if c.UUID().String() == "fffc" {
        err := p.WriteCharacteristic(c, []byte("\x00\xff\x00\x00"), true)
        if err != nil {
                fmt.Printf("Failed to discover descriptors, err: %s\n", err)
                continue
            }
      }



gistにあげてます。
https://gist.github.com/n0bisuke/8eddfa29176d9c41c2ea#file-gatt-write-test-go-L80-L86

\x00\xff\x00\x00を書き込んでますが、最初の00は固定です。その後が色(RGB)になります。

  • 赤: \x00\xff\x00\x00
  • 緑: \x00\x00\xff\x00
  • 青: \x00\x00\x00\xff

みたいな感じです。

実行するとキャンドルの色が赤になります :thumbsup:

まとめ

 PlayBulbがプログラム制御出来ました。
早くDroneの記事を書かないとなと思いつつも。
デバッグがしやすい(ドローンはオフィスで飛ばすとウルサイ…w)方で進めてみました。

色々とBLE周りの情報で詰まる人がいると思うので、もう少し後で加筆したいと思います。


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。