ç 究ãããžã§ã¯ãã§ã¯ããããã¿ã€ãã®å»ççšãã¬ã¹ã¬ãããå¿
èŠã§ããã ããã€ã¹ã¯ãã«ã¹ãå®æçã«æž¬å®ããæ£è
ã«èŠåããããããªãŒã¬ãã«ãšãšãã«çµæãã¯ã©ãŠããµãŒãã¹ã«éä¿¡ããå¿
èŠããããŸããã ã¹ããŒããã©ã³ã®ä»£ããã«åºå®ãªããŒã¿ãŒãåãããã£ãããã¹ãã¬ã¹ã¬ããããã®ãããªããã€ã¹ã«ãªãå¯èœæ§ããããŸãã ãããã£ãŠãèªåã®æã§ãããã¿ã€ããçµã¿ç«ãŠãããšããåã«ãæºåãã§ãããã®ã§å®éšããããšã«ããŸããã ããã§ãå
åŠåŒå¿æã»ã³ãµãŒãåããæ°ããXiaomi miãã³ã1S PulseïŒGeektimesã®
ã¬ãã¥ãŒ ïŒãå
¥æããŸããã
ãã¬ã¹ã¬ããã®éžæã¯ããã®æ¯èŒçäœãäŸ¡æ ŒãåªããããããªãŒãããã³å¿ææ°ã®æž¬å®ããã¿ã³ãæŒãããšã«ãã£ãŠèµ·åãããã®ã§ã¯ãªããã¹ããŒããã©ã³ããéå§ããããšããäºå®ã«é¢é£ããŠããŸããã
Bluetooth 4.0ïŒãŸãã¯Bluetooth Low Energyã以éBLEãšåŒã³ãŸãïŒã§å©çšå¯èœãªäžé£ã®ãµãŒãã¹ãšæ©èœã調ã¹ãããšãããå®éšãéå§ããŸããã
ãããäžã§äœããèŠã€ããããšã¯é£ãããããŸããã§ããããã®æ
å ±ã¯ç§ã倧ãã«å©ããŠãããŸããããå¿
èŠãªã»ã³ãµãŒãªãã§ä»¥åã®ããŒãžã§ã³ã«é¢ä¿ããŠããŸããã ããã§ãBLEã¹ãã£ããŒããå§ããŸããã
Nordic Semiconductorã«ã¯ãé©åã§ãççŽã«èšã£ãŠãéåžžã«äŸ¿å©ãªããŒã«ãããããšãããããŸããã ããã¯ãAndroid 4.3
以éã®ãã¹ã¿ãŒã³ã³ãããŒã«ããã«ãŸãã¯
nRF MCPã§ãã ã¿ãã¬ããã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŠãSCANããå®è¡ãããšãmiãã³ããç°¡åã«èŠã€ããããã®ç©çã¢ãã¬ã¹ãæžãçããŸãã-C8ïŒ0FïŒ10ïŒ11ïŒ1BïŒ6EïŒ

ãã¿ããéãããã¯ãªãã¯ããŠãããæ¥ç¶ããã¯ãªãã¯ãããšãäžé£ã®ãµãŒãã¹ã衚瀺ãããŸãã

èæèšã®èå¥åã¯ããã®ãããªããã€ã¹ã®æšæºã§ããããšãå€æããŸãã
-0x180D ã å
ãèŠãŠãç§ã¯æ©ãåãã§ãããšèšãã§ãããã
ãªããŒã¿ãŒãšããŠã
Raspberry Pi ïŒã¢ãã«BïŒãšASUSã®ASUS BT400 BLE-USBã¢ããã¿ãŒã䜿çšããŸããã
BlueZãå¿
èŠã§ãã
-Linuxçšã®BluetoothãšPythonçšã®ããã€ãã®è¿œå ã¢ãžã¥ãŒã«ã䜿çšããããã®æ¬ç©ã®ã¹ã€ã¹ãã€ãã
Raspberry Piã®æºåRaspberry Piã«ã¯ã
Raspbianã€ã¡ãŒãžã
䜿çšãããŸãã ã apt-get updateããã³apt-get upgradeãã¢ããã¿ãŒããã§ãã¯ããåŸïŒ
pi@raspberrypi:~ $ lsusb Bus 001 Device 006: ID 0b05:17cb ASUSTek Computer, Inc. Bus 001 Device 005: ID 046d:c077 Logitech, Inc. Bus 001 Device 004: ID 04d9:1602 Holtek Semiconductor, Inc.
ãã°ããããç§ã®ã¢ããã¿ãŒã¯æåã®è¡ã«ãããŸãã BlueZãã€ã³ã¹ããŒã«ããŸããã ã³ãŒãã®ææ°ã¢ãŒã«ã€ããããŠã³ããŒãããããšããå§ãããŸãããããæžããŠããæç¹ã§ã¯ãããã¯BlueZ 5.37ã§ã解åããŠã³ã³ãã€ã«ããŸãã apt-getãä»ããŠã€ã³ã¹ããŒã«ãããããŒãžã§ã³5.23ã«æºè¶³ããŸããã gatttool âhelpã³ãã³ããå®è¡ãããšãã€ã³ã¹ããŒã«ãæ£ããããšã確èªã§ããŸãã
Gatttoolã¯ãBLEããã€ã¹ã®äžè¬çãªå±æ§ãããã¡ã€ã«ã§ãã
GATTãæäœããããã®BlueZããŒã«ã§ãã å€ãããŒãžã§ã³ã§ã¯ãgatttoolã¯ããã©ã«ãã§ã¯ã€ã³ã¹ããŒã«ããããæåã§ãããžçããããå¿
èŠããããŸããããããã§ã¯ãã«ããå©çšã§ããã®ã§ããã¬ã¹ã¬ãããæäœããã®ã«å¿
èŠãªãã®ã¯ã»ãšãã©æã£ãŠããŸãã Pythonã®BlueZã§
åäœããããã«ãpipçµç±ã§
Pexpectãã€ã³ã¹ããŒã«ã
ãŸããã Raspberryãåèµ·åããã¢ããã¿ãŒããªã³ã«ããŸããã hciconfigã³ãã³ãã§ã¢ããã¿ãŒã®ç¶æ
ã確èªããŸããã
pi@raspberrypi:~ $ hciconfig hci0: Type: BR/EDR Bus: USB BD Address: 5C:F3:70:71:7E:F5 ACL MTU: 1021:8 SCO MTU: 64:1 DOWN RX bytes:616 acl:0 sco:0 events:34 errors:0 TX bytes:380 acl:0 sco:0 commands:34 errors:0
DOWNãã©ã°ã¯ãã¢ããã¿ãŒããªãã«ãªã£ãããšã瀺ãã次ã®ã³ãã³ãã§ãªã³ã«ããŸããã
sudo hciconfig hci0 up
Raspberryã®ã³ãŒããæžãåã«ãå¿
èŠãªãã¹ãŠã®ãµãŒãã¹ïŒå¿ææ°ãããããªãŒã¬ãã«ãæ¯åèŠåïŒãBlueZã®ã¿ãŒããã«ã¢ãŒãã§å©çšå¯èœã§ããããšã確èªããå¿
èŠããããŸããã
圌ã¯BLEç°å¢ãã¹ãã£ã³ããåé¡ãªããã¬ã¹ã¬ãããèŠã€ããŸããã
pi@raspberrypi:~ $ sudo hcitool -i hci0 lescan LE Scan ... C8:0F:10:11:1B:6E (unknown) C8:0F:10:11:1B:6E MI1S
connectã³ãã³ãã§ãã¬ã¹ã¬ããã«æ¥ç¶ãã察話ã¢ãŒãã§gatttoolãå®è¡ããŸããïŒããŒIïŒïŒ
pi@raspberrypi:~ $ sudo gatttool -i hci0 -b C8:0F:10:11:1B:6E -I [C8:0F:10:11:1B:6E][LE]> connect Attempting to connect to C8:0F:10:11:1B:6E Connection successful [C8:0F:10:11:1B:6E][LE]>
ãã¢ãªã³ã°ãªãã®å¯Ÿè©±åæ¥ç¶ã¯éåžžçŽ20ç§ç¶ããããã¯ããããäœã¬ãã«ã®ãã©ã€ãã·ãŒã§ãããããã©ã«ãã§äœ¿çšãããŸãã å©çšå¯èœãªãµãŒãã¹ã®ãªã¹ãã¯ããã©ã€ããªã³ãã³ãã«ãã£ãŠè¡šç€ºãããŸãã
[C8:0F:10:11:1B:6E][LE]> primary attr handle: 0x0001, end grp handle: 0x0009 uuid: 00001800-0000-1000-8000-00805f9b34fb attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb attr handle: 0x0010, end grp handle: 0x0039 uuid: 0000fee0-0000-1000-8000-00805f9b34fb attr handle: 0x003a, end grp handle: 0x0048 uuid: 0000fee1-0000-1000-8000-00805f9b34fb attr handle: 0x0049, end grp handle: 0x004e uuid: 0000180d-0000-1000-8000-00805f9b34fb attr handle: 0x004f, end grp handle: 0x0051 uuid: 00001802-0000-1000-8000-00805f9b34fb
uuidã®åŸã®4æ¡ã§ãã©ã®ãããªçš®é¡ã®ãµãŒãã¹ãå¯èœããå€æããŸãã 2ã€ã®äžè¬çãªãµãŒãã¹ïŒæ±çšïŒãã¡ãŒã«ãŒã«ãã£ãŠå®çŸ©ããã2ã€ã®ãµãŒãã¹ïŒfee0ããã³fee1ïŒãHRMãµãŒãã¹ïŒ180dïŒããã³ã¢ã©ãŒãïŒ1802ïŒãå€æããŸããã
ãã¬ã¹ã¬ããã®ç¹æ§ã®ãªã¹ãã¯ãchar-descã³ãã³ãã§ãã³ãã«ã®æé ã§è¡šç€ºãããŸãã ãªã¹ãã«ff0cãšããèå¥åãæã€ç¹æ§ãèŠã€ãããŸããïŒ
ãã³ãã«ïŒ0x002cãuuidïŒ0000ff0c-0000-1000-8000-00805f9b34fbã
ããããªãŒã¬ãã«ã®0x002cãã€ã³ã¿ãŒã¯ã以åã®ããŒãžã§ã³ã®ãã¬ã¹ã¬ããã«æ¢ã«å®çŸ©ãããŠããŸãã char-read-hndã³ãã³ãã§ããŒã¿ãèªã¿åãããšããŸããïŒãã€ã³ã¿ãŒã§ããŒã¿ãèªã¿åããŸãïŒïŒ

ããããªãŒã¯æåã«ãéäŒãããŸããã çãã¯å
é»ã¬ãã«ã ãã§ã¯ãªããããã¯16é²æ°ã®æåã®ãã€ãïŒåå€ã«ã¹ããŒããã©ã³ã70ïŒ
ã瀺ããïŒã§ããã ãã§ãªããå®å
šãªå
é»æ
å ±ïŒãµã€ã¯ã«æ°ãæåŸã®å
é»ã®æ¥ä»ãããããªãŒã¹ããŒã¿ã¹ïŒã§ããããŸãã ã¿ã¹ã¯ã®æ¡ä»¶ã®äžã§ã¯ãã¬ãã«ã ããå¿
èŠã§ããã
2çªç®ã¯ãæ¯åããã¢ã©ãŒãã«ãåŸã£ããã MCPããã®ããŒã¿ã«ãããšãããã¯å³æã¢ã©ãŒãã§ãããã¢ã©ãŒãã¬ãã«ã¯èå¥å0x2A06ã«éä¿¡ããå¿
èŠãããã³ãã³ãã§ãããšæ³å®ããŸããã

ç¹æ§ã®ãªã¹ãã§ã¯ããã®èå¥åã¯æ¬¡ã®è¡ã«å¯Ÿå¿ããŠããŸãã
ãã³ãã«ïŒ0x0051ãuuidïŒ00002a06-0000-1000-8000-00805f9b34fb
å€01ã®ãã€ã³ã¿ãŒ0x0051ã«ã³ãã³ããéä¿¡ããŸããïŒ
[C8:0F:10:11:1B:6E][LE]> char-write-cmd 0x0051 01
ãã¬ã¹ã¬ããã¯2ã€ã®åŒ±ãããºã§å¿çããŸãããå€02ã¯01ã®2åã§ãã 4ã€ã®ä¿¡å·ãããã³03-2ãããããã匷ãã å¿ææ°ããããšããã¹ãŠãããè€éã«ãªããŸããã MCPã¯æ¬¡ã®ããšã瀺ããŸããã

ãã®ãµãŒãã¹ã«é¢é£ããæ©èœïŒ
handle: 0x004b, uuid: 00002a37-0000-1000-8000-00805f9b34fb handle: 0x004c, uuid: 00002902-0000-1000-8000-00805f9b34fb handle: 0x004d, uuid: 00002803-0000-1000-8000-00805f9b34fb handle: 0x004e, uuid: 00002a39-0000-1000-8000-00805f9b34fb
å¿ææ°ã¯ãéç¥ã¢ãŒããŸãã¯ããã·ã¥éç¥ã¢ãŒãã§ã¹ããŒããã©ã³ã«éä¿¡ãããŸãããããããªãŒã¬ãã«ãšã¯èŠãªãããŸããã ãã€ã³ã¿ãŒ0x004cïŒCCCã®èå¥åã¯åžžã«2902ïŒã®å€0100ã䜿çšããŠCCCïŒã¯ã©ã€ã¢ã³ãç¹æ§æ§æïŒã«æžã蟌ãããšã«ããéç¥ãæå¹ã«ããéç¥ãåŸ
ã€å¿
èŠããããŸãã
äœãèµ·ããããå€ã¯æ£åžžã«èšé²ãããŸããããéç¥ã¯åä¿¡ãããããã¬ã¹ã¬ããã¯æ°ç§åŸã«ãªãã«ãªããŸããã âlistenã¹ã€ããã䜿çšããŠã³ã³ãœãŒã«ã¢ãŒãã§gatttoolãå®è¡ããããšã倱æããŸãããgatttoolã¯äºæããŠããã³ã°ãããã ãã§ãã äžèšã§èšãã°ããªããªãã
ç¶æ³ãæ確ã«ããããã«ãBLEã¹ããã¡ãŒã䜿çšããå¿
èŠããããŸããïŒWindows 8ãæèŒããã©ãããããïŒã ããã¯ãTexas Instrumentsã®CC2540ãããäžã®ãã©ãã·ã¥ãããBLE-usbãã³ã°ã«ãšãåãã¡ãŒã«ãŒã®
Smart Packet Snifferããã°ã©ã ã«åºã¥ããŠããŸããã ããã°ã©ããŒãå«ãå¿
èŠãªãã®ã¯ãã¹ãŠãéçºè
åãã®ãããã®åœ¢ã§ç°¡åã«èŠã€ããããšãã§ããŸããããã°ã©ã ãšãã¡ãŒã ãŠã§ã¢ã¯
TIã® Webãµã€ãããèªç±ã«ããŠã³ããŒãããŸããã
éèŠïŒ ãã¬ã¹ã¬ããããã¬ãŒã³ããŒã·ã§ã³ã¢ãŒãïŒåºåã¢ãŒãïŒã®ãšãã«ã¹ããã¡ãŒãå®è¡ããŸãã ã¹ããŒããã©ã³ã«æ¥ç¶ããåã«ã ãã以å€ã®å Žåã¯è¡šç€ºãããŸããã ãŸããäžèŠãªBLEããã€ã¹ããã¹ãŠã¹ããã¡ãŒããåãå€ããŠããã®ãè¯ãããšã§ããããã«ã·ãŒã«ããããããšããã°ãåŸã§ææ¡ããã®ã«åœ¹ç«ã¡ãŸãã
ããã¯ããã¬ãŒã³ããŒã·ã§ã³ã¢ãŒãã§ã¹ããã¡ãŒã®ãã±ãããã©ã®ããã«èŠãããã§ãã

AdvAïŒAdvertising AddressïŒãã£ãŒã«ãã«ãããšãããããŸãã«ç§ã®ãã¬ã¹ã¬ããã§ãããšå€æããŸããã ã¹ããŒããã©ã³ãšã®æ¥ç¶ã確ç«ããåŸãGATTæ¥ç¶ã¢ãŒãã§ç»åãå€æŽãããŸããïŒ

ããã§ã¯ãå€0100ããã€ã³ã¿ãŒ0x004Cã䜿çšããŠCCCã«æžã蟌ãŸããå¿ææ°éç¥ãæå¹ã«ãªã£ãŠããããšãããããŸãã
ãã¬ã¹ã¬ããã®ä»¥åã®ããŒãžã§ã³ã®ç 究è
ã®äžäººã¯ããã¹ãŠã®ãµãŒãã¹ãå¿åããã€ã¹ã§å©çšã§ãããšã¯éããªããšããã°ã«
æžããŠããŸãã ç§ãç¥ãéããå Žåã«ãã£ãŠã¯ããã¬ã¹ã¬ãããšå¯Ÿè©±ããããã€ã¹ã¯ãæ£ãããŠãŒã¶ãŒæ
å ±ããã¬ã¹ã¬ããã«éä¿¡ããå¿
èŠããããŸããããã¯ãã¹ããŒããã©ã³ãšãã¢ãªã³ã°ãããšãã«éšåçã«ããã·ã¥ãããŸãã
åã®ããŒãžã§ã³ãšåæ§ã«ããã®ããŒã¿ã¯20ãã€ãé·ã§ããã€ã³ã¿ãŒ0x0019ã䜿çšããŠç¹æ§ã«æžã蟌ãŸããæ°ããæ¥ç¶ããšã«å€æŽãããããšã¯ãããŸããã æåã®4ãã€ãã¯ã¹ããŒããã©ã³ã®uidããã¬ãŒã³ããã¹ãã§ã¯æ§å¥ã幎霢ã身é·ãäœéãäžæžãèš±å¯ã®ãã€ãïŒ00ã§ããå¿
èŠããããŸãïŒã®ãã€ããããã³ããã·ã¥ã®ãããªã·ãŒã±ã³ã¹ã®10ãã€ãã§ãã ãã¬ã¹ã¬ãããããŠãŒã¶ãŒæ
å ±ãèªã¿åãããšãã§ããŸããã§ããã
ããã±ãŒãžãåæãããšã次ã®ããšãããããŸããã
- æ¥ç¶ãããã³ã«ããã¹ãŠã®éç¥èš±å¯ããã¬ã¹ã¬ããïŒèå¥å2902ã®CCCïŒã«éä¿¡ãããŸã
- 次ã¯ãŠãŒã¶ãŒæ
å ±ã®è»¢éã§ã
- 次ã«ããã€ã³ã¿ãŒ0x0028ã«åŸã£ãŠãæ¥ä»ãšæå»ãèšé²ãããŸã
- ãã®åŸãããããªãŒã¬ãã«ãš1æ¥ãããã®æ©æ°ã«é¢ããããŒã¿ãèªã¿èŸŒãŸããŸã
- ãã€ã³ã¿ãŒ0x004Eã«ããå¿ææ°ã«é¢ããéç¥ãåãåãåã«ãç¹æ§ãå¿ææ°å¶åŸ¡ãã€ã³ããã«å¯Ÿå¿ããŠãã·ãŒã±ã³ã¹0x15 0x00 0x00ãèšé²ãããŸãïŒããã¯ãªã»ããã§ãããšæ³å®ããŸãïŒ
- 次ã«ã0x15 0x02 0x01ãããã«æžã蟌ãŸããŸããããã¯ãç§ã®å Žåã¯å·Šæã«å¯Ÿå¿ããŸã
- ãã®åŸã15ã20ç§åŸã«ã2ãã€ãã®å¿ææ°ãããšãã°06 40ã§éç¥ãå°çããŸãã2çªç®ã®ãã€ãã¯ã16é²æ°ã®å¿ææ°ã§ãã
çè«çã«ã¯ãå¿ææ°ãååŸããããã«ã3çªç®ãš4çªç®ã®ãã€ã³ããé€ããŠãããããã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ãç¹°ãè¿ãå¿
èŠããããŸããã å€æããããã«ããªã»ããããã«å®è¡ã§ããŸãã ãããæåã§è¡ãããšã¯äžå¯èœã§ãããã¹ãŠã®ã³ãã³ããå
¥åããåã«ãã¬ã¹ã¬ãããåæãããŸãã ããã§ãPythonã¹ã¯ãªãããæºåããŸããã
import sys, pexpect from time import sleep gatt=pexpect.spawn('gatttool -I') gatt.logfile = open("pylog.txt", "w") gatt.sendline('connect C8:0F:10:11:1B:6E') gatt.expect('Connection successful')
ãšããã§ãå®è¡ãããã¹ãããã®æ°ã¯å¿åã§èªã¿åãããšãã§ãããã€ã³ã¿0x001Dã§èªã¿åãããšãã§ããŸãã çãã¯4ãã€ãã§ããå·Šããå³ã«èªãå¿
èŠããããŸãã
ã¹ã¯ãªããã¯ããããªãŒã¬ãã«ã衚瀺ããéç¥ãéä¿¡ããåŸ
æ©ããŠå¿ææ°ãåºåããŸãã è¬ã¯è§£æ±ºããŸããããããŒã¿ãã¯ã©ãŠããµãŒãã¹ã«éä¿¡ããæ¹æ³ãåŠç¿ããå¿
èŠãããããã®ããã«
Thingspeakã䜿çšããããšã«ã
ãŸãã ã ããã¯ãã·ã³ãã«ãªAPIãšæ¢è£œã®èŠèŠåãåããç¡æã®ãµãŒãã¹ã§ãã
Thingspeakã®ã»ããã¢ããã«ã¯5åããããããŸããã§ããã ç»é²ããŠå人çšã¹ããŒã¹ã«å
¥å®€ããå¿
èŠããããŸãã 次ã«ãæ°ãããã£ã³ãã«ãäœæãããã£ã³ãã«èšå®ã§ååãçªå·ããã£ãŒã«ãã©ãã«ãæå®ããŸãã èšå®ãä¿åãã[APIããŒ]ã¿ãã«ç§»åããŸãã ããã§ãæžã蟌ã¿çšã®APIããŒãã³ããŒããŸãïŒAPIããŒã®æžã蟌ã¿ïŒïŒ

ãã®åŸ-[ãã©ã€ããŒããã¥ãŒ]ã¿ãã«åãæ¿ããŸãïŒãã£ã³ãã«ã®ã»ããã¢ããæã«[ãããªãã¯ã«ãã]ãæå®ãããŠããªãå ŽåïŒã
Pythonã®ãã®ãããªæ§é ã¯ãThingspeakã«ããŒã¿ãéä¿¡ãã責任ããããŸãã
baseURL = 'https://api.thingspeak.com/update?api_key=%s'%YOUR_API_KEY f = urllib2.urlopen(baseURL + "&field1=%s&field2=%s" % (batt, hrm)) print f.read() f.close()
å®å
šãªã³ãŒã import sys, pexpect from time import sleep import urllib2 sample_interval = 180
éåžžã®æäœã§ã¯ãã³ã³ãœãŒã«ã«ã¯1ããå§ãŸãããŒã¿éä¿¡çªå·ã衚瀺ãããŸãã ãªããŒã¿ã®ç¯å²ã¯ãçŽèŠç·ã§3ã4ã¡ãŒãã«ã§ãããã¯å»çç
æ£ã§ã¯éåžžã®ããšã§ãã ãããããã®ãããªè·é¢ã«ãããã¬ã¹ã¬ããã¯æã®ã²ãã§ç°¡åã«ä¿è·ãããŸãã
ãšã¯ãµãµã€ãºãã€ã¯ã§ã®ãã¬ãŒãã³ã°äžã«ãçµæã®ã·ã¹ãã ã20åéãã¹ãããŸããã 枬å®ééã¯3åã枬å®åæ°ã¯8åã§ãããã¬ã¹ã¬ããã¯ãç®èãšã®æ¥è§Šããããå Žåã«èææ°ãé倧è©äŸ¡ããåŸåãããã粟床ãé«ããããã«æéŠã®åŸãã«ã»ã³ãµãŒãé
眮ããŸãã Thingspeakã®çµæïŒ

ã°ã©ããããããããã«ã8åã®æž¬å®ã¯ããããªãŒã®å
é»ã«åœ±é¿ããŸããã§ããã å®éšã¯éåžžã«æåããŠãããšèããããåŸãããçµéšã䜿çšããŠç¬èªã®ããã€ã¹ãèšèšããããããšãã°OEMãæ¢ãããããããšãã§ããŸãã
䟿å©ãªãªã³ã¯ïŒ