IoT

2019ǯ11·î01Æü

¤Ò¤â¥¹¥¤¥Ã¥Á¤Ç¥¹¥Þ¡¼¥È¾ÈÌÀ¤òÁàºî¤¹¤ë

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

Philips Hue ¤òÂåɽ³Ê¤È¤¹¤ë¥¹¥Þ¡¼¥È¥Ð¥ë¥Ö¡ÊÅŵå¡Ë¤Ï¿ï½ê¤Ç¤½¤ÎÍøÊØÀ­¤¬¤¦¤¿¤ï¤ì¤Æ¤­¤Þ¤·¤¿¡£¼ê¸µ¤Ç¤Ï¤³¤ì¤Þ¤Ç¤³¤ÎÊýÌ̤ÎÀ½ÉʤˤϿ¨¤ì¤º¤Ë¤¤¤Þ¤·¤¿¤¬¡¢ÀèÆü Meross ¼Ò¤Î¡ÖMSL120¡×¤òÇã¤Ã¤Æ¤ß¤Þ¤·¤¿¡£¾ïÍѤ·¤Æ¤¤¤ëƱ¼Ò¤Î¥¹¥Þ¡¼¥È¥×¥é¥° MSS110 ¤ÈƱ°ì¤Î¸ø¼°¥¢¥×¥ê¤ÇÍøÍѤǤ­¤ë¤³¤È¤âÅԹ礬¤è¤¯³Ú¤·¤ß¤Ê¤¬¤é»È¤Ã¤Æ¤¤¤Þ¤¹

¼ÒÆâ¤Ç¤½¤ÎÏäò¤·¤¿¤È¤³¤í¾éÃ̤ޤ¸¤ê¤Ë¡Ö¾ÈÌÀ¤Ä¤Ê¤¬¤ê¤Ç¸½Âå¤Î¥¹¥Þ¡¼¥È¥Ð¥ë¥Ö¤ò¾¼Ï´ü¤Î¤Ò¤â¼°¤Î¥¹¥¤¥Ã¥Á¤ÇÁàºî¤·¤Æ¤ß¤¿¤ê¤È¤«¡×¤È¤¤¤¦ÏÃÂ꤬¤¢¤ê¼ÂºÝ¤Ë»î¤·¤Æ¤ß¤Þ¤·¤¿¡£¤»¤Ã¤«¤¯¤Ê¤Î¤Ç "½ÐÍî¤Á¥Í¥¿" ¤È¤·¤ÆÆ°ºî¤ÎÍͻҤò¾Ò²ð¤·¤Þ¤¹¡£À©¸æ¤Ë ESP32 ¥Ü¡¼¥É¤ò»È¤¤ IFTTT ¥¢¥×¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤·¤ÆÅÀÅô¡¦¾ÃÅô¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£

¡¡
Æ°²è¡§1ʬ2ÉÃ

±äĹÍѤΤҤâ¤ò¼è¤ê¤Ä¤±ÂΤΰÌÃ֤ˤ¢¤ï¤»¤Æ¿­½Ì¤µ¤»¤¿¤ê¡¢É÷¤òÁ÷¤Ã¤Æ¿¶¤ê»Ò¤ÎÍ×ÎΤǤҤâ¤ò¼ê¸µ¤Ë°ú¤­´ó¤»¤ë¤Ê¤É¡¢¤Ò¤â¥¹¥¤¥Ã¥Á¤Ï²ÈÄíÀ¸³è¤ËÆëÀ÷¤ß¤Î¤è¤¤¿Í´ÖŪ¤Ê½ÀÆðÀ­¤ÈÊص¹¤ò¤½¤Ê¤¨¤¿¥æ¡¼¥¶¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ç¤·¤¿¡£ ¥¹¥¤¥Ã¥Á¼«ÂΤò¶îÆ°¤µ¤»¤ë¤¿¤á¤ÎÅÅÎϤäÇÛÅŤòɬÍפȤ»¤ºÁÇËѤʤ·¤¯¤ß¤Ç¤¢¤ê¤Ê¤¬¤é¤¢¤ëÄøÅ٤αó³ÖÁàºî¤ò¼Â¸½¤Ç¤­¤ë¥á¥ê¥Ã¥È¤ÏÂ礭¤¯¡¢º£¸å¤â¤³¤Î·Á¼°¤Î¥¹¥¤¥Ã¥Á¤¬»Ñ¤ò¾Ã¤¹¤³¤È¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¡£Ã¯¤Ë¤Ç¤â°·¤¦¤³¤È¤Î¤Ç¤­¤ë´Ö¸ý¤Î¹­¤µ¤Ï²ÈÅÅÀ½ÉʤΥ¹¥Þ¡¼¥È²½¤Î¿Ê¤àº£¤Î»þÂå¤Ë¤âÍ­ÍѤ«¤â¤·¤ì¤Þ¤»¤ó¡£

¡Ê»ÈÍѤ·¤¿»ñºà¡Ë


(tanabe)
klab_gijutsu2 at 18:13¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2019ǯ10·î08Æü

ÅŻҹ©ºî¤Ç¤Î AC µëÅÅÀ©¸æ¤ÈÊƹñÀ½¡ÖIoT Relay¡×¤Î¤³¤È

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

¥Þ¥¤¥³¥ó¤ò»È¤Ã¤Æ¤¤¤ë¤È AC 100V ¤Ç²ÔƯ¤¹¤ëµ¡´ï¤Ø¤ÎµëÅŤòÀ©¸æ¤·¤¿¤¯¤Ê¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Ö¥í¥°¤Ë¤â°ÊÁ°¡¢½©·îÅÅ»ÒÄ̾¦Íͤˤè¤ë¥½¥ê¥Ã¥É¥¹¥Æ¡¼¥È¥ê¥ì¡¼¡ÊSSR¡Ë¥­¥Ã¥È¤ò»È¤Ã¤Æ¤½¤ì¤ò»î¤ß¤¿ÆâÍƤò´Þ¤àµ­»ö¤ò·ÇºÜ¤·¤Þ¤·¤¿¡£

SSR ¤Ë¤Ï¤ï¤º¤«¤ÊÅÅή¤ÇÀ©¸æ¤Ç¤­¤ë¼ê·Ú¤µ¤¬¤¢¤ê¡¢µ¡³£¼°¤Î¥ê¥ì¡¼¤Ë¤ÏÀä±ïÀ­Åù¤Ç¤ÎÍ¥°ÌÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢Ã±Éʤε¡³£¼°¥ê¥ì¡¼¤ò¥Þ¥¤¥³¥ó¤Ç¼è¤ê²ó¤¹ºÝ¤Î¼ê¤«¤º¤ÏɬÍפÊÍ×ÁǤ¬¤Þ¤È¤á¤Æ¼ÂÁõ¤µ¤ì¤¿¥ê¥ì¡¼¥â¥¸¥å¡¼¥ë¤òÍøÍѤ¹¤ë¤³¤È¤Ç¾Êά¤Ç¤­¤Þ¤¹¡£ ¤³¤Î¤¢¤¿¤ê¤ÎÏÃÂê¤Ï¥Í¥Ã¥È¤ò¸¡º÷¤¹¤ë¤ÈÍÍ¡¹¤Ê¼ÂÎã¤È¤È¤â¤Ë¾Ò²ð¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤À¡¢»ä¼«¿È¤Ï¤³¤¦¤¤¤Ã¤¿¤â¤Î¤ò¡Ö¼«ºî¡×¤¹¤ë¤¿¤Ó¤Ë°ìËõ¤ÎÉ԰¤ò´¶¤¸¤Æ¤¤¤Þ¤·¤¿¡£¾å¤Î 4ǯÁ°¤Îµ­»ö¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤¤¤Æ¤¤¤Þ¤¹¡£

¸Ä¿ÍŪ¤Ë¤Ï¤³¤Î¤è¤¦¤Ë¹âÅÅ°µ¤ò°·¤¦¤â¤Î¤ÏËÜÅö¤Ï¤¢¤Þ¤ê¼«ºî¤·¤¿¤¯¤Ê¤¤¤Ç¤¹¡£¤½¤ÎÊýÌ̤ËÁÇÍܤ¬¤Ê¤¯¤Æ¤âÉôÉʤò·¤¨¤ì¤Ðºî¤ë¤Î¤Ï´Êñ¤Ç¤¹¤¬¡¢¡Ö¼êºî¤ê¤Î³Ú¤·¤µ¡×¤Ê¤É¤è¤ê¤â°ÂÁ´À­¤¬¤â¤Ã¤È¤â½ÅÍפǤ¹¤«¤é¡¢¼êº¢¤Ê²Á³Ê¤Ç·øÏ´¤Ê´°À®ÉʤòÆþ¼ê¤Ç¤­¤ë¤Ê¤é¤½¤ì¤ò»È¤¤¤¿¤¤¤È¤¤¤¦¤Î¤¬ÀµÄ¾¤Ê¤È¤³¤í¤Ç¤¹¡£»ÄÇ°¤Ê¤¬¤éº£¤Î¤È¤³¤í¤½¤¦¤¤¤¦¾¦Éʤϸ«Åö¤¿¤é¤Ê¤¤¤è¤¦¤Ç¤¹¤¬¡Ê¼ûÍפϤ¢¤ë¤È»×¤¦¤Î¤Ç¤¹¤¬¡¦¡¦¡Ë¡¢ :

¤³¤¦¤¤¤Ã¤¿»ö¾ð¤Ë¤è¤êñ½ã¤Ê¥È¥ê¥¬¡¼¿®¹æ¤òÁ÷¤ë¤À¤±¤Ç½êÄê¤Îµ¡´ï¤Ø¤ÎµëÅŤò¼è¤ê²ó¤·¤Æ¤¯¤ì¤ë¥Ö¥é¥Ã¥¯¥Ü¥Ã¥¯¥¹Åª¤Ê´°À®Éʤò¤Ò¤È¤Ä¤ÎÍýÁÛ·Á¤È¤·¤Æ¥¤¥á¡¼¥¸¤·¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬¡¢¤¹¤Ç¤Ë¤½¤¦¤¤¤¦À½Éʤ¬Åо줷¤Æ¤¤¤ë¤³¤È¤òºÇ¶áÃΤê¤Þ¤·¤¿¡£Kickstarter ȯ¤Î¡ÖIoT Relay¡×¤È¤¤¤¦Êƹñ¤ÎÀ½ÉʤǤ¹¡£¤³¤ì¤Ï¤Þ¤µ¤Ë¾åµ­¤Î¤è¤¦¤Ê¼ûÍפËÂбþ¤¹¤ëÆâÍƤǹ½À®¤µ¤ì¤¿ "¥ê¥ì¡¼¤Î·øÏ´¤Ê¥é¥Ã¥Ñ¡¼" ¤Ç¤¹¡£¸½Êª¤Î¼Ì¿¿¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£

»ÄÇ°¤Ê¤¬¤éº£¤Î¤È¤³¤í IoT Relay ¤ÏÆüËܤΠPSE ǧÄê¤ò¼õ¤±¤Æ¤ª¤é¤º¹ñÆâ¤Ç¤ÏÈÎÇ䤵¤ì¤Æ¤¤¤Þ¤»¤ó¡£¸Ä¿ÍŪ¤Ê¹¥´ñ¿´¤«¤éÀèÆü¤³¤ÎÀ½ÉʤòĴ㤷¼ê¸µ¤Ç»î¤·¤Æ¤ß¤Þ¤·¤¿¡£º£²ó¤Ï¤½¤Î¥ì¥Ý¡¼¥È¤Ç¤¹¡£

¤Á¤Ê¤ß¤Ë¡¢½êÄê¤Îµ¡´ï¤Ø¤ÎµëÅŤˤϤ³¤¦¤·¤¿¥í¡¼¥«¥ë¤Ê¥ê¥ì¡¼Îà¤ò¼è¤ê²ó¤¹¤Ð¤«¤ê¤Ç¤Ï¤Ê¤¯¡¢¶áǯ¼êº¢¤Ë¤Ê¤Ã¤¿¥¹¥Þ¡¼¥È¥×¥é¥°¤òÍøÍѤ¹¤ëÁªÂò¤â¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥¹¥Þ¡¼¥È¥×¥é¥°¤Ë¤Ï¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÀܳ´Ä¶­¤¬É¬¿Ü¤Ç¤¢¤ë¤³¤È¤Ë²Ã¤¨¡¢ÌܤÎÁ°¤Ë¤¢¤ëµ¡´ï¤ò°·¤¦ºÝ¤Ë¤â¡Ö±ó²ó¤ê¡×¤Î·ë²Ì¤È¤·¤ÆÀ¸¤¸¤ëÈù̯¤ÊÈ¿±þ¤ÎÃÙ¤ì¤Ë°ãÏ´¶¤ò³Ð¤¨¤ë¥±¡¼¥¹¤â¤¢¤ê¤Þ¤¹¡£°ìÊý¡¢¥¹¥Þ¡¼¥È¥×¥é¥°¤Ë¤Ï±ó³ÖÃϤε¡´ï¤Ø¤ÎµëÅÅÀ©¸æ¤Ë¤âÂбþ¤Ç¤­¤ëÂ礭¤Ê¥á¥ê¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢Î¾¼Ô¤ÏŬºàŬ½ê¤Ç»È¤¤Ê¬¤±¤ë¤Ù¤­¤Ç¤·¤ç¤¦¡£

IoT Relay ¤Ë¤Ä¤¤¤Æ

1. ³µÍ×

Kickstarter ¾å¤Î¥×¥í¥¸¥§¥¯¥È¥Ú¡¼¥¸

SparkFun ¤Ç¤ÎÈÎÇä¥Ú¡¼¥¸

  • IoT Power Relay - www.sparkfun.com¡¡US $26.95
    Do you want to control a standard wall outlet device with your microcontroller, but don¡Çt want to mess with the high-voltage wiring? The IoT Power Relay is a controllable power relay equipped with four outputs that help you create an Internet of Things project with safe, reliable power control. With the IoT Power Relay you can easily control the power going to a device with an Arduino, Raspberry Pi or other single-board computer or microcontroller. It provides an alternative to the Power Switch Tail.

    The IoT Power Relay is designed to allow you to safely control an outlet device that operates at 3--48VDC or 12--120VAC. Each IoT Power Relay features a single input (from the included C13 power cable) to four outputs: one normally on, one always on, and two normally off.   :
    ¤ß¤é¤¤ËÝÌõ ·ë²Ì
    ¥Þ¥¤¥¯¥í¥³¥ó¥È¥í¡¼¥é¤Çɸ½àŪ¤Ê¥³¥ó¥»¥ó¥È¥Ç¥Ð¥¤¥¹¤òÀ©¸æ¤·¤¿¤¤¤¬¡¢¹âÅÅ°µÇÛÀþ¤Ë¤Ï¼ê¤ò½Ð¤·¤¿¤¯¤Ê¤¤¤È»×¤¦¤À¤í¤¦¤«?IoT Power Relay¤Ï4¤Ä¤Î½ÐÎϤòÈ÷¤¨¤¿À©¸æ²Äǽ¤Ê¥Ñ¥ï¡¼¥ê¥ì¡¼¤Ç¡¢°ÂÁ´¤Ç¿®ÍêÀ­¤Î¹â¤¤ÅŸ»À©¸æ¤òÈ÷¤¨¤¿IoT¥×¥í¥¸¥§¥¯¥È¤Î¹½ÃÛ¤ËÌòΩ¤Á¤Þ¤¹¡£IoT Power Relay¤ò»È¤¨¤Ð¡¢Arduino¤äRaspberry Pi¤Ê¤É¤Î¥·¥ó¥°¥ë¥Ü¡¼¥É¥³¥ó¥Ô¥å¡¼¥¿¤ä¥Þ¥¤¥¯¥í¥³¥ó¥È¥í¡¼¥é¤ò»È¤Ã¤Æ¡¢¥Ç¥Ð¥¤¥¹¤Ø¤ÎÅÅÎ϶¡µë¤ò´Êñ¤ËÀ©¸æ¤Ç¤­¤ë¡£ÅŸ»¥¹¥¤¥Ã¥Á¥Æ¡¼¥ë¤ÎÂå¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£

    IoT Power Relay¤Ï¡¢DC3~48V¤Þ¤¿¤Ï12~120VAC¤ÇÆ°ºî¤¹¤ë¥³¥ó¥»¥ó¥È¥Ç¥Ð¥¤¥¹¤ò°ÂÁ´¤ËÀ©¸æ¤Ç¤­¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£³ÆIoT Power Relay¤Ë¤Ï¡¢Ã±°ì¤ÎÆþÎÏ(ÉÕ°¤ÎC13ÅŸ»¥±¡¼¥Ö¥ë¤«¤é)¤«¤é»Í¤Ä¤Î½ÐÎϤ¬¤¢¤ê¤Þ¤¹¡£°ì¤Ä¤ÏÄ̾索¥ó¡¢°ì¤Ä¤Ï¾ï»þ¥ª¥ó¡¢Æó¤Ä¤ÏÄ̾索¥Õ¤Ç¤¹¡£  :

Amazon.com ¤Ç¤ÎÈÎÇä¥Ú¡¼¥¸ ¡Ê"does not ship to Japan."¡Ë

2. ȯÃí ¡Á ÅþÃå

¼ê¸µ¤Ç IoT Relay ¤Î¸ºß¤òÃΤä¿ 2019ǯ7·î¤Î»þÅÀ¤Ç¤Ï SparkFun ¤ò¤Ï¤¸¤á¼ç¤À¤Ã¤¿¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥¿¤Î¥µ¥¤¥È¤Ë¤ª¤¤¤Æ¤â Amazon.com ¤Ë¤ª¤¤¤Æ¤â¤³¤È¤´¤È¤¯ºß¸ËÀÚ¤ì¤Î¾õÂÖ¤À¤Ã¤¿¡£À½Â¤½ªÎ»¤Î²ÄǽÀ­¤âÁÛÁü¤·¤Ä¤Ä SparkFun ¤ØÆþ²ÙÄÌÃΤò¥ê¥¯¥¨¥¹¥È¤·¤Æ¤ª¤¤¤¿¤È¤³¤í 2019-09-05 ¤Ë²¼¤Î¥á¡¼¥ë¤¬ÆϤ¤¤¿¡£
ËÜÂΤÎÈÎÇä²Á³Ê¤Ï´ûÃΤΤȤª¤ê ÊÆ $26.95 ¤Ç¤¢¤ê¡¢¤È¤ê¤¢¤¨¤º¹ØÆþ¼ê³¤­¤ò¿Ê¤á¤Æ¤ß¤ë¤ÈÆüËܤؤÎÁ÷ÎÁ¤ÏºÇ°Â¤Î¡ÖEconomy¡Ê1-4 Weeks¡Ë¡×¤Ç $12.02 ¤È¤Î¤³¤È¡£Èù̯¤ËǺ¤Þ¤·¤¤¶â³Û¤À¤¬¤·¤Ð¤é¤¯¹Í¤¨¤¿Ëö¤Ë PayPal ·Ðͳ¤Ç $38.97 ¤ò»Ùʧ¤Ã¤¿¡£

2019-09-06 ¤Ë¥Ë¥å¡¼¥¸¥ã¡¼¥¸¡¼½£¥Ë¥å¡¼¥¢¡¼¥¯¤«¤éȯÁ÷¤µ¤ì 2019-09-19 ¤Ë¼«Âð¤Î͹Êؼõ¤±¤ËÆϤ¤¤¿¡£¥¹¥Ú¥Ã¥¯¤Ï³°È¢¤Ëµ­ºÜ¤µ¤ì¤Æ¤ª¤êÀâÌÀ½ñ¤ÎÎà¤ÏÉÕ°¤·¤Ê¤¤¡£¸½Êª¤ò¸«¤ì¤Ð»È¤¤Êý¤¬¤ï¤«¤ë¤è¤¦¤Ë¹©Éפµ¤ì¤Æ¤¤¤ë¡£

¡Ê¥¯¥ê¥Ã¥¯¤Ç²Ä»ëÂç½Äɽ¼¨¡Ë

¡ÊËÜÂΤ˰õ»ú¤µ¤ì¤¿Ææ¥Þ¡¼¥¯¡§¸å½Ò¡Ë

3. Æ°ºî¤ÎÍÍ»Ò

°Ê²¼¤ÎÆ°²è¤Ë¤Ï IoT Relay ¤Î¤è¤Ã¤Ä¤Î¥×¥é¥°º¹¹þ¸ý¤½¤ì¤¾¤ì¤Ë LED ¥é¥¤¥È¤òÁõÃ夷 ESP32 ¥Ü¡¼¥É¤«¤é High, Low ¤Î¥È¥ê¥¬¡¼¿®¹æ¤òÁ÷¤Ã¤ÆÈ¿±þ¤ò¤ß¤¿ÍͻҤò¼ý¤á¤Æ¤¤¤ë¡£

Æ°²è¡§ 35ÉÃ

4. »îÍѤòÄ̤¸¤Æ¤Î¥á¥â

  • IoT Relay ¤Ï¼«Ê¬¤¬´üÂÔ¤·¤Æ¤¤¤¿¤â¤Î¤Ë¤­¤ï¤á¤Æ¶á¤¤À½ÉÊ
  • ¤è¤Ã¤Ä¤Îº¹¹þ¸ý¤«¤é¤ÎµëÅŤò¸ÄÊ̤Υȥꥬ¡¼¤ÇÀ©¸æ²Äǽ¤È¤¹¤ë¥ª¥×¥·¥ç¥ó¤¬¤¢¤ì¤Ð¤è¤êÍ­ÍѤ«¤â
  • º¹¹þ¸ý¤¬¤Ò¤È¤Ä¤À¤±¤Î¥·¥ó¥×¥ë¤Ê¥Ð¡¼¥¸¥ç¥ó¤â˾¤Þ¤ì¤ë
  • À½ÉʤΰÂÁ´À­¤ò¼¨¤¹»Øɸ¤È¤·¤Æ¤ÏËÜÂΤˤ½¤ì¤È»×¤·¤­ "SAFETY CPI TESTED", "computer performance inc QC pass" ¤È½ñ¤«¤ì¤¿¥Þ¡¼¥¯¤¬¤¢¤ë¤¬¡¢¼ê¸µ¤Ç¾ðÊó¤òõ¤·¤¿ÈϰϤǤϺ£¤Î¤È¤³¤í¤³¤ì¤é¤Î¼ÂÂΤÏȽÁ³¤È¤·¤Ê¤¤

    ´ØÏ¢¤·¤ÆÊÆ¥¢¥Þ¥¾¥ó¤Ë¤Ï¤³¤¦¤¤¤¦ Q&A ¤â¡£¾å¤Î»ö¾ð¤ÏÊƹñ¿Í¤Ë¤È¤Ã¤Æ¤â¡Ö¡©¡×¤ÊÍͻҡ£
    • Amazon.com: Customer Questions & Answers
      Is this unit UL listed?

      Showing 1-2 of 2 answers

      • I can't say for sure, but there is no UL markings on the unit. There is 2 markings: "Safety CPI Tested" and "computer performance inc QC pass"
      • Not yet.
    Ʊ¤¸¤¯¥ì¥Ó¥å¡¼Íó¤è¤ê¡£
    • Hackable hardware - www.amazon.com
      This is a well designed and constructed product, but be aware that it is not yet UL listed. My only suggestion for improvement would be to add holes or tabs for secure mounting.   :
    UL ¤Ë¤Ä¤¤¤Æ
    • UL (°ÂÁ´µ¡´Ø) - Wikipedia
      UL LLC¡Ê±Ñ¸ì: Underwriters Laboratories°Ê²¼UL¡Ë¤Ï¡¢¥¢¥á¥ê¥«¹ç½°¹ñ¥¤¥ê¥Î¥¤½£¥Î¡¼¥¹¥Ö¥ë¥Ã¥¯¤ËËܵò¤ò¹½¤¨¡¢»î¸³¡¢¸¡ºº¤ª¤è¤Óǧ¾Ú¤ò¹Ô¤¦´ë¶È¡£Ç§¾Ú´ë¶È¤È¤·¤Æ¡¢À¤³¦10°ÌÁ°¸å¤Îµ¬ÌϤò»ý¤Ä¡£  :

5. ¸Ä¿ÍŪ¤Ê½ê´¶

º£²ó¥Ô¥Ã¥¯¥¢¥Ã¥×¤·¤¿ IoT Relay ¤ÏÀ¤³¦Ãæ¤Î Maker ¤ÎÀøºßŪ¤Ê¼ûÍפΤҤȤĤòŪ³Î¤ËÈ¿±Ç¤·¤¿Îɤ¤À½ÉʤÀ¤È»×¤¤¤Þ¤¹¡£¤¿¤À¤·¡¢ÍøÍѼԤؤΰÂÁ´À­¤ÎÄ󶡤òºÇÂç¤Î¥¢¥Ô¡¼¥ë¥Ý¥¤¥ó¥È¤È¤¹¤ë°ìÊý¤Ç¡¢¸½»þÅÀ¤Ë¤ª¤¤¤Æ¤³¤ÎÀ½Éʼ«ÂΤÎÊÆËܹñÆâ¤Ç¤Î°ìÈÌŪ¤Ê°ÂÁ´´ð½à¤Ø¤ÎŬ¹ç¾õ¶·¤¬È½Á³¤È¤·¤Ê¤¤¾õ¶·¤Ë¤Ï¤¤¤µ¤µ¤«¼«¸ÊÌ·½â¤Î´¶¤â¤¢¤ê¡¢¤½¤ÎÅÀ¤¬¥Þ¥¤¥Ê¥¹¥¤¥á¡¼¥¸¤Ë¤Ä¤Ê¤¬¤ê¤«¤Í¤Ê¤¤·üÇ°¤â¤¢¤ê¤Þ¤¹¡£º£¸å¤½¤ÎÊýÌ̤ÎÀ°È÷¤¬Å¬Àڤ˹Ԥï¤ì¤ì¤Ð¤³¤ÎÀ½ÉÊ¤Ï IoT, ¥¹¥Þ¡¼¥È¥Û¡¼¥à¤ÎÇȤ˾è¤ê¤è¤ê¥á¥¸¥ã¡¼¤Ê¸ºß¤Ë¤Ê¤êÆÀ¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£ÆÃÄê¤ÎÀ½Éʤ¬ÌÜΩ¤Ä·Á¤ÇÀ®¸ù¤ò¼ý¤á¤ì¤ÐƱÅù¡Ê¤¢¤ë¤¤¤Ï¤½¤ì°Ê¾å¡Ë¤Îµ¡Ç½¤ò»ý¤ÄÀ½Éʤ¬¤è¤êÄã²Á³Ê¤ÇÅо줷¥¸¥ã¥ó¥ë²½¤·¤ÆÉáµÚ¤Î¹­¤¬¤ë¥±¡¼¥¹¤Ï¿¡¹¤¢¤ê¡¢¤½¤¦¤·¤¿Î®¤ì¤¬¤¤¤º¤ì PSE ǧÄêÀ½Éʤνи½¤Ë¤Ä¤Ê¤¬¤ë²ÄǽÀ­¤âÁÛÄꤵ¤ì¤Þ¤¹¡£¤½¤¦¤¤¤Ã¤¿´üÂÔ¤ò´Þ¤á¡¢¤³¤ÎÀ½Éʤκ£¸å¤ÎÆ°¸þ¤Ë¤Ï¿ï»þÌܤò¸þ¤±¤Æ¤¤¤­¤¿¤¤¤È¹Í¤¨¤Æ¤¤¤Þ¤¹¡£


(tanabe)
klab_gijutsu2 at 07:09¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2019ǯ07·î12Æü

¤½¤Î³Ø½¬¥ê¥â¥³¥ó¤Ç¤¢¤Îµ¡´ï¤òÁàºî¤Ç¤­¤Ê¤¤¸¶°ø¤òõ¤ë

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

³Ø½¬·¿¤ÎÀÖ³°Àþ¥ê¥â¥³¥ó¤ò»È¤Ã¤Æ¤¤¤ë¤È¤¿¤Þ¤Ë¤¦¤Þ¤¯È¿±þ¤·¤Ê¤¤µ¡´ï¤ËÁø¶ø¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¿®¹æ¤Î³Ø½¬¤ò¿µ½Å¤Ë¹Ô¤¦¤Î¤ÏÅöÁ³¤È¤·¤Æ¡¢Ê̤γؽ¬¥ê¥â¥³¥óÀ½ÉʤǤÏÌäÂê¤Î¤ß¤é¤ì¤Ê¤¤¥±¡¼¥¹¤â¤¢¤ë¤¿¤á¤³¤¦¤·¤¿¾ì¹ç¤Ë¤Ï¤·¤Ð¤·¤Ð¡ÖÁêÀ­¡×¤È¤¤¤¦Û£Ëæ¤Êɽ¸½¤¬ÍѤ¤¤é¤ì¤Þ¤¹¡£¤·¤«¤·¡¢¤½¤³¤Ë¤Ïɬ¤º¶ñÂÎŪ¤Ê¸¶°ø¤¬¤¢¤ë¤Ï¤º¤Ç¤¹¡£ºÇ¶á¤Î³èÆ°¤Î°ì´Ä¤È¤·¤Æ¡¢¾ðÊó¤Î¤Û¤È¤ó¤É¸«Åö¤¿¤é¤Ê¤¤¤³¤Î·ï¤Ë¤Ä¤¤¤ÆÄ´¤Ù¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

¤­¤Ã¤«¤±

¼«Âð¤Ç³ô¼°²ñ¼Ò¥Ô¥¯¥»¥éÍͤˤè¤ë²¼µ­¤Î TV ¥Á¥å¡¼¥Ê¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£

¥³¥ó¥Ñ¥¯¥È¤Ç¤¢¤ê¤Ê¤¬¤é´ðËÜÀ­Ç½¤¬¤È¤Æ¤â¤·¤Ã¤«¤ê¤·¤Æ¤¤¤ë¤³¤È¤¬µ¤¤ËÆþ¤ê¥×¥é¥¤¥Ù¡¼¥È¤Ç°¦ÍѤ·¤Æ¤¤¤ëÀ½ÉʤǤ¹¡£¤¿¤À¡¢¤³¤Î¥Á¥å¡¼¥Ê¤ÏÉÕ°¤Î¥ê¥â¥³¥ó¤Ë¤Ïµ¡ÉÒ¤ËÈ¿±þ¤¹¤ë¤â¤Î¤Î¡¢¼«Âð¤ÇĹǯ¤¤¤í¤¤¤í¤Êµ¡´ï¤ÎÁàºî¤Ë»È¤Ã¤Æ¤¤¤ë¼ê»ý¤Á¼°¤ÎË¿³Ø½¬¥ê¥â¥³¥ó¤Î¿®¹æ¤Ë¤Ï¤Û¤È¤ó¤ÉÈ¿±þ¤·¤Ê¤¤¤³¤È¤òÉԻ׵Ĥ˻פäƤ¤¤Þ¤·¤¿¡£º£¤«¤é 1 ǯ¤Û¤ÉÁ°¤ËƳÆþ¤·¤¿¤¢¤ë¥á¥¸¥ã¡¼¤Ê¥¹¥Þ¡¼¥È¥ê¥â¥³¥óÀ½Éʤ«¤é¤ÎÁàºî¤Ë¤ª¤¤¤Æ¤âƱ¤¸¾õ¶·¤À¤Ã¤¿¤Î¤Ç¤¹¤¬¡¢¤¹¤Ç¤Ë½ãÀµ¥ê¥â¥³¥ó¤Ç¤ÎÁàºî¤ËÆëÀ÷¤ó¤Ç¤¤¤¿¤³¤È¤â¤¢¤ê¤¢¤Þ¤êµ¤¤Ë¤«¤±¤º¤Ë¤¤¤Þ¤·¤¿¡£

¤½¤ÎÏÃÂê¤È¤Ï̵´Ø·¸¤ËÀèÆü¹âÎð¤Î¿ÈÆâ¤Î¤¿¤á¤Ë¤Ç¤­¤ë¤À¤±¥·¥ó¥×¥ë¤Ê³Ø½¬¥ê¥â¥³¥ó¤¬É¬Íפˤʤê¹ñ³°¤Î¥Þ¡¼¥±¥Ã¥È¤«¤é¼Ì¿¿¤Î 6 ¥Ü¥¿¥ó¤Î¤ß¤Î°Â²Á¤Ê³Ø½¬¥ê¥â¥³¥ó¤òĴ㤷¤Þ¤·¤¿¡£¥á¡¼¥«¡¼¤ÏÉÔÌÀ¡¢Â¿¾¯³ä¹â¤Ê¤¬¤é Amazon.co.jp ¤Î¥Þ¡¼¥±¥Ã¥È¥×¥ì¥¤¥¹¤Ë¤â½ÐÉʤµ¤ì¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¡£

¤³¤Î¥¹¥Æ¥£¥Ã¥¯·¿¤Î¥ê¥â¥³¥ó¤ÎÆ°ºî³Îǧ¤ò¹Ô¤¦²áÄø¤Ç¤Õ¤È¾å¤Î¥Á¥å¡¼¥Ê¤ò»î¤·¤Æ¤ß¤¿¤È¤³¤í¡¢¤³¤ì¤Þ¤Ç¤Î·Ð¸³¤¬±³¤Î¤è¤¦¤Ë¤¢¤Ã¤µ¤ê¤ÈÈ¿±þ¤·¤Þ¤·¤¿¡£¤³¤Î·ë²Ì¤Ë¶Ã¤­¡¢¤¿¤Þ¤¿¤ÞºÇ¶áÀÖ³°ÀþÄÌ¿®¤ÎÊÙ¶¯¤¬¤Æ¤é¤Ë ESP32 ¥Ü¡¼¥É¤ò»È¤Ã¤Æ»îºîÃæ¤À¤Ã¤¿³Ø½¬¥ê¥â¥³¥ó¡Ê¢¨¡Ë¤Ç»î¤·¤Æ¤ß¤ë¤È¤½¤Î·ë²Ì¤â OK ¤Ç¤·¤¿¡£

¡Ê¢¨¡Ë¤³¤Î»îºî¤Ï½êÄê¤Î¥ê¥â¥³¥ó¿®¹æ¤ò¥µ¥ó¥×¥ê¥ó¥°¤·¤¿·ë²Ì¤ò¤½¤Î¤Þ¤Þ¿®¹æ¤ÎºÆ¸½¤ËÍøÍѤ¹¤ëÁÇËѤÊÆâÍƤΤâ¤Î¤Ç¤¹

¤³¤Î°ã¤¤¤Ï°ìÂβ¿¤Ë¤è¤ë¤â¤Î¤Ê¤Î¤«¡© ¤Ë¤ï¤«¤Ë¶½Ì£¤¬Í¯¤¤¤Æ¤­¤Þ¤·¤¿¡£º£²ó¤Ï¤³¤Î·ï¤Ë¤Ä¤¤¤ÆÄ´¤Ù¤¿ÆâÍƤȤ½¤Î·ë²Ì¤ò¾Ò²ð¤·¤Þ¤¹¡£¼ê¸µ¤Ç¤Ï¤³¤¦¤¤¤Ã¤¿»ëÅÀ¤Ç»ö¾ð¤ò·¡¤ê²¼¤²¤¿Îã¤ò¤Þ¤ÀÌܤˤ·¤¿¤³¤È¤¬¤¢¤ê¤Þ¤»¤ó¤¬¡¢¶½Ì£¿¼¤¤·ë²Ì¤¬ÆÀ¤é¤ì¤Þ¤·¤¿¡£

1. Æ»¶ñΩ¤Æ

°ìÏ¢¤Î¼Â¸³¤Ç¤ÎÂêºà¤È¤·¤Æ¡¢¥Á¥å¡¼¥ÊÉÕ°¤Î¥ê¥â¥³¥ó¤Î¡ÖÅŸ»¡×¥Ü¥¿¥ó²¡²¼¤Ë¤è¤ê¾È¼Í¤µ¤ì¤ë¿®¹æ¤òÍøÍѤ¹¤ë¡£

¤³¤Î¿®¹æ¤ò°Ê²¼¤Î¤è¤Ã¤Ä¤Î³Ø½¬¥ê¥â¥³¥ó¤Ëµ­²±¤µ¤»¡¢¤³¤ì¤é¤Ë¤è¤Ã¤ÆºÆ¸½¤µ¤ì¤¿¿®¹æ¤ÎÆâÍƤò¸¡¾Ú¤¹¤ë¡£

  1. ¥¹¥Æ¥£¥Ã¥¯·¿¥ê¥â¥³¥ó A¡§ ¥Á¥å¡¼¥Ê¦ȿ±þ OK
  2. »îºîÃæ¤Î¥ê¥â¥³¥ó B¡§ ¥Á¥å¡¼¥Ê¦ȿ±þ OK
  3. ¼ê»ý¤Á·¿¥ê¥â¥³¥ó C¡§ ¥Á¥å¡¼¥Ê¦ȿ±þ NG
  4. ¥¹¥Þ¡¼¥È¥ê¥â¥³¥ó D¡§ ¥Á¥å¡¼¥Ê¦ȿ±þ NG

¤Ê¤ª¡¢¤´¤Î¥Á¥å¡¼¥Ê¤Î¥ê¥â¥³¥ó¿®¹æ¤Î·Á¼°¤Ï²ÈÀ½¶¨¥Õ¥©¡¼¥Þ¥Ã¥È¤À¤Ã¤¿¡£

2. ¿®¹æÁ´ÂΤÎÇÈ·Á¤òɾ²Á¤¹¤ë

¤Þ¤º¡¢³Æ¥ê¥â¥³¥ó¤Î¿®¹æ¤ÎÇÈ·Á¤ò³Îǧ¤¹¤ë¡£¥ª¥·¥í¥¹¥³¡¼¥×¤Ç¿®¹æ¤ÎÁ´ÂÎÁü¤ò´Ñ»¡¤¹¤ëÍ×ÎΡ£°Ê²¼¤Ë³Æ¿®¹æ¤ò¥µ¥ó¥×¥ê¥ó¥°¤·¤¿·ë²Ì¤Î¥Ç¡¼¥¿¤È¤½¤ì¤òÇÈ·Á¤Î·Á¤Ë¥×¥í¥Ã¥È¤·¤¿¿Þ¡¢¤µ¤é¤Ë¤½¤ì¤¾¤ì¤ò¸µ¥ê¥â¥³¥ó¤Î¿®¹æÇÈ·Á¤Ë½Å¤Í¹ç¤ï¤»¤¿¿Þ¤ò¼¨¤¹¡£

  • ¥Á¥å¡¼¥ÊÉÕ°¤Î½ãÀµ¥ê¥â¥³¥ó¿®¹æ¤ÎÇÈ·Á   ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë
  • ¥¹¥Æ¥£¥Ã¥¯¥ê¥â¥³¥ó A ¤ÇºÆ¸½¤·¤¿¿®¹æ¤ÎÇÈ·Á   ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

    ¡Ê¸µ¤ÎÉÕ°¥ê¥â¥³¥ó¿®¹æÇÈ·Á¤È¤Î½Å¤Í¹ç¤ï¤»¡Ë
  • »îºî¥ê¥â¥³¥ó B ¤ÇºÆ¸½¤·¤¿¿®¹æ¤ÎÇÈ·Á   ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

    ¡Ê¸µ¤ÎÉÕ°¥ê¥â¥³¥ó¿®¹æÇÈ·Á¤È¤Î½Å¤Í¹ç¤ï¤»¡Ë
  • ¼ê»ý¤Á·¿¥ê¥â¥³¥ó C ¤ÇºÆ¸½¤·¤¿¿®¹æ¤ÎÇÈ·Á   ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

    ¡Ê¸µ¤ÎÉÕ°¥ê¥â¥³¥ó¿®¹æÇÈ·Á¤È¤Î½Å¤Í¹ç¤ï¤»¡Ë
  • ¥¹¥Þ¡¼¥È¥ê¥â¥³¥ó D ¤ÇºÆ¸½¤·¤¿¿®¹æ¤ÎÇÈ·Á   ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

    ¡Ê¸µ¤ÎÉÕ°¥ê¥â¥³¥ó¿®¹æÇÈ·Á¤È¤Î½Å¤Í¹ç¤ï¤»¡Ë

¤³¤³¤Ç¤Ï°Ê²¼¤ÎÅÀ¤ËÃíÌܤ·¤¿¤¤¡£

  • È¿±þ OK ¤À¤Ã¤¿¥¹¥Æ¥£¥Ã¥¯¥ê¥â¥³¥ó A ¤Î¿®¹æÇÈ·Á¤¬¸µ¿®¹æ¤Î¤½¤ì¤È¤Û¤Ü°ìÃפ·¤Æ¤¤¤ë¤Î¤ËÂФ·¡¢È¿±þ NG ¤À¤Ã¤¿¼ê»ý¤Á·¿¥ê¥â¥³¥ó C ¤ÎÇÈ·Á¤Ç¤Ï¥¿¥¤¥ß¥ó¥°¤Î¤º¤ì¤¬ÌÜΩ¤Ä
  • ¤½¤Î°ìÊý¤Ç¡¢Æ±¤¸¤¯È¿±þ NG ¤Î¥¹¥Þ¡¼¥È¥ê¥â¥³¥ó D ¤Î¾È¹ç·ë²Ì¤Ë¤Ï¤¢¤Þ¤ê¤³¤Î¤º¤ì¤Ï¸«¤é¤ì¤º¡¢¤à¤·¤íÈ¿±þ OK ¤À¤Ã¤¿»îºî¥ê¥â¥³¥ó B ¤ÎÇÈ·Á¤Î¤Û¤¦¤¬¤º¤ì¤¬Â礭¤¤

¤³¤Î·ë²Ì¤«¤é¡¢¼ê¸µ¤Î¥Á¥å¡¼¥Ê¤Ë A, B ¤Î¿®¹æ¤¬¼õ¤±¤¤¤ì¤é¤ì¡¢C, D ¤Î¿®¹æ¤¬ÃƤ«¤ì¤ë¸½¾Ý¤Î¼ç°ø¤Ï¿®¹æÁ´ÂΤΥ¿¥¤¥ß¥ó¥°¤Î¤º¤ì¤Ç¤Ï¤Ê¤¤¤³¤È¤¬¿ä»¡¤µ¤ì¤ë¡£

3. ¿®¹æ¤ò¹½À®¤¹¤ë¥Ñ¥ë¥¹¤ÎÉʼÁ¤òɾ²Á¤¹¤ë

¥Ñ¥ë¥¹¤ËÃíÌܤ¹¤ëÍýͳ

Á°¹à¤Ç¤Ï¤Þ¤º³Æ¿®¹æ¤ÎÁ´ÂΤÎÇÈ·Á¤ËÃíÌܤ·¤¿¤¬¡¢µ¡´ï¦¤ÎÈ¿±þ¤¬°Û¤Ê¤ë¸¶°ø¤ò¤½¤³¤«¤éõ¤êÅö¤Æ¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤«¤Ã¤¿¡£Ê̤Îɾ²Á¼´¤È¤·¤Æ¡¢¤½¤ì¤¾¤ì¤Î¿®¹æ¤ò¹½À®¤¹¤ë¥Ñ¥ë¥¹·²¤ÎγÅÙ¤ËÌܤò¸þ¤±¤ë¤³¤È¤ò»×¤¤Î©¤Ã¤¿¡£¤½¤Î¤­¤Ã¤«¤±¤Ï¡¢Àè¤À¤Ã¤ÆÀÖ³°Àþ¥ê¥â¥³¥ó¿®¹æ¤«¤é¥Ó¥Ã¥È¥Ç¡¼¥¿¤ÎÃê½Ð¤ò»î¤ß¤Æ¤¤¤¿Àޤ˼¡¤ÎÅÀ¤¬µ¤¤Ë¤Ê¤Ã¤¿¤³¤È¤Ë¤¢¤ë¡£

  • ¼õ¿®¤·¤¿ÀÖ³°Àþ¿®¹æ¤Ë´Þ¤Þ¤ì¤ë¥Ñ¥ë¥¹¤ÎÉý¤ÎÍɤì¤ò¤É¤ÎÄøÅÙµöÍƤ¹¤Ù¤­¤«¡©

ÀÖ³°Àþȯ¸÷ÁǻҤ«¤éȯ¿®¤µ¤ì¤¿¿®¹æ¤ò¼õ¸÷ÁǻҷÐͳ¤Ç¼õ¿®¤·¤¿·ë²Ì¤Î¿®¹æ¤Ë´Þ¤Þ¤ì¤ë¥Ñ¥ë¥¹¤ÎÉý¤Ë¤ÏÍýÏÀÃͤ«¤é³°¤ì¤¿¡ÖÍɤì¡×¤ÎÍ×ÁǤ¬¤Ä¤­¤â¤Î¤Ç¤¢¤ë¤¿¤á¡¢¤½¤³¤«¤é¥Ç¡¼¥¿¤òÆɤ߼è¤ëºÝ¤Ë¤Ï¥Ñ¥ë¥¹Éý¤ª¤è¤Ó ON / OFF ¥Ñ¥ë¥¹ÈæΨ¤ÎÍýÏÀÃͤȤΤº¤ì¤ò¸«±Û¤·¤¿µöÍÆÈϰϤÎÀßÄê¤ËÃí°Õ¤¬É¬ÍפȤʤ롣¤³¤ÎµöÍÆÈϰϤò°ï椷¤¿¥Ñ¥ë¥¹¤«¤é¤ÏŬÀڤ˥ǡ¼¥¿¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¤¿¤á¤½¤ÎÀþ¤òµ¿¤Ã¤¿¡£

¥Ñ¥ë¥¹ÉʼÁ¤òɾ²Á¤¹¤ë¤¿¤á¤Î´ð½à

»ÄÇ°¤Ê¤¬¤é¼ê¸µ¤Ç¤Ïº£¤Î¤È¤³¤í²ÈÀ½¶¨¥Õ¥©¡¼¥Þ¥Ã¥Èµ¬Ìó¤Î°ì¼¡»ñÎÁ¤Îȯ·¡¤Ë¤Ï»ê¤Ã¤Æ¤¤¤Ê¤¤¡£Âå¤ï¤ê¤Ë¡¢¤³¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤òÆɤ߲ò¤¯¤¿¤á¤Î¾ðÊ󸻤Ȥ·¤Æ¡¢ÀÖ³°Àþ¥ê¥â¥³¥ó¤Î¿®¹æ·Á¼°¤Ë´Ø¤¹¤ëÏÃÂê¤Ë¤ª¤¤¤Æ¤·¤Ð¤·¤Ð¸ÀµÚ¤µ¤ì¤ë¼¡¤Îµ®½Å¤Ê»ñÎÁ¤ò»²¾È¤µ¤»¤Æ夤¤Æ¤¤¤ë¡£

¤³¤ì¤é¤Î»ñÎÁ¤«¤é¡¢²ÈÀ½¶¨¥Õ¥©¡¼¥Þ¥Ã¥È¿®¹æ¤Ë´Þ¤Þ¤ì¤ë¥Ó¥Ã¥È¥Ç¡¼¥¿¤Ï°Ê²¼¤Î¹½À®¤Ç¤¢¤ë¤³¤È¤¬²ò¼á¤µ¤ì¤ë¡£

  • ¥Ñ¥ë¥¹Éý¤Î´ðËÜĹ T ¤Ï Typical 425 ¥Þ¥¤¥¯¥íÉÃ
  • ¥Ó¥Ã¥ÈÃÍ 0 ¤ÏÀè¹Ô¤¹¤ë 1T ¤Î ON ¥Ñ¥ë¥¹¤È¸å³ 1T ¤Î OFF ¥Ñ¥ë¥¹¤Î¥Ú¥¢¤Çɽ¸½¤µ¤ì¤ë
  • ¥Ó¥Ã¥ÈÃÍ 1 ¤ÏÀè¹Ô¤¹¤ë 1T ¤Î ON ¥Ñ¥ë¥¹¤È¸å³ 3T ¤Î OFF ¥Ñ¥ë¥¹¤Î¥Ú¥¢¤Çɽ¸½¤µ¤ì¤ë

¤½¤Î¤¿¤á¡¢²ÈÀ½¶¨¥Õ¥©¡¼¥Þ¥Ã¥È¿®¹æ¤Ë´Þ¤Þ¤ì¤ë³Æ¥Ñ¥ë¥¹¤ÎÉʼÁ¤ÎÎÉÈݤϼ¡¤Î¤Õ¤¿¤Ä¤Î¼ÜÅ٤ǵҴÑŪ¤ËȽÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¤È¹Í¤¨¤¿¡£

  1. ¡ÖT ¡á 425 ¥Þ¥¤¥¯¥íÉáפˤè¤ê¶á¤¤¤³¤È
  2. ¡Ö'0' ¡á ON ¥Ñ¥ë¥¹ 1T : OFF ¥Ñ¥ë¥¹ 1T¡× ¡Ö'1' ¡á ON ¥Ñ¥ë¥¹ 1T : OFF ¥Ñ¥ë¥¹ 3T¡×¤ÎÈæΨ¤Ë¤è¤ê¶á¤¤¤³¤È

  • ¹¥¤Þ¤·¤¤Î㡧 ¥Ñ¥ë¥¹Éý¤ÈÀè¹Ô¡¦¸å³¥Ñ¥ë¥¹¤ÎÈæΨ¤¬ÍýÏÀÃͤ˶ᤤ
  • ¹¥¤Þ¤·¤¯¤Ê¤¤Îã 1¡§ ¥Ñ¥ë¥¹Èæ¤ÏŬÀµ¤Ç¤â¥Ñ¥ë¥¹Éý¤¬°ïæ ¡Ê¢¨¿ÞÃæ¤ÎÃͤÏÀâÌÀÍѤÎÎã¤Ç¤¢¤ê¤¢¤Þ¤ê°ÕÌ£¤Ï¤Ê¤¤¡Ë
  • ¹¥¤Þ¤·¤¯¤Ê¤¤Îã 2¡§ ¥Ñ¥ë¥¹È椬°ïæ ¡Ê¢¨¿ÞÃæ¤ÎÃͤÏÀâÌÀÍѤÎÎã¤Ç¤¢¤ê¤¢¤Þ¤ê°ÕÌ£¤Ï¤Ê¤¤¡Ë

°Ê¾å¤ÎÆâÍƤˤâ¤È¤Å¤­¡¢¤Þ¤º¤³¤Î¥Á¥å¡¼¥Ê¤Î½ãÀµ¥ê¥â¥³¥ó¿®¹æ¤Î¥µ¥ó¥×¥ê¥ó¥°¥Ç¡¼¥¿¤ò¤â¤È¤Ë¡¢¤½¤³¤Ë´Þ¤Þ¤ì¤ëÍɤì¤ÎÍ×ÁǤòÇÓ½ü¤·ÍýÏÀÃͤËÃÖ¤­´¹¤¨¤¿¡ÖÍýÁÛ·Á¡×¤Î¿®¹æ¥Ç¡¼¥¿¤ò¹½À®¤¹¤ë¤³¤È¤Ë¤·¤¿¡£¤½¤ÎÆâÍƤȳƥê¥â¥³¥ó¤Îȯ¤¹¤ë¿®¹æ¥Ç¡¼¥¿¤òÈæ³Ó¤¹¤ì¤Ð°ìÏ¢¤Îɾ²Á¤ò¹Ô¤¦¾å¤ÇÊص¹¤¬¤¢¤ë¤À¤í¤¦¡£

3-1 ÍýÁÛ·Á¤Î¿®¹æ

¸µ¿®¹æ¤Î¥Ç¡¼¥¿¤Ë´Þ¤Þ¤ì¤ëÍɤì¤ò¼è¤ê½ü¤­ÍýÏÀÃͤˤ½¤Ã¤Æ 1T = 425 ¥Þ¥¤¥¯¥íÉÃ, 3T = 1,275 ¥Þ¥¤¥¯¥íÉäËÃÖ¤­´¹¤¨¤¿¥Ç¡¼¥¿¤È¤½¤ì¤ò¥×¥í¥Ã¥È¤·¤¿¿Þ¤ò°Ê²¼¤Ë¼¨¤¹¡£

A: À¸¥Ç¡¼¥¿¡§TSV ·Á¼°

B: ÇÈ·Á
C: ¥Ç¡¼¥¿Ãæ¤Î¥Ñ¥ë¥¹Ä¹¤ò½çÈÖ¤Ë 1T ¤Ç½ü»»¤·¤¿·ë²Ì
  • 0, 1 ¤ÎÀè¹Ô¥Ñ¥ë¥¹¡¢¤ª¤è¤Ó 0 ¤Î¸å³¥Ñ¥ë¥¹¤Ï 1T = 425 ¤Ë¤Ä¤­ 100% ¤¬ÍýÁÛ
  • 1 ¤Î¸å³¥Ñ¥ë¥¹¤Ï 3T = 1275 ¤Ë¤Ä¤­ 300% ¤¬ÍýÁÛ
D: ¥Ç¡¼¥¿¤Ë½Ð¸½¤¹¤ë¥Ó¥Ã¥ÈÃÍ 0, 1 ¤ò¹½À®¤¹¤ë¸å³¥Ñ¥ë¥¹Ä¹¤ÈÀè¹Ô¥Ñ¥ë¥¹Ä¹¤ÎÈæΨ
  • 0 ¤Ï 1T / 1T ¤Ë¤Ä¤­ 1.0 ¤¬ÍýÁÛ
  • 1 ¤Ï 3T / 1T ¤Ë¤Ä¤­ 3.0 ¤¬ÍýÁÛ
C: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë
D: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

3-2 ¥Á¥å¡¼¥ÊÉÕ°¤Î½ãÀµ¥ê¥â¥³¥ó¤Î¿®¹æ

A: À¸¥Ç¡¼¥¿¡§TSV ·Á¼°

B: ÇÈ·Á
¾å¤Î¸µ¿®¹æ¡ÊÀġˤÈÍýÁÛ·Á¡ÊÀ֡ˤȤνŤ͹ç¤ï¤»¡£¤³¤Î¤è¤¦¤Ë¤«¤Ê¤êÍýÁÛ·Á¤Ë¶á¤¤¡£
C: ¥Ç¡¼¥¿Ãæ¤Î¥Ñ¥ë¥¹Ä¹¤ò½çÈÖ¤Ë 1T ¤Ç½ü»»¤·¤¿·ë²Ì
D: ¥Ç¡¼¥¿¤Ë½Ð¸½¤¹¤ë¥Ó¥Ã¥ÈÃÍ 0, 1 ¤ò¹½À®¤¹¤ë¸å³¥Ñ¥ë¥¹Ä¹¤ÈÀè¹Ô¥Ñ¥ë¥¹Ä¹¤ÎÈæΨ
C: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë
D: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

ɾ²Á

ÇÈ·Á¤ÎÁ´ÂÎÁü¤¬ÍýÁÛ·Á¤Ë¤­¤ï¤á¤Æ¶á¤¤¤³¤È¤Ë¶Ã¤¤¤¿¡£¥Ñ¥ë¥¹Éý¤ª¤è¤Ó¥Ñ¥ë¥¹Èæ¤ÎγÅÙ¤ËÃíÌÜ¡£¤³¤ì¤¬½ãÀµ¥ê¥â¥³¥ó¤Î¥¯¥ª¥ê¥Æ¥£¡£

3-3 ¥¹¥Æ¥£¥Ã¥¯¥ê¥â¥³¥ó A ¤Ë¤è¤ëºÆ¸½¿®¹æ

A: À¸¥Ç¡¼¥¿¡§TSV ·Á¼°

B: ÇÈ·Á
C: ¥Ç¡¼¥¿Ãæ¤Î¥Ñ¥ë¥¹Ä¹¤ò½çÈÖ¤Ë 1T ¤Ç½ü»»¤·¤¿·ë²Ì
D: ¥Ç¡¼¥¿¤Ë½Ð¸½¤¹¤ë¥Ó¥Ã¥ÈÃÍ 0, 1 ¤ò¹½À®¤¹¤ë¸å³¥Ñ¥ë¥¹Ä¹¤ÈÀè¹Ô¥Ñ¥ë¥¹Ä¹¤ÎÈæΨ
C: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë
D: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

ɾ²Á

¥Ñ¥ë¥¹Éý¡¦¥Ñ¥ë¥¹Èæ¤È¤â¸µ¿®¹æ¤ÈƱÅù¡Ê°Ê¾å¡©¡Ë¤ËÎɹ¥¡£Æþ¼ê°ÊÍèÇùÁ³¤ÈÉʼÁ¤Î¹â¤µ¤ò´¶¤¸¤Æ¤¤¤¿¤¬¡¢º£²ó¤ÎÄ´ºº¤òÄ̤¸¤Æ¤³¤ÎÀ½Éʤ¬Î÷²Á¤Ç¤¢¤ë¤Ë¤â¤«¤«¤ï¤é¤ºÈó¾ï¤ËÍ¥¤ì¤¿³Ø½¬¥ê¥â¥³¥ó¤Ç¤¢¤ë¤³¤È¤¬µÒ´ÑŪ¤ËÌÀ¤é¤«¤Ë¤Ê¤Ã¤¿¡£

3-4 »îºî¥ê¥â¥³¥ó B ¤Ë¤è¤ëºÆ¸½¿®¹æ

A: À¸¥Ç¡¼¥¿¡§TSV ·Á¼°

B: ÇÈ·Á
C: ¥Ç¡¼¥¿Ãæ¤Î¥Ñ¥ë¥¹Ä¹¤ò½çÈÖ¤Ë 1T ¤Ç½ü»»¤·¤¿·ë²Ì
D: ¥Ç¡¼¥¿¤Ë½Ð¸½¤¹¤ë¥Ó¥Ã¥ÈÃÍ 0, 1 ¤ò¹½À®¤¹¤ë¸å³¥Ñ¥ë¥¹Ä¹¤ÈÀè¹Ô¥Ñ¥ë¥¹Ä¹¤ÎÈæΨ
C: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë
D: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

ɾ²Á

¤ª¤ª¤à¤Í¸µ¤Î¿®¹æ¤Ë¶á¤¤¥Ñ¥ë¥¹ÉʼÁ¤ò³ÎÊݤǤ­¤Æ¤¤¤ë¡£¼«ºî¤Î¿®¹æ¤¬¼õ¤±¤¤¤ì¤é¤ì¤Æ¥Û¥Ã¤È¤·¤Þ¤·¤¿¡£

3-5 ¼ê»ý¤Á·¿¥ê¥â¥³¥ó C ¤Ë¤è¤ëºÆ¸½¿®¹æ

A: À¸¥Ç¡¼¥¿¡§TSV ·Á¼°

B: ÇÈ·Á
C: ¥Ç¡¼¥¿Ãæ¤Î¥Ñ¥ë¥¹Ä¹¤ò½çÈÖ¤Ë 1T ¤Ç½ü»»¤·¤¿·ë²Ì
D: ¥Ç¡¼¥¿¤Ë½Ð¸½¤¹¤ë¥Ó¥Ã¥ÈÃÍ 0, 1 ¤ò¹½À®¤¹¤ë¸å³¥Ñ¥ë¥¹Ä¹¤ÈÀè¹Ô¥Ñ¥ë¥¹Ä¹¤ÎÈæΨ
C: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë
D: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

ɾ²Á

¥Ó¥Ã¥ÈÃÍ 0, 1 ¤È¤â¤ËÀè¹Ô¥Ñ¥ë¥¹Ä¹¤¬¥³¥ó¥¹¥¿¥ó¥È¤ËÍýÏÀÃͤò¥ª¡¼¥Ð¡¼¡¢0 ¤Î¸å³¥Ñ¥ë¥¹Ä¹¤ÏµÕ¤ËÂ礭¤¯¥¢¥ó¥À¡¼¤È¤Ê¤ë·¹¸þ¤¬¸²Ãø¤Ë¤ß¤é¤ì¤ë¡£Àè¹Ô¥Ñ¥ë¥¹Ä¹¤Î±Æ¶Á¤Ç¥Ñ¥ë¥¹Èæ¤ÏÁ´ÂÎŪ¤ËÌÜΩ¤Ã¤ÆÄ㤤¡£¤«¤Ê¤êÊʤΤ¢¤ë¿®¹æ¤È¹Í¤¨¤é¤ì¤ë¡£¥Ñ¥ë¥¹Éý¤Î¤Ð¤é¤Ä¤­¡¢¥Ñ¥ë¥¹Èæ¤ÎÄ㤵¡¢¤½¤Î¤¤¤º¤ì¤«¤¢¤ë¤¤¤ÏξÊý¤¬¥Á¥å¡¼¥Ê¦¤ËµöÍƤµ¤ì¤Ê¤«¤Ã¤¿¤³¤È¤¬È¿±þ NG ¤Î¸¶°ø¤È¹Í¤¨¤é¤ì¤ë¡£

3-6 ¥¹¥Þ¡¼¥È¥ê¥â¥³¥ó D ¤Ë¤è¤ëºÆ¸½¿®¹æ

A: À¸¥Ç¡¼¥¿¡§TSV ·Á¼°

B: ÇÈ·Á
C: ¥Ç¡¼¥¿Ãæ¤Î¥Ñ¥ë¥¹Ä¹¤ò½çÈÖ¤Ë 1T ¤Ç½ü»»¤·¤¿·ë²Ì
D: ¥Ç¡¼¥¿¤Ë½Ð¸½¤¹¤ë¥Ó¥Ã¥ÈÃÍ 0, 1 ¤ò¹½À®¤¹¤ë¸å³¥Ñ¥ë¥¹Ä¹¤ÈÀè¹Ô¥Ñ¥ë¥¹Ä¹¤ÎÈæΨ
C: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë
D: ¤Î¥Ò¥¹¥È¥°¥é¥à  ¡ÊÀ¸¥Ç¡¼¥¿¡§TSV ·Á¼°¡Ë

ɾ²Á

¸µ¿®¹æ¤È¤ÎÇÈ·ÁÁ´ÂΤξȹç¤Ç¤Î¥¿¥¤¥ß¥ó¥°¤º¤ì¤ÏÌÜΩ¤¿¤Ê¤«¤Ã¤¿¤¬¡¢¥Ñ¥ë¥¹Éý¤Ë¤â¥Ñ¥ë¥¹Èæ¤Ë¤âÈó¾ï¤Ë¤Ð¤é¤Ä¤­¤¬Â礭¤¤¡£¤Ï¤¿ÌܤˤÏ¿¤¯¤Îµ¡´ï¤¬¤³¤ÎÀ½Éʤο®¹æ¤Ç¥³¥ó¥È¥í¡¼¥ë¤Ç¤­¤Æ¤¤¤ë¤³¤È¤Î¤Û¤¦¤¬ÉԻ׵Ĥˤµ¤¨´¶¤¸¤é¤ì¤ë¡£°ìÈ̤βÈÅÅÀ½Éʤˤª¤¤¤Æ¥ê¥â¥³¥ó¿®¹æ¥Ç¡¼¥¿²ò¼á¤ÎµöÍÆÈϰϤ¬¹­¤¯ÀßÄꤵ¤ì¤Æ¤¤¤ë¤³¤È¤¬»¡¤»¤é¤ì¤ë¡£¹­¤¯ÍøÍѤµ¤ì¤Æ¤¤¤ëÀ½ÉʤǤ¢¤ë¤Ë¤â¤«¤«¤ï¤é¤º¤³¤ì¤Û¤ÉÍð¤ì¤¿¿®¹æ¤ò½Ð¤·¤Æ¤¤¤ë¤È¤ÏÁÛÁü¤·¤Æ¤¤¤Ê¤«¤Ã¤¿¡£¼ê¸µ¤Î¸ÄÂθÇÍ­¤ÎÌäÂê¡© ¥í¥Ã¥È¤Ë¤è¤ëÉʼÁ¤Î¤Ð¤é¤Ä¤­¡© ¤¢¤ë¤¤¤Ï¥¹¥Þ¡¼¥È¥ê¥â¥³¥ó¤ÎÀ­¼Á¾åÊ£¿ô¤ÎÀÖ³°Àþ LED ¤òÅëºÜ¤·¤Æ¤¤¤ë¤³¤È¤Î²¿¤é¤«¤Î±Æ¶Á¤«¡© ¤¤¤º¤ì¤Ë¤»¤è¡¢Á°·Ç¤Î¡Ö¼ê»ý¤Á·¿¥ê¥â¥³¥ó C¡×¤Î¿®¹æ¤ò¼õ¤±¤¤¤ì¤Ê¤¤µ¡´ï¤Ë¤³¤Î¿®¹æ¤¬ÄÌÍѤ¹¤ë¤È¤Ï¹Í¤¨¤Ë¤¯¤¤¡£

4. ·ëÏÀ

Á°¹à¤Ë·Ç¤²¤¿¥Ñ¥ë¥¹Éý¡¦¥Ñ¥ë¥¹Èæ¤Î¥Ò¥¹¥È¥°¥é¥à¤Î¿Þ¤ò¤¢¤é¤¿¤á¤Æʤ٤Ƥߤ롣Ðíâפ¹¤ë¤È¡Ö¼ê»ý¤Á·¿¥ê¥â¥³¥ó C¡×¡Ö¥¹¥Þ¡¼¥È¥ê¥â¥³¥ó D¡×¤Î¿®¹æ¤Ë´Þ¤Þ¤ì¤ë¥Ñ¥ë¥¹·²¤ÎÉʼÁ¤ÎÍðÄ´¤¬¤Ï¤Ã¤­¤ê¤È¸«¤Æ¤È¤ì¤ë¡£Â¾¤Î¥ê¥â¥³¥óʬ¤ÎÆÃħ¤È¤Îº¹°ã¤¬¸²Ãø¤Ç¤¢¤ë¤³¤È¤«¤é¡¢¤³¤Î¤Õ¤¿¤Ä¤Î³Ø½¬¥ê¥â¥³¥ó¤Î¿®¹æ¤¬¼ê¸µ¤Î¥Á¥å¡¼¥Ê¤Ë¼õ¤±¤¤¤ì¤é¤ì¤Ê¤¤¸½¾Ý¤Î¼ç°ø¤Ï¤³¤Î¥Ñ¥ë¥¹¤ÎγÅÙ¤ÎÍð¤ì¤Ë¤¢¤ë¤â¤Î¤ÈÁÛÄꤵ¤ì¤ë¡£












½ê´¶

º£²ó¤ÎÄ´ºº¤òÄ̤¸¤Æ¡¢¤ª¤½¤é¤¯¤ÏÀÖ³°Àþ¥ê¥â¥³¥ó¤Î¿®¹æ¤Ë¸Â¤é¤º¥Ñ¥ë¥¹¿®¹æÁ´È̤˶¦Ä̤¹¤ëÉʼÁɾ²Á¼´¤Î°ìü¤ò³Ø¤Ö¤³¤È¤¬¤Ç¤­¤¿¤è¤¦¤Ë»×¤¤¤Þ¤¹¡£ÌÜ»ë¤Ç¤ÏÇÈ·Á¤ÎÁ´ÂÎÁü¤¬¸µ¤Î¥ê¥â¥³¥ó¿®¹æ¤Î¤½¤ì¤È¤è¤¯»÷¤Æ¤¤¤ë¤Ë¤â¤«¤«¤ï¤é¤º¡¢¥¹¥Þ¡¼¥È¥ê¥â¥³¥ó D ¤Ë¤è¤ëºÆ¸½¿®¹æ¡Ê°Ê²¼¤Ë¸µ¿®¹æÇÈ·Á¤È¤Î¾È¹ç¿Þ¤òºÆ·Ç¡Ë¤¬¼Âºß¤Îµ¡´ï¤ÇÃƤ«¤ì¤ë¥±¡¼¥¹¤Î¤¢¤ë¤³¤È¤Ï¾ÝħŪ¤Ç¤¹¡£

¥ª¥·¥í¥¹¥³¡¼¥×Åù¤Çµð»ëŪ¤Ë¿®¹æÇÈ·ÁÁ´ÂΤò´Ñ»¡¤¹¤ë¤³¤È¤Ë¤ÏÊص¹¤¬¤¢¤ê¡¢¤Þ¤¿¤½¤Î³Îǧ¤Ï¤³¤¦¤¤¤Ã¤¿Ä´ºº¤ò¹Ô¤¦ºÝ¤Ë¤Ï·ç¤«¤»¤Þ¤»¤ó¤¬¡¢ÌµÀþÄÌ¿®¤ËÍѤ¤¤é¤ì¤ë¿®¹æ¤Ï¤¢¤¯¤Þ¤Ç¤âÀèƬ¤«¤é½ç¤òÄɤäÆÆâÍƤòµâ¤ó¤Ç¤¤¤¯¤â¤Î¤Ç¤¢¤ê»þ´Ö¤Î³µÇ°¤ò´Þ¤Þ¤Ê¤¤¥Ð¡¼¥³¡¼¥É¤Î¤è¤¦¤Ë»ë³Ð¤òÄ̤¸°ì½Ö¤ÇÁ´ÂΤò¤È¤é¤¨¤½¤³¤«¤é¾ðÊó¤òºÎ¼è¤·¤Æ¤¤¤¯À­¼Á¤Î¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤½¤Î¤¿¤á¡¢¿®¹æ¤ÎÉʼÁ¤òȽÃǤ¹¤ë¤¿¤á¤Ë¤Ï»þ´Ö¼´¤Ë¤½¤Ã¤Æ¥ß¥¯¥í¤Ë²ò¼á¤ò¹Ô¤¦É¬Íפ⤢¤ë¤³¤È¤òǧ¼±¤¹¤ëÎɤ¤µ¡²ñ¤È¤Ê¤ê¤Þ¤·¤¿¡£


(tanabe)
klab_gijutsu2 at 07:47¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2019ǯ02·î06Æü

¥¹¥Þ¡¼¥È¥×¥é¥° + ESP32 ¤ÇĶ¥·¥ó¥×¥ë¤Ë Wake On Wan

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

¥¹¥Þ¡¼¥È¥¹¥Ô¡¼¥«¡¼¤ÎÉáµÚ¤Ëȼ¤¤¥¹¥Þ¡¼¥È¥Û¡¼¥à·ÏÀ½ÉʤÎÄã²Á³Ê²½¤¬¾¯¤·¤º¤Ä¿Ê¤ó¤Ç¤¤¤Þ¤¹¡£ ºÇ¶á¥×¥é¥¤¥Ù¡¼¥È¤Ç¼¡¤ÎÀ½ÉʤòÇ㤤¤Þ¤·¤¿¡£º£¤Î¤È¤³¤í°ÂÄêÆ°ºî¤·¤Æ¤ª¤ê¼«Âð¤Ç»È¤Ã¤Æ¤¤¤ë Google Home Mini ¤È¤ÎÁêÀ­¤â¤è¤¯µ¤¤ËÆþ¤Ã¤Æ¤¤¤Þ¤¹¡£

¢¨¥¹¥Þ¡¼¥È¥×¥é¥°¤ò»È¤¨¤Ð²ÈÄíÍÑÅŸ»¤«¤é½êÄê¤Îµ¡´ï¤Ø¤ÎµëÅŤò¼ê·Ú¤ËÁàºî¤Ç¤­¤ë¤¿¤áÊØÍø¤Ç¤¹¤¬¡¢¸Ä¿ÍŪ¤Ë¤Ï²¿¤é¤«¤Î¸¶°ø¤Ç¼«Ê¬¤Î°Õ¿Þ¤·¤Ê¤¤Æ°ºî¤¬µ¯¤³¤Ã¤¿¾ì¹ç¤Ë¿¼¹ï¤Ê»öÂ֤ˤĤʤ¬¤ê¤«¤Í¤Ê¤¤µ¡´ï¤È¤ÎÊ»ÍѤÏÈò¤±¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¾¯¤Ê¤¯¤È¤â¸½»þÅÀ¤ÇÅŵ¤¥¹¥È¡¼¥Ö¤Ê¤É¤ò¤Ä¤Ê¤°Í¦µ¤¤Ï¤¢¤ê¤Þ¤»¤ó ^^;

¥¹¥Þ¡¼¥È¥×¥é¥°¤ò PC ¤Îµ¯Æ°¤ËÍøÍѤ¹¤ë

¥¹¥Þ¡¼¥È¥¹¥Ô¡¼¥«¡¼¤Ø¤Î²»À¼»Ø¼¨¤Ç PC ¤òµ¯Æ°¤¹¤ë¥¢¥¤¥Ç¥£¥¢¤Ë¤Ï¼ÂÍÑÀ­¤¬¤¢¤ê¡¢¥Í¥Ã¥È¤ò¸¡º÷¤¹¤ë¤È»²¹Í¤Ë¤Ê¤ë¿¤¯¤Î¶½Ì£¿¼¤¤Îã¤Ë¿¨¤ì¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°ìÊý¤Ç¡¢Meross Smart Plug Mini ¤ò¿¨¤Ã¤Æ¤¤¤ë¤¦¤Á¤Ë¤³¤ì¤ò»È¤¨¤Ð¤È¤Æ¤â¥·¥ó¥×¥ë¤ÊÆ»¶ñΩ¤Æ¤ÇƱÍͤΤ³¤È¤ò¼Â¸½¤Ç¤­¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È¹Í¤¨¤Þ¤·¤¿¡£°Ê²¼¤ÎȯÁۤˤè¤ë¤â¤Î¤Ç¤¹¡£

  1. ¤³¤Î¥×¥é¥°¤Ï¤â¤È¤â¤È¥ë¡¼¥¿±Û¤·¤ÎÆ°ºî¤òÁ°Äó¤È¤¹¤ë¥¯¥é¥¦¥É¥Ù¡¼¥¹¤Î¥¹¥Þ¡¼¥È¥Û¡¼¥à·ÏÀ½ÉʤǤ¢¤ë
  2. ¤½¤Î¤¿¤á¼«Á°¤ÇÄÌ¿®¤Þ¤ï¤ê¤ò¼è¤ê²ó¤¹¤³¤È¤Ê¤¯½êÄê¤Îµ¡´ï¤Ø¤ÎµëÅŤò²°Æâ³°¤«¤é»Ø¼¨¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë
  3. ¤È¤¤¤¦¤³¤È¤Ï¡¢¾åµ­ 2. ¤ÎµëÅÅÂоݤε¡´ï¤ò¡Öµ¯Æ°¤¹¤ë¤È LAN ¾å¤Ë½êÄê¤Î¥Þ¥¸¥Ã¥¯¥Ñ¥±¥Ã¥È¤òÁ÷¤ê½Ð¤¹ÆâÍÆ¤Î¥×¥í¥°¥é¥à¤ò½ñ¤­¹þ¤ó¤À¥Þ¥¤¥³¥ó¥Ü¡¼¥É¡×¤È¤·¤Æ¤ª¤±¤Ð¡¢¥¹¥Þ¡¼¥È¥¹¥Ô¡¼¥«¡¼·Ðͳ¤Ç¤¢¤ì¡¢¤½¤Î¾¤ÎÊýË¡¤Ç¤¢¤ì¡¢µëÅŻؼ¨¤Ò¤È¤Ä¤Ç´Êñ¤Ë LAN ¾å¤Î½êÄê¤Î PC ¤òµ¯Æ°¤Ç¤­¤ë¤Ï¤º

ÅŸ»ÅêÆþ¤«¤é¤Î¥¹¥¿¡¼¥È¤Ê¤Î¤Ç¥Ü¡¼¥É¦¤Î½é´ü½èÍý¤Ë¿¾¯¤Î»þ´Ö¤¬¤«¤«¤ë¤³¤È¤ÏͽÁÛ¤µ¤ì¤ë¤â¤Î¤ÎÁ´ÂΤȤ·¤Æ¶Ú¤ÏÄ̤äƤ¤¤Þ¤¹¡£ÆäËÆñ¤·¤¤Í×ÁǤâ¤Ê¤¤¤¿¤á¹ñÆâ³°¤Î¤É¤³¤«¤Ë¤¹¤Ç¤ËƱ°ì¤Î»öÎ㤬¤¢¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤ÈÁÛÁü¤·¤Þ¤·¤¿¤¬¡¢¼ê¸µ¤Ç¤¶¤Ã¤È¸«ÅϤ·¤¿ÈϰϤǤϸ«Åö¤¿¤é¤Ê¤¤¤è¤¦¤Ç¤¹¡£¤½¤ó¤Ê¤ï¤±¤Ç¡¢¤Þ¤¢¤â¤·ÀèÎ㤬¤¢¤Ã¤Æ¤â¤¤¤¤¤«¡¢¤È»×¤¤¤Ê¤¬¤é¤¶¤Ã¤¯¤ê·Á¤Ë¤·¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

¼ÂÁõ¤ÈÆ°ºî¤ÎÍÍ»Ò

¥¹¥Þ¡¼¥È¥×¥é¥°¤«¤é¤ÎµëÅÅÀè¤Ï²¿¤«¤ÈÍ»Ä̤Τ­¤¯ ESP32 ¥Ü¡¼¥É¤È¤·¤Þ¤·¤¿¡£AC ¥¢¥À¥×¥¿¤È USB ¥±¡¼¥Ö¥ë¤´¤·¤Ë¥Ü¡¼¥ÉñÂΤò¥×¥é¥°¤ØÀܳ¤·¤Æ»È¤¤¤Þ¤¹¡£ ¥×¥í¥°¥é¥à¤Ï°Ê²¼¤ÎÆâÍƤȤ·¤Þ¤·¤¿¡£ÂÐ¾Ý PC ¤¬µ¯Æ°¤¹¤ì¤ÐÅö³º¥Ü¡¼¥É¤Ï¤ªÌò¸æÌȤˤĤ­¥×¥í¥°¥é¥à¤«¤éµëÅŸµ¤Î¥×¥é¥°¤ò¥ª¥Õ¤Ë¤¹¤ë¤³¤È¤Ç¼«¤é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤·¤Þ¤¹¡£

  1. ½é´ü½èÍý¤È¤·¤Æ WiFi AP ¤È¤ÎÀܳ¤ò³ÎΩ
  2. ½êÄê¤Î¥Þ¥¸¥Ã¥¯¥Ñ¥±¥Ã¥È¤ò LAN ¤ØÁ÷½Ð
  3. ¥Þ¥¸¥Ã¥¯¥Ñ¥±¥Ã¥ÈÁ÷½Ð¸å¤ËÂÐ¾Ý PC ¤Ø ping ¤ò·Ñ³Ū¤Ëȯ¹Ô
  4. ping ¤Ø¤Î±þÅú¤ò¸¡ÃΤ·¤¿¤é¼«¥Ü¡¼¥É¤ØµëÅÅÃæ¤Î¥¹¥Þ¡¼¥È¥×¥é¥°¤ÎÄÌÅŤò¥ª¥Õ¤Ë¤¹¤ë

¤¢¤ï¤»¤Æ¥Í¥Ã¥È¥ï¡¼¥¯Àܳ»þ¤ÈÅŸ»ÀÚÃÇÁ°¤Ë¥á¡¼¥ë¤Ç¤½¤Î»Ý¤òÄÌÃΤ·¤Þ¤¹¡£¤³¤ÎÄÌÃΤϥê¥â¡¼¥È¤ÇÁàºî¤ò¹Ô¤¦¾ì¹ç¤Ë¤Ï¾õ¶·ÇÄ°®¤Î¤¿¤á¤ËÍ­ÍѤǤ¹¤¬¡¢¥¹¥Þ¡¼¥È¥¹¥Ô¡¼¥«¡¼¤ØÀ¼¤ò¤«¤±¤Æ¤¤¤ëºßÂð»þ¤Ë¤Ï¤¤¤µ¤µ¤«¾éĹ¤Ê¤Î¤Ç¤¤¤º¤ì¼ê¤ò²Ã¤¨¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£

¥½¡¼¥¹¥³¡¼¥É

Arduino IDE + Arduino core for the ESP32 ´Ä¶­¸þ¤±¤ËÍÑ°Õ¤·¤¿¥×¥í¥°¥é¥à¤Ç¤¹¡£
Á°¹à¤Ëµó¤²¤¿¥á¡¼¥ëÄÌÃνèÍý¤Ë¤Ï SendGrid ¤ò¡¢¥×¥é¥°¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¤Ë¤Ï IFTTT ¥¢¥×¥ì¥Ã¥È¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤é¤Ï ESP32_WakeOnLan.h ËÁƬ¤Î¡Ö#define USE_MAIL_NOTIFICATION¡×¡Ö#define USE_AUTO_SHUTDOWN¡×¤ÎÄêµÁ¤ò̵¸ú²½¤¹¤ì¤Ð¾Êά¤µ¤ì¤Þ¤¹¡£

¥Ç¥â

°ì¼°¤ÎÆ°ºî¤ÎÍͻҤò¼ý¤á¤¿Æ°²è¤Ç¤¹¡£ ¡Ê1ʬ10ÉáË

¡ÊÃí¡§¤³¤ÎÆ°²è¤Ë¤Ï "OK Google" ¤ÎȯÀ¼¤¬´Þ¤Þ¤ì¤Þ¤¹¡£
¶á¤¯¤Ë Goole Home ¥Ç¥Ð¥¤¥¹¤Î¤¢¤ë¾ì¹ç¤Ë¤Ï¤´Ãí°Õ²¼¤µ¤¤¡Ë

;Ã̤ʤ¬¤é¡¢¼ê¸µ¤Ç¤Ï²áµî¤Ë²¿ÅÙ¤« Wake On Wan ¤Î»î¤ß¤ò¹Ô¤¤¤½¤ì¤¾¤ìÅö¥Ö¥í¥°¤Îµ­»ö¤È¤·¤Æ¸ø³«¤·¤Æ¤¤¤Þ¤¹¡£¸«ÊÖ¤·¤Æ¤ß¤ë¤ÈÆ»¶ñΩ¤Æ¤ËÈù̯¤ËÅö»þ¤Î¾õ¶·¤¬È¿±Ç¤µ¤ì¤Æ¤ª¤ê¤Á¤ç¤Ã¤ÈÌÌÇò¤¯´¶¤¸¤Þ¤·¤¿¡£

»þÂ夬²Ã®¤ò³¤±¤Æ¤¤¤Þ¤¹¡£¿ôǯ¸å¤Î̤Í褬³Ú¤·¤ß¤Ç¤¹¡£


(tanabe)
klab_gijutsu2 at 04:50¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2018ǯ09·î05Æü

ESP32 ¥â¥¸¥å¡¼¥ë¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê°Å¹æ²½µ¡¹½¤Ë´Ø¤¹¤ë¥á¥â

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

ESP-WROOM-32 ¤ÎÆ⢥եé¥Ã¥·¥å¥á¥â¥ê¤Ë¤Ä¤¤¤ÆÄ´¤Ù¤Æ¤¤¤¿¤È¤³¤í¤Ç Flash Encryption ¤Ë¶½Ì£¤ò»ý¤Á¤½¤ÎÊØÍø¤µ¤ò¼Â´¶¤·¤Þ¤·¤¿¡£ ÍøÍÑÊýË¡¤Ë¤ä¤ä¹þ¤ßÆþ¤Ã¤¿Í×ÁǤâ´Þ¤Þ¤ì¤ë¤¿¤á¼«Ê¬ÍѤΥá¥â¤È¤·¤Æ°ìÏ¢¤Î¾ðÊó¤ò¹µ¤¨¤Æ¤ª¤¯¤³¤È¤Ë¤·¤Þ¤¹¡£

½ÅÍס§ ¤³¤Îµ­»ö¤Ë¤Ï¸í¤ê¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤½¤Î¸í¤ê¤¬¸¶°ø¤Ç²¿½è¤«¤Ç²¿¤é¤«¤Î»³²¤¬È¯À¸¤·¤¿¤È¤·¤Æ¤âÉ®¼Ô¤Ê¤é¤Ó¤ËÅö¼Ò¤Ï°ìÀÚ¤ÎÀÕǤ¤òÉ餤¤Þ¤»¤ó¡£¼Â¸³¤äÁàºî¤Ï¾åµ­¸ø¼°¥É¥­¥å¥á¥ó¥È¤ò½ÏÆɤξåɬ¤º¼«¸ÊÀÕǤ¤Ç¿µ½Å¤Ë¹Ô¤Ã¤Æ²¼¤µ¤¤¡£

³µÍ×

ESP32 ¥â¥¸¥å¡¼¥ë¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Ï esptool ¤ò»È¤¨¤Ð´Êñ¤ËÆɤ߽ñ¤­¤Ç¤­¤ë¤¿¤á¥Ð¥Ã¥¯¥¢¥Ã¥×Åù¤ËÊØÍø¤Ç¤¹¤¬¡¢¤½¤Î°ìÊý¤Ç¡¢¼«Ê¬¤Î¼ê¤òÎ¥¤ì¤¿¾ì½ê¤ÇÁõÃÖ¤ò²ÔƯ¤µ¤»¤ë¾ì¹ç¤Ê¤É¤Ë¾¼Ô¤ËÉÔÀµ¤Ê¥¯¥í¡¼¥ó¤òºîÀ®¤µ¤ì¤¿¤ê¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤ë¥»¥ó¥·¥Æ¥£¥Ö¤Ê¾ðÊó¤òÆɤޤì¤Æ¤·¤Þ¤¦²ÄǽÀ­¤â¤¢¤ê¤Þ¤¹¡£ ¤³¤¦¤¤¤Ã¤¿·üÇ°¤Ï Flash Encryption µ¡¹½¤òÍøÍѤ¹¤ì¤Ð³ÊÃʤ˷ڸº¤µ¤ì¤Þ¤¹¡£½êÄê¤Î¥â¥¸¥å¡¼¥ë¤Î¤â¤È¤Ç°Å¹æ²½¤·¤¿¥¤¥á¡¼¥¸¤ò¾¤Î¥â¥¸¥å¡¼¥ë¤Ø»ý¤Á¹þ¤ó¤Ç²ÔƯ¤µ¤»¤ë¤³¤È¤Ï¤Ç¤­¤º¡¢¤½¤³¤«¤é¾ðÊó¤òÀà»ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤»¤ó¡£

¤¿¤À¤·¡¢Flash Encryption ¤ÎÍøÍѤˤÏÂ礭¤¯¤Õ¤¿¤Ä¤ÎÃí°Õ¤¹¤Ù¤­ÅÀ¤¬¤¢¤ê¤Þ¤¹¡£

  1. ESP32 ¥Á¥Ã¥×Æâ¤Î OTP ¥á¥â¥ê¤Ø¤ÎÉԲĵդʽñ¤­¹þ¤ß¤òȼ¤¦
  2. ¤Ò¤È¤¿¤Ó Flash Encryption ¤òŬÍѤ·¤¿¥â¥¸¥å¡¼¥ë¤Ë¤ª¤¤¤Æ¤½¤ì°Ê¹ß¤Î¥¤¥á¡¼¥¸¤Î¹¹¿·»þ¤ËºÆ°Å¹æ²½¤ò¼Â»Ü²Äǽ¤Ê²ó¿ô¤Ï¡Ö3 ²ó¡×¤Þ¤Ç

¤³¤Î¤è¤¦¤Ë¡¢¥¢¥¯¥Æ¥£¥Ö¤Ê³«È¯¤ä¼Â¸³¤Î¥Õ¥§¡¼¥º¸þ¤­¤Ç¤Ï¤Ê¤¯¤ª¤ª¤à¤Í¥×¥í¥°¥é¥à´°À®Ãʳ¬¤Ç¤ÎËÜÈÖµ¡¤äÀ½ÉʤؤÎŬÍѤòÁÛÄꤷ¤¿µ¡¹½¤È¸À¤¨¤ë¤Ç¤·¤ç¤¦¡£¤½¤¦¤¤¤Ã¤¿»ö¾ð¤âÁê¤Þ¤Ã¤Æ¤«¡¢¤³¤ì¤òÀѶËŪ¤ËÍøÍѤ·¤Æ¤¤¤ë¸Ä¿Í¥æ¡¼¥¶¤Ïº£¤Î¤È¤³¤í¤¢¤Þ¤ê¿¤¯¤Ê¤¤¤è¤¦¤Ë¸«¼õ¤±¤é¤ì¤Þ¤¹¡£

¥Õ¥é¥Ã¥·¥å¥á¥â¥ê°Å¹æ²½¤Î¿¤¯¤Î¥á¥ê¥Ã¥È¤ò¹Í¤¨¤ë¤ÈÀˤ·¤¯´¶¤¸¤é¤ì¤Þ¤¹¤¬¡¢¼ÂºÝ¤Ë¤Ï¾åµ­ 2. ¤ÎÀ©¸Â¤Ï¡Ö»öÁ°À¸À®°Å¹æ²½¥­¡¼¡×¤òŬÀڤ˼è¤ê²ó¤¹¤³¤È¤Ç²óÈò¤¬²Äǽ¤Ç¤¹¡£¤½¤ÎÊýË¡¤Ç¤¢¤ì¤Ð Flash Encryption ¤ò¤´¤¯¼ê·Ú¤Ë°·¤¨¤ë¤¿¤á¡¢¤¿¤È¤¨¤Ð¥×¥í¥È¥¿¥¤¥Ô¥ó¥°Ãʳ¬¤Ç¤Î»îºîµ¡¤Ç¤ÎÍøÍѤʤÉÍÍ¡¹¤Ê³èÍÑÊýË¡¤¬¹Í¤¨¤é¤ì¤ë¤Ç¤·¤ç¤¦¡£

°Ê²¼¤Îµ­»ö¤Ç¤Ï¡¢ºÇ½é¤Ë Flash Encryption ¤Î¤·¤¯¤ß¤ÎÀ°Íý¤ò¹Ô¤¤¡¢¼¡¤Ë¾åµ­¤Î»öÁ°À¸À®°Å¹æ²½¥­¡¼¤òÍøÍѤ¹¤ë¼ê½ç¤È¼ÂºÝ¤Ë¤½¤ÎÁàºî¤ò¹Ô¤Ã¤¿µ­Ï¿¤òÎóµó¡¢ºÇ¸å¤Ë Arduino core for ESP32 ´Ä¶­¤Ç¤ÎÂбþÊýË¡Åù¤Ë¤Ä¤¤¤Æ¼ê¸µ¤Ç¹Ô¤Ã¤¿¼Â¸³¤ÎÆâÍƤȤ½¤Î·ë²Ì¤Ë¿¨¤ì¤Æ¤¤¤Þ¤¹¡£ ¤Ê¤ª¡¢Espressif ¤ÏÊ̤Υ»¥­¥å¥ê¥Æ¥£µ¡¹½¤Ç¤¢¤ë Secure Boot ¤È¤ÎÊ»ÍѤò¿ä¾©¤·¤Æ¤¤¤Þ¤¹¤¬¡¢¤³¤Îµ­»ö¤Ç¤Ï¤Þ¤º Flash Encryption ñÂΤËÃíÌܤ·¤Æ¤¤¤Þ¤¹¡£

  • ¼ê¸µ¤Ç¤Ï Linux ´Ä¶­¤Çºî¶È¤ò¹Ô¤Ã¤Æ¤ª¤ê¡¢µ­»öÃæ¤Î¥³¥Þ¥ó¥Éȯ¹ÔÎã¤Ê¤É¤Ë¡Ö/dev/ttyUSB0¡×Åù¤Î´Ä¶­¤Ë¨¤·¤¿µ­½Ò¤¬´Þ¤Þ¤ì¤Þ¤¹
  • Flash Encryption ¤ÎÁàºî¤Ç»ÈÍѤ¹¤ë esptool, espefuse, espsecure ¤Î³Æ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¢Linux, MacOSX ´Ä¶­ÍÑ¤Ë¤Ï Python ¥¹¥¯¥ê¥×¥È¤È¤·¤Æ¡¢Windows ´Ä¶­ÍÑ¤Ë¤Ï exe ¼Â¹Ô·Á¼°¤ÇÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£µ­»ö¤Ç¤Î¹½Ê¸Îã¤Ë¤Ï¾å¤ÈƱ¤¸Íýͳ¤Ç ".py" ¤Î³ÈÄ¥»Ò¤òµ­½Ò¤·¤Æ¤¤¤ë²Õ½ê¤¬¤¢¤ê¤Þ¤¹

Flash Encryption ¤Î¤·¤¯¤ß

¤Þ¤º¡¢¸ø¼°¥É¥­¥å¥á¥ó¥È¤ÎÆâÍƤò¤â¤È¤Ë Flash Encryption ¤Î¤·¤¯¤ß¤òÀ°Íý¤·¤Þ¤¹¡£

Á´ÂÎÁü

  

  • Flash Encryption ¤Ï ESP32 ¥â¥¸¥å¡¼¥ë¤ÎÆ⢥եé¥Ã¥·¥å¥á¥â¥ê¾å¤Î½êÄê¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤ÎÆâÍƤò AES-256 ¤Ç°Å¹æ²½¤¹¤ë¤â¤Î
  • °Å¹æ²½¥­¡¼¤ÏÅö³º¥â¥¸¥å¡¼¥ë¤Ç½é¤á¤Æ°Å¹æ²½¤ò¹Ô¤¦ºÝ¤Ë ESP32 ¥Á¥Ã¥×Æâ¤Î efuse ÎΰèÆâ¤Ë¥é¥ó¥À¥à¤ËÀ¸À®¤µ¤ì±Ê³Ū¤ËÊÝ»ý¤µ¤ì¤ë¡£À¸À®¤µ¤ì¤¿¥­¡¼¤Ø¤Î³°Éô¤«¤é¤Î¥¢¥¯¥»¥¹¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÉÔ²Ä
    • ESP32 efuse ¤Î¾ÜºÙ => espefuse - github.com/espressif
  • °Å¹æ²½¤Ï¥Ö¡¼¥È¥í¡¼¥À¤¬¹Ô¤¦¡£¶ñÂÎŪ¤Ë¤Ï¡¢make menuconfig - [Security Features] - [Enable flash encryption boot] ¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤¿¾õÂ֤ǥӥë¥É¤·¤¿¥Ö¡¼¥È¥í¡¼¥À¤¬¡¢Â¾¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸¤È¤È¤â¤Ë make flash ¤µ¤ì¤¿¸å¤Î½é²óµ¯Æ°»þ¤Ë°ì³ç¤·¤Æ°Å¹æ²½¤ò¼Â»Ü¤¹¤ë
    • ¤Ä¤Þ¤ê¡¢¾åµ­¥ª¥×¥·¥ç¥ó¤Ï¤½¤ÎÌÜŪ¤Ë¨¤·¤¿¥Ö¡¼¥È¥í¡¼¥À¥³¡¼¥É¤òÀ¸À®¤¹¤ë¤â¤Î¤Ç¤¢¤ê¡¢¤½¤Î¾¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸¤ÏÄ̾ï¤ÎÆâÍƤǥӥë¥É¤µ¤ì¤ë
  • °Å¹æ²½¤ÎÂоݤϰʲ¼¤Î¤È¤ª¤ê
    • ¥Ö¡¼¥È¥í¡¼¥À ¡Ê¥ª¥Õ¥»¥Ã¥È 0x1000, ºÇĹ¥µ¥¤¥º 0x7000 ¥Ð¥¤¥È¡Ë
    • ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë ¡Ê¥ª¥Õ¥»¥Ã¥È 0x8000, ¥µ¥¤¥º 0xC00 ¥Ð¥¤¥È¡Ë
    • Type = app ¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó
    • encrypted ¥Õ¥é¥°¤Î»ØÄꤵ¤ì¤¿¥Ñ¡¼¥Æ¥£¥·¥ç¥ó
      • ¤¿¤À¤·¡¢¼ê¸µ¤Î³Îǧ¤Ç¤ÏÀßÄê¾å spiffs ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤ÎÄêµÁ¤Ë¡Öspiffs,data,spiffs,0x291000,0x16F000,encrypted¡×¤ÎÍ×ÎΤǻØÄê¤òÉÕÍ¿¤·°Å¹æ²½¤òÍ­¸ú¤Ë¤·¤¿¤È¤³¤í¥×¥í¥°¥é¥à¼Â¹Ô»þ¤Ë¼¡¤Î¥¨¥é¡¼¤¬È¯À¸¤·¤¿¡§ "spiffs can not run on encrypted partition"
    • nvs ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó ¡Êkey-value ¥¹¥È¥¢Îΰè¡Ë ¤ò°Å¹æ²½¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡£ spiffs ¤ÈƱÍÍ¤Ë nvs ¤Ë¤âÀìÍѤΠAPI ¥»¥Ã¥È¤¬ÍÑ°Õ¤µ¤ì¤Æ¤ª¤ê¤½¤Ã¤Á¦¤Î¼ÂÁõ¤È¤Î¤«¤Í¤¢¤¤¤À¤Ã¤¿¤ê¡©
    • ¥É¥­¥å¥á¥ó¥È¾å¤Î´ØÏ¢²Õ½ê¤Î°úÍÑ¡£¤Á¤Ê¤ß¤Ë¼ê¸µ¤Ç¤Ï¤Þ¤À»È¤Ã¤¿¤³¤È¤Î¤Ê¤¤¡Öphy¡×¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Î¸ÀµÚ¤¬¤¢¤ë¤¬¡¢¡Öphysical access readout¡×¤¬ NG ¤Ë¤Ä¤­ esptool Åù¤ÇÆɤ߽Ф·ÉÔǽ¤Ç¤¢¤ë¤¿¤á¥È¥ì¡¼¥É¥ª¥Õ¤òÍý²ò¤·¤¿¾å¤ÇÍøÍѤ¹¤Ù¤­¤À¤í¤¦
      • None of the default partition tables include any encrypted data partitions.
      • It is not necessary to mark ¡Èapp¡É partitions as encrypted, they are always treated as encrypted.
      • The ¡Èencrypted¡É flag does nothing if flash encryption is not enabled.
      • It is possible to mark the optional phy partition with phy_init data as encrypted, if you wish to protect this data from physical access readout or modification.
      • It is not possible to mark the nvs partition as encrypted.
  • ²ÔƯÃæ¤Î¥×¥í¥°¥é¥à¤«¤é¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¾å¤Î¥Ç¡¼¥¿»²¾È¤ÎºÝ¤ÎÉü¹æ¤ÏÆ©²áŪ¤Ë¹Ô¤ï¤ì¤ë

Ãí°ÕÅÀ

Flash Encryption ¤Ë¤ª¤¤¤Æ¤Ï 8 ¥Ó¥Ã¥È¤Î¡ÖFLASH_CRYPT_CNT¡×efuse ¤¬Èó¾ï¤Ë½ÅÍס£¤¢¤é¤«¤¸¤á¤½¤ÎÌò³ä¤È°ÕÌ£¤òÀµ¤·¤¯ÇÄ°®¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ë¡£

  • ¤Þ¤º¡¢¼ê¸µ¤Ë¤¢¤ë Flash Encryption ̤¼Â»Ü¤Î ESP32-DevKitC ¤ËÂФ· Espressif Ä󶡤Πespefuse ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î summary ¥³¥Þ¥ó¥É, dump ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿·ë²Ì¤ò°Ê²¼¤Ë¼¨¤¹
    $ espefuse.py --port /dev/ttyUSB0 summary
    espefuse.py v2.3.1
    Connecting.....
    Security fuses:
    FLASH_CRYPT_CNT        Flash encryption mode counter                     = 0 R/W (0x0)
    FLASH_CRYPT_CONFIG     Flash encryption config (key tweak bits)          = 0 R/W (0x0)
    CONSOLE_DEBUG_DISABLE  Disable ROM BASIC interpreter fallback            = 0 R/W (0x0)
    ABS_DONE_0             secure boot enabled for bootloader                = 0 R/W (0x0)
    ABS_DONE_1             secure boot abstract 1 locked                     = 0 R/W (0x0)
    JTAG_DISABLE           Disable JTAG                                      = 0 R/W (0x0)
    DISABLE_DL_ENCRYPT     Disable flash encryption in UART bootloader       = 0 R/W (0x0)
    DISABLE_DL_DECRYPT     Disable flash decryption in UART bootloader       = 0 R/W (0x0)
    DISABLE_DL_CACHE       Disable flash cache in UART bootloader            = 0 R/W (0x0)
    BLK1                   Flash encryption key                              
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
    BLK2                   Secure boot key                                   
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
    BLK3                   Variable Block 3                                  
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
    
    Efuse fuses:
    WR_DIS                 Efuse write disable mask                          = 0 R/W (0x0)
    RD_DIS                 Efuse read disablemask                            = 0 R/W (0x0)
    CODING_SCHEME          Efuse variable block length scheme                = 0 R/W (0x0)
    KEY_STATUS             Usage of efuse block 3 (reserved)                 = 0 R/W (0x0)
    
    Config fuses:
    XPD_SDIO_FORCE         Ignore MTDI pin (GPIO12) for VDD_SDIO on reset    = 0 R/W (0x0)
    XPD_SDIO_REG           If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset   = 0 R/W (0x0)
    XPD_SDIO_TIEH          If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V   = 0 R/W (0x0)
    SPI_PAD_CONFIG_CLK     Override SD_CLK pad (GPIO6/SPICLK)                = 0 R/W (0x0)
    SPI_PAD_CONFIG_Q       Override SD_DATA_0 pad (GPIO7/SPIQ)               = 0 R/W (0x0)
    SPI_PAD_CONFIG_D       Override SD_DATA_1 pad (GPIO8/SPID)               = 0 R/W (0x0)
    SPI_PAD_CONFIG_HD      Override SD_DATA_2 pad (GPIO9/SPIHD)              = 0 R/W (0x0)
    SPI_PAD_CONFIG_CS0     Override SD_CMD pad (GPIO11/SPICS0)               = 0 R/W (0x0)
    DISABLE_SDIO_HOST      Disable SDIO host                                 = 0 R/W (0x0)
    
    Identity fuses:
    MAC                    MAC Address                                       
      = 30:ae:a4:02:59:c0 (CRC 9b OK) R/W 
    CHIP_VER_REV1          Silicon Revision 1                                = 0 R/W (0x0)
    CHIP_VERSION           Reserved for future chip versions                 = 0 R/W (0x0)
    CHIP_PACKAGE           Chip package identifier                           = 0 R/W (0x0)
    
    Calibration fuses:
    BLK3_PART_RESERVE      BLOCK3 partially served for ADC calibration data  = 0 R/W (0x0)
    ADC_VREF               Voltage reference calibration                     = 1100 R/W (0x0)
    
    Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).
    
    $ espefuse.py --port /dev/ttyUSB0 dump
    espefuse.py v2.3.1
    Connecting....
    EFUSE block 0:
    00000000 a40259c0 009b30ae 00000000 00000036 00000000 00000000
    EFUSE block 1:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    EFUSE block 2:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    EFUSE block 3:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    
  • FLASH_CRYPT_CNT ¤Ï°Å¹æ²½¤ò¹Ô¤Ã¤¿²ó¿ô¤È°Å¹æ²½¤ÎÍ­¸ú̵¸ú¾õÂÖ¤ò´ÉÍý¤¹¤ë¡£½é´üÃͤϾå¤Î¤È¤ª¤ê¥¼¥í ¡ÊBIN: 0000 0000¡Ë¤Ç¤¢¤ê¡¢¥Ö¡¼¥È¥í¡¼¥À¤¬½é¤á¤Æ°Å¹æ²½¤ò¹Ô¤Ã¤¿»þÅÀ¤Ç BIN:0000 0001 ¤ËÊѲ½¤¹¤ë ¡ÊÉԲĵաË
  • FLASH_CRYPT_CNT ¤Î ON ¥Ó¥Ã¥È¿ô¤¬¶ö¿ô¤Î¾ì¹ç¤Ï°Å¹æ²½¤¬Ìµ¸ú¤Ê¾õÂÖ¡¢´ñ¿ô¤Î¾ì¹ç¤Ï°Å¹æ²½¤¬Í­¸ú¤Ê¾õÂ֤Ǥ¢¤ë¤³¤È¤ò¼¨¤¹
  • FLASH_CRYPT_CNT ¤Î ON ¥Ó¥Ã¥È¿ô¤¬´ñ¿ô¡¢¤¹¤Ê¤ï¤Á°Å¹æ²½¤¬Í­¸ú¤Ê¾õÂÖ¤ÇÊ̤Υץ졼¥ó¤Ê¥¤¥á¡¼¥¸¤ò make flash ¤¹¤ë¤Èµ¯Æ°ÉԲĤȤʤ롣¤³¤ì¤Ï¡¢ESP32 ¤¬ efuse Îΰè¤ËÊÝ»ý¤·¤Æ¤¤¤ë¥­¡¼¤Ç°Å¹æ²½¤µ¤ì¤¿¥¤¥á¡¼¥¸¤Î´üÂÔ¤µ¤ì¤ë¾õ¶·¤Ç¤¢¤ë¤Ë¤â¤«¤«¤ï¤é¤º¾ì°ã¤¤¤Ê¥¤¥á¡¼¥¸¤ËľÌ̤·¤¿·ë²Ì¤Î½êºî
  • ¾åµ­¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï°Ê²¼¤Î¼ê½ç¤Ç Flash Encryption ¤ò̵¸ú²½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë ¡ÊÃí¡§¼ê¸µ¤Ç¤Ï¤³¤ÎÁàºî¤Ï̤³Îǧ¡Ë
    1. make menuconfig - [Security Features] - [Enable flash encryption boot] ¥ª¥×¥·¥ç¥ó¤ò³Î¼Â¤Ë̵¸ú²½¤·¤Æ make && make flash
    2. ¼êºî¶È¤Ç FLASH_CRYPT_CNT ¤Î ON ¥Ó¥Ã¥È¿ô¤ò¶ö¿ô¤Ë¤¹¤ë¤³¤È¤Ç°Å¹æ²½Ìµ¸ú¤Î¾õÂ֤ˤ¹¤ë¡£¶ñÂÎŪ¤Ë¤Ï¡¢espefuse ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤Ã¤Æ FLASH_CRYPT_CNT ¤ËÂФ· burn_efuse ¥³¥Þ¥ó¥É¤òȯ¹Ô¤¹¤ë¤È¸½ºß¤â¤Ã¤È¤â¾å°Ì¤Î ON ¥Ó¥Ã¥È¤Îº¸Â¦¤Î¥Ó¥Ã¥È¤¬ ON ¤Ë¤Ê¤ë¡£¤Ä¤Þ¤ê¡¢FLASH_CRYPT_CNT ¡á BIN:0000 0001 ¤Î¾õÂ֤Ǽ¹Ԥ¹¤ë¤È BIN:0000 0011 ¤ËÊѲ½¤¹¤ë => ON ¥Ó¥Ã¥È¿ô¤¬¶ö¿ô¤Ê¤Î¤Ç°Å¹æ²½Ìµ¸ú¾õÂÖ
      espefuse.py --port /dev/ttyUSB0 burn_efuse FLASH_CRYPT_CNT
    3. ESP32 ¥Ü¡¼¥É¤ò¥ê¥»¥Ã¥È¤¹¤ë¤ÈÀµ¾ï¤Ë²ÔƯ¤¹¤ë

  • OTP ¥á¥â¥ê¤Ç¤¢¤ë efuse Îΰè¤Ø¤ÎÊѹ¹¤ÏÉԲĵդǤ¢¤ë¤¿¤á¡¢8 ¥Ó¥Ã¥È¤Î FLASH_CRYPT_CNT ¤ËÂФ¹¤ë¾åµ­¤Î¡Ö°Å¹æ²½¤È̵¸ú²½¡×¤Î¾å¸Â²ó¿ô¤Ï 4 ²ó¡£°Ê²¼¤Ë¾õÂ֤ΰìÍ÷¤ò¼¨¤¹¡£ 9. ¤Î̵¸ú²½ 4 ²ó¤á¤ÇÁ´¥Ó¥Ã¥È¤¬ ON ¡á 0xFF ¤Ë¤Ê¤ë¤ÈÅö³º ESP32 ¥â¥¸¥å¡¼¥ë¤Ç¤Î Flash Encryption ¤Ï±Êµ×¤Ë̵¸ú¤È¤Ê¤ë
    1. BIN:0000 0000¡¡¹©¾ì½Ð²Ù»þ
    2. BIN:0000 0001¡¡°Å¹æ²½ 1 ²ó¤á
    3. BIN:0000 0011¡¡Ìµ¸ú²½ 1 ²ó¤á
    4. BIN:0000 0111¡¡°Å¹æ²½ 2 ²ó¤á
    5. BIN:0000 1111¡¡Ìµ¸ú²½ 2 ²ó¤á
    6. BIN:0001 1111¡¡°Å¹æ²½ 3 ²ó¤á
    7. BIN:0011 1111¡¡Ìµ¸ú²½ 3 ²ó¤á
    8. BIN:0111 1111¡¡°Å¹æ²½ 4 ²ó¤á
    9. BIN:1111 1111¡¡Ìµ¸ú²½ 4 ²ó¤á

  • ¤Ê¤ª¡¢¤¢¤ë»þÅÀ¤Ç¤Î FLASH_CRYPT_CNT ¤Î¾õÂÖ¤ò±Ê³²½¤µ¤»¤¿¤¤¾ì¹ç¤Ï espefuse.py ¤Î write_protect_efuse ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¡£¸í¤Ã¤Æ¼Â¹Ô¤¹¤ë¤È¼êµÍ¤Þ¤ê¤Ë¤Ê¤ë¤¿¤áÍ×Ãí°Õ
    espefuse.py --port /dev/ttyUSB0 write_protect_efuse FLASH_CRYPT_CNT
  • ¤Þ¤¿¡¢°Ê²¼¤Î»ö¾ð¤Ë¤âÃí°Õ¤¬É¬Í×
    • Read- and Write- protecting efuses - espefuse - github.com/espressif
      NOTE that efuses are often read/write protected as a group, so protecting one will cause some related efuses to become protected. espefuse.py will confirm the full list of efuses that will become protected.

»öÁ°À¸À®°Å¹æ²½¥­¡¼¤ÎÍøÍѤˤè¤ë Flash Encryption

ESP32 ¥Á¥Ã¥×ÆâÉô¤ËÊÝ»ý¤µ¤ì¤ë¥Õ¥é¥Ã¥·¥å¥á¥â¥ê°Å¹æ²½¥­¡¼¤Ï¥Û¥¹¥È PC ¾å¤ÇÀ¸À®¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£¥­¡¼¤ÎÀ¸À®¤ò ESP32 ¦¤Ç¹Ô¤¦¤È¤½¤ì°Ê¹ß¤Î°Å¹æ²½½èÍý¤ÏÁ°½Ò¤Î FLASH_CRYPT_CNT ¤Î´ÉÍý²¼¤Ç¥Ö¡¼¥È¥í¡¼¥À¤Ø°Ñ¤Í¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢¥Û¥¹¥È PC ¾å¤Ç¥­¡¼¤òÀ¸À®¤¹¤ì¤Ð³«È¯¼Ô¤¬¼çÂÎŪ¤Ë½êÄê¤Î¥¤¥á¡¼¥¸¤Î°Å¹æ²½¤ò¹Ô¤¦¤³¤È¤¬²Äǽ¤È¤Ê¤ê¡¢µ®½Å¤Ê FLASH_CRYPT_CNT ¤ò¾ÃÈñ¤¹¤ë¤³¤È¤Ê¤¯ Flash Encryption ¤ò·Ñ³Ū¤ËÍøÍѤǤ­¤Þ¤¹¡£¥Û¥¹¥È PC ¾å¤ÇÀ¸À®¤·¤¿¥­¡¼¤Ï espefuse ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î burn_key ¥³¥Þ¥ó¥É¤Ç ESP32 ¤Î efuse Îΰè¤Ø½ñ¤­¹þ¤ó¤À¾å¤Ç»ÈÍѤ·¤Þ¤¹¡£

³µÍ×

¥É¥­¥å¥á¥ó¥È¤è¤ê¡£

  • Reflashing via Pregenerated Flash Encryption Key - Flash Encryption - esp-idf.readthedocs.io
    Reflashing via Pregenerated Flash Encryption Key

    It is possible to pregenerate a flash encryption key on the host computer and burn it into the ESP32¡Çs efuse key block. This allows data to be pre-encrypted on the host and flashed to the ESP32 without needing a plaintext flash update.

    This is useful for development, because it removes the 4 time reflashing limit. It also allows reflashing the app with secure boot enabled, because the bootloader doesn¡Çt need to be reflashed each time.

    Important

    This method is intended to assist with development only, not for production devices. If pre-generating flash encryption for production, ensure the keys are generated from a high quality random number source and do not share the same flash encryption key across multiple devices.
           :
    Google Ìõ¡§
    »öÁ°À¸À®¤µ¤ì¤¿¥Õ¥é¥Ã¥·¥å°Å¹æ²½¥­¡¼¤Ë¤è¤ë¥ê¥Õ¥é¥Ã¥·¥å

    ¥Û¥¹¥È¥³¥ó¥Ô¥å¡¼¥¿¤Ë¥Õ¥é¥Ã¥·¥å°Å¹æ²½¥­¡¼¤ò»öÁ°¤ËÀ¸À®¤·¡¢ESP32¤Îefuse¥­¡¼¥Ö¥í¥Ã¥¯¤Ë½ñ¤­¹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥Ç¡¼¥¿¤ò¥Û¥¹¥È¾å¤Ç»öÁ°°Å¹æ²½¤·¡¢Ê¿Ê¸¥Õ¥é¥Ã¥·¥å¹¹¿·¤òɬÍפȤ»¤º¤ËESP32¤Ë¥Õ¥é¥Ã¥·¥å¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

    ¤³¤ì¤Ï4²ó¤Î¥ê¥Õ¥é¥Ã¥·¥åÀ©¸Â¤ò¼è¤ê½ü¤¯¤¿¤á¡¢³«È¯¤ËÌòΩ¤Á¤Þ¤¹¡£¤Þ¤¿¡¢Ëè²ó¥Ö¡¼¥È¥í¡¼¥À¤ò¥ê¥Õ¥é¥Ã¥·¥å¤¹¤ëɬÍפ¬¤Ê¤¤¤¿¤á¡¢¥»¥­¥å¥¢¥Ö¡¼¥È¤òÍ­¸ú¤Ë¤·¤Æ¥¢¥×¥ê¤ò¥ê¥Õ¥é¥Ã¥·¥å¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£

    ½ÅÍ×

    ¤³¤Î¥á¥½¥Ã¥É¤Ï¡¢³«È¯¤Î»Ù±ç¤Î¤ßÌÜŪ¤È¤·¤Æ¤ª¤ê¡¢ËÜÈÖÍѤΥǥХ¤¥¹ÍѤǤϤ¢¤ê¤Þ¤»¤ó¡£¥×¥í¥À¥¯¥·¥ç¥óÍѤΥեé¥Ã¥·¥å°Å¹æ²½¤ò»öÁ°À¸À®¤¹¤ë¾ì¹ç¤Ï¡¢¥­¡¼¤¬¹âÉʼÁ¤ÎÍð¿ô¥½¡¼¥¹¤«¤éÀ¸À®¤µ¤ì¡¢Ê£¿ô¤Î¥Ç¥Ð¥¤¥¹´Ö¤ÇƱ¤¸¥Õ¥é¥Ã¥·¥å°Å¹æ²½¥­¡¼¤ò¶¦Í­¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
           :
¿¤¯¤Î¸Ä¿Í¥æ¡¼¥¶¤Îºî¶È¤ÎÂçÉôʬ¤Ï¤Þ¤µ¤Ë¡Ö³«È¯¡×¤Ç¤¢¤ê¡¢¤½¤Î²áÄø¤Ç¥Õ¥é¥Ã¥·¥å¥á¥â¥ê°Å¹æ²½¤Î²¸·Ã¤òµý¼õ¤Ç¤­¤ë¤³¤È¤ÏÍ­¤êÆñ¤¤¡£»öÁ°À¸À®°Å¹æ²½¥­¡¼¤òÍøÍѤ·¤¿ Flash Encryption ¤Îή¤ì¤ò²¼¿Þ¤Ë¼¨¤¹¡£

¼ê½ç

°Ê²¼¤Î°ìÏ¢¤Î¼ê½ç¤Ç¤Ï¡¢´û½Ð¤Î esptool, espefuse ¤Ë²Ã¤¨¡¢espsecure ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ¹¤ë¡£

½é²ó¤Î°Å¹æ²½¤ò½ª¤¨¤ë¤Þ¤Ç

Âè°ìÃʳ¬¤È¤·¤Æ¡¢¤Þ¤º½é²ó¤Î°Å¹æ²½¤Þ¤Ç¤ò´°Î»¤µ¤»¤ë¡£¥Û¥¹¥È PC ¾å¤ÇÀ¸À®¤·¤¿°Å¹æ²½¥­¡¼¤ò ESP32 ¤Î efuse ¤ØÀè¹Ô¤·¤Æ½ñ¤­¹þ¤à¤³¤È¤¬¤³¤³¤Ç¤Î¥Ý¥¤¥ó¥È¡£

  1. °Å¹æ²½¥­¡¼¤ò¥Û¥¹¥È PC ¾å¤ÇÀ¸À®¤¹¤ë¡£½é²ó¤Î¤ß¡£ÀäÂФËʶ¼º¤·¤Ê¤¤¤³¤È
    espsecure.py generate_flash_encryption_key ./mykey.bin
  2. À¸À®¤·¤¿¥­¡¼¤ò ESP32 ¤Î efuse ¤Ø½ñ¤­¹þ¤à¡£¼è¤ê¾Ã¤·ÉÔ²Ä
    espefuse.py --port /dev/ttyUSB0 burn_key flash_encryption ./mykey.bin
    ¢¨¤³¤Î¼ê½ç¤Ç²¼µ­¡Ö3. ½é²ó¤Î Flash Encryption¡×¤ËÀè¹Ô¤·¤Æ efuse ¤Ø°Å¹æ²½¥­¡¼¤ò½ñ¤­¹þ¤à¤³¤È¤Ë¤è¤ê¡¢ËÜÍè¤Ï¥Ö¡¼¥È¥í¡¼¥À¤Ë¤è¤ë½é²ó¤Î°Å¹æ²½¼Â¹Ô¤ÎÁ°½èÍý¤È¤·¤Æ ESP32 ¥Á¥Ã¥×Æâ¤Ç¹Ô¤ï¤ì¤ë°Å¹æ²½¥­¡¼¤ÎÀ¸À®¤¬¥¹¥­¥Ã¥×¤µ¤ì¤ë
  3. ½é²ó¤Î Flash Encryption ¤ò¼Â¹Ô
    ½é²ó¤Î°Å¹æ²½¤Ï»öÁ°À¸À®¥­¡¼¤ò»È¤ï¤Ê¤¤¾ì¹ç¤Î¼ê½ç¤ÈƱ¤¸
    1. make menuconfig ¤Ç [Security Features] - [Enable flash encryption boot] ¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤ÆÊݸ½ªÎ»
    2. make ¤ò¼Â¹Ô
    3. make flash monitor ¤ò¼Â¹Ô
    4. flash ¸å¤Î¥ê¥»¥Ã¥È¤ò·Ð¤Æ¥Ö¡¼¥È¥í¡¼¥À¤Ë¤è¤ë°Å¹æ²½¤¬»Ï¤Þ¤ë¡Ê´°Î»¤Þ¤ÇÅŸ»¤òÍî¤È¤µ¤Ê¤¤¤³¤È¡Ë¡£¥·¥ê¥¢¥ë½ÐÎϤΠmonitor ¤Ï Ctrl+']' ¤Ç½ªÎ»
    5. °Å¹æ²½¤¬´°Î»¤¹¤ë¤È¥Ö¡¼¥È¥í¡¼¥À¤¬ ESP32 ¤Ë¥ê¥»¥Ã¥È¤ò¤«¤±¤ë ¡Á °Å¹æ²½¤µ¤ì¤¿¥¤¥á¡¼¥¸¤Ç¥×¥í¥°¥é¥à¤¬µ¯Æ°
    6. Á°·Ç¤Î espefuse.py --port [PORT] summary ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·ÀèƬ¤Î FLASH_CRYPT_CNT ¤¬¡Ö1 R/W (0x1)¡×¤ËÊѤï¤Ã¤Æ¤¤¤ë¤³¤È¤ò³Îǧ

¥Û¥¹¥È PC ¾å¤Ç¤Î¥¤¥á¡¼¥¸¤Î°Å¹æ²½¤È¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Ø¤Î½ñ¤­¹þ¤ß

½é²ó¤Î°Å¹æ²½¤Ï¾å¤Î¼ê½ç¤Ç OK¡£¤½¤ì°Ê¹ß¤Ë¥Ó¥ë¥É¤·¤¿¥¤¥á¡¼¥¸¤Ë¤Ä¤¤¤Æ¤Ï¼ê¸µ¤Ç°Å¹æ²½¤ò¹Ô¤Ã¤¿¾å¤Ç ESP32 ¤ØžÁ÷¤¹¤ì¤Ð¤è¤¤¡£°Ê²¼¤ÎÎã¤Ï app ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸Ê¬¤À¤¬¡¢É¬Íפ˱þ¤¸¤Æ¾¤Î¥¤¥á¡¼¥¸¤â°Å¹æ²½¤·¤Æ½ñ¤­¹þ¤à¡£¤Ê¤ª¡¢¥Ó¥ë¥É¤·¤¿¤Þ¤Þ¤Î¾õÂ֤Υ֡¼¥È¥í¡¼¥À¥¤¥á¡¼¥¸¤òºÆÅÙ¥Õ¥é¥Ã¥·¥å¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ESP32 ¦¤Ç¤Ï¥Ö¡¼¥È¥í¡¼¥À¼«ÂΤ⤹¤Ç¤Ë°Å¹æ²½¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡£

  1. ¹¹¿·¤·¤¿¥×¥í¥°¥é¥à¤ò make ¤·¤Æ¥¤¥á¡¼¥¸¤ò¥Ó¥ë¥É¤¹¤ë¡£make flash ¤Ï¹Ô¤ï¤Ê¤¤¤³¤È
  2. espsecure.py ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤Ã¤Æ¥Û¥¹¥È PC ¾å¤ÇÅö³º¥¤¥á¡¼¥¸¤ò°Å¹æ²½¤¹¤ë¡£--address ¤Ï¥¤¥á¡¼¥¸¥Ó¥ë¥É»þÅÀ¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥óÄêµÁ¤Ë¤½¤Ã¤Æ»ØÄꤹ¤ë¡£ ²¼µ­Îã¤Ç¤Ï¸µ¤Î¥×¥ì¡¼¥ó¤Ê¥¤¥á¡¼¥¸¤¬¡Öbuild/mySimpleApp.bin¡×¤Ç¤¢¤ê¡¢½ÐÎϤ¹¤ë°Å¹æ²½¥¤¥á¡¼¥¸¤¬¡Öbuild/mySimpleApp_Encrypted.bin¡×¤Ç¤¢¤ë
    espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x10000 -o build/mySimpleApp_Encrypted.bin build/mySimpleApp.bin
  3. °Å¹æ²½¤·¤¿¥¤¥á¡¼¥¸¤ò esptool ¤Ç ESP32 ¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Ø½ñ¤­¹þ¤ó¤Ç´°Î»
    esptool.py --port /dev/ttyUSB0 --baud 921600 write_flash 0x10000 build/mySimpleApp_Encrypted.bin

Á°¹à¤ÎÁàºî¤ò¹Ô¤Ã¤¿µ­Ï¿

¼ê¸µ¤Ç¼ÂºÝ¤ËÁ°¹à¤ÎÁàºî¤ò¹Ô¤¤¤½¤ÎÍͻҤȷë²Ì¤òµ­Ï¿¤·¤Þ¤·¤¿¡£¤³¤ì¤¬½é¤á¤Æ¤Î Flash Encryption ¤ÎÁàºî¤Ç¡¢³ÆÆ°²è¤Ï°ìȯ»£¤ê¤·¤¿¤â¤Î¤Ç¤¹¡£

¥Æ¥¹¥ÈÍÑ¤Î¥×¥í¥°¥é¥à¤È¤·¤Æ°Ê²¼¤Î¡ÖmySimpleApp.c¡×¤ò»ÈÍÑ¡£LED ÅÀÌǥ롼¥×Ãæ¤Ë Flash Encryption ¤ÎÍ­¸ú̵¸ú¾õÂÖ¤ò¥·¥ê¥¢¥ë½ÐÎϤ¹¤ëÆâÍÆ¡£

#include <stdio.h>
#include "esp_flash_encrypt.h"
#include "esp_event.h"
#include "esp_log.h"
#include "driver/gpio.h"

const char *secretData = "**** this is secret data ****";
const char *TAG = "TAG";

void app_main()
{
  ESP_LOGI(TAG, "%s", secretData);
  gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
  int sts = 1;
  for (int i = 0; i < 10; i++) {
    if (esp_flash_encryption_enabled()) {
      ESP_LOGI(TAG, "Flash Encryption is enabled");
    } else {
      ESP_LOGI(TAG, "Flash Encryption is disabled");
    }
    gpio_set_level(GPIO_NUM_2, sts);
    sts = !sts;
    vTaskDelay(1000 / portTICK_PERIOD_MS);
  }
}
¤Þ¤º Flash Encryption Í­¸ú²½Á°¤ÎÁǤξõÂ֤Υܡ¼¥É¤ËÂФ· make flash monitor ¤ò¹Ô¤Ã¤¿Íͻҡ£"Flash Encryption is disabled" ¤Î½ÐÎϤ¬¸«¤¨¤ë¡£

Æ°²è A
  

°Ê²¼¡¢»öÁ°À¸À®°Å¹æ²½¥­¡¼¤ò»È¤Ã¤¿ Flash Encryption Áàºî¤Îµ­Ï¿¡£

  1. °Å¹æ²½¥­¡¼¤ò¥Û¥¹¥È PC ¾å¤ÇÀ¸À® ¡Á À¸À®¤·¤¿¥­¡¼¤ò ESP32 ¤Î efuse Îΰè¤Ø½ñ¤­¹þ¤à
    $ espsecure.py generate_flash_encryption_key ./mykey.bin
    espsecure.py v2.3.1
    
    $ espefuse.py --port /dev/ttyUSB0 burn_key flash_encryption ./mykey.bin
    espefuse.py v2.3.1
    Connecting......
    Write key in efuse block 1. The key block will be read and write protected (no further changes or readback). This is an irreversible operation.
    Type 'BURN' (all capitals) to continue.
    BURN
    Burned key data. New value: 6a 60 3c a7 d0 3f d4 9f b0 a3 f9 ca 77 61 10 47 30 57 80 c5 5c fd bc a0 ce 30 3e 36 b1 b5 ac c4
    Disabling read/write to key efuse block...
    
    
    Æ°²è B
  2. ¾åµ­ 1. Áàºî¸å¤Î efuse ¤Î¾õÂÖ
    $ espefuse.py --port /dev/ttyUSB0 summary
    espefuse.py v2.3.1
    Connecting......
    Security fuses:
    FLASH_CRYPT_CNT        Flash encryption mode counter                     = 0 R/W (0x0)
    FLASH_CRYPT_CONFIG     Flash encryption config (key tweak bits)          = 0 R/W (0x0)
    CONSOLE_DEBUG_DISABLE  Disable ROM BASIC interpreter fallback            = 0 R/W (0x0)
    ABS_DONE_0             secure boot enabled for bootloader                = 0 R/W (0x0)
    ABS_DONE_1             secure boot abstract 1 locked                     = 0 R/W (0x0)
    JTAG_DISABLE           Disable JTAG                                      = 0 R/W (0x0)
    DISABLE_DL_ENCRYPT     Disable flash encryption in UART bootloader       = 0 R/W (0x0)
    DISABLE_DL_DECRYPT     Disable flash decryption in UART bootloader       = 0 R/W (0x0)
    DISABLE_DL_CACHE       Disable flash cache in UART bootloader            = 0 R/W (0x0)
    BLK1                   Flash encryption key                              
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -/- 
    BLK2                   Secure boot key                                   
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
    BLK3                   Variable Block 3                                  
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
    
    Efuse fuses:
    WR_DIS                 Efuse write disable mask                          = 128 R/W (0x80)
    RD_DIS                 Efuse read disablemask                            = 1 R/W (0x1)
    CODING_SCHEME          Efuse variable block length scheme                = 0 R/W (0x0)
    KEY_STATUS             Usage of efuse block 3 (reserved)                 = 0 R/W (0x0)
    
    Config fuses:
    XPD_SDIO_FORCE         Ignore MTDI pin (GPIO12) for VDD_SDIO on reset    = 0 R/W (0x0)
    XPD_SDIO_REG           If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset   = 0 R/W (0x0)
    XPD_SDIO_TIEH          If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V   = 0 R/W (0x0)
    SPI_PAD_CONFIG_CLK     Override SD_CLK pad (GPIO6/SPICLK)                = 0 R/W (0x0)
    SPI_PAD_CONFIG_Q       Override SD_DATA_0 pad (GPIO7/SPIQ)               = 0 R/W (0x0)
    SPI_PAD_CONFIG_D       Override SD_DATA_1 pad (GPIO8/SPID)               = 0 R/W (0x0)
    SPI_PAD_CONFIG_HD      Override SD_DATA_2 pad (GPIO9/SPIHD)              = 0 R/W (0x0)
    SPI_PAD_CONFIG_CS0     Override SD_CMD pad (GPIO11/SPICS0)               = 0 R/W (0x0)
    DISABLE_SDIO_HOST      Disable SDIO host                                 = 0 R/W (0x0)
    
    Identity fuses:
    MAC                    MAC Address                                       
      = 30:ae:a4:02:59:c0 (CRC 9b OK) R/W 
    CHIP_VER_REV1          Silicon Revision 1                                = 0 -/W (0x0)
    CHIP_VERSION           Reserved for future chip versions                 = 0 -/W (0x0)
    CHIP_PACKAGE           Chip package identifier                           = 0 -/W (0x0)
    
    Calibration fuses:
    BLK3_PART_RESERVE      BLOCK3 partially served for ADC calibration data  = 0 -/W (0x0)
    ADC_VREF               Voltage reference calibration                     = 1100 -/W (0x0)
    
    Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).
    
    
    $ espefuse.py --port /dev/ttyUSB0 dump
    espefuse.py v2.3.1
    Connecting....
    EFUSE block 0:
    00010080 a40259c0 009b30ae 00000000 00000036 00000000 00000000
    EFUSE block 1:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    EFUSE block 2:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    EFUSE block 3:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    
    
  3. make menuconfig ¤Ç [Security Features] - [Enable flash encryption boot] ¤òÍ­¸ú²½¤·¤¿¸å¤Ç make ¤ò¼Â¹Ô
    $ make
    CC build/bootloader/bootloader_support/src/bootloader_clock.o
    CC build/bootloader/bootloader_support/src/bootloader_flash.o
    CC build/bootloader/bootloader_support/src/bootloader_init.o
    CC build/bootloader/bootloader_support/src/bootloader_random.o
    CC build/bootloader/bootloader_support/src/bootloader_sha.o
    CC build/bootloader/bootloader_support/src/bootloader_utility.o
    CC build/bootloader/bootloader_support/src/efuse.o
                         ¡ÊÃæά¡Ë
    CC build/xtensa-debug-module/trax.o
    AR build/xtensa-debug-module/libxtensa-debug-module.a
    LD build/mySimpleApp.elf
    esptool.py v2.3.1
    To flash all build output, run 'make flash' or:
    python /home/t/esp/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 /home/t/Arduino/my/for_ESP-IDF/mySimpleApp/build/bootloader/bootloader.bin 0x10000 /home/t/Arduino/my/for_ESP-IDF/mySimpleApp/build/mySimpleApp.bin 0x8000 /home/t/Arduino/my/for_ESP-IDF/mySimpleApp/build/partitions_singleapp.bin
    
    
    ;Ã̤ʤ¬¤é¡¢¾å¤ÎºÇ½ª¹Ô¤Î¥³¥Þ¥ó¥ÉÎãÃæ¤Î¡Ö--after hard_reset¡×¤Îµ­½Ò¤¬µ¤¤Ë¤Ê¤ê Advanced Options - espressif/esptool Wiki ¤Ç³Îǧ¤·¤¿¤È¤³¤í¡¢¡Ö--after no_reset¡×¥ª¥×¥·¥ç¥ó¤Î¸ºß¤òÃΤä¿¡£¥Ç¥Õ¥©¥ë¥È¤Ï¡Ö--after hard_reset¡×¡£esptool Áàºî¸å¤Ë¼«Æ°Åª¤Ë¥ê¥»¥Ã¥È¤¬¤«¤«¤ë¤È¶ñ¹ç¤Î¤ï¤ë¤¤¾ì¹ç¤¬¤¢¤ë¤¬¡¢no_reset »ØÄê¤Ç¤½¤ì¤ò²óÈò¤Ç¤­¤ë¤³¤È¤ò³Ð¤¨¤¿¡£
    Æ°²è C
  4. make flash monitor --- ¥Ö¡¼¥È¥í¡¼¥À¤¬³Æ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤ò°Å¹æ²½¤·¤Æ¤¤¤ë¾õ¶·¤¬¸«¤Æ¤È¤ì¤ë¡£¤½¤Î¸åµ¯Æ°¤·¤¿ mySimpleApp ¤«¤é¤Î¥á¥Ã¥»¡¼¥¸½ÐÎϤ¬ "Flash Encryption is enabled" ¤ËÊѲ½¤·¤Æ¤¤¤ë
    $ make flash monitor
    Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)...
    esptool.py v2.3.1
    Connecting........_
    Chip is ESP32D0WDQ6 (revision 0)
    Features: WiFi, BT, Dual Core
    Uploading stub...
    Running stub...
    Stub running...
    Configuring flash size...
    Auto-detected Flash size: 4MB
    Flash params set to 0x0220
    Compressed 25296 bytes to 14703...
    Wrote 25296 bytes (14703 compressed) at 0x00001000 in 1.3 seconds (effective 156.4 kbit/s)...
    Hash of data verified.
    Compressed 140160 bytes to 68713...
    Wrote 140160 bytes (68713 compressed) at 0x00010000 in 6.1 seconds (effective 184.8 kbit/s)...
    Hash of data verified.
    Compressed 3072 bytes to 103...
    Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 1885.7 kbit/s)...
    Hash of data verified.
    
    Leaving...
    Hard resetting via RTS pin...
    MONITOR
    --- idf_monitor on /dev/ttyUSB0 115200 ---
    --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
    ets Jun  8 2016 00:22:57
    
    rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    ets Jun  8 2016 00:22:57
    
    rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:2
    load:0x3fff0018,len:4
    load:0x3fff001c,len:7400
    load:0x40078000,len:0
    ho 12 tail 0 room 4
    load:0x40078000,len:17796
    entry 0x40078724
    I (31) boot: ESP-IDF v3.1-dev-1171-g358c822 2nd stage bootloader
    I (31) boot: compile time 16:28:39
    I (31) boot: Enabling RNG early entropy source...
    I (37) boot: SPI Speed      : 40MHz
    I (41) boot: SPI Mode       : DIO
    I (45) boot: SPI Flash Size : 4MB
    I (49) boot: Partition Table:
    I (52) boot: ## Label            Usage          Type ST Offset   Length
    I (60) boot:  0 nvs              WiFi data        01 02 00009000 00006000
    I (67) boot:  1 phy_init         RF data          01 01 0000f000 00001000
    I (75) boot:  2 factory          factory app      00 00 00010000 00100000
    I (82) boot: End of partition table
    I (86) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x05888 ( 22664) map
    I (103) esp_image: segment 1: paddr=0x000158b0 vaddr=0x3ffb0000 size=0x02284 (  8836) load
    I (107) esp_image: segment 2: paddr=0x00017b3c vaddr=0x40080000 size=0x00400 (  1024) load
    0x40080000: _iram_start at /home/t/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
    
    I (113) esp_image: segment 3: paddr=0x00017f44 vaddr=0x40080400 size=0x080cc ( 32972) load
    I (136) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11ccc ( 72908) map
    0x400d0018: _flash_cache_start at ??:?
    
    I (161) esp_image: segment 5: paddr=0x00031cec vaddr=0x400884cc size=0x00668 (  1640) load
    0x400884cc: esp_rom_spiflash_program_page_internal at /home/t/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412
    
    I (162) esp_image: segment 6: paddr=0x0003235c vaddr=0x400c0000 size=0x00000 (     0) load
    I (174) boot: Loaded app from partition at offset 0x10000
    I (174) boot: Checking flash encryption...
    W (179) flash_encrypt: Using pre-loaded flash encryption key in EFUSE block 1
    I (187) flash_encrypt: Setting CRYPT_CONFIG efuse to 0xF
    I (205) flash_encrypt: Disable UART bootloader encryption...
    I (205) flash_encrypt: Disable UART bootloader decryption...
    I (208) flash_encrypt: Disable UART bootloader MMU cache...
    I (214) flash_encrypt: Disable JTAG...
    I (218) flash_encrypt: Disable ROM BASIC interpreter fallback...
    I (237) esp_image: segment 0: paddr=0x00001020 vaddr=0x3fff0018 size=0x00004 (     4) 
    I (237) esp_image: segment 1: paddr=0x0000102c vaddr=0x3fff001c size=0x01ce8 (  7400) 
    I (247) esp_image: segment 2: paddr=0x00002d1c vaddr=0x40078000 size=0x00000 (     0) 
    I (253) esp_image: segment 3: paddr=0x00002d24 vaddr=0x40078000 size=0x04584 ( 17796) 
    I (701) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x05888 ( 22664) map
    I (709) esp_image: segment 1: paddr=0x000158b0 vaddr=0x3ffb0000 size=0x02284 (  8836) 
    I (712) esp_image: segment 2: paddr=0x00017b3c vaddr=0x40080000 size=0x00400 (  1024) 
    0x40080000: _iram_start at /home/t/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
    
    I (716) esp_image: segment 3: paddr=0x00017f44 vaddr=0x40080400 size=0x080cc ( 32972) 
    I (736) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11ccc ( 72908) map
    0x400d0018: _flash_cache_start at ??:?
    
    I (762) esp_image: segment 5: paddr=0x00031cec vaddr=0x400884cc size=0x00668 (  1640) 
    0x400884cc: esp_rom_spiflash_program_page_internal at /home/t/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412
    
    I (763) esp_image: segment 6: paddr=0x0003235c vaddr=0x400c0000 size=0x00000 (     0) 
    I (768) flash_encrypt: Encrypting partition 2 at offset 0x10000...
    [0;3oets Jun  8 2016 00:22:57
    
    rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:2
    load:0x3fff0018,len:4
    load:0x3fff001c,len:7400
    load:0x40078000,len:0
    ho 12 tail 0 room 4
    load:0x40078000,len:17796
    entry 0x40078724
    I (30) boot: ESP-IDF v3.1-dev-1171-g358c822 2nd stage bootloader
    I (30) boot: compile time 16:28:39
    I (30) boot: Enabling RNG early entropy source...
    I (36) boot: SPI Speed      : 40MHz
    I (41) boot: SPI Mode       : DIO
    I (45) boot: SPI Flash Size : 4MB
    I (49) boot: Partition Table:
    I (52) boot: ## Label            Usage          Type ST Offset   Length
    I (59) boot:  0 nvs              WiFi data        01 02 00009000 00006000
    I (67) boot:  1 phy_init         RF data          01 01 0000f000 00001000
    I (74) boot:  2 factory          factory app      00 00 00010000 00100000
    I (82) boot: End of partition table
    I (86) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x05888 ( 22664) map
    I (103) esp_image: segment 1: paddr=0x000158b0 vaddr=0x3ffb0000 size=0x02284 (  8836) load
    I (107) esp_image: segment 2: paddr=0x00017b3c vaddr=0x40080000 size=0x00400 (  1024) load
    0x40080000: _iram_start at /home/t/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
    
    I (113) esp_image: segment 3: paddr=0x00017f44 vaddr=0x40080400 size=0x080cc ( 32972) load
    I (136) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11ccc ( 72908) map
    0x400d0018: _flash_cache_start at ??:?
    
    I (163) esp_image: segment 5: paddr=0x00031cec vaddr=0x400884cc size=0x00668 (  1640) load
    0x400884cc: esp_rom_spiflash_program_page_internal at /home/t/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412
    
    I (163) esp_image: segment 6: paddr=0x0003235c vaddr=0x400c0000 size=0x00000 (     0) load
    I (175) boot: Loaded app from partition at offset 0x10000
    I (175) boot: Checking flash encryption...
    I (180) flash_encrypt: flash encryption is enabled (3 plaintext flashes left)
    I (188) boot: Disabling RNG early entropy source...
    I (193) cpu_start: Pro cpu up.
    I (197) cpu_start: Starting app cpu, entry point is 0x40080e4c
    0x40080e4c: call_start_cpu1 at /home/t/esp/esp-idf/components/esp32/cpu_start.c:225
    
    I (0) cpu_start: App cpu up.
    I (208) heap_init: Initializing. RAM available for dynamic allocation:
    I (214) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
    I (220) heap_init: At 3FFB32C0 len 0002CD40 (179 KiB): DRAM
    I (227) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
    I (233) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
    I (239) heap_init: At 40088B34 len 000174CC (93 KiB): IRAM
    I (246) cpu_start: Pro cpu start user code
    I (264) cpu_start: Starting scheduler on PRO CPU.
    I (0) cpu_start: Starting scheduler on APP CPU.
    I (265) TAG: **** this is secret data ****
    I (265) TAG: Flash Encryption is enabled
    I (1265) TAG: Flash Encryption is enabled
    I (2265) TAG: Flash Encryption is enabled
    I (3265) TAG: Flash Encryption is enabled
    I (4265) TAG: Flash Encryption is enabled
    I (5265) TAG: Flash Encryption is enabled
    I (6265) TAG: Flash Encryption is enabled
    I (7265) TAG: Flash Encryption is enabled
    I (8265) TAG: Flash Encryption is enabled
    I (9265) TAG: Flash Encryption is enabled
    
    
    Æ°²è D
  5. ¾åµ­ 4. ½é²ó°Å¹æ²½´°Î»¸å¤Î efuse ¤Î¾õÂÖ -- FLASH_CRYPT_CNT efuse ¤ÎÃͤ¬Àµ¤·¤¯¡Ö0x01¡×¤ËÊѲ½
    $ espefuse.py --port /dev/ttyUSB0 summary
    
    espefuse.py v2.3.1
    Connecting.....
    Security fuses:
    FLASH_CRYPT_CNT        Flash encryption mode counter                     = 1 R/W (0x1)
    FLASH_CRYPT_CONFIG     Flash encryption config (key tweak bits)          = 15 R/W (0xf)
    CONSOLE_DEBUG_DISABLE  Disable ROM BASIC interpreter fallback            = 1 R/W (0x1)
    ABS_DONE_0             secure boot enabled for bootloader                = 0 R/W (0x0)
    ABS_DONE_1             secure boot abstract 1 locked                     = 0 R/W (0x0)
    JTAG_DISABLE           Disable JTAG                                      = 1 R/W (0x1)
    DISABLE_DL_ENCRYPT     Disable flash encryption in UART bootloader       = 1 R/W (0x1)
    DISABLE_DL_DECRYPT     Disable flash decryption in UART bootloader       = 1 R/W (0x1)
    DISABLE_DL_CACHE       Disable flash cache in UART bootloader            = 1 R/W (0x1)
    BLK1                   Flash encryption key                              
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -/- 
    BLK2                   Secure boot key                                   
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
    BLK3                   Variable Block 3                                  
      = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
    
    Efuse fuses:
    WR_DIS                 Efuse write disable mask                          = 128 R/W (0x80)
    RD_DIS                 Efuse read disablemask                            = 1 R/W (0x1)
    CODING_SCHEME          Efuse variable block length scheme                = 0 R/W (0x0)
    KEY_STATUS             Usage of efuse block 3 (reserved)                 = 0 R/W (0x0)
    
    Config fuses:
    XPD_SDIO_FORCE         Ignore MTDI pin (GPIO12) for VDD_SDIO on reset    = 0 R/W (0x0)
    XPD_SDIO_REG           If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset   = 0 R/W (0x0)
    XPD_SDIO_TIEH          If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V   = 0 R/W (0x0)
    SPI_PAD_CONFIG_CLK     Override SD_CLK pad (GPIO6/SPICLK)                = 0 R/W (0x0)
    SPI_PAD_CONFIG_Q       Override SD_DATA_0 pad (GPIO7/SPIQ)               = 0 R/W (0x0)
    SPI_PAD_CONFIG_D       Override SD_DATA_1 pad (GPIO8/SPID)               = 0 R/W (0x0)
    SPI_PAD_CONFIG_HD      Override SD_DATA_2 pad (GPIO9/SPIHD)              = 0 R/W (0x0)
    SPI_PAD_CONFIG_CS0     Override SD_CMD pad (GPIO11/SPICS0)               = 0 R/W (0x0)
    DISABLE_SDIO_HOST      Disable SDIO host                                 = 0 R/W (0x0)
    
    Identity fuses:
    MAC                    MAC Address                                       
      = 30:ae:a4:02:59:c0 (CRC 9b OK) R/W 
    CHIP_VER_REV1          Silicon Revision 1                                = 0 -/W (0x0)
    CHIP_VERSION           Reserved for future chip versions                 = 0 -/W (0x0)
    CHIP_PACKAGE           Chip package identifier                           = 0 -/W (0x0)
    
    Calibration fuses:
    BLK3_PART_RESERVE      BLOCK3 partially served for ADC calibration data  = 0 -/W (0x0)
    ADC_VREF               Voltage reference calibration                     = 1100 -/W (0x0)
    
    Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).
    
    
    $ espefuse.py --port /dev/ttyUSB0 dump espefuse.py v2.3.1
    Connecting......
    EFUSE block 0:
    00110080 a40259c0 009b30ae 00000000 00000036 f0000000 000003c4
    EFUSE block 1:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    EFUSE block 2:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    EFUSE block 3:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    
    
  6. ¾åµ­ 4. ½é²ó°Å¹æ²½´°Î»¸å¤Ë¤¢¤é¤¿¤á¤Æ¥×¥ì¡¼¥ó¤Ê app ¥¤¥á¡¼¥¸¤ò esptool ¤Ç½ñ¤­¹þ¤ó¤Ç make monitor -- ¥¢¥×¥ê¤Îµ¯Æ°¤¬Å¬ÀÚ¤ËÃƤ«¤ì¤ë
    $ esptool.py --port /dev/ttyUSB0 --baud 921600 write_flash 0x10000 build/mySimpleApp.bin; make monitor
    esptool.py v2.3.1
    Connecting....
    Detecting chip type... ESP32
    Chip is ESP32D0WDQ6 (revision 0)
    Features: WiFi, BT, Dual Core
    Uploading stub...
    Running stub...
    Stub running...
    Changing baud rate to 921600
    Changed.
    Configuring flash size...
    Auto-detected Flash size: 4MB
    Compressed 140160 bytes to 68713...
    Wrote 140160 bytes (68713 compressed) at 0x00010000 in 1.5 seconds (effective 730.5 kbit/s)...
    Hash of data verified.
    
    Leaving...
    Hard resetting via RTS pin...
    MONITOR
    --- idf_monitor on /dev/ttyUSB0 115200 ---
    --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
    ets Jun  8 2016 00:22:57
    
    rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    ets Jun  8 2016 00:22:57
    
    rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:2
    load:0x3fff0018,len:4
    load:0x3fff001c,len:7400
    load:0x40078000,len:0
    ho 12 tail 0 room 4
    load:0x40078000,len:17796
    entry 0x40078724
    I (31) boot: ESP-IDF v3.1-dev-1171-g358c822 2nd stage bootloader
    I (31) boot: compile time 16:28:39
    I (31) boot: Enabling RNG early entropy source...
    I (37) boot: SPI Speed      : 40MHz
    I (41) boot: SPI Mode       : DIO
    I (45) boot: SPI Flash Size : 4MB
    I (49) boot: Partition Table:
    I (52) boot: ## Label            Usage          Type ST Offset   Length
    I (60) boot:  0 nvs              WiFi data        01 02 00009000 00006000
    I (67) boot:  1 phy_init         RF data          01 01 0000f000 00001000
    I (75) boot:  2 factory          factory app      00 00 00010000 00100000
    I (82) boot: End of partition table
    E (86) esp_image: image at 0x10000 has invalid magic byte
    W (92) esp_image: image at 0x10000 has invalid SPI mode 255
    E (99) boot: Factory app partition is not bootable
    E (104) boot: No bootable app partitions in the partition table
    user code done
    
    
    Á°·Ç¤Î¥É¥­¥å¥á¥ó¥Èµ­½Ò¤Î¤è¤¦¤Ë¡Öflash read err, 1000¡×¤Î¥¨¥é¡¼½ÐÎϤȥê¥Ö¡¼¥È¤Î¥ë¡¼¥×¤òͽÁÛ¤·¤¿¤¬¤³¤³¤Ç¤Ï¤³¤Î¤è¤¦¤Ë¡Öboot: Factory app partition is not bootable¡×¤Îɽ¼¨¤ÇÄä»ß¤·¤¿¡£¤³¤Î¤¢¤¿¤ê¤Î»ö¾ð¤Ï¤Þ¤À¤è¤¯¤ï¤«¤é¤Ê¤¤
    Æ°²è E
  7. ¤³¤³¤Ç¥½¡¼¥¹¥³¡¼¥É¤Ë¾®¤µ¤¯Êѹ¹¤ò²Ã¤¨¤ë¡£¥á¥Ã¥»¡¼¥¸¤Ë¥Ó¥Ã¥¯¥ê¥Þ¡¼¥¯¤ò½ñ¤­²Ã¤¨¤¿¤À¤±
    Êѹ¹Á°
    ESP_LOGI(TAG, "Flash Encryption is enabled");

    Êѹ¹¸å
    ESP_LOGI(TAG, "Flash Encryption is enabled!!!!");

  8. make ¤ò·Ð¤Æ PC ¾å¤Ç app ¥¤¥á¡¼¥¸¤ò°Å¹æ²½¤· esptool ¤Ç¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Ø½ñ¤­¹þ¤à¤È´üÂÔÄ̤ê¾å¤ÎÊѹ¹¤¬È¿±Ç¤µ¤ì¤¿¾õÂ֤ǵ¯Æ°
    $ make
    CC build/main/mySimpleApp.o
    AR build/main/libmain.a
    LD build/mySimpleApp.elf
    esptool.py v2.3.1
    To flash all build output, run 'make flash' or:
    python /home/t/esp/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 /home/t/Arduino/my/for_ESP-IDF/mySimpleApp/build/bootloader/bootloader.bin 0x10000 /home/t/Arduino/my/for_ESP-IDF/mySimpleApp/build/mySimpleApp.bin 0x8000 /home/t/Arduino/my/for_ESP-IDF/mySimpleApp/build/partitions_singleapp.bin
    
    $ espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x10000 -o build/mySimpleApp_encrypted.bin build/mySimpleApp.bin
    espsecure.py v2.3.1
    
    $ esptool.py --port /dev/ttyUSB0 --baud 921600 write_flash 0x10000 build/mySimpleApp_encrypted.bin; make monitor
    esptool.py v2.3.1
    Connecting....
    Detecting chip type... ESP32
    Chip is ESP32D0WDQ6 (revision 0)
    Features: WiFi, BT, Dual Core
    Uploading stub...
    Running stub...
    Stub running...
    Changing baud rate to 921600
    Changed.
    Configuring flash size...
    Auto-detected Flash size: 4MB
    Compressed 140176 bytes to 138083...
    Wrote 140176 bytes (138083 compressed) at 0x00010000 in 2.2 seconds (effective 509.0 kbit/s)...
    Hash of data verified.
    
    Leaving...
    Hard resetting via RTS pin...
    MONITOR
    --- idf_monitor on /dev/ttyUSB0 115200 ---
    --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
    ets Jun  8 2016 00:22:57
    
    rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    ets Jun  8 2016 00:22:57
    
    rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:2
    load:0x3fff0018,len:4
    load:0x3fff001c,len:7400
    load:0x40078000,len:0
    ho 12 tail 0 room 4
    load:0x40078000,len:17796
    entry 0x40078724
    I (31) boot: ESP-IDF v3.1-dev-1171-g358c822 2nd stage bootloader
    I (31) boot: compile time 16:28:39
    I (31) boot: Enabling RNG early entropy source...
    I (37) boot: SPI Speed      : 40MHz
    I (41) boot: SPI Mode       : DIO
    I (45) boot: SPI Flash Size : 4MB
    I (49) boot: Partition Table:
    I (52) boot: ## Label            Usage          Type ST Offset   Length
    I (60) boot:  0 nvs              WiFi data        01 02 00009000 00006000
    I (67) boot:  1 phy_init         RF data          01 01 0000f000 00001000
    I (75) boot:  2 factory          factory app      00 00 00010000 00100000
    I (82) boot: End of partition table
    I (86) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x0588c ( 22668) map
    I (103) esp_image: segment 1: paddr=0x000158b4 vaddr=0x3ffb0000 size=0x02284 (  8836) load
    I (108) esp_image: segment 2: paddr=0x00017b40 vaddr=0x40080000 size=0x00400 (  1024) load
    0x40080000: _iram_start at /home/t/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
    
    I (113) esp_image: segment 3: paddr=0x00017f48 vaddr=0x40080400 size=0x080c8 ( 32968) load
    I (136) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11ccc ( 72908) map
    0x400d0018: _flash_cache_start at ??:?
    
    I (163) esp_image: segment 5: paddr=0x00031cec vaddr=0x400884c8 size=0x0066c (  1644) load
    0x400884c8: esp_rom_spiflash_program_page_internal at /home/t/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412
    
    I (164) esp_image: segment 6: paddr=0x00032360 vaddr=0x400c0000 size=0x00000 (     0) load
    I (175) boot: Loaded app from partition at offset 0x10000
    I (175) boot: Checking flash encryption...
    I (180) flash_encrypt: flash encryption is enabled (3 plaintext flashes left)
    I (188) boot: Disabling RNG early entropy source...
    I (194) cpu_start: Pro cpu up.
    I (197) cpu_start: Starting app cpu, entry point is 0x40080e4c
    0x40080e4c: call_start_cpu1 at /home/t/esp/esp-idf/components/esp32/cpu_start.c:225
    
    I (0) cpu_start: App cpu up.
    I (208) heap_init: Initializing. RAM available for dynamic allocation:
    I (215) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
    I (221) heap_init: At 3FFB32C0 len 0002CD40 (179 KiB): DRAM
    I (227) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
    I (233) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
    I (240) heap_init: At 40088B34 len 000174CC (93 KiB): IRAM
    I (246) cpu_start: Pro cpu start user code
    I (264) cpu_start: Starting scheduler on PRO CPU.
    I (0) cpu_start: Starting scheduler on APP CPU.
    I (266) TAG: **** this is secret data ****
    I (266) TAG: Flash Encryption is enabled!!!!
    I (1266) TAG: Flash Encryption is enabled!!!!
    I (2266) TAG: Flash Encryption is enabled!!!!
    I (3266) TAG: Flash Encryption is enabled!!!!
    I (4266) TAG: Flash Encryption is enabled!!!!
    I (5266) TAG: Flash Encryption is enabled!!!!
    I (6266) TAG: Flash Encryption is enabled!!!!
    I (7266) TAG: Flash Encryption is enabled!!!!
    I (8266) TAG: Flash Encryption is enabled!!!!
    I (9266) TAG: Flash Encryption is enabled!!!!
    
    
    Æ°²è F
¤³¤ì¤Ç FLASH_CRYPT_CNT ¤òµ¤¤Ë¤¹¤ë¤³¤È¤Ê¤¯ Flash Encryption ¤òÍøÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£

Arduino core for ESP32 ´Ä¶­¤Ç¤Ï¤É¤¦¤¹¤ë¡©Åù¤Î¼Â¸³¤È·ë²Ì

¤³¤³¤Þ¤Ç¤Ï¸ø¼°¥É¥­¥å¥á¥ó¥È¤Îµ­½Ò¤ò²ò¼á¤·¤Ê¤¬¤é»öÁ°À¸À®°Å¹æ²½¥­¡¼¤ò»È¤¤ ESP-IDF ¥Ù¡¼¥¹¤Ç Flash Encryption ¤ÎÁàºî¤ò¹Ô¤Ã¤Æ¤­¤Þ¤·¤¿¡£¤è¤êÍøÍѼԤ襤 Arduino core for ESP32 ´Ä¶­¤Ç¤Î»ö¾ð¤¬µ¤¤Ë¤Ê¤ê¤Þ¤¹¡£¸½»þÅÀ¤Ç¤Ï¤³¤ÎÅÀ¤Ë´Ø¤¹¤ëŪ³Î¤Ê¾ðÊ󤬸«Åö¤¿¤é¤Ê¤¤¤¿¤á¼ê¸µ¤ÇÄ´ºº¤È¼Â¸³¤ò¹Ô¤¤¤Þ¤·¤¿¡£

¼Â¸³ 1: Flash Encryption Í­¸ú¾õÂ֤ǤΥХ寥¢¥Ã¥×¡¦¥ì¥¹¥È¥¢¤Ï²Äǽ¡©

Á°¹à¤Þ¤Ç¤Î³Îǧ¤Î·ë²Ì¡¢¸½ºß¼ê¸µ¤Ë¤Ï FLASH_CRYPT_CNT efuse ¤ÎÃͤ¬ 0x01 ¤Î ESP32 ¥Ü¡¼¥É¤¬¤¢¤ë¡£¤³¤³¤Ë¤Ï¥¢¥×¥ê¡ÖmySimpleApp¡×¤ÎËÜÂΤΥ¤¥á¡¼¥¸¤ò¤Ï¤¸¤á°Å¹æ²½¤µ¤ì¤¿°ì¼°¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤ë¡£

¤Þ¤ºÁÇËѤˡ¢¤³¤Î¾õÂ֤ǥեé¥Ã¥·¥å¥á¥â¥êÁ´Îΰè¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤È¥ì¥¹¥È¥¢¤¬²Äǽ¤Ç¤¢¤ë¤«Èݤ«¤Ë´Ø¿´¤ò»ý¤Ã¤¿¡£ ¤µ¤Ã¤½¤¯ esptool ¤ò»È¤¤²¼µ­Í×ÎΤǥХ寥¢¥Ã¥×¤È¥ì¥¹¥È¥¢¤ò»î¤·¤¿¤È¤³¤í¡¢Flash Encryption ÉÔ»ÈÍÑ»þ¤ÈƱÍͤËÌäÂê¤Ê¤¯½èÍý¤Ç¤­¤ë¤³¤È¤ò³Îǧ¤·¤¿¡£ÊªÍýŪ¤ÊÆɤ߽ñ¤­¤ÎºÝ¤Ë´Ö¤ÇºÙ¹©¤ò¤·¤¿¤ê¤Ï¤·¤Ê¤¤¤é¤·¤¤¡£¤Þ¤º¤Ï¤Ò¤È°Â¿´¡£

esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0 0x400000 flash4MB.bin

esptool.py --port /dev/ttyUSB0 --baud 921600 write_flash 0 flash4MB.bin

¼Â¸³ 2: ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸¤òÉü¹æ¤·¤Æ¤ß¤ë

¼¡¤Ë¡¢esptool ¤ÇÆɤ߽Ф·¤¿½êÄê¤Î°Å¹æ²½¤º¤ß¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤ò espsecure ¥æ¡¼¥Æ¥£¥ê¥Æ¥£ ¤Î decrypt_flash_data ¥³¥Þ¥ó¥É¤ÇÀµ¤·¤¯Éü¹æ²Äǽ¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤¿¡£¤³¤¦¤¤¤Ã¤¿À°¹çÀ­¤Ï°ìÏ¢¤Îʸ̮¤ÎÃæ¤ÇŬÀÚ¤ËÊݤ¿¤ì¤Æ¤¤¤ë¡£ °Ê²¼¤Ï°Å¹æ²½¤µ¤ì¤¿¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë¤ò¥Û¥¹¥È PC ¾å¤ËÆɤ߽Ф·¤ÆÉü¹æ¤¹¤ëÎã¡£decrypt_flash_data ¥³¥Þ¥ó¥É¤Ë¤ª¤¤¤Æ¤â --address »ØÄ꤬ɬ¿Ü¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤¬É¬Íס£

esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x8000 0xc00 partition_table_Encrypted.bin

espsecure.py decrypt_flash_data --keyfile ./mykey.bin --address 0x8000 -o partition_table_plain.bin partiiion_table_Encrypted.bin

¤Ê¤ª¡¢¥µ¥¤¥ºÉÔÄê¤Î¥Ö¡¼¥È¥í¡¼¥À¡¼¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥×¥í¥¸¥§¥¯¥È¤Î¥Ó¥ë¥É»þ¤Ë build/bootloader/ ²¼¤ËÀ¸À®¤µ¤ì¤¿°Å¹æ²½Á°¤Î bootloader.bin ¤Î¥Õ¥¡¥¤¥ë¥µ¥¤¥º¡Ê¤³¤³¤Ç¤Ï 25,296 ¥Ð¥¤¥È¡Ë¤ò»ØÄꤷ¤Æ°Å¹æ²½¥¤¥á¡¼¥¸¤òºÎ¼è¡£¾åµ­¤ÈƱ¤¸Í×ÎΤÇÉü¹æ²Äǽ¤À¤Ã¤¿¡£

esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x1000 25296 bootloader_Encrypted.bin

espsecure.py decrypt_flash_data --keyfile ./mykey.bin --address 0x1000 -o bootloader_plain.bin bootloader_Encrypted.bin

¼Â¸³ 3: Á´¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤Î¥¤¥á¡¼¥¸¤òºÎ¼è¡¦Éü¹æ¡¦ºÆ°Å¹æ²½¤·¤Æ½ñ¤­Ì᤹¤È¡©

¾å¤Î¤è¤¦¤Ë¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë¤È¥Ö¡¼¥È¥í¡¼¥À¤Î¥¤¥á¡¼¥¸¤Î¼èÆÀ¤ÈÉü¹æ¤Î³Îǧ¤ò½ª¤¨¤¿¤È¤³¤í¤Ç¡¢Â¾¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸¤â¤¹¤Ù¤ÆºÎ¼è¤·¡¢Å¬µ¹Éü¹æ¤ÈºÆ°Å¹æ²½¤ò¹Ô¤Ã¤¿¾å¤Ç ESP32 ¤Ø½ñ¤­Ìᤷ¤Æ¤ä¤ì¤ÐÉáÄÌ¤Ë¥×¥í¥°¥é¥à¤¬Æ°ºî¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È¹Í¤¨¼ÂºÝ¤Ë¼ê¤òÆ°¤«¤·¤Æ»î¤·¤Æ¤ß¤¿¡£

¤Þ¤º¥Ñ¡¼¥Æ¥£¥·¥ç¥óÄêµÁ¤ò»²¾È¤·³Æ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸¤ò¸ÄÊ̤˺μ褹¤ë¡£

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x6000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 1M,

Á°·Ç¤Î¤è¤¦¤Ë nvs ¤Ï°Å¹æ²½¤µ¤ì¤Æ¤ª¤é¤º¡¢Æɤ߽Ф·ÉԲĤΠphy ¤ÏÃæ¿È¤¬¤¹¤Ù¤Æ 0xFF ¤À¤Ã¤¿¡£¸å¼Ô¤Ï¤¤¤º¤ì¤Ë¤»¤è mySimpleApp ¤Ç¤Ï»ÈÍѤ·¤Æ¤¤¤Ê¤¤¤¿¤á¤Ò¤È¤Þ¤º¤³¤Î¤Þ¤Þ¤Ë¤·¤Æ¤ª¤¯¡£Type = app ¤Î factory ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Î¤ßÉü¹æ¤ò¹Ô¤Ã¤¿¡£¼Â¹Ô¤·¤¿¥³¥Þ¥ó¥É¤ò°Ê²¼¤Ë¹µ¤¨¤ë¡£

esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x9000 0x6000 nvs.bin
esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0xf000 0x1000 phy_init.bin
esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x10000 0x100000 factory_Encrypted.bin

espsecure.py decrypt_flash_data --keyfile ./mykey.bin --address 0x10000 -o factory_plain.bin factory_Encrypted.bin

¼¡¤Ë¡¢Éü¹æ¤·¤¿¥Ö¡¼¥È¥í¡¼¥À, ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë, factory ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤ò¤¢¤é¤¿¤á¤Æ°Å¹æ²½¤¹¤ë¡£

espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x1000 -o bootloader_reEncrypted.bin bootloader_plain.bin
espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x8000 -o partition_table_reEncrypted.bin partition_table_plain.bin
espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x10000 -o factory_reEncrypted.bin factory_plain.bin

½àÈ÷¤ò½ª¤¨¤¿°ì¼°¤ò²¼µ­¥³¥Þ¥ó¥É¤Ç¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Ø½ñ¤­Ìᤷ¤¿¡£

esptool.py --port /dev/ttyUSB0 --baud 921600 write_flash \
    0x1000 bootloader_reEncrypted.bin \
    0x8000 partition_table_reEncrypted.bin \
    0x9000 nvs.bin \
    0xf000 phy_init.bin \
    0x10000 factory_reEncrypted.bin

¤³¤Î·ë²Ì¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó mySimpleApp ¤ÏÌäÂê¤Ê¤¯Æ°ºî¤·¤¿¡£Åö½éÊ£»¨¤Ë´¶¤¸¤é¤ì¤¿ Flash Encryption ¤Ï°Æ³°ÁÇľ¤Ê¹½Â¤¤é¤·¤¤¡£

¼Â¸³ 4: Arduino core for ESP32 ´Ä¶­¤Ç³«È¯¤·¤¿¥¢¥×¥ê°ì¼°¤ò°Ü¹Ô¤·¤Æ¤ß¤ë

¤³¤³¤Þ¤Ç¤Î·ë²Ì¤Ë³¤±¤Æ¡¢ESP-IDF ¤Ç¤Ï¤Ê¤¯ Arduino core for ESP32 ´Ä¶­¤Ç¥Ó¥ë¥É¤·¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥¤¥á¡¼¥¸°ì¼°¤Ë¤Ä¤¤¤Æ Flash Encryption ´Ä¶­¤Ç¤Î¼è¤ê²ó¤·¤ò»î¤ß¤¿¡£

¼Â¸³ÍѤÎÂêºà¤È¤·¤Æ Arduino IDE ´Ä¶­¤Çľ¶á¤ËºîÀ®¤·¤¿ Google Home ¤ËȯÏ䵤»¤ë¥¨¡¼¥¸¥§¥ó¥È¥×¥í¥°¥é¥à¤ò»È¤Ã¤¿¡£¥¢¥×¥êÆâ¤Ç SPIFFS ¤òÍøÍѤ·¤Æ¤¤¤ë¤³¤È¤â¼Â¸³¤ò¹Ô¤¦¾å¤Ç²¿¤È¤Ê¤¯¹¥ÅԹ硣¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë¤Ï°Ê²¼¤ÎÆâÍÆ¡£

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
eeprom,   data, 0x99,    0x290000,0x1000,
spiffs,   data, spiffs,  0x291000,0x16F000,

¼ê¸µ¤Ç¤ÏƱ¥¢¥×¥ê¤ò Flash Encryption ¤òŬÍѤ·¤Æ¤¤¤Ê¤¤ÁǤΠESP32 ¥Ü¡¼¥É¤Ç±¿ÍÑÃæ¡£

¤Þ¤º¡¢¤³¤ÎÈó Flash Encryption ¤Ê¥Ü¡¼¥É A ¤ò¥Û¥¹¥È PC ¤ØÀܳ¤·¡¢¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤«¤é¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸°ì¼°¤òºÎ¼è¤¹¤ë¡£

esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x9000 0x5000 nvs.bin
esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0xe000 0x2000 otadata.bin
esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x10000 0x140000 app0.bin
esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x150000 0x140000 app1.bin
esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x290000 0x1000 eeprom.bin
esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x291000 0x16F000 spiffs.bin

esptool.py --port /dev/ttyUSB0 --baud 921600 read_flash 0x8000 0xC00 partition_table.bin

¥Ö¡¼¥È¥í¡¼¥À¤Ï¥µ¥¤¥ºÉÔÄê¤À¤¬¡¢Arduino core for ESP32 ¤Î¾ì¹ç¡¢[arduino]/hardware/espressif/esp32/tools/sdk/bin/ ¥Ç¥£¥ì¥¯¥È¥ê²¼¤Ë SPI ¥â¡¼¥É + Flash Frequency Ê̤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¤¿¤á¤³¤ì¤òÍøÍѤǤ­¤ë¡£

$ pwd
/home/t/app/arduino-1.8.5/hardware/espressif/esp32/tools/sdk/bin
$ ls -l
¹ç·× 128
-rw-rw-r-- 1 t t 15088  7·î 30 21:42 bootloader_dio_40m.bin
-rw-rw-r-- 1 t t 13696  7·î 30 21:42 bootloader_dio_80m.bin
-rw-rw-r-- 1 t t 13696  7·î 30 21:42 bootloader_dout_40m.bin
-rw-rw-r-- 1 t t 13696  7·î 30 21:42 bootloader_dout_80m.bin
-rw-rw-r-- 1 t t 15088  7·î 30 21:42 bootloader_qio_40m.bin
-rw-rw-r-- 1 t t 15072  7·î 30 21:42 bootloader_qio_80m.bin
-rw-rw-r-- 1 t t 15088  7·î 30 21:42 bootloader_qout_40m.bin
-rw-rw-r-- 1 t t 15072  7·î 30 21:42 bootloader_qout_80m.bin

ËÜ¥¢¥×¥ê¤Ï "QIO" + "80MHz" ¤Î»ØÄê¤Ç¥Ó¥ë¥É¤·¤Æ¤¤¤ë¤¿¤á¡Öbootloader_qio_80m.bin¡×¤ò¥³¥Ô¡¼¤·¤Æ»È¤¦¡£

  

°Å¹æ²½¤ÎÂоݤǤ¢¤ë¥Ö¡¼¥È¥í¡¼¥À¡¼, ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë ¤ª¤è¤Ó app0, app1 ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤Î¥¤¥á¡¼¥¸¤ò Flash Encryption ŬÍѤº¤ß¤Î ESP32 ¥Ü¡¼¥É B ¤Î¥­¡¼¤ò»È¤Ã¤Æ°Å¹æ²½¤¹¤ë¡£

espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x1000 -o bootloader_Encrypted.bin bootloader_qio_80m.bin
espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x8000 -o partition_table_Encrypted.bin partition_table.bin
espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x10000 -o app0_Encrypted.bin app0.bin
espsecure.py encrypt_flash_data --keyfile ./mykey.bin --address 0x150000 -o app1_Encrypted.bin app1.bin

¤³¤³¤Ç Flash Encryption ŬÍѤº¤ß¤Î ESP32 ¥Ü¡¼¥É B ¤ò¥Û¥¹¥È PC ¤Ë¤Ä¤Ê¤®Âؤ¨¤Æ¤«¤é¡¢°Ê²¼¤ÎÍ×ÎΤdzƥѡ¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸¤ò½ñ¤­¹þ¤à¡£

esptool.py --port /dev/ttyUSB0 --baud 921600 write_flash \
    0x1000 bootloader_Encrypted.bin \
    0x8000 partition_table_Encrypted.bin \
    0x9000 nvs.bin \
    0xe000 otadata.bin \
    0x10000 app0_Encrypted.bin \
    0x150000 app1_Encrypted.bin \
    0x290000 eeprom.bin \
    0x291000 spiffs.bin

°Ê¾å¤Î¼ê½ç¤Ë¤è¤ê¡¢Arduino core for ESP32 ´Ä¶­¤Ç¥Ó¥ë¥É¤ò¹Ô¤¤ÁǤΠESP32 ¥Ü¡¼¥É A ¾å¤Ç²ÔƯÃæ¤ÎÅö³º¥¢¥×¥ê¤¬¡¢Flash Encryption ŬÍѤº¤ß¤Î¥Ü¡¼¥É B ¾å¤ÇÀµ¾ï¤ËÆ°ºî¤·¤¿¡£

Flash Encryption ¤òÆ»¶ñ¤È¤·¤ÆÉáÃʻȤ¤¤¹¤ë¤¿¤á¤Ë

¾å¤Î·ë²Ì¤ò¼õ¤±¤Æ¡¢Flash Encryption ¤òÆ»¶ñ¤È¤·¤ÆÆü¾ïŪ¤ËÍøÍѤ¹¤ë¾å¤Ç¤Î¥Ý¥¤¥ó¥È¤òÁÛÄꤷ¤¿¡£

  • ¤¢¤é¤«¤¸¤á¡Ö½é²ó¤Î°Å¹æ²½¡×¤ò·Ð¤Æ FLASH_CRYPT_CNT ¡á 0x01 ¾õÂ֤Ȥʤ俥ܡ¼¥É¤ò»ñºà¤È¤·¤ÆÍÑ°Õ¤·¤Æ¤ª¤¯
  • ÉáÃʤÏÁǤΥܡ¼¥È¤ò»È¤Ã¤Æ Arduino IDE ´Ä¶­¤Ê¤ê ESP-IDF ´Ä¶­¤Ê¤ê¤ÇÉáÄÌ¤Ë¥×¥í¥°¥é¥à³«È¯¤ò¹Ô¤¦
  • ¼«Ê¬¤Î¼ê¤òÎ¥¤ì¤¿¾ì½ê¤Ë¥Ü¡¼¥É¤òÀßÃÖ¤¹¤ë¾ì¹ç¤Ï¾å¤ÎÍ×ÎΤÇÁǤΥܡ¼¥É¤«¤é Flash Encryption Í­¸ú²½¤º¤ß¥Ü¡¼¥É¤Ø¥¤¥á¡¼¥¸¤ò°Ü¹Ô¤·¤ÆÍøÍѤ¹¤ë
       ESP32 Board A                         ESP32 Board B
    +------------------+  copy & encrypt  +------------------+
    | Flash Encryption | partition images | Flash Encryption |
    |     DISABLED     | ===============> |     ENABLED      | 
    +------------------+                  +------------------+
    

Íý¶þ¤¬¤ï¤«¤Ã¤Æ¤·¤Þ¤¨¤Ð°Ü¹ÔÊýË¡¤½¤Î¤â¤Î¤Ïñ½ã¤À¤¬¡¢¼ê½ç¤¬ÌÌÅݤʤΤÇŬÀڤ˰ì³çÁàºî¤ò¹Ô¤¦¤¿¤á¤Ë Python ¥¹¥¯¥ê¥×¥È¤òÍÑ°Õ¤·¤¿¡£Linux, MacOSX, Windows ¤Î³Æ´Ä¶­¤ËÂбþ¡£¤Ê¤ª¡¢Á°¹à¤Î¼Â¸³¤Ç¤Ï¥Ö¡¼¥È¥í¡¼¥À¤Î¥¤¥á¡¼¥¸¤ò SDK ¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¥³¥Ô¡¼¤·¤ÆÍøÍѤ·¤¿¤¬¡¢¥Ö¡¼¥È¥í¡¼¥À¥³¡¼¥É¤Ï¸ÇÄêĹ¤Ç¤Ï¤Ê¤¤¤â¤Î¤Î¥µ¥¤¥º¤Î¾å¸Â¤Ï 0x7000 ¥Ð¥¤¥È¤Ç¤¢¤ê¡¢ÁǤΥܡ¼¥É¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¥ª¥Õ¥»¥Ã¥È 0x1000 ¤«¤é 0x7000 ¥Ð¥¤¥Èʬ¤òÆɤ߽Ф·¤Æ½èÍý¤·¤¿¤È¤³¤íÌäÂê¤Ê¤¯Æ°ºî¤·¤¿¤¿¤á¤³¤ÎÊýË¡¤òºÎ¤Ã¤¿¡£¤³¤ì¤Ê¤é¸µ¥¢¥×¥ê¤Î³«È¯´Ä¶­¤¬²¿¤Ç¤¢¤ë¤«¤Ë¤«¤«¤ï¤é¤ºÂбþ¤Ç¤­¤ë¡£

  1. Flash Encryption ¤Î̵¸ú¤Ê¥Ü¡¼¥É A ¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤«¤é¥Ö¡¼¥È¥í¡¼¥À¥¤¥á¡¼¥¸¤ò¥Û¥¹¥È PC ¤ØºÎ¼è
  2. Ʊ¤¸¤¯¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë¥¤¥á¡¼¥¸¤òºÎ¼è
  3. ¾å¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë¤ÎÆâÍƤ˴ð¤Å¤­³Æ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸¤òºÎ¼è
  4. °Å¹æ²½¤ÎɬÍפʥ¤¥á¡¼¥¸¤ò Flash Encryption ¤ÎÍ­¸ú¤Ê¥Ü¡¼¥É B ÍѤΥ­¡¼¤Ç°Å¹æ²½¤¹¤ë
  5. ¥¤¥á¡¼¥¸°ì¼°¤ò¥Ü¡¼¥É B ¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Ø½ñ¤­¹þ¤à

°Ê²¼¤ÎÆ°²è¤Ï¤³¤Î¥¹¥¯¥ê¥×¥È¤ò»È¤Ã¤ÆÁ°·Ç¤Î¡ÖGoogle Home ¤ËȯÏ䵤»¤ë¥¨¡¼¥¸¥§¥ó¥È¥×¥í¥°¥é¥à¡×¤ò²ÔƯ¤µ¤»¤Æ¤¤¤ëÁǤΥܡ¼¥É A ¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸°ì¼°¤ò°Å¹æ²½Í­¸ú¤Ê¥Ü¡¼¥É B ¤Ø°Ü¹Ô¤·¤¿Íͻҡ£

Á°È¾¡§ ÁǤΥܡ¼¥É A ¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤«¤é¤Î³Æ¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸ºÎ¼è¤È°Å¹æ²½´°Î»¤Þ¤Ç

¸åȾ¡§ ¾å¤Î¥¤¥á¡¼¥¸¤ò Flash Encryption ¤ÎÍ­¸ú¤Ê¥Ü¡¼¥É B ¤Ë½ñ¤­¹þ¤ó¤ÇÅö³º¥¢¥×¥ê¤Î²ÔƯ¤ò³Îǧ

»Ä¤Ã¤Æ¤¤¤ëµ¿Ìä

º£²ó¡¢½êÄê¤Î¥Ü¡¼¥É¤Ç Flash Encryption ¤òÍ­¸ú²½¤¹¤ë¤Þ¤Ç¤Î²áÄø¤Ç¤Ï¥É¥­¥å¥á¥ó¥È¤ÎÆâÍƤɤª¤ê¤Ë ESP-IDF ´Ä¶­¤Ç make menuconfig ¤Ç¤Î°Å¹æ²½¥ª¥×¥·¥ç¥óÍ­¸ú²½¤ò·Ð¤Æ make && make flash ¤ò¼Â¹Ô¤¹¤ë¼ê½ç¤òƧ¤ó¤À¤¬¡¢¥Ü¡¼¥É¦¤Î¤ªÁ·Î©¤Æ¤È¤·¤Æ¤Ï FLASH_CRYPT_CNT efuse ¤ÎÃͤò 0x01 ¤Ë¤¹¤ë¤À¤±¤Ç»ö­¤ê¤ë²ÄǽÀ­¤âÁÛÁü¤µ¤ì¤ë¡£

¤â¤·²¾¤Ë¤½¤¦¤Ç¤¢¤ì¤Ð¡¢ÁǤξõÂ֤Υܡ¼¥É¤ËÂФ·»öÁ°À¸À®°Å¹æ²½¥­¡¼¤ò½ñ¤­¹þ¤ó¤À¾å¤Ç Á°·Ç¤Î¤è¤¦¤Ë¡Öespefuse.py --port [PORT] burn_efuse FLASH_CRYPT_CNT¡×¥³¥Þ¥ó¥É¤ò°ìÅÙȯ¹Ô¤¹¤ë¤À¤±¤Ç½àÈ÷ OK ¤«¤â¤·¤ì¤Ê¤¤¡£¼ê¸µ¤Ç¤Ï¤Þ¤À»î¤»¤Æ¤¤¤Ê¤¤¤¬´Ø¿´¤Ï¤¢¤ë¡£¤³¤Î·ï¤â¤ª¤Ã¤Æ³Îǧ¤·¤¿¤¤¡£


°Ê¾å¡¢Ä¹¤¤¥á¥â¤Ç¤·¤¿¡£¤¤¤í¤¤¤í¶½Ì£¿¼¤¤µ¡¹½¤Ç¤¹¡£


(tanabe)

ÉÕµ­¡§¡Ö»Ä¤Ã¤Æ¤¤¤ëµ¿Ìä¡×¤Ë¤Ä¤¤¤Æ¤ÎÄɼ¸³ ¡Ê2018-11-08¡Ë

Àè¤À¤Ã¤Æ¾å¤Î¡Ö»Ä¤Ã¤Æ¤¤¤ëµ¿Ìä¡×¤Î¹à¤Ë¼¡¤Î¤è¤¦¤Ë½ñ¤­»Ä¤·¤¿¡£

¥Ü¡¼¥É¦¤Î¤ªÁ·Î©¤Æ¤È¤·¤Æ¤Ï FLASH_CRYPT_CNT efuse ¤ÎÃͤò 0x01 ¤Ë¤¹¤ë¤À¤±¤Ç»ö­¤ê¤ë²ÄǽÀ­¤âÁÛÁü¤µ¤ì¤ë¡£

¤½¤Î¸å¼ê¸µ¤Ç¸¡¾ÚÍѤΠESP32 ¥Ü¡¼¥É¤ò³ÎÊݤ·¤¿»ö¾ð¤â¤¢¤ê¡¢¤³¤³¤Þ¤Ç¤ÎÏÃÂê¤ò¼ºÇ°¤¹¤ëÁ°¤ËÄɼ¸³¤ò¹Ô¤¦¤³¤È¤Ë¤·¤¿¡£°Ê²¼¤Ë·ëÏÀ¤ò¼¨¤¹¡£

°Ê²¼¤Î¾ò·ï¤òËþ¤¿¤»¤Ð ¥Ü¡¼¥É¦¤Î½àÈ÷¤¬´°Î»¤¹¤ë¡£ ¤³¤Î¾õÂ֤Ǥ¢¤ì¤Ð¡¢PC ¾å¤Ç½êÄê¤Î»öÁ°À¸À®¥­¡¼¤Ë¤è¤ê°Å¹æ²½¤·¤¿¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥¤¥á¡¼¥¸¤ò esptool ¤Ç½ñ¤­¹þ¤ó¤Ç¤½¤Î¤Þ¤Þ¼Â¹Ô¤¹¤ë¤³¤È¤¬²Äǽ¡£ESP-IDF ¤ò·Ðͳ¤¹¤ëɬÍפϤʤ¤¡£¤Ê¤ª FLASH_CRYPT_CNT ¤ÎÁàºî¤À¤±¤Ç¤ÏÉԲġ£

  • FLASH_CRYPT_CNT ¤Î ON ¥Ó¥Ã¥È¿ô¤¬ 1 (0x01) ¤Ê¤É´ñ¿ô¤Ç¤¢¤ë¤³¤È
    espefuse.py --port /dev/ttyUSB0 burn_efuse FLASH_CRYPT_CNT
  • FLASH_CRYPT_CONFIG ¤ÎÃͤ¬ 15 (0xF) ¤Ç¤¢¤ë¤³¤È
    espefuse.py --port /dev/ttyUSB0 burn_efuse FLASH_CRYPT_CONFIG 15
  • PC ¾å¤ÇÀ¸À®¤·¤¿»öÁ°°Å¹æ²½¥­¡¼¤òÀµ¤·¤¯½ñ¤­¹þ¤ß¤º¤ß¤Ç¤¢¤ë¤³¤È
    espefuse.py --port /dev/ttyUSB0 burn_key flash_encryption ./mykey.bin

°Ê²¼¤Ïº£²ó¼ê¸µ¤Ç¼Â¸³¤Ë»È¤Ã¤¿¥Ü¡¼¥É¤Ç¤Î espefuse.py summary ¤Î·ë²Ì¡£

¤Þ¤º½Ð²Ù»þ¤ÎÁǤξõÂÖ¡£ ¡Ê¤Á¤Ê¤ß¤Ë¤³¤³¤Ç»ÈÍѤ·¤Æ¤¤¤ë¥Ü¡¼¥É¤Ï ESP32-DevKitC ¤Ç¤Ï¤Ê¤¯ ROM BASIC ¤¬ºÇ½é¤«¤é̵¸ú¾õÂ֤Τâ¤Î¡Ë

$ espefuse.py summary

Security fuses:
FLASH_CRYPT_CNT        Flash encryption mode counter                     = 0 R/W (0x0)
FLASH_CRYPT_CONFIG     Flash encryption config (key tweak bits)          = 0 R/W (0x0)
CONSOLE_DEBUG_DISABLE  Disable ROM BASIC interpreter fallback            = 1 R/W (0x1)
ABS_DONE_0             secure boot enabled for bootloader                = 0 R/W (0x0)
ABS_DONE_1             secure boot abstract 1 locked                     = 0 R/W (0x0)
JTAG_DISABLE           Disable JTAG                                      = 0 R/W (0x0)
DISABLE_DL_ENCRYPT     Disable flash encryption in UART bootloader       = 0 R/W (0x0)
DISABLE_DL_DECRYPT     Disable flash decryption in UART bootloader       = 0 R/W (0x0)
DISABLE_DL_CACHE       Disable flash cache in UART bootloader            = 0 R/W (0x0)
BLK1                   Flash encryption key                              
  = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLK2                   Secure boot key                                   
  = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLK3                   Variable Block 3                                  
  = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 

Efuse fuses:
WR_DIS                 Efuse write disable mask                          = 0 R/W (0x0)
RD_DIS                 Efuse read disablemask                            = 0 R/W (0x0)
CODING_SCHEME          Efuse variable block length scheme                = 0 R/W (0x0)
KEY_STATUS             Usage of efuse block 3 (reserved)                 = 0 R/W (0x0)

Config fuses:
XPD_SDIO_FORCE         Ignore MTDI pin (GPIO12) for VDD_SDIO on reset    = 0 R/W (0x0)
XPD_SDIO_REG           If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset   = 0 R/W (0x0)
XPD_SDIO_TIEH          If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V   = 0 R/W (0x0)
SPI_PAD_CONFIG_CLK     Override SD_CLK pad (GPIO6/SPICLK)                = 0 R/W (0x0)
SPI_PAD_CONFIG_Q       Override SD_DATA_0 pad (GPIO7/SPIQ)               = 0 R/W (0x0)
SPI_PAD_CONFIG_D       Override SD_DATA_1 pad (GPIO8/SPID)               = 0 R/W (0x0)
SPI_PAD_CONFIG_HD      Override SD_DATA_2 pad (GPIO9/SPIHD)              = 0 R/W (0x0)
SPI_PAD_CONFIG_CS0     Override SD_CMD pad (GPIO11/SPICS0)               = 0 R/W (0x0)
DISABLE_SDIO_HOST      Disable SDIO host                                 = 0 R/W (0x0)

Identity fuses:
MAC                    MAC Address                                       
  = 24:0a:c4:9a:56:b0 (CRC 4d OK) R/W 
CHIP_VER_REV1          Silicon Revision 1                                = 1 R/W (0x1)
CHIP_VERSION           Reserved for future chip versions                 = 2 R/W (0x2)
CHIP_PACKAGE           Chip package identifier                           = 0 R/W (0x0)

Calibration fuses:
BLK3_PART_RESERVE      BLOCK3 partially served for ADC calibration data  = 0 R/W (0x0)
ADC_VREF               Voltage reference calibration                     = 1100 R/W (0x10)

Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).

Á°½Ò¤Î»°¾ò·ï¤òËþ¤¿¤·¤¿¾õÂÖ¡£°Å¹æ²½¥­¡¼¤ò½ñ¤­¹þ¤ó¤À·ë²Ì¡ÖBLK1 Flash encryption key¡×¹à¤Î¡ÖBLK1¡×¤¬¡ÖR/W¡×¤«¤é¡Ö-/-¡×¤ËÊѲ½¤·¤Æ¤¤¤ëÅÀ¤ËÃí°Õ

$ espefuse.py summary

Security fuses:
FLASH_CRYPT_CNT        Flash encryption mode counter                     = 1 R/W (0x1)
FLASH_CRYPT_CONFIG     Flash encryption config (key tweak bits)          = 15 R/W (0xf)
CONSOLE_DEBUG_DISABLE  Disable ROM BASIC interpreter fallback            = 1 R/W (0x1)
ABS_DONE_0             secure boot enabled for bootloader                = 0 R/W (0x0)
ABS_DONE_1             secure boot abstract 1 locked                     = 0 R/W (0x0)
JTAG_DISABLE           Disable JTAG                                      = 0 R/W (0x0)
DISABLE_DL_ENCRYPT     Disable flash encryption in UART bootloader       = 0 R/W (0x0)
DISABLE_DL_DECRYPT     Disable flash decryption in UART bootloader       = 0 R/W (0x0)
DISABLE_DL_CACHE       Disable flash cache in UART bootloader            = 0 R/W (0x0)
BLK1                   Flash encryption key                              
  = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -/- 
BLK2                   Secure boot key                                   
  = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLK3                   Variable Block 3                                  
  = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 

Efuse fuses:
WR_DIS                 Efuse write disable mask                          = 128 R/W (0x80)
RD_DIS                 Efuse read disablemask                            = 1 R/W (0x1)
CODING_SCHEME          Efuse variable block length scheme                = 0 R/W (0x0)
KEY_STATUS             Usage of efuse block 3 (reserved)                 = 0 R/W (0x0)

Config fuses:
XPD_SDIO_FORCE         Ignore MTDI pin (GPIO12) for VDD_SDIO on reset    = 0 R/W (0x0)
XPD_SDIO_REG           If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset   = 0 R/W (0x0)
XPD_SDIO_TIEH          If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V   = 0 R/W (0x0)
SPI_PAD_CONFIG_CLK     Override SD_CLK pad (GPIO6/SPICLK)                = 0 R/W (0x0)
SPI_PAD_CONFIG_Q       Override SD_DATA_0 pad (GPIO7/SPIQ)               = 0 R/W (0x0)
SPI_PAD_CONFIG_D       Override SD_DATA_1 pad (GPIO8/SPID)               = 0 R/W (0x0)
SPI_PAD_CONFIG_HD      Override SD_DATA_2 pad (GPIO9/SPIHD)              = 0 R/W (0x0)
SPI_PAD_CONFIG_CS0     Override SD_CMD pad (GPIO11/SPICS0)               = 0 R/W (0x0)
DISABLE_SDIO_HOST      Disable SDIO host                                 = 0 R/W (0x0)

Identity fuses:
MAC                    MAC Address                                       
  = 24:0a:c4:9a:56:b0 (CRC 4d OK) R/W 
CHIP_VER_REV1          Silicon Revision 1                                = 1 -/W (0x1)
CHIP_VERSION           Reserved for future chip versions                 = 2 -/W (0x2)
CHIP_PACKAGE           Chip package identifier                           = 0 -/W (0x0)

Calibration fuses:
BLK3_PART_RESERVE      BLOCK3 partially served for ADC calibration data  = 0 -/W (0x0)
ADC_VREF               Voltage reference calibration                     = 1100 -/W (0x10)

Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).

»öÁ°°Å¹æ²½¥­¡¼¤Î½ñ¤­¹þ¤ß¤È FLASH_CRYPT_CNT ¤ÎÀßÄê¤À¤±¤Ç¤ÏÉԲĤǤ¢¤ê FLASH_CRYPT_CONFIG ¤ÎÀßÄê¤âɬÍפÀ¤Ã¤¿¡£

¤³¤ì¤Ç»ö¾ð¤¬¤ï¤«¤Ã¤¿¤¿¤áº£¸å¤Ï¤è¤ê¼êÁ᤯¥Ü¡¼¥É¤Î°Å¹æ²½ÀßÄê¤ò¹Ô¤¦¤³¤È¤¬²Äǽ¤È¤Ê¤Ã¤¿¡£

¤³¤Î¶¹¤¤¶¹¤¤¾ðÊ󤬤ۤ«¤Î狼¤ÎÌò¤ËΩ¤Äµ¡²ñ¤¬¤¢¤ë¤«¤É¤¦¤«¤Ï¤ï¤«¤ê¤Þ¤»¤ó¤¬¡¢¤Ò¤È¤Þ¤º¼«Ê¬ÍѤ˥á¥â¤·¤Æ¤ª¤¯¤³¤È¤Ë¤·¤Þ¤·¤¿¡£


(tanabe)
klab_gijutsu2 at 19:32¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2018ǯ08·î08Æü

Google Home ¤Ç¥í¡¼¥«¥ë¤Î MP3 ¥Õ¥¡¥¤¥ë¤ò¥×¥ì¥¤¥ê¥¹¥ÈºÆÀ¸¤¹¤ëÊýË¡

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

Á°²ó¤Îµ­»ö¤Ç¤Ï ¤Û¤ê¤Ò¤í Íͤˤè¤ë esp8266-google-home-notifier ¥é¥¤¥Ö¥é¥ê¤È ESP32 ¥Ü¡¼¥É¤ò»È¤Ã¤Æ¹½À®¤·¤¿ Google Home ÍÑ¥­¥ã¥¹¥È¥¨¡¼¥¸¥§¥ó¥È¤È¤½¤ÎÍøÍÑÎã¤ò¾Ò²ð¤·¤Þ¤·¤¿¡£µ­»ö¤Ç¤Ï¤¢¤ï¤»¤ÆƱ¥é¥¤¥Ö¥é¥ê¤ò¥×¥é¥¤¥Ù¡¼¥È¤Ë¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿ÆâÍƤȤ·¤Æ°Ê²¼¤òµó¤²¤Þ¤·¤¿¡£

  1. ¸µ¤Î google-home-notifier ¤Ë¸ºß¤¹¤ë ip ´Ø¿ô¤òÄɲÃ
  2. ¸µ¤Î google-home-notifier ¤Ë¸ºß¤¹¤ë play ´Ø¿ô ¡Êpublic¡Ë¤òÄɲÃ
  3. play ´Ø¿ô¤Ë¤è¤ë Google Home ¤Ç¤Î MP3 ¥Ç¡¼¥¿ºÆÀ¸½ªÎ»¤ò¸¡ÃΤ¹¤ë¤¿¤á¤Î¥³¡¼¥ë¥Ð¥Ã¥¯µ¡¹½¤òÄɲÃ

º£²ó¤Ï¤ß¤Ã¤Ä¤á¤ÎÏÃÂê¤Ë¤Ä¤¤¤Æ¾Ò²ð¤·¤Þ¤¹¡£

ÏäΤ­¤Ã¤«¤±

Google Home Mini ¤Ç Spotify ¤Ê¤É»î¤·¤Æ¤¤¤ë¤¦¤Á¤Ë¡¢ÀÎÇã¤Ã¤¿²»³Ú CD ¤ò¤³¤¦¤¤¤¦¼ê·Ú¤µ¤ÇÄ°¤¯¤³¤È¤¬¤Ç¤­¤ì¤Ð¤È»×¤¦¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£¤½¤Î¤¿¤á¤Ë¤Ï³Ú¶Ê¥Ç¡¼¥¿¤ò MP3 ·Á¼°Åù¤ËÊÑ´¹¤·¤Æ Google Play Music ¤Ø¥¢¥Ã¥×¥í¡¼¥É¤¹¤ì¤Ð̵ÎÁ¤Ç¼Â¸½¤Ç¤­¤ë¤È¿ï½ê¤Ç¾Ò²ð¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤Ê¤«¤Ê¤«Ì¥ÎÏŪ¤Ê¥µ¡¼¥Ó¥¹¤Ç¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤Î°ìÊý¤Ç Google LLC ¦¤ÎÍøÍѵ¬Ìó¤È¤Î¤«¤Í¤¢¤¤¤¬µ¤¤Ë¤Ê¤ê¤Þ¤·¤¿¡£

¼ê¸µ¤Ç¤ÏÆü¾ïŪ¤Ë Google LLC ¤Î¿¤¯¤ÎÍ¥¤ì¤¿¥µ¡¼¥Ó¥¹¤ÎÊص¹¤òµý¼õ¤·¤Æ¤ª¤ê¡¢¤Ò¤È¤ê¤Î¥æ¡¼¥¶¤È¤·¤ÆƱ¼Ò¤Ë¤Ï·É°Õ¤È¿®Íê´¶¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£¤·¤«¤·¡¢¼«Ê¬¤Ë¤¹¤Ù¤Æ¤Î¸¢Íø¤Î¤¢¤ë¥Ç¡¼¥¿¤Ç¤¢¤ì¤Ð¤È¤â¤«¤¯¡¢¼«Ê¬¤Ë¤Ï½êÍ­¸¢¤·¤«¤Ê¤¤³Ú¶Ê¤Î¥Ç¡¼¥¿¤ò´Ý¤´¤È¤³¤Îµ¬Ìó¤Î¤â¤È¤Øͤ±¤ë¤³¤È¤Ë¤Ï¸Ä¿ÍŪ¤Ë¤¿¤á¤é¤¤¤¬¤¢¤ê¤Þ¤·¤¿¡£¤½¤³¤ÇÃíÌܤ·¤¿¤Î¤¬ google-home-notifier ¤Î MP3 ¥Ç¡¼¥¿ºÆÀ¸µ¡Ç½¤Ç¤¹¡£

google-home-notifier ¤Ë¤Ï URL ¤Ç»ØÄꤵ¤ì¤¿ MP3 ¥Ç¡¼¥¿¤ò Google Home ¤Ø¥­¥ã¥¹¥È¤¹¤ë¤³¤È¤Î¤Ç¤­¤ë play ´Ø¿ô¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢LAN ¾å¤Ë¥í¡¼¥«¥ë Web ¥µ¡¼¥Ð¤ò¤òΩ¤Æ¤Æ¤½¤³¤Ø½êÄê¤Î MP3 ¥Ç¡¼¥¿¤òÇÛÃÖ¤·¡¢¤½¤Î¥¢¥É¥ì¥¹¤ò¤³¤Î´Ø¿ô¤ØÅϤ»¤Ð¼ê¸µ¤Î´Ä¶­¤«¤é¥Ç¡¼¥¿¤ò»ý¤Á½Ð¤¹¤³¤È¤Ê¤¯ Google Home ¤ÇºÆÀ¸¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£¤³¤Î¤ä¤êÊý¤Ê¤é»ÔÈΤγڶʤËÂФ¹¤ë¼«Ê¬¤Î¸¢Íø¤ÎÈϰϤòƧ¤ß±Û¤¨¤ë¿´ÇۤϤʤ¤¤Ç¤·¤ç¤¦¡£

¤¿¤À¡¢play ´Ø¿ô¤Ï°ì·ï¤Î¥Ç¡¼¥¿¤ò¥ï¥ó¥·¥ç¥Ã¥È¤Ç¥­¥ã¥¹¥È¤¹¤ë¤³¤È¤òÁ°Äó¤È¤¹¤ë¤â¤Î¤ÇÊ£¿ô¥Ç¡¼¥¿¤ÎϢ³ºÆÀ¸¤Ë¤ÏÂбþ¤·¤Æ¤¤¤Þ¤»¤ó¡£¤½¤Î¤¿¤á²¿¶Ê¤«¤ò½çÈÖ¤Ëή¤¹¤È¤¤¤Ã¤¿¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤Î¤¬»ÄÇ°¤Ç¤¹¡£¤½¤³¤Ç¡¢¤³¤ÎÉôʬ¤Ë¼ê¤ò²Ã¤¨¡¢½êÄê¤Î¥×¥ì¥¤¥ê¥¹¥È¤ò»²¾È¤·¤ÆÊ£¿ô¤Î MP3 ¥Ç¡¼¥¿¤Î½ç¼¡ºÆÀ¸¡¦¥·¥ã¥Ã¥Õ¥ëºÆÀ¸¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Æ¤ß¤Þ¤·¤¿¡£

¤Þ¤º¤½¤ÎÆ°ºî¤ÎÍͻҤòÆ°²è¤Ç¾Ò²ð¤·¤Þ¤¹¡£¼«Âð¤Ç¤Ï¸þ¤«¤Ã¤Æº¸Â¦¤Î Raspberry Pi Zero W ¤ò¥í¡¼¥«¥ë Web ¥µ¡¼¥Ð¤È¤·¤Æ±¿ÍѤ·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥Ç¥â¤Ç¤Ï soundorbis Íͤˤè¤ë¥Õ¥ê¡¼¤Î¥¸¥ó¥°¥ë¶Ê¤ò»ÈÍѤµ¤»¤Æ夤¤Æ¤¤¤Þ¤¹¡£

Æ°²è¡§1ʬ15ÉÃ
  

¤Á¤Ê¤ß¤Ë¤³¤³¤Ç¤Ï°Ê²¼¤Î IFTTT ¥¢¥×¥ì¥Ã¥È ¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë ·Ðͳ¤Ç¥í¡¼¥«¥ë Web ¥µ¡¼¥Ð¤«¤éºÆÀ¸¥ê¥¹¥È¡Ödemo.txt¡×¡ÊÆâÍơˤòÆɤ߹þ¤ó¤Ç½èÍý¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£
¥È¥ê¥¬¡¼
¥¢¥¯¥·¥ç¥ó

ºÆÀ¸¥ê¥¹¥È¤È¤½¤Î¼þÊÕ¤ÎÏÃÂê¤ÏËöÈø¤Î¡Ö¥¨¡¼¥¸¥§¥ó¥È¥×¥í¥°¥é¥à¡×¤Î¹à¤Ëµ­½Ò¤·¤Æ¤¤¤Þ¤¹¡£
°Ê²¼¡¢¼Â¸½¤Ë»ê¤ë¤Þ¤Ç¤Î·Ð°Þ¤ò¹µ¤¨¤Þ¤¹¡£

ÂбþÊýË¡¤ÎÄ´ºº

google-home-notifier ¤Î½èÍýÆâÍÆ

¤Þ¤º google-home-notifier ¤Î½èÍý¤òÄɤ¦¤³¤È¤«¤é»Ï¤á¤Þ¤·¤¿¡£°Ê²¼¤Ï¤½¤Î¤Þ¤È¤á¤Ç¤¹¡£esp8266-google-home-notifier ¤Ï¥ª¥ê¥¸¥Ê¥ë¤Î google-home-notifier ¤¬·ø¼Â¤Ë°Ü¿¢¤µ¤ì¤¿¥é¥¤¥Ö¥é¥ê¤Ç¤¢¤ë¤¿¤á¤³¤³¤Ç¤Ï¸å¼Ô¤ò¥¿¡¼¥²¥Ã¥È¤È¤·¤Æ¤¤¤Þ¤¹¡£

½é´üÀßÄê
  • ¸Æ¤Ó½Ð¤·Â¦¤«¤é ip() ´Ø¿ô¤Ë¤è¤êÂоݤȤ¹¤ë Google Home ¥Ç¥Ð¥¤¥¹¤Î IP ¥¢¥É¥ì¥¹¤È¸À¸ì¤¬»ØÄꤵ¤ì¤ì¤Ð¤½¤ì¤òÀßÄê
  • ¸Æ¤Ó½Ð¤·Â¦¤«¤é device() ´Ø¿ô¤Ë¤è¤êÂÐ¾Ý Google Home ¥Ç¥Ð¥¤¥¹¤Î¥Ç¥Ð¥¤¥¹Ì¾¤È¸À¸ì¤¬»ØÄꤵ¤ì¤ì¤Ð¤½¤ì¤òÊÝ»ý

¼ç½èÍý

  • notify() ´Ø¿ô¤ÏÅϤµ¤ì¤¿¥Æ¥­¥¹¥È¤ò½êÄê¤Î¸À¸ì¤Ç TTS ½èÍý¤·¤¿·ë²Ì¤Î MP3 ¥Õ¥¡¥¤¥ë¤Î URL ¤òÂÐ¾Ý Google Home ¥Ç¥Ð¥¤¥¹¤Ø¥­¥ã¥¹¥È¤¹¤ë
  • play() ´Ø¿ô¤Ï»ØÄꤵ¤ì¤¿ MP3 ¥Õ¥¡¥¤¥ë¤Î URL ¤ò¤òÂÐ¾Ý Google Home ¥Ç¥Ð¥¤¥¹¤Ø¥­¥ã¥¹¥È¤¹¤ë
  • notify(), play() ¤Ï¤¤¤º¤ì¤â¸Æ¤Ó½Ð¤µ¤ì¤¿»þÅÀ¤ÇÂÐ¾Ý Google Home ¥Ç¥Ð¥¤¥¹¤Î IP ¥¢¥É¥ì¥¹¤¬Ì¤ÀßÄê¾õÂ֤Ǥ¢¤ì¤ÐÁ°½Ð device() ´Ø¿ô·Ðͳ¤ÇÊÝ»ý¤·¤Æ¤¤¤ë¥Ç¥Ð¥¤¥¹Ì¾¤Ç mDNS ¾È²ñ¤Ë¤è¤êÂÐ¾Ý Google Home ¥Ç¥Ð¥¤¥¹¤Î IP ¥¢¥É¥ì¥¹¤òÆÀ¤ë  =>  GitHub: mdns

¥­¥ã¥¹¥È¤Î¼ê½ç

ÃíÌܤ¹¤Ù¤­ÅÀ¤È¹Í¤¨Êý

¥Ý¥¤¥ó¥È¤Ï¡¢¾åµ­¡Ö¥­¥ã¥¹¥È¤Î¼ê½ç¡×¤ÎºÇ¸å¤Î¡Öload() ¤¬½ª¤ï¤Ã¤¿¤é³Æ²¾ÁÛ¥Á¥ã¥Í¥ë¤ò close ¤·¤Æ¥³¥Í¥¯¥·¥ç¥ó¤òÀÚÃǡפȤ¤¤¦Éôʬ¤Ë¤¢¤ê¤Þ¤¹¡£³ºÅö²Õ½ê¤Î¥½¡¼¥¹¥³¡¼¥É¤ò°úÍѤ·¤Þ¤¹¡£

  • google-home-notifier.js ¡Ê#L88-L96¡Ë
                  :
    var onDeviceUp = function(host, url, callback) {
      var client = new Client();
      client.connect(host, function() {
        client.launch(DefaultMediaReceiver, function(err, player) {
    
          var media = {
            contentId: url,
            contentType: 'audio/MP3',
            streamType: 'BUFFERED' // or LIVE
          };
          player.load(media, { autoplay: true }, function(err, status) {
            client.close();
            callback('Device notified');
          });
                  :
    

¤³¤Î¤è¤¦¤Ë¡¢Google Home ¦¤Î DefaultMediaReceiver ¤ØºÆÀ¸Âоݥǡ¼¥¿¤Î°ú¤­ÅϤ·¡Êplayer.load()¡Ë¤ò½ª¤¨¤ë¤È¥×¥í¥°¥é¥à¤Ïľ¤Á¤Ë¥Ç¥Ð¥¤¥¹¤È¤ÎÀܳ¤òÊĤ¸¤½¤Î¤Þ¤Þ½ªÎ»¤·¤Æ¤¤¤Þ¤¹¡£¤¢¤È¤Ï Google Home ¤Þ¤«¤»¤È¤¤¤¦¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢Google Home ¤Ï¥Ç¡¼¥¿ºÆÀ¸Ãæ¤ËÊ̤Υǡ¼¥¿¤Î¥­¥ã¥¹¥È¤¬»Ø¼¨¤µ¤ì¤ë¤È¸½ºß¤ÎºÆÀ¸¤Î½ªÎ»¤òÂԤĤ³¤È¤Ê¤¯¤¢¤Ã¤µ¤ê¿·¤·¤¤¥Ç¡¼¥¿¤ÎºÆÀ¸¤ò³«»Ï¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢Ã±¤Ë google-home-notifier ¤ò·«¤êÊÖ¤·¼Â¹Ô¤·¤Æ¤â¡¢¤½¤ÎÅÔÅ٥ǡ¼¥¿ºÆÀ¸¤¬ÃæÃǤµ¤ìÊ̥ǡ¼¥¿¤ÎºÆÀ¸¤Ë°Ü¤ë¤À¤±¤Ç¡¢¥×¥ì¥¤¥ê¥¹¥ÈºÆÀ¸¤Î¤è¤¦¤Ë¡Ö°ì·ï¤ÎºÆÀ¸¤¬½ªÎ»¡Á¼¡¤Î¥Ç¡¼¥¿¤òºÆÀ¸¡×¤È¤¤¤¦Æ°¤­¤Ë¤Ï¤Ê¤ê¤Þ¤»¤ó¡£

°ìÊý¡¢¼ê¸µ¤Ç¾åµ­¤Î player.load() ¸å¤âÀܳ¤ò°Ý»ý¤·¤¿¾õÂ֤Ǵѻ¡¤·¤¿¤È¤³¤í¡¢Google Home ¦¤Ç¥Ç¡¼¥¿ºÆÀ¸¤¬½ªÎ»¤¹¤ë¤ÈÁ°·Ç¤Î²¾ÁÛ¥Á¥ã¥Í¥ë¡Öurn:x-cast:com.google.cast.media¡×·Ðͳ¤Ç¥Ç¥Ð¥¤¥¹Â¦¤«¤é¥×¥í¥°¥é¥à¤Ø²¼µ­Í×ÎΤΥá¥Ã¥»¡¼¥¸¤¬Á÷½Ð¤µ¤ì¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤·¤¿¡£

{"type":"MEDIA_STATUS","status":[{"mediaSessionId":1,"playbackRate":1,"playerState":"IDLE","currentTime":0,"supportedMediaCommands":15,"volume":{"level":1,"muted":false},"currentItemId":1,"idleReason":"FINISHED"}],"requestId":0}

¤³¤Î¤è¤¦¤Ë¡¢Àܳ¤ò°Ý»ý¤·¤Æ¤¤¤ì¤Ð¥×¥í¥°¥é¥à¤Ï¥Ç¥Ð¥¤¥¹Â¦¤ÎºÆÀ¸½ªÎ»¤ÎÊ᪤¬²Äǽ¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤·¤¿¡£ ¤³¤Î·ï¤ò´Þ¤á¤³¤³¤Þ¤Ç¤Î°ìÏ¢¤Î»ö¾ð¤òƧ¤Þ¤¨¤ë¤È¡¢google-home-notifier ¤Ç¥Ç¡¼¥¿¤ÎϢ³ºÆÀ¸¤ò¼Â¸½¤¹¤ë¤¿¤á¤ËɬÍפÊÁ¼ÃÖ¤ÏÂ礭¤¯¼¡¤Î¤Õ¤¿¤Ä¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£

  • ¥Ç¥Ð¥¤¥¹¤Ø¤ÎºÆÀ¸»Ø¼¨¤ò½ª¤¨¤¿¤¢¤È¤â¥Ç¥Ð¥¤¥¹¤È¤ÎÀܳ¤ò°Ý»ý¤¹¤ë
  • ¥Ç¥Ð¥¤¥¹¤«¤é¾åµ­¤ÎºÆÀ¸½ªÎ»¥á¥Ã¥»¡¼¥¸¤ò¼õ¤±¼è¤Ã¤¿¤é¼¡¤Î¥Ç¡¼¥¿¤ÎºÆÀ¸¤ò»Ø¼¨¤¹¤ë

¤Ê¤ª¡¢Google Cast ¤Î»ÅÍͤˤϥǡ¼¥¿¤ÎϢ³ºÆÀ¸¤ò¹Ô¤¦¤¿¤á¤Î¥Í¥¤¥Æ¥£¥Ö¤Îµ¡¹½¤¬Â¸ºß¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È¤â»×¤¦¤Î¤Ç¤¹¤¬¡¢¼ê¸µ¤Ç¤Ïº£¤Î¤È¤³¤í¤½¤ÎÊýÌ̤ζñÂÎŪ¤Ê¾ðÊó¤Ë¹Ô¤­Ã夤¤Æ¤ª¤é¤º¡¢¤¤¤º¤ì¤Ë¤»¤è¤³¤³¤Ç¤Ï¤¢¤¯¤Þ¤Ç¤â¸½¹Ô¤Î google-home-notifier ¤Îµ¡Ç½¤ò³ÈÄ¥¤¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

¼ÂÁõ¤Þ¤ï¤ê¤ÎÏÃÂê

Êý¿Ë

¼ÂÁõ¤Ë¤¢¤¿¤Ã¤Æ¤Ï¼¡¤ÎÊý¿Ë¤ò´ðËܤȤ·¤Þ¤·¤¿¡£

  • Ê£¿ô MP3 ¥Ç¡¼¥¿¤ÎϢ³ºÆÀ¸¤Ï¤¢¤¯¤Þ¤Ç¤â³ÈÄ¥µ¡Ç½¤È¤·¤Æ¼è¤ê²ó¤¹¡£½¾Íè¤Î TTS µ¡Ç½¤ª¤è¤Óñ°ì¤Î MP3 ºÆÀ¸µ¡Ç½¤È¤Î¸ß´¹À­¤òÊݤÁξ¼Ô¤Î½èÍý¤ò¾×Æͤµ¤»¤Ê¤¤
  • ¥Ç¥Ð¥¤¥¹¤«¤é¤ÎºÆÀ¸½ªÎ»¥á¥Ã¥»¡¼¥¸¤ò¼õ¤±¼è¤ë¤¿¤á¤Î¥³¥Í¥¯¥·¥ç¥ó°Ý»ý¤È´Æ»ë¤Ï¾¤Î½èÍý¤ò»ß¤á¤Ê¤¤¤¿¤á¤Ë¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¥¿¥¹¥¯Æâ¤Ç¼Â»Ü¤¹¤ë
  • ¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¥¿¥¹¥¯¤«¤éºÆÀ¸½ªÎ»ÄÌÃΤò¼õ¤±¼è¤ë¤¿¤á¤Ë¥³¡¼¥ë¥Ð¥Ã¥¯µ¡¹½¤òÀßÃÖ¤¹¤ë¡£¥é¥¤¥Ö¥é¥ê¦¤ØÄɲ乤ë¤Î¤Ï¤³¤Î¡Ö°ì·ï¤Î MP3 ¥Ç¡¼¥¿ºÆÀ¸¤¬½ªÎ»¤·¤¿¾ì¹ç¡¢¤Þ¤¿¤ÏÃæÃÇ¡¦¥¹¥­¥Ã¥×¤µ¤ì¤¿¾ì¹ç¤Ë¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô·Ðͳ¤ÇÄÌÃΤ¹¤ë¡×½èÍý¤Ë¤È¤É¤á¡¢¤½¤ì°Ê³°¤Î½èÍý¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¦¤ÎÍ×·ï¤È¤·¤Æ¥¨¡¼¥¸¥§¥ó¥È¥×¥í¥°¥é¥à¤Ø¼ÂÁõ¤¹¤ë
  • ¤Ä¤Þ¤ê¥é¥¤¥Ö¥é¥ê¦¤Î²þÊѤÏɬÍ׺Ǿ®¸Â¤ÎÆâÍƤȤ¹¤ë

½èÍý¤Î¥¤¥á¡¼¥¸

º¸Â¦¤Î¥Õ¥í¡¼¤Ï¼ê¸µ¤Ç¤Î p8266-google-home-notifier ¤È¥¨¡¼¥¸¥§¥ó¥È¥×¥í¥°¥é¥à¤Ë¤è¤ë½èÍýÆâÍƤòÍ×Ìó¤·¤¿¤â¤Î¤Ç¤¹¡£±¦Â¦¤Ï¤½¤³¤ËÄ´ºº¤«¤éÆÀ¤é¤ì¤¿¾ðÊó¤ò²ÃÌ£¤·¤Æ MP3 ¥Ç¡¼¥¿¤Î¥ê¥¹¥ÈºÆÀ¸µ¡Ç½¤òÄɲä·¤¿¥¤¥á¡¼¥¸¤Ç¡¢¤¶¤Ã¤¯¤ê¡¢ÀÖʸ»ú¤Î¡Ö¥­¥ã¥¹¥È½èÍý¡×¡ÖºÆÀ¸´Æ»ë¥¿¥¹¥¯¡×¤ÎÉôʬ¤ò¥é¥¤¥Ö¥é¥ê¦¤Î½èÍýÍ×ÁǤÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Ê¤ª³¥¿§¤Î¥Ö¥í¥Ã¥¯¤Ï±¦¥Õ¥í¡¼¤È¤Î¶¦ÄÌÉôʬ¤Ç¤¹¡£ ¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

Google Home ¤«¤é¤Î¥á¥Ã¥»¡¼¥¸¤Ë¤Ä¤¤¤Æ

¾åµ­±¦¥Õ¥í¡¼¤Î¡ÖºÆÀ¸´Æ»ë¥¿¥¹¥¯¡×¥Ñ¡¼¥ÈÆâ¤Î¾ò·ïʬ´ôÉôʬ¤Ç¤â¿¨¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¥Ç¡¼¥¿ºÆÀ¸¤Î´Æ»ëÃæ¤Ë¤Ï Google Home ¥Ç¥Ð¥¤¥¹¤«¤é²¾ÁÛ¥Á¥ã¥Í¥ë·Ðͳ¤Ç¤µ¤Þ¤¶¤Þ¤Ê¥á¥Ã¥»¡¼¥¸¤¬Á÷¤é¤ì¤Æ¤­¤Þ¤¹¡£¼ê¸µ¤Ç¤Î´Ñ»¡·ë²Ì¤«¤é¡¢º£²ó¤Î¼ÂÁõ¤Ç¤Ï°Ê²¼¤Î¥á¥Ã¥»¡¼¥¸¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£

  • ¡Ê±¦¥Õ¥í¡¼Ãæ¤Î¡Ö¢¨1¡×¡Ë ¥Ç¡¼¥¿¤ÎºÆÀ¸½ªÎ»¤Ï¡¢Á°·Ç¤Î¤È¤ª¤êÅö³º¥Ç¥Ð¥¤¥¹¤«¤é¤Î¡Öurn:x-cast:com.google.cast.media¡×¥Á¥ã¥Í¥ë·Ðͳ¤Ç¤Î°Ê²¼¤Î¥á¥Ã¥»¡¼¥¸¤Ë¤è¤Ã¤ÆȽÄê¤Ç¤­¤ë¡£¤³¤ì¤ò¼õ¤±¼è¤Ã¤¿¤é¥¨¡¼¥¸¥§¥ó¥È¦¤Ï¼¡¤Î¶Ê¤ÎºÆÀ¸¤Ø°Ü¹Ô¤¹¤ë
    {"type":"MEDIA_STATUS","status":[{"mediaSessionId":1,"playbackRate":1,"playerState":"IDLE","currentTime":0,"supportedMediaCommands":15,"volume":{"level":1,"muted":false},"currentItemId":1,"idleReason":"FINISHED"}],"requestId":0}
  • ¡Ê±¦¥Õ¥í¡¼Ãæ¤Î¡Ö¢¨2¡×¡Ë ¥Ç¥Ð¥¤¥¹¤¬Â¾¤Î¥¢¥×¥êÅù¤È¤Î¥­¥ã¥¹¥È¥»¥Ã¥·¥ç¥ó¤ò³«»Ï¤·¤¿¾ì¹ç¤Ë¤Ï¡Öurn:x-cast:com.google.cast.tp.connection¡×¥Á¥ã¥Í¥ë¤«¤é°Ê²¼¤Î¥á¥Ã¥»¡¼¥¸¤¬ÆϤ¯¡£¤³¤ì¤ò¼õ¤±¼è¤Ã¤¿¤é¥¨¡¼¥¸¥§¥ó¥È¦¤Ï¸½ºß¤ÎϢ³ºÆÀ¸½èÍý¤òÄä»ß¤¹¤ë
    {"type":"CLOSE"}
    • ¤Ê¤ª¡¢Google Cast µ¡¹½¤Ë¤ª¤¤¤Æ¤Ï¥Ç¥Ð¥¤¥¹Â¦¤È¤ÎÀܳ¤Î°Ý»ý¡¦³Îǧ¤Î¤¿¤á¤Ë¾åµ­¥Á¥ã¥Í¥ë¾å¤ÇÁê¸ß¤Ë PING, PONG ¥á¥Ã¥»¡¼¥¸¤Î±þ½·¤ò·Ñ³Ū¤Ë¼Â»Ü¤¹¤ë¤³¤È¤¬Î®µ·¤Î¤Ò¤È¤Ä¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¥¿¥¹¥¯¤Ç¤ÎÂÔµ¡Ãæ¤Ï 5ÉÃËè¤Ë PING ¤òÁ÷¤ë¤³¤È¤Ë¤·¤¿¤¬¡¢¥¿¥¤¥ß¥ó¥°¤Ë¤è¤Ã¤Æ¤Ï¥Ç¥Ð¥¤¥¹Â¦¤«¤é PING ¤¬ÆϤ¯¤³¤È¤â¤¢¤ë¡£¤½¤Î¾ì¹ç¤Ï PONG ¤òÁ÷¤ë
      {"type":"PING"}
      {"type":"PONG"}
  • ¡Ê±¦¥Õ¥í¡¼Ãæ¤Î¡Ö¢¨3¡×¡Ë ¥æ¡¼¥¶¤¬¡ÖOK, Google¡£¥¹¥È¥Ã¥×¡×¡ÖOK, Google¡£¤ä¤á¤Æ¡×Åù¤ÎºÆÀ¸Ää»ß¤òµá¤á¤ë¥Õ¥ì¡¼¥º¤òȯ¤·¤¿¾ì¹ç¤Ï¡Öurn:x-cast:com.google.cast.media¡×¥Á¥ã¥Í¥ë·Ðͳ¤Ç¥Ç¥Ð¥¤¥¹¤«¤é²¼µ­Í×ÎΤΥá¥Ã¥»¡¼¥¸¤¬ÆϤ¯¡£¤³¤ì¤ò¼õ¤±¼è¤Ã¤¿¤é¥¨¡¼¥¸¥§¥ó¥È¦¤ÏϢ³ºÆÀ¸¤òÄä»ß¤¹¤ë
    {"type":"MEDIA_STATUS","status":[{"mediaSessionId":1,"playbackRate":1,"playerState":"PAUSED","currentTime":1.880214,"supportedMediaCommands":15,"volume":{"level":1,"muted":false},"activeTrackIds":[],"currentItemId":1,"repeatMode":"REPEAT_OFF"}],"requestId":388729138}
  • ¡Ê±¦¥Õ¥í¡¼Ãæ¤Î¡Ö¢¨4¡×¡Ë ¥æ¡¼¥¶¤¬¡ÖOK, Google¡£¥¹¥­¥Ã¥×¡×¡ÖOK, Google¡£¼¡¤Î¶Ê¡×Åù¤Î¥Õ¥ì¡¼¥º¤Ç¼¡¥Ç¡¼¥¿¤Ø¤Î¥¹¥­¥Ã¥×¤ò¥ê¥¯¥¨¥¹¥È¤·¤¿¾ì¹ç¤Ï¡Öurn:x-cast:com.google.cast.media¡×¥Á¥ã¥Í¥ë·Ðͳ¤Ç¥Ç¥Ð¥¤¥¹¤«¤é²¼µ­Í×ÎΤΥá¥Ã¥»¡¼¥¸¤¬ÆϤ¯¡£¤³¤Î¾õ¶·¤Ç¤Î¥¹¥Æ¡¼¥¿¥¹¤Ï¡Ö"playerState":"PLAYING"¡×¤«¤Ä¡¢¡Ö"requestId":¡×¤ÎÃͤ¬ 0 °Ê³°¤È¤Ê¤ë¡£ ¤³¤ì¤ò¼õ¤±¼è¤Ã¤¿¤é¥¨¡¼¥¸¥§¥ó¥È¦¤Ï¼¡¤Î¥Ç¡¼¥¿¤ÎºÆÀ¸¤Ø°Ü¹Ô¤¹¤ë
    {"type":"MEDIA_STATUS","status":[{"mediaSessionId":1,"playbackRate":1,"playerState":"PLAYING","currentTime":15.665338,"supportedMediaCommands":15,"volume":{"level":1,"muted":false},"activeTrackIds":[],"currentItemId":1,"repeatMode":"REPEAT_OFF"}],"requestId":388729139}
    ¤Ê¤ª¡Ö"requestId":0¡×¤Î¥á¥Ã¥»¡¼¥¸¤¬¥Ç¡¼¥¿¤ÎºÆÀ¸³«»Ï»þÅÀ¤Ç°ìÅÙȯ¹Ô¤µ¤ì¤ë¤¿¤á¾åµ­¤Èº®Æ±¤·¤Ê¤¤¤è¤¦Ãí°Õ
    {"type":"MEDIA_STATUS","status":[{"mediaSessionId":1,"playbackRate":1,"playerState":"PLAYING","currentTime":1.384362,"supportedMediaCommands":15,"volume":{"level":1,"muted":false},"activeTrackIds":[],"currentItemId":1,"repeatMode":"REPEAT_OFF"}],"requestId":0}

¥½¡¼¥¹¥³¡¼¥É

¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿ esp8266-google-home-notifier

¥ª¥ê¥¸¥Ê¥ë¤Î esp8266-google-home-notifier ¥é¥¤¥Ö¥é¥ê¤Î¥³¡¼¥É¤Ø¥×¥é¥¤¥Ù¡¼¥È¤Ë¼ê¤ò²Ã¤¨¤Æ¤¤¤Þ¤¹¡£Êѹ¹²Õ½ê¤Ï¡Ö#ifdef TANABE¡×Éôʬ¤Ç¡¢fork ¤·¤¿ GitHub ¥ê¥Ý¥¸¥È¥ê¤ØÈ¿±Ç¤·¤Æ¤¤¤Þ¤¹¡£Êѹ¹ÆâÍƤϤ³¤Îµ­»ö¤ÎËÁƬ¡¢¤ª¤è¤ÓÁ°²ó¤Îµ­»ö¤Ç¿¨¤ì¤¿¤È¤ª¤ê¤Ç¤¹¡£

$ git clone -b private https://github.com/mkttanabe/esp8266-google-home-notifier.git

¤Þ¤¿¡¢Æ±¥ê¥Ý¥¸¥È¥ê¤Î examples/esp32/SimpleUsage/ ²¼¤Ë play ´Ø¿ôÍѤΥµ¥ó¥×¥ë¥¹¥±¥Ã¥Á¤ò²Ã¤¨¤Þ¤·¤¿¡£¤É¤Á¤é¤â¥ª¥ê¥¸¥Ê¥ë¤Î SimpleUsage.ino ¤Î¥³¥Ô¡¼¤ò¾®¤µ¤¯½ñ¤­Âؤ¨¤¿¤â¤Î¤Ç¤¹¡£

¤³¤Î¤Õ¤¿¤Ä¤ÎÄɲåµ¥ó¥×¥ë¤ò¼Â¹Ô¤·¤¿ÍͻҤÎÆ°²è¤Ç¤¹¡£
  

¥¨¡¼¥¸¥§¥ó¥È¥×¥í¥°¥é¥à

Arduino core for the ESP32 ´Ä¶­¤ÇºîÀ®¤·¤¿¥¨¡¼¥¸¥§¥ó¥È¤Î Adruino ¥¹¥±¥Ã¥Á¤Ç¤¹¡£Á°²óʬ¤È¸ß´¹À­¤Î¤¢¤ëµ¡Ç½³ÈÄ¥ÈǤǤ¹¡£

  • GoogleHomeNotifierESP32AgentEx - github.com/mkttanabe

    GoogleHomeNotifierESP32Agent.ino ¤Î °Ê²¼¤Î²Õ½ê¤ò´Ä¶­¤Ë¤¢¤ï¤»¤Æ½ñ¤­Âؤ¨¤ë
    //------- ¥æ¡¼¥¶ÄêµÁ ------------------

    // Google Home ¥Ç¥Ð¥¤¥¹¤Î IP ¥¢¥É¥ì¥¹, ¥Ç¥Ð¥¤¥¹Ì¾
    // Í­¸ú¤Ë¤¹¤ì¤Ð»ØÄê IP ¥¢¥É¥ì¥¹¤òľÀÜ»ÈÍÑ
    // ̵¸ú¤Ë¤¹¤ì¤Ð»ØÄê¥Ç¥Ð¥¤¥¹Ì¾¤Ç mDNS ¾È²ñ
    //#define USE_GH_IPADRESS

    IPAddress myGoogleHomeIPAddress(192,168,0,110);
    #define myGoogleHomeDeviceName "room02"

    // WiFi ¥¢¥¯¥»¥¹¥Ý¥¤¥ó¥È
    #define ssid "ssid"
    #define password "pass"

    // Beebotte ¾ðÊó
    #define mqtt_host "mqtt.beebotte.com"
    #define mqtt_port 8883
    #define mqtt_topic "test01/msg"
    #define mqtt_pass "token:" "token_************"

    // MP3 ¥Ç¡¼¥¿¤òÇÛÃÖ¤¹¤ë Web ¥µ¡¼¥Ð
    #define dataServer "192.168.0.127"
    #define dataServerPort 80
    // MP3 ¥Ç¡¼¥¿¤Î URL
    #define MP3DataFmt "http://" dataServer "/sound/%s.mp3"
    // MP3 ºÆÀ¸¥ê¥¹¥È¤Î¥Ñ¥¹
    #define MP3ListFmt "/sound/list/%s.txt"
    //-------------------------------------

    ¾å¤Îµ­½Ò¤Î¾ì¹ç¡¢¼«Ê¬¤Î Beebotte ¥¢¥«¥¦¥ó¥È¤Î Channel "test01", Resource "msg" ¤Î¥á¥Ã¥»¡¼¥¸¤Î data ¥­¡¼¤ÎÃͤ˱þ¤¸¤Æ°Ê²¼¤¬¹Ô¤ï¤ì¤ë
    • data ÃͤÎÀèƬʸ»ú¤¬¥¢¥¹¥¿¥ê¥¹¥¯¤Ç¤¢¤ì¤Ð²»À¼¹çÀ®ÍѤΥƥ­¥¹¥È¤È¤ß¤Ê¤·¤Æ google-home-notifier ¤Î TTS ½èÍý¤Ë¤«¤±¤ë
      • Îã¡Ë {"data":"*¤³¤ó¤Ë¤Á¤Ï"} => ¡Ö¤³¤ó¤Ë¤Á¤Ï¡×¤ÈȯÏÃ
    • data ÃͤÎÀèƬʸ»ú¤¬¥¢¥¹¥¿¥ê¥¹¥¯¤Þ¤¿¤Ï "@" ¤Ç¤Ê¤±¤ì¤Ð MP3 ¥Õ¥¡¥¤¥ë̾¤È¤ß¤Ê¤·½êÄê¤Î Web ¥µ¡¼¥Ð¤Î URL ¤ËÊÔ½¸¤·¤ÆºÆÀ¸
      • Îã¡Ë {"data":"file01"} => "http://192.168.0.127/sound/file01.mp3" ¤ò¥­¥ã¥¹¥È
    • data ÃͤÎÀèƬʸ»ú¤¬ "@" ¤Ç¤¢¤ì¤Ð MP3 ¥Ç¡¼¥¿ºÆÀ¸¥ê¥¹¥È̾¤È¤ß¤Ê¤·½êÄê¤Î Web ¥µ¡¼¥Ð¤Î URL ¤ËÊÔ½¸¤·¤ÆÆɤ߹þ¤ß¡¢µ­½Ò¤µ¤ì¤Æ¤¤¤ë³Æ MP3 ¥Ç¡¼¥¿¥¨¥ó¥È¥ê¤òºÆÀ¸
      • Îã¡Ë {"data":"@demo"} => "http://192.168.0.127/sound/list/demo.txt" ¤òºÆÀ¸¥ê¥¹¥È¤È¤·¤ÆÆɤ߹þ¤ó¤Ç½èÍý
        • ²¼µ­¤Î»ØÄ꤬¤¢¤ì¤Ð¥·¥ã¥Ã¥Õ¥ëºÆÀ¸¤ò¹Ô¤¦
          {"data":"@demo,1"} , {"data":"@list01,¥é¥ó¥À¥à"}
        • ¾åµ­°Ê³°¤Ê¤é¥ê¥¹¥È¾å¤Îµ­½Ò½ç¤ËºÆÀ¸
      • ºÆÀ¸¥ê¥¹¥È¤Îµ­½ÒÎã
        demo.txt
        # ³Æ¹Ô¤Î '#' °Ê¹ß¤Ï¥³¥á¥ó¥È¤È¤·¤Æ°·¤ï¤ì¤ë
        # ¶õ¹Ô¤Ï̵»ë¡¢Í­¸ú¹ÔÀèƬËöÈø¤Î¥¹¥Ú¡¼¥¹¡¦¥¿¥Ö¤Ï½üµî¤µ¤ì¤ë

        # soundorbis Íͤˤè¤ë¥Õ¥ê¡¼ BGM ºîÉʤè¤ê
        #
        # ¡Ú¥Õ¥ê¡¼BGM¡Û¥ê¥³¡¼¥À¡¼¥¸¥ó¥°¥ë¡Ú01¡Á05¡Û
        # https://www.youtube.com/watch?v=ztm1CSZEpY8
        #
        # ÍøÍѵ¬Ìó
        # https://www.soundorbis.net/license
        #

        demo/[1]nc150689
        demo/[2]nc150690
        demo/[3]nc150691
        demo/[4]nc150692
        demo/[5]nc150693

    ¤Ê¤ª¡¢¾å¤Î¡Ö¥æ¡¼¥¶ÄêµÁ¡×²Õ½ê¤Ë¤ª¤¤¤Æ¡Ö#define USE_GH_IPADRESS¡×¤¬Ìµ¸ú¤Ê¾ì¹ç¤ÏÁ°²óÈǤÈƱÍÍ¤Ë mDNS ¾È²ñ¤Ë¤è¤ê¥Ç¥Ð¥¤¥¹Ì¾¤«¤é IP ¥¢¥É¥ì¥¹¤ò¼èÆÀ¤¹¤ë¤¬¡¢¤³¤Î¤ä¤ä»þ´Ö¤Î¤«¤«¤ë¾È²ñ¤Î¥³¥¹¥È¤ò·Ú¸º¤¹¤ë¤¿¤á¤Ë¡¢º£²ó¤Î³ÈÄ¥ÈǤˤª¤¤¤Æ¤Ï°ìö¼èÆÀ¤·¤¿ IP ¥¢¥É¥ì¥¹¤ò ESP32 ¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥êÎÎ°è ¡ÊSPIFFS¡Ë ¤Øµ­Ï¿¤·¼¡²ó¤Ï¤Þ¤º¤½¤ì¤ò»²¾È¤¹¤ë½èÍý¤ò²Ã¤¨¤Æ¤¤¤ë¡£Åö³º¥¢¥É¥ì¥¹¤Ø¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ì¹ç¤äÅö³º¥¢¥É¥ì¥¹¤Î¥Ç¥Ð¥¤¥¹¤ò Google Home ¤È¼±Ê̤Ǥ­¤Ê¤¤¾ì¹ç¤Ï¤¢¤é¤¿¤á¤Æ¾È²ñ¤Èµ­Ï¿¤ò¹Ô¤¦¡£¾ÜºÙ¤Ï DeviceAddress.cpp ¤ò»²¾È¤Î¤³¤È

¤³¤¦¤¤¤Ã¤¿·Ð°Þ¤ò·Ð¤Æ·Á¤Ë¤Ê¤Ã¤¿¤Î¤¬ËÁƬ¤Î¥Ç¥âÆ°²è¤Ç²ÔƯ¤·¤Æ¤¤¤ë¥¨¡¼¥¸¥§¥ó¥È¤Ç¤¹¡£Raspberry Pi Zero W ¤Î¥í¡¼¥«¥ë Web ¥µ¡¼¥Ð¤È¥Ú¥¢¤Ç¤È¤Æ¤â²÷Ŭ¤ËÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£


(tanabe)
klab_gijutsu2 at 09:54¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2018ǯ08·î03Æü

Google Home ¤òµòÅÀ´Ö¤ÎÁÐÊý¸þ¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤ËÍøÍѤ¹¤ë

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

ESP32 ÈÇ google-home-notifier ¤Î¤³¤È

google-home-notifier ¤Î ESP8266 °Ü¿¢ÈÇ¡Öesp8266-google-home-notifier¡×¤Îºî¼Ô¤Ç¤¢¤ë ¤Û¤ê¤Ò¤í Íͤ¬¡¢º£Ç¯¡Ê2018ǯ¡Ë6·î¤Ë ESP32 ¤Ø¤ÎÂбþ¤ò¼Â»Ü¤µ¤ì¤Þ¤·¤¿¡£node.js ¥×¥í¥°¥é¥à¤Ç¤¢¤ë¥ª¥ê¥¸¥Ê¥ë¤Î google-home-notifier ¤ò¼Â¹Ô²Äǽ¤Ê¤â¤Ã¤È¤â¾®¿¶¤ê¤Ê¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ï¥é¥º¥Ù¥ê¡¼¥Ñ¥¤¤Ç¤¹¤¬¡¢¤µ¤é¤Ë¥³¥ó¥Ñ¥¯¥È¤Ç¾ÃÈñÅÅÎϤξ¯¤Ê¤¤ ESP32 ¥Ü¡¼¥É¤Ç¼«Í³¤Ë Google Home ¤Ø¤Î¥­¥ã¥¹¥È¤ò¼Â¸½¤Ç¤­¤ë¤³¤È¤Ë¤ÏÂ礭¤ÊÌ¥ÎϤ¬¤¢¤ê¤Þ¤¹¡£¼«Âð¤Ç¤Ï¤³¤ÎÁÇÀ²¤é¤·¤¤¥é¥¤¥Ö¥é¥ê¤ò»È¤Ã¤Æ MQTT ¥á¥Ã¥»¡¼¥¸¤ò¥È¥ê¥¬¡¼¤Ë¥­¥ã¥¹¥Æ¥£¥ó¥°¤ò¹Ô¤¦ÆâÍƤΥ¨¡¼¥¸¥§¥ó¥È¤ò¹½À®¤·ÍÍ¡¹¤ÊÍ×·ï¤ÇÍøÍѤµ¤»¤Æ夤¤Æ¤¤¤Þ¤¹¡£

¡ÖÀ¼¤Î¥¢¥Ð¥¿¡¼¡×¤Ë¤è¤ë¤ä¤ê¤È¤ê¡©

¤½¤ó¤ÊÃæ¤ÇÀèÆü¤Õ¤È¡¢google-home-notifier ¤Î¡ÖGoogle Home ¤ÇǤ°Õ¤Î²»¤ò½Ð¤»¤ëµ¡Ç½¡×¤È¡¢Google Home ¦¤Î¡Ö²»À¼¤Ç½êÄê¤Î½èÍý¤ò¼Â¹Ô¤Ç¤­¤ëµ¡Ç½¡×¤ÎÁȤ߹ç¤ï¤»¤ò¡¢Î¥¤ì¤¿µòÅÀ´Ö¤Ç¤ÎÄ귿Ū¤Ê¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤ËÍøÍѤǤ­¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¡© ¤È»×¤¤Î©¤Á¤Þ¤·¤¿¡£¿Þ¤Î¤è¤¦¤Ê¥¤¥á¡¼¥¸¤Ç¤¹¡£

ÁÐÊý¤Î¥¨¡¼¥¸¥§¥ó¥È¤¬¤½¤ì¤¾¤ì MQTT ¥Ö¥í¡¼¥«¡¼¾å¤ÎÊ̤Υȥԥ寤ò Subscribe ¤·¤Æ¤ª¤­¡¢É¬Íפ˱þ¤¸¤ÆÁê¼ê¤Î¥È¥Ô¥Ã¥¯¤Ø¥á¥Ã¥»¡¼¥¸¤ò Publish ¤¹¤ë¤³¤È¤Ç¸½ÃϤΠGoole Home ¤¬½êÄê¤Î¥¢¥Ê¥¦¥ó¥¹¤ò¹Ô¤¤¤Þ¤¹¡£¤½¤ÎÆâÍƤËÂФ¹¤ë½êÄê¤Î¥Õ¥ì¡¼¥º¤Ç¤Î±þÅú¤ÇÁê¼ê¤Ø¸þ¤±¤Æ¤Î½èÍý¤òȯư¤¹¤ë·Á¤Ë¤·¤Æ¤ª¤±¤Ð¡¢¤¤¤ï¤Ð¡ÖÀ¼¤Î¥¢¥Ð¥¿¡¼¡×¤òÄ̤¸¤Æξ¼Ô´Ö¤Î¤ä¤ê¤È¤ê¤¬À®Î©¤¹¤ë¤È¹Í¤¨¤Þ¤·¤¿¡£Æ±¤¸¤¯²»À¼¤Ë¤è¤ëÏ¢ÍíÊýË¡¤Ç¤¢¤Ã¤Æ¤âÅÅÏäȤϰۤʤꤳ¤Î¤ä¤êÊý¤Ë¤ÏľÀÜŪ¤Ê¹´Â«´¶¤ä¤¢¤ë¼ï¤Î½Å¤µ¤¬¤Ê¤¤¤¿¤áÁÐÊý¤È¤â¤è¤ê¼ê·Ú¤Ë¤è¤êø¡¹¤ÈÍøÍѤǤ­¤ë¤Ç¤·¤ç¤¦¡£

»îºî¤Î¥·¥Ê¥ê¥ª

¤¤¤í¤¤¤í»ÈÅÓ¤¬¤¢¤ê¤½¤¦¤Ç¤¹¤¬¡¢¼ê¸µ¤Ç¤Ï¤Þ¤º¸Ä¿ÍŪ¤Ë¸½ºß¤â¤Ã¤È¤â¿È¶á¤Ê¥Æ¡¼¥Þ¤Ç¤¢¤ë¡Ö¹âÎð¼ÔÀ¤ÂӤΰÂÈݳÎǧ¡×¤òÁÛÄꤷ¤¿¥·¥Ê¥ê¥ª¤ò·Á¤Ë¤·¤Æ¤ß¤Þ¤·¤¿¡£°Ê²¼¤ÎÆâÍƤǤ¹¡£

A¡§¸«¼é¤ê¦
B¡§¹âÎð¼ÔÀ¤ÂÓ¦

  • A => Google Home A¡§¡Ö¤Í¤¨ Google¡¢°ÂÈݤò³Îǧ¡×
    • Google Home A => A¡§¡Ø¤Ï¤¤¡¢¤³¤ì¤«¤éÀ¼¤ò¤«¤±¤Æ¤ß¤Þ¤¹¡Ù

  • Google Home B => B¡§¡Ø¿È¤Î¤Þ¤ï¤ê¤ÏÂç¾æÉפǤ¹¤«¡©ÌäÂ꤬¤Ê¤¤¾ì¹ç¤Ï "¤Í¤¨ Google¡¢½çÄ´¤Ç¤¹" ¤ÈÏä·¤«¤±¤Æ²¼¤µ¤¤¡£¤â¤·²¿¤«¤´ÁêÃ̤¬¤¢¤ì¤Ð¡¢"¤Í¤¨ Google¡¢¥³¡¼¥ë¤·¤Æ" ¤ÈÏä·¤«¤±¤Æ²¼¤µ¤¤¡Ù

    • ¥Ñ¥¿¡¼¥ó 1¡§ B => Google Home B¡§¡Ö¤Í¤¨ Google¡¢½çÄ´¤Ç¤¹¡×
      • Google Home B => B¡§¡Ø¤½¤ì¤Ï¤è¤«¤Ã¤¿¤Ç¤¹¡£¤µ¤Ã¤½¤¯Âç¾æÉפÈÅÁ¤¨¤Æ¤ª¤­¤Þ¤¹¤Í¡Ù
        • Google Home A => A¡§¡ØÀèÊý¤«¤é "¸µµ¤¤Ç¤¹"¤È²»À¼Ï¢Íí¤¬¤¢¤ê¤Þ¤·¤¿¡£¥á¡¼¥ë¤ò³Îǧ¤·¤Æ²¼¤µ¤¤¡Ù
        • A ¤¢¤Æ¤Ë¥á¡¼¥ë¤¬ÆϤ¯


    • ¥Ñ¥¿¡¼¥ó 2¡§ B => Google Home B¡§¡Ö¤Í¤¨ Google¡¢¥³¡¼¥ë¤·¤Æ¡×
      • Google Home B => B¡§¡Ø¤Ï¤¤¡¢¤¹¤°¤ËÅÅÏäò¤¹¤ë¤è¤¦¤Ë¤ÈÅÁ¤¨¤Þ¤¹¡Ù
        • Google Home A => A¡§¡ØÀèÊý¤«¤é "ÅÅÏ䷤Ƥۤ·¤¤"¤È²»À¼Ï¢Íí¤¬¤¢¤ê¤Þ¤·¤¿¡£¥á¡¼¥ë¤ò³Îǧ¤·¤Æ²¼¤µ¤¤¡Ù
        • A ¤¢¤Æ¤Ë¥á¡¼¥ë¤¬ÆϤ­·ÈÂÓÅÅÏ䬿ô²ó¥³¡¼¥ë¤µ¤ì¤ë

Áê¼ê¤¬¹âÎð¼Ô¤Ç¤â¤¢¤ë¤¿¤á Google Home ¤«¤é¤Î¥¢¥Ê¥¦¥ó¥¹¤Ë¤Ï¤È¤ê¤ï¤±¡Öʹ¤­¼è¤ê¤ä¤¹¤µ¡×¤¬µá¤á¤é¤ì¤Þ¤¹¡£Äê·¿¤Îʸ¸À¤Ê¤Î¤ÇËè²ó²»À¼¹çÀ®¤ò¹Ô¤¦É¬Á³À­¤â¤Ê¤¯¡¢¤³¤³¤Ç¤Ï¡¢google-home-notifier ¤Î notify ´Ø¿ô¤«¤é¸Æ¤Ó½Ð¤µ¤ì¤ë Google ËÝÌõ TTS ¤ò»È¤¦¤Î¤Ç¤Ï¤Ê¤¯¡¢Ê£¿ô¤Î¥ª¥ó¥é¥¤¥ó TTS ¥µ¡¼¥Ó¥¹¤ò»î¤·¤¿Ãæ¤Ç¸Ä¿ÍŪ¤Ë¤â¤Ã¤È¤â¼«Á³¤Ë´¶¤¸¤é¤ì¤¿²»À¼¤ò¼ýÏ¿¤·¤¿ MP3 ¥Ç¡¼¥¿¤ò play ´Ø¿ô¤ÇºÆÀ¸¤¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

Æ°ºî¤ÎÍÍ»Ò

¸å½Ð¤Î¥×¥í¥°¥é¥à¥ê¥½¡¼¥¹°ì¼°¤ò»È¤Ã¤ÆÆóÁȤΡÖGoogle Home Mini + ¥¨¡¼¥¸¥§¥ó¥È¡×´Ö¤Ç¤ä¤ê¤È¤ê¤ò¹Ô¤Ã¤¿ÍͻҤÎÆ°²è¤Ç¤¹¡£

¡Ê¥Ñ¥¿¡¼¥ó 1¡§ ¡Ö°ÂÈݤò³Îǧ¡× ¡Á ¡Ö½çÄ´¤Ç¤¹¡× 1ʬ17ÉÃ

¡Ê¥Ñ¥¿¡¼¥ó 2¡§ ¡Ö°ÂÈݤò³Îǧ¡× ¡Á ¡Ö¥³¡¼¥ë¤·¤Æ¡×¡Ë 1ʬ16ÉÃ

¥ê¥½¡¼¥¹

esp8266-google-home-notifier ¤Î¥«¥¹¥¿¥Þ¥¤¥º

Á°½Ò¤Î¤è¤¦¤Ë¼ê¸µ¤Ç¤ÏºîÀ®¤·¤¿¥¨¡¼¥¸¥§¥ó¥È¤ò¤µ¤Þ¤¶¤Þ¤ÊÍ×·ï¤ÇÍøÍѤ·¤Æ¤ª¤ê¡¢¤³¤Î´Ö¤Ë¥ª¥ê¥¸¥Ê¥ë¤Î esp8266-google-home-notifier ¥é¥¤¥Ö¥é¥ê¤Î¥³¡¼¥É¤Ø²¿ÅÀ¤«¥×¥é¥¤¥Ù¡¼¥È¤Ë¼ê¤ò²Ã¤¨¤Æ¤¤¤Þ¤¹¡£Êѹ¹²Õ½ê¤Ï¡Ö#ifdef TANABE¡×Éôʬ¤Ç¡¢fork ¤·¤¿ GitHub ¥ê¥Ý¥¸¥È¥ê¤ØÈ¿±Ç¤·¤Æ¤¤¤Þ¤¹¡£

$ git clone -b private https://github.com/mkttanabe/esp8266-google-home-notifier.git

Êѹ¹ÆâÍÆ

  1. ¸µ¤Î google-home-notifier ¤Ë¸ºß¤¹¤ë ip ´Ø¿ô¤òÄɲÃ
    • Google Home ¥Ç¥Ð¥¤¥¹¥¢¥É¥ì¥¹¤Î mDNS ¾È²ñ¤ËÈæ³ÓŪ»þ´Ö¤¬¤«¤«¤ë¤¿¤á IP ¥¢¥É¥ì¥¹¤Îľ»ØÄê¤â¤Ç¤­¤ë¤È´ò¤·¤¤¤¿¤á
  2. ¸µ¤Î google-home-notifier ¤Ë¸ºß¤¹¤ë play ´Ø¿ô ¡Êpublic¡Ë¤òÄɲÃ
    • ¼ê¸µ¤Ç¤Ï TTS µ¡Ç½¤À¤±¤Ç¤Ê¤¯ MP3 ºÆÀ¸µ¡Ç½¤âɬÍפǤ¢¤ë¤¿¤á
  3. play ´Ø¿ô¤Ë¤è¤ë Google Home ¤Ç¤Î MP3 ¥Ç¡¼¥¿ºÆÀ¸½ªÎ»¤ò¸¡ÃΤ¹¤ë¤¿¤á¤Î¥³¡¼¥ë¥Ð¥Ã¥¯µ¡¹½¤òÄɲÃ
    • ¸µ¤Î google-home-notifier ¤Ë¤â¤Ê¤¤¤¬Íߤ·¤¤¤È»×¤Ã¤Æ¤¤¤¿µ¡Ç½¡£Íýͳ¤Ï¸åÆü¤¢¤é¤¿¤á¤Æ¡¢¡¢

¥¨¡¼¥¸¥§¥ó¥È¥×¥í¥°¥é¥à

Arduino core for the ESP32 ´Ä¶­¤ÇºîÀ®¤·¤¿¥¨¡¼¥¸¥§¥ó¥È¤Î Adruino ¥¹¥±¥Ã¥Á¤Ç¤¹¡£MQTT ¥Ö¥í¡¼¥«¡¼¤Ë Beebotte ¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£

  • GoogleHomeNotifierESP32Agent - github.com/mkttanabe
    GoogleHomeNotifierESP32Agent.ino ¤Î °Ê²¼¤Î²Õ½ê¤ò´Ä¶­¤Ë¤¢¤ï¤»¤Æ½ñ¤­Âؤ¨¤ë
    //------- ¥æ¡¼¥¶ÄêµÁ ------------------
    // Google Home ¥Ç¥Ð¥¤¥¹¤Î IP ¥¢¥É¥ì¥¹, ¥Ç¥Ð¥¤¥¹Ì¾
    // Í­¸ú¤Ë¤¹¤ì¤Ð»ØÄê IP ¥¢¥É¥ì¥¹¤òľÀÜ»ÈÍÑ
    // ̵¸ú¤Ë¤¹¤ì¤Ð»ØÄê¥Ç¥Ð¥¤¥¹Ì¾¤Ç mDNS ¾È²ñ
    #define USE_GH_IPADRESS

    IPAddress myGoogleHomeIPAddress(192,168,0,121);
    #define myGoogleHomeDeviceName "room01"

    // WiFi ¥¢¥¯¥»¥¹¥Ý¥¤¥ó¥È
    #define ssid "ssid"
    #define password "pass"

    // Beebotte ¾ðÊó
    #define mqtt_host "mqtt.beebotte.com"
    #define mqtt_port 8883
    #define mqtt_topic "test01/msg"
    #define mqtt_pass "token:" "token_************"

    // MP3 ¥Ç¡¼¥¿¤òÇÛÃÖ¤¹¤ë Web ¥µ¡¼¥Ð¤È¥Ç¡¼¥¿¥Ñ¥¹
    #define dataServer "192.168.0.126"
    #define dataServerPort 80
    #define MP3DataFmt "http://" dataServer "/sound/%s.mp3"

    //-------------------------------------

    ¾å¤Îµ­½Ò¤Î¾ì¹ç¡¢¼«Ê¬¤Î Beebotte ¥¢¥«¥¦¥ó¥È¤Î Channel "test01", Resource "msg" ¤Î¥á¥Ã¥»¡¼¥¸¤Î data ¥­¡¼¤ÎÃͤ˱þ¤¸¤Æ°Ê²¼¤¬¹Ô¤ï¤ì¤ë.
    • data ÃͤÎÀèƬʸ»ú¤¬¥¢¥¹¥¿¥ê¥¹¥¯¤Ç¤¢¤ì¤Ð²»À¼¹çÀ®ÍѤΥƥ­¥¹¥È¤È¤ß¤Ê¤·¤Æ google-home-notifier ¤Î TTS ½èÍý¤Ë¤«¤±¤ë
      • Îã¡Ë {"data":"*¤³¤ó¤Ë¤Á¤Ï"} => ¡Ö¤³¤ó¤Ë¤Á¤Ï¡×¤ÈȯÏÃ
    • data ÃͤÎÀèƬʸ»ú¤¬¥¢¥¹¥¿¥ê¥¹¥¯¤Ç¤Ê¤±¤ì¤Ð MP3 ¥Õ¥¡¥¤¥ë̾¤È¤ß¤Ê¤·½êÄê¤Î Web ¥µ¡¼¥Ð¥¹¥Ú¡¼¥¹¤Î URL ¤òÊÔ½¸¤·¤ÆºÆÀ¸
      • Îã¡Ë {"data":"file01"} => "http://192.168.0.126/sound/file01.mp3" ¤ò¥­¥ã¥¹¥È

ÍÑ°Õ¤·¤¿ IFTTT ¥¢¥×¥ì¥Ã¥È

º£²ó¤Î»îºî¤Ç¤Ï¡¢¥È¥ê¥¬¡¼¤Ë Google Assistant ¥µ¡¼¥Ó¥¹¡¢¥¢¥¯¥·¥ç¥ó¤Ë WebHooks ¥µ¡¼¥Ó¥¹¤ò¥¢¥µ¥¤¥ó¤·¤¿¤ß¤Ã¤Ä¤Î IFTTT ¥¢¥×¥ì¥Ã¥È¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£ ¢¨ ¤¤¤º¤ì¤â¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨

  • Ì䤤¹ç¤ï¤»¥Õ¥ì¡¼¥º¡Ö°ÂÈݤò³Îǧ¡×Âиþ¤Î¥¢¥×¥ì¥Ã¥È
    ¥¢¥¯¥·¥ç¥ó¤Ç Beebotte ¾å¤ÎÁê¼ê¦ "test02/msg" ¥È¥Ô¥Ã¥¯¤Ø "AnpiQuery.mp3" ¤Î¥­¥ã¥¹¥ÈºÆÀ¸¤ò»Ø¼¨¤¹¤ë¥á¥Ã¥»¡¼¥¸¤ò Publish
    ¥È¥ê¥¬¡¼
    ¥¢¥¯¥·¥ç¥ó
  • ±þÅú¥Õ¥ì¡¼¥º¡Ö½çÄ´¤Ç¤¹¡×¤ª¤è¤Ó¡Ö¥³¡¼¥ë¤·¤Æ¡×¤ËÂиþ¤Î¥¢¥×¥ì¥Ã¥È
    ¥¢¥¯¥·¥ç¥ó¤Ç¼¡¹à¤Î Google Apps Script ¤Ë¤è¤ë Web ¥¢¥×¥ê¥³¡¼¥É¤ò½êÄê¤Î¥Ñ¥é¥á¡¼¥¿¤òź¤¨¤Æ¼Â¹Ô
    ¥È¥ê¥¬¡¼
    ¥¢¥¯¥·¥ç¥ó
    ¥È¥ê¥¬¡¼
    ¥¢¥¯¥·¥ç¥ó

Google Apps Script ¤Ë¤è¤ë Web ¥¢¥×¥ê¥³¡¼¥É

¾å¤Î¤Õ¤¿¤Ä¤Î±þÅúÍÑ¥¢¥×¥ì¥Ã¥È¤«¤é¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë GAS ¥³¡¼¥É¤Ç¤¹¡£

  • ¡Ö½çÄ´¤Ç¤¹¡×¤Î¾ì¹ç
    ¥¢¥×¥ì¥Ã¥È¤«¤éÅϤµ¤ì¤ë res ¥Ñ¥é¥á¡¼¥¿¤ÎÃͤϡÖsafe¡×¡£ Beebotte ¾å¤ÎÁê¼ê¦ "test01/msg" ¥È¥Ô¥Ã¥¯¤Ø "AnpiSafe.mp3" ¤Î¥­¥ã¥¹¥ÈºÆÀ¸¤ò»Ø¼¨¤¹¤ë¥á¥Ã¥»¡¼¥¸¤ò Publish ¤·¤Æ¡Ö¸µµ¤¤Ç¤¹¡×¤È Gmail ¤òÁ÷¿®
  • ¡Ö¥³¡¼¥ë¤·¤Æ¡×¤Î¾ì¹ç
    ¥¢¥×¥ì¥Ã¥È¤«¤éÅϤµ¤ì¤ë res ¥Ñ¥é¥á¡¼¥¿¤ÎÃͤϡÖdoCall¡×¡£¤Þ¤º Twillio ·Ðͳ¤ÇÁê¼ê¤Î·ÈÂÓÅÅÏäò¿ô²ó¥³¡¼¥ë¤·¤Æ¤«¤é Beebotte ¾å¤ÎÁê¼ê¦ "test01/msg" ¥È¥Ô¥Ã¥¯¤Ø "AnpiDoCall.mp3" ¤Î¥­¥ã¥¹¥ÈºÆÀ¸¤ò»Ø¼¨¤¹¤ë¥á¥Ã¥»¡¼¥¸¤ò Publish ¤·¤Æ¡ÖÅÅÏ䬤ۤ·¤¤¡×¤È Gmail ¤òÁ÷¿®


/*
  AnpiResponse
  2018-07
*/
var ADMIN = "***********@gmail.com";

function doGet(e) {
  return  ContentService.createTextOutput("??");
}

function doPost(e) {
  return doIt(e);
}

function doIt(e) {
  var msg, mp3Name;
  var res = e.parameter.res;
  var where = e.parameter.where;

  if (res == "safe") {
    msg = "¸µµ¤¤Ç¤¹";
    mp3Name = "AnpiSafe";
  } else if (res == "doCall") {
    msg = "ÅÅÏ䬤ۤ·¤¤";
    mp3Name = "AnpiDoCall";
    doPhoneCall(); // twilio
  }¡¡else {
    return  ContentService.createTextOutput("res not found");
  }

  doPublish(mp3Name); // MQTT

  // gmail
  doSendMail(ADMIN, "Anpi", ADMIN, ADMIN,
           "°ÂÈÝÏ¢Íí [" + res + "]", 
           curDate() + " " + curTime() + "\n" +
           where + " ¤è¤ê ¡Ö" + msg + "¡×¤ÈÏ¢Íí¤¬¤¢¤ê¤Þ¤·¤¿");

  return  ContentService.createTextOutput("OK");
}

function curDate() {
  var d = new Date();
  return d.getFullYear() + '-' +
    ('00' + (d.getMonth()+1)).slice(-2) + '-' + ('00' + d.getDate()).slice(-2);
}

function curTime() {
  var d = new Date();
  return ('00' + d.getHours()).slice(-2) + ':' +
    ('00' + d.getMinutes()).slice(-2) + ':' +  ('00' + d.getSeconds()).slice(-2);
}

function doPhoneCall() {
  var url = "https://api.twilio.com/2010-04-01/Accounts/****************/Calls";
  var data = "To=%2B************&From=%2B***********0&Url=http://demo.twilio.com/docs/voice.xml&Timeout=10";
  var options = {
    method: "POST",
    headers: {
      "Authorization":"Basic QUMxZjdhYTIzZWM2YTdkNWM*************************",
      "Content-Type":"application/x-www-form-urlencoded"
    },
    payload: data,
    muteHttpExceptions: true
  };
  var response = UrlFetchApp.fetch(url, options);
}

function doPublish(mp3Name) {
  var url = "https://api.beebotte.com/v1/data/publish/test01/msg";
  var data = '{"data":"' + mp3Name + '"}';
  var options = {
    method: "POST",
    headers: {
      "X-Auth-Token":"token_****************",
      "Content-Type":"application/json"
    },
    payload: data,
    muteHttpExceptions: true
  };
  var response = UrlFetchApp.fetch(url, options);
}

function doSendMail(from, fromName, to, cc, subject, body) {
  GmailApp.sendEmail(
    to,
    subject,
    body,
    {
      from: from,
      name: fromName,
      cc: cc
    }
  );
}

¸½¹Ô¤Î Google Home ¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¡ÖǽưŪ¤ÊȯÏáפòµ¼»÷Ū¤Ë¼Â¸½¤¹¤ë google-home-notifier ¤òÍøÍѤ·¤Ê¤±¤ì¤Ð¤Ç¤­¤Ê¤¤¤³¤È¤Ç¤¢¤ê¡¢¤³¤¦¤¤¤Ã¤¿»È¤¤Êý¤âƱ¥×¥í¥°¥é¥à¤Î¼ÂÍÑŪ¤Ê±þÍÑÎã¤Î¤Ò¤È¤Ä¤Ç¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¡£¤µ¤é¤ËȯŸ¤µ¤»¤ë¤³¤È¤â¤Ç¤­¤ë¤Ç¤·¤ç¤¦¡£ÌÌÇò¤¤»þÂå¤Ë¤Ê¤ê¤Þ¤·¤¿¡£



;ÃÌ¡§¡Ö¤¦¤ë¤µ¤¤¥¢¥é¡¼¥à¡×µ¡Ç½¤ò DIY ¤·¤¿ÏÃ

¼ê¸µ¤Ç¤Î google-home-notifier ¤ÎÍøÍÑÎã¤ò¤â¤¦¤Ò¤È¤Ä¾Ò²ð¤·¤Þ¤¹¡£ Google Home ¤Î¥¢¥é¡¼¥àµ¡Ç½¤Ï¼ê·Ú¤Ç²¿¤«¤ÈÊØÍø¤Ê¤Î¤ÇÌܳФޤ·ÍѤ˻Ȥ俤ꤷ¤Æ¤¤¤Þ¤·¤¿¡£¤È¤³¤í¤¬¥×¥ê¥»¥Ã¥È¤Î¥¢¥é¡¼¥à²»¤¬¤¤¤µ¤µ¤«¾åÉʤ¹¤®¤ë¤¿¤á¼ê¸µ¤Ç¤Ï²»Î̤òºÇÂç¤Ë¤·¤Æ¤âÌܳФá¤Ë¤Ä¤Ê¤¬¤é¤Ê¤¤¥±¡¼¥¹¤¬²¿ÅÙ¤«¤¢¤ê¤Þ¤·¤¿¡£Æ±¤¸·Ð¸³¤ò¤·¤¿Êý¤Ï¤ª¤½¤é¤¯¾¯¤Ê¤¯¤Ê¤¤¤Î¤Ç¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¡£

¤Á¤Ê¤ß¤Ë¡¢Google ¤Ï 2018-02-01 ¤Î¥¢¥Ã¥×¥Ç¡¼¥È¤Ç Google ¥¢¥·¥¹¥¿¥ó¥È¤Î¥¢¥é¡¼¥à²»¤òÊѹ¹²Äǽ¤È¤·¤¿¤è¤¦¤Ç¤¹¤¬¡¢¤³¤Îµ¡Ç½¤òÍøÍѤǤ­¤ë¤Î¤Ï¸½»þÅÀ¤Ç¤Ï¸À¸ìÀßÄ꤬±Ñ¸ì¤Î¾ì¹ç¤Î¤ß¤ÇÆüËܸì´Ä¶­¤Ç¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£

¸åÆü¤ÎÂбþ¤Ë´üÂÔ¤·¤Ä¤Ä¡¢Á°·Ç¤Î¥¨¡¼¥¸¥§¥ó¥È¤òÍøÍѤ·¤Æ¼ª¾ã¤ê¤Ç¤¦¤ë¤µ¤¤¥¢¥é¡¼¥à¤òÌĤ餹µ¡Ç½¤ò¼«ºî¤·¤Æ¤ß¤Þ¤·¤¿¡£

¤Þ¤º¡¢¥¢¥é¡¼¥àÀßÄêÍÑ¡¦²ò½üÍѤβ¼¤Î¤Õ¤¿¤Ä¤Î IFTTT ¥¢¥×¥ì¥Ã¥È¤òÍÑ°Õ¤·¤Þ¤·¤¿¡£½êÄê¤Î¥·¡¼¥È¤Î A1 ¥»¥ë¤ò»È¤Ã¤Æ²»¤òÌĤ餹»þ¹ï¤ÎÀßÄꡦ²ò½ü¤ò¹Ô¤¦ÆâÍƤǤ¹¡£ÀßÄêÍѤΥ¢¥×¥ì¥Ã¥È¤Ç¤Ï Google Assistant ¥È¥ê¥¬¡¼¤Î¥ª¥×¥·¥ç¥ó "Say a phrase with both a number and a text ingredient" ¤Ç¤Î "a number" ¤È "a text" ¤ò»È¤Ã¤Æ»þ¡¦Ê¬¤Î¤Õ¤¿¤Ä¤Î²»À¼»Ø¼¨Í×ÁǤò¼õ¤±Æþ¤ì¤Æ¤¤¤Þ¤¹¡£
¥È¥ê¥¬¡¼
¥¢¥¯¥·¥ç¥ó
¥È¥ê¥¬¡¼
¥¢¥¯¥·¥ç¥ó

¤¢¤ï¤»¤ÆÅö³º¥·¡¼¥È¤Ë°Ê²¼¤Î GAS ¥³¡¼¥É¤òÉÕÍ¿¡¢¥¹¥¯¥ê¥×¥È¼Â¹Ô¤Î¥È¥ê¥¬¡¼¡Ö»þ´Ö¼çƳ·¿¡×¤Î¡Öʬ¥¿¥¤¥Þ¡¼¡×¤Ç¡Ö1ʬ¤´¤È¡×¤Ë doNotify() ´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤òÀßÄꤷ¤Þ¤·¤¿¡£¥·¡¼¥È¤Ëµ­Ï¿¤µ¤ì¤¿»þ¹ï¤È¸½ºß¤Î»þ¹ï¤¬°ìÃפ¹¤ë¤È¡¢Beebotte ¾å¤Î "test01/msg" ¥È¥Ô¥Ã¥¯¤Ø "noise01.mp3" ¤Î¥­¥ã¥¹¥ÈºÆÀ¸¤ò»Ø¼¨¤¹¤ë¥á¥Ã¥»¡¼¥¸¤¬ Publish ¤µ¤ì¤Þ¤¹¡£


// Beebotte ¤Ø MQTT ¥á¥Ã¥»¡¼¥¸¤ò Publish
function doPublish(mp3Name) {
  var url = "https://api.beebotte.com/v1/data/publish/test01/msg";
  var data = '{"data": "' + mp3Name + '"}';
  var options = {
    method: "POST",
    headers: {
      "X-Auth-Token":"token_*************", 
      "Content-Type":"application/json"
    },
    payload: data,
    muteHttpExceptions: true
  };
  var response = UrlFetchApp.fetch(url, options);
}

function doNotify() {
  // ¥·¡¼¥È¤ò¥Á¥§¥Ã¥¯¡£A1 ¤Ë»þ¹ï¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ì¤ÐÁû²»¤òÌĤ餹
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadSheet.getSheets()[0];
  var val = sheet.getRange("A1").getValue();
  Logger.log(val);
  if (val == 0) {
    return;
  }
  var hm = val.split("_");
  Logger.log("set => " + hm[0] + ":" + hm[1]);  
  if (hm[0] >= 24 || hm[1] >= 60){
    //Logger.log("invalid");
    return;
  }
  var dt = new Date();
  var min = dt.getMinutes();
  var h = dt.getHours();
  if (String(h) == hm[0] && String(min) == hm[1]) {
    sheet.getRange("A1").setValue("0");
    doPublish("noise01");
  }
}

Æ°ºî¤ÎÍͻҡ§ Æ°²è 32ÉÃ

 

¤³¤Î¤è¤¦¤Ëñµ¡Ç½¤Ç¤´¤¯¥·¥ó¥×¥ë¤Ê¤â¤Î¤Ç¤¹¤¬¡¢¼ê¸µ¤Ç¤Ï·ë¹½Ìò¤ËΩ¤Ã¤Æ¤¤¤Þ¤¹¡£


(tanabe)
klab_gijutsu2 at 18:26¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2018ǯ06·î12Æü

SwitchBot ¤ò ESP32 ¤Ç±ó³ÖÁàºî¤·¤Æ¤ß¤¿

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

SwitchBot ¤È¸ø³« API

ʪÍýŪ¤Ê¥¹¥¤¥Ã¥Á¤ä¥Ü¥¿¥ó¤ò¿Í¤ËÂå¤ï¤Ã¤ÆÁàºî¤·¤Æ¤¯¤ì¤ë BLE ¥Ç¥Ð¥¤¥¹ SwitchBot ¡Êby Wonderlabs,Inc.¡Ë¤¬¿Íµ¤¤Ç¤¹¡£Í­Àþ/̵ÀþÄÌ¿®¤äÀÖ³°ÀþÅù¤Ë¤è¤ë¥³¥ó¥È¥í¡¼¥ë¤ËÂбþ¤·¤Æ¤¤¤Ê¤¤µ¡´ï¤ò¤¤¤ï¤Ð¶¯°ú¤Ë IoT ÊýÌ̤ذú¤­¹þ¤â¤¦¤È¤¤¤¦È¯ÁÛ¤¬ÌÌÇò¤¤¤Ç¤¹¤Í¡£


gigazine.net

µ»Å¬¥Þ¡¼¥¯¤ÈÈÖ¹æ¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ë°õºþ¤µ¤ì¤Æ¤¤¤ë

¤³¤ì¤ÏƱ¤¸¤¯¥¯¥é¥¦¥É¥Õ¥¡¥ó¥Ç¥£¥ó¥°¤ò·Ð¤Æ 2016ǯ¤Ë¾¦Éʲ½¤µ¤ì¤¿ MicroBot Push ¡Êby Naran Inc.¡§ ¹©»öÀß·×ǧ¾ÚÈÖ¹æ R208-160099¡Ë ¤Î¸åÄɤ¤À½ÉʤǤϤ¢¤ê¤Þ¤¹¤¬¡¢¼ê¸µ¤Ë¤¢¤ëξ¼Ô¤òÈæ¤Ù¤Æ¤ß¤ë¤È SwitchBot ¤Ë¤Ï¸åȯ¤Ç¤¢¤ë¤³¤È¤Î¥¢¥É¥Ð¥ó¥Æ¡¼¥¸¤¬¿ï½ê¤Ë³è¤«¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¸«¼õ¤±¤é¤ì¤Þ¤¹¡£¤È¤ê¤ï¤±´ò¤·¤¤¤Î¤ÏËÜÂΤΥ¢¡¼¥à¤òÀ©¸æ¤¹¤ë¤¿¤á¤Î API ¤¬¸ø³«¤µ¤ì¤Æ¤¤¤ë¤³¤È¤Ç¤¹¡£

¤³¤Î¸øÌó¤Î¤È¤ª¤ê Wonderlabs,Inc. ¤Ï Apache License 2.0 ¤Î¤â¤È¤Ë¼¡¤Î¥ê¥½¡¼¥¹¤ò¸ø³«¤·¤Æ¤¤¤Þ¤¹¡£

SwitchBot ¤Î¥¢¡¼¥àÁàºî¤ËɬÍפʼê½ç¤¬¼¡¤Î¥·¥ó¥×¥ë¤ÊÆâÍƤǤ¢¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£

  • ÂоݤȤ¹¤ë BLE GATT ¥µ¡¼¥Ó¥¹¤Ï¥æ¡¼¥¶ÄêµÁ¤Î¡Öcba20d00-224d-11e6-9fb8-0002a5d5c51b¡×
  • ¤½¤ÎÇÛ²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡Öcba20002-224d-11e6-9fb8-0002a5d5c51b¡×¤¬¥¿¡¼¥²¥Ã¥È
  • ¾åµ­¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ø¼¡¤ÎÃͤò½ñ¤­¹þ¤à¤È¤½¤ì¤¾¤ì°Ê²¼¤ÎµóÆ°¤È¤Ê¤ë
    • { 0x57, 0x01, 0x00 } ¡§ ¥¢¡¼¥à¤ò ¡ÖÅݤ¹¡Ü°ú¤¯¡× ¡Ê"Press"¡Ë
    • { 0x57, 0x01, 0x01 } ¡§ ¥¢¡¼¥à¤ò ¡ÖÅݤ¹¡× ¡Ê"Turn On"¡Ë
    • { 0x57, 0x01, 0x02 } ¡§ ¥¢¡¼¥à¤ò ¡Ö°ú¤¯¡× ¡Ê"Turn Off"¡Ë

°Ê²¼¤Ï°ÊÁ°¾Ò²ð¤·¤¿¼ê½ç¤ÇºÎ¼è¤·¤¿ GATT ´ÉÍý²¼¤Î UUID ¤Î°ìÍ÷¤Ç¤¹¡£

onServicesDiscovered: serviceList.size=4

onServicesDiscovered: svc uuid=00001800-0000-1000-8000-00805f9b34fb // Generic Access
onServicesDiscovered: chrlist.size=3
onServicesDiscovered:  chr uuid=00002a00-0000-1000-8000-00805f9b34fb // Device Name
onServicesDiscovered:  desclist.size=0
onServicesDiscovered:  chr uuid=00002a01-0000-1000-8000-00805f9b34fb // Appearance
onServicesDiscovered:  desclist.size=0
onServicesDiscovered:  chr uuid=00002a04-0000-1000-8000-00805f9b34fb // Peripheral Preferred Connection Parameters
onServicesDiscovered:  desclist.size=0

onServicesDiscovered: svc uuid=00001801-0000-1000-8000-00805f9b34fb // Generic Attribute
onServicesDiscovered: chrlist.size=0

onServicesDiscovered: svc uuid=0000fee7-0000-1000-8000-00805f9b34fb // Custom UUID of Tencent Holdings Limited
onServicesDiscovered: chrlist.size=3
onServicesDiscovered:  chr uuid=0000fec8-0000-1000-8000-00805f9b34fb // Custom UUID of Apple, Inc.
onServicesDiscovered:  desclist.size=1
onServicesDiscovered:   desc uuid=00002902-0000-1000-8000-00805f9b34fb // Client Characteristic Configuration Descriptor
onServicesDiscovered:  chr uuid=0000fec7-0000-1000-8000-00805f9b34fb // Custom UUID of Apple, Inc.
onServicesDiscovered:  desclist.size=0
onServicesDiscovered:  chr uuid=0000fec9-0000-1000-8000-00805f9b34fb // Custom UUID of Apple, Inc.
onServicesDiscovered:  desclist.size=0

onServicesDiscovered: svc uuid=cba20d00-224d-11e6-9fb8-0002a5d5c51b // User defined service
onServicesDiscovered: chrlist.size=2
onServicesDiscovered:  chr uuid=cba20003-224d-11e6-9fb8-0002a5d5c51b  // User defined characteristic
onServicesDiscovered:  desclist.size=1
onServicesDiscovered:   desc uuid=00002902-0000-1000-8000-00805f9b34fb // // Client Characteristic Configuration Descriptor
onServicesDiscovered:  chr uuid=cba20002-224d-11e6-9fb8-0002a5d5c51b  // User defined characteristic
onServicesDiscovered:  desclist.size=0

¤Á¤Ê¤ß¤Ë¡¢¼ê¸µ¤Î SwithiBot ¸ÄÂΤΠMAC ¥¢¥É¥ì¥¹¤Ï¡ÖC0:65:9A:7D:61:E1¡×¤Ç¤·¤¿¡£

¼«ºî¤Î Android ¥¢¥×¥ê¤ÇÁàºî¤·¤Æ¤ß¤ë

¾åµ­¤Î¼ê½ç¤Ë¤½¤Ã¤Æ¤Þ¤º Android ¥¢¥×¥ê¤ò¤¶¤Ã¤¯¤ê½ñ¤¤¤Æ¤ß¤Þ¤·¤¿¡£°Ê²¼¤ÏÆ°ºî¤ÎÍͻҤò¼ý¤á¤¿Æ°²è¤È¥½¡¼¥¹¥³¡¼¥É¤Ç¤¹¡£

Æ°²è¡§40Éᡲ»ÎÌÃí°Õ

SwitchBot01 - MainActivity.java

/**
 *
 * SwitchBot01
 *
 * SwitchBot ¤òÁàºî¤¹¤ë
 *
 * ¥á¡¼¥«¡¼¤¬¸ø¼°¤Ë¸ø³«¤·¤Æ¤¤¤ë¥×¥í¥°¥é¥à¤ò¥Ù¡¼¥¹¤ËºîÀ®
 *
 * https://github.com/OpenWonderLabs/python-host/
 *
 */

package jp.klab.SwitchBot01;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattDescriptor;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanRecord;
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.android.gms.appindexing.Action;
import java.util.List;
import java.util.UUID;

public class MainActivity extends AppCompatActivity
    implements Runnable, View.OnClickListener, Handler.Callback {

  private static final String TAG = "SB01";
  private static final String TARGET_ADDR = "C0:65:9A:7D:61:E1"; // ¼ê¸µ¤Î SwitchBot

  private static final int SCAN_MODE = ScanSettings.SCAN_MODE_LOW_LATENCY;

  private static final int MSG_DOSCAN = 100;
  private static final int MSG_FOUNDDEVICE = 110;
  private static final int MSG_STOPSCAN = 120;
  private static final int MSG_GATTCONNECT = 200;
  private static final int MSG_GATTCONNECTED = 210;
  private static final int MSG_GATTDISCONNECT = 300;
  private static final int MSG_GATTDISCONNECTED = 310;
  private static final int MSG_GATTGOTSERVICE = 400;
  private static final int MSG_SW_ON = 500;
  private static final int MSG_SW_OFF = 510;
  private static final int MSG_SW_PRESS = 520;
  private static final int MSG_ERROR = 10;
  private static final int REQ_ENABLE_BT = 0;

  private BluetoothAdapter mBtAdapter = null;
  private BluetoothLeScanner mBtScanner = null;
  private BluetoothGatt mBtGatt = null;
  private BluetoothDevice mBtDevice;
  private Handler mHandler;

  private Context mCtx;
  private ProgressDialog mProgressDlg = null;

  private TextView mTvAddr;
  private TextView mTvRssi;
  private Button mButtonDisconn;
  private Button mButtonConn;
  private Button mButtonTurnOn;
  private Button mButtonTurnOff;
  private Button mButtonPress;

  private BluetoothGattCharacteristic mChUser2 = null;
  private BluetoothGattDescriptor mDescUser1 = null;

  // SwitchBot ¤ÎÄ󶡤¹¤ë¥µ¡¼¥Ó¥¹¡¦¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯·²¤Î UUID ¤è¤ê
  private UUID mUuidSvcUser1 = UUID.fromString("cba20d00-224d-11e6-9fb8-0002a5d5c51b");
  private UUID mUuidChUser2  = UUID.fromString("cba20002-224d-11e6-9fb8-0002a5d5c51b");

  // SwitchBot ¤Î 3 ¥³¥Þ¥ó¥É
  private byte[] mCmdSwPress = new byte[] {(byte)0x57, (byte)0x01, (byte)0x00};
  private byte[] mCmdSwOn    = new byte[] {(byte)0x57, (byte)0x01, (byte)0x01};
  private byte[] mCmdSwOff   = new byte[] {(byte)0x57, (byte)0x01, (byte)0x02};

  private ScanCallback mScanCallback = new bleScanCallback();
  private BluetoothGattCallback mGattCallback = new bleGattCallback();

  // GATT ¥¤¥Ù¥ó¥È¥³¡¼¥ë¥Ð¥Ã¥¯
  private class bleGattCallback extends BluetoothGattCallback {
    @Override
    public void onDescriptorWrite(BluetoothGatt gatt,
                    BluetoothGattDescriptor desc,
                    int status) { // writeDescriptor() ·ë²Ì
      super.onDescriptorWrite(gatt, desc, status);
    }
    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
                     BluetoothGattCharacteristic ch,
                     int status) { // readCharacteristic() ·ë²Ì
      super.onCharacteristicRead(gatt, ch, status);
      Log.d(TAG, "onCharacteristicRead: sts=" + status);
    }
    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt,
                      BluetoothGattCharacteristic ch,
                      int status) { // writeCharacteristic ·ë²Ì
      super.onCharacteristicWrite(gatt, ch, status);
      Log.d(TAG, "onCharacteristicWrite: sts=" + status);
    }

    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status,
                      int newState) {
      super.onConnectionStateChange(gatt, status, newState);
      if (newState == BluetoothProfile.STATE_CONNECTED) {  // Àܳ´°Î»
        mHandler.sendEmptyMessage(MSG_GATTCONNECTED);
      } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { // ÀÚÃÇ´°Î»
        mHandler.sendEmptyMessage(MSG_GATTDISCONNECTED);
      }
    }

    @Override
    public void onCharacteristicChanged (BluetoothGatt gatt,
                       BluetoothGattCharacteristic ch) {
      Log.d(TAG, "onCharacteristicChanged");
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { // GATT ¥µ¡¼¥Ó¥¹°ìÍ÷¼èÆÀ´°Î»
      super.onServicesDiscovered(gatt, status);

      // SwitchBot ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ ¤Î¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ 2 ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ
      BluetoothGattService svc = gatt.getService(mUuidSvcUser1);
      mChUser2 = svc.getCharacteristic(mUuidChUser2);

/**  ¤¹¤Ù¤Æ¤Î Services - Characteristics - Descriptors ¤ò¥í¥°¤Ø**
 List<BluetoothGattService> serviceList = gatt.getServices();

 Log.d(TAG, "onServicesDiscovered: serviceList.size=" + serviceList.size());

 for (BluetoothGattService s : serviceList) {
 Log.d(TAG, "onServicesDiscovered: svc uuid=" + s.getUuid().toString());
 List<BluetoothGattCharacteristic> chlist = s.getCharacteristics();
 Log.d(TAG, "onServicesDiscovered: chrlist.size=" + chlist.size());

 for (BluetoothGattCharacteristic c : chlist) {
 UUID uuid = c.getUuid();
 Log.d(TAG, "onServicesDiscovered:  chr uuid=" + uuid.toString());
 List<BluetoothGattDescriptor> dlist = c.getDescriptors();

 Log.d(TAG, "onServicesDiscovered:  desclist.size=" + dlist.size());
 for (BluetoothGattDescriptor d : dlist) {
 Log.d(TAG, "onServicesDiscovered:   desc uuid=" + d.getUuid());
 }
 }
 }
**/
      mHandler.sendEmptyMessage(MSG_GATTGOTSERVICE);
    }
  };

  // SCAN ¥¤¥Ù¥ó¥È¥³¡¼¥ë¥Ð¥Ã¥¯
  private class bleScanCallback extends ScanCallback {
    @Override
    public void onBatchScanResults(List<ScanResult> results) {
      super.onBatchScanResults(results);
      Log.d(TAG, "onBatchScanResults");
    }
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
      super.onScanResult(callbackType, result);
      int rssi = result.getRssi();
      mBtDevice = result.getDevice();
      ScanRecord rec = result.getScanRecord();
      String addr = mBtDevice.getAddress();
      if (!addr.equals(TARGET_ADDR)) {
        return;
      }
      mTvAddr.setText("ADDRESS\n" + TARGET_ADDR);
      mTvRssi.setText("RSSI\n" + rssi);
      mHandler.sendEmptyMessage(MSG_FOUNDDEVICE);
    }
    @Override
    public void onScanFailed(int errorCode) {
      super.onScanFailed(errorCode);
      Log.e(TAG, "onScanFailed: err=" + errorCode);
    }
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate");
    mCtx = this;
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    mTvAddr = (TextView) findViewById(R.id.tvAddr);
    mTvRssi = (TextView) findViewById(R.id.tvRssi);
    mButtonDisconn = (Button)findViewById(R.id.buttonDisconn);
    mButtonConn = (Button)findViewById(R.id.buttonConn);
    mButtonTurnOn = (Button)findViewById(R.id.buttonTurnOn);
    mButtonTurnOff = (Button)findViewById(R.id.buttonTurnOff);
    mButtonPress = (Button)findViewById(R.id.buttonPress);
    mButtonDisconn.setOnClickListener(this);
    mButtonConn.setOnClickListener(this);
    mButtonTurnOn.setOnClickListener(this);
    mButtonTurnOff.setOnClickListener(this);
    mButtonPress.setOnClickListener(this);
    setButtonsVisibility(false);
    setButtonsEnabled(false);
    setTvColor(Color.LTGRAY);

    mHandler = new Handler(this);

    /***** add for Android 6.0 or later ****/
    // https://developer.android.com/training/permissions/requesting.html
    // https://developer.android.com/topic/libraries/support-library/index.html#backward
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
        PackageManager.PERMISSION_GRANTED) {
      ActivityCompat.requestPermissions(this,
          new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
    }

    // üËö¤Î Bluetooth ¥¢¥À¥×¥¿¤Ø¤Î»²¾È¤ò¼èÆÀ
    mBtAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter();

    if (mBtAdapter == null) {
      // Bluetooth ¥µ¥Ý¡¼¥È¤Ê¤·
      showDialogMessage(this, "Device does not support Bluetooth.", true); // finish
    } else if (!mBtAdapter.isEnabled()) {
      // Bluetooth ̵¸ú¾õÂÖ
      Log.d(TAG, "Bluetooth is not enabled.");
      // Í­¸ú²½¤¹¤ë
      Intent it = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
      startActivityForResult(it, REQ_ENABLE_BT);
    } else {
      mBtScanner = mBtAdapter.getBluetoothLeScanner();
      if (!mBtAdapter.isMultipleAdvertisementSupported()) {
        showDialogMessage(this, "isMultipleAdvertisementSupported NG.", true); // finish
      } else {
        // ¥¹¥­¥ã¥ó³«»Ï
        mHandler.sendEmptyMessage(MSG_DOSCAN);
      }
    }
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult");
    switch (requestCode) {
      case REQ_ENABLE_BT:
        // Bluetooth Í­¸ú²½ OK
        if (resultCode == Activity.RESULT_OK) {
          Log.d(TAG, "REQ_ENABLE_BT OK");
          // ¥¹¥­¥ã¥ó³«»Ï
          mHandler.sendEmptyMessage(MSG_DOSCAN);
        } else {
          Log.d(TAG, "REQ_ENABLE_BT Failed");
          mHandler.sendEmptyMessage(MSG_ERROR); // finish
        }
        break;
    }
  }

  @Override
  public void onStart() {
    super.onStart();
    Log.d(TAG, "onStart");
    Action viewAction = Action.newAction(
        Action.TYPE_VIEW, // TODO: choose an action type.
        "Main Page", // TODO: Define a title for the content shown.
        // TODO: If you have web page content that matches this app activity's content,
        // make sure this auto-generated web page URL is correct.
        // Otherwise, set the URL to null.
        Uri.parse("http://host/path"),
        // TODO: Make sure this auto-generated app deep link URI is correct.
        Uri.parse("android-app://jp.klab.SwitchBot01/http/host/path")
    );
  }

  @Override
  public void onStop() {
    super.onStop();
    Log.d(TAG, "onStop");
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy");
    // GATT Àܳ½ªÎ»
    if (mBtGatt != null) {
      mBtGatt.disconnect();
      mBtGatt.close();
      mBtGatt = null;
    }
    // ¥¹¥­¥ã¥óÄä»ß
    if (mBtScanner != null) {
      mBtScanner.stopScan(mScanCallback);
      mBtScanner = null;
    }
  }

  @Override
  public void onClick(View v) {
    if (v == (View)mButtonConn) {
      mHandler.sendEmptyMessage(MSG_GATTCONNECT);
    } else if (v == (View)mButtonTurnOn) {
      mHandler.sendEmptyMessage(MSG_SW_ON);
    } else if (v == (View)mButtonTurnOff) {
      mHandler.sendEmptyMessage(MSG_SW_OFF);
    } else if (v == (View)mButtonPress) {
      mHandler.sendEmptyMessage(MSG_SW_PRESS);
    } else  if (v == (View)mButtonDisconn) {
      mHandler.sendEmptyMessage(MSG_GATTDISCONNECT);
    }
      return;
  }

  @Override
  public boolean handleMessage(Message msg) {
    switch (msg.what) {
      case MSG_DOSCAN: // ¥¹¥­¥ã¥ó³«»Ï
        Log.d(TAG, "msg: MSG_DOSCAN");
        ScanSettings scanSettings = new ScanSettings.Builder().
                setScanMode(SCAN_MODE).build();
        mBtScanner.startScan(null, scanSettings, mScanCallback);
        break;

      case MSG_STOPSCAN: // ¥¹¥­¥ã¥óÄä»ß
        Log.d(TAG, "msg: MSG_STOPSCAN");
        mBtScanner.stopScan(mScanCallback);

        break;

      case MSG_FOUNDDEVICE: // ¥Ú¥ê¥Õ¥§¥é¥ë¤Î¥¢¥É¥Ð¥¿¥¤¥º¥Ñ¥±¥Ã¥È¤ò¸¡½Ð
        Log.d(TAG, "msg: MSG_FOUNDDEVICE");
        mHandler.sendEmptyMessage(MSG_STOPSCAN);
        setTvColor(Color.BLACK);
        setButtonsVisibility(true);
        break;

      case MSG_GATTCONNECT: // ¥Ç¥Ð¥¤¥¹¤Ø¤ÎÀܳ¤ò³«»Ï
        Log.d(TAG, "msg: MSG_GATTCONNECT");
        showProgressMessage(getString(R.string.app_name), "¥Ç¥Ð¥¤¥¹¤ØÀܳÃ桦¡¦¡¦");
        mBtGatt = mBtDevice.connectGatt(mCtx, false, mGattCallback);
        mBtGatt.connect();

        break;

      case MSG_GATTCONNECTED: // ¥Ç¥Ð¥¤¥¹¤Ø¤ÎÀܳ¤¬´°Î»
        Log.d(TAG, "msg: MSG_GATTCONNECTED");
        setTvColor(Color.LTGRAY);
        // ¥Ç¥Ð¥¤¥¹¤Î GATT ¥µ¡¼¥Ó¥¹°ìÍ÷¤Î¼èÆÀ¤Ø
        mBtGatt.discoverServices();
        break;

      case MSG_GATTGOTSERVICE: // ¥Ç¥Ð¥¤¥¹¤Î GATT ¥µ¡¼¥Ó¥¹°ìÍ÷¼èÆÀ´°Î»
        Log.d(TAG, "msg: MSG_GATTGOTSERVICE");
        if (mProgressDlg != null) {
          mProgressDlg.cancel();
          mProgressDlg = null;
        }
        setButtonsEnabled(true);
        break;

      case MSG_GATTDISCONNECT: // ¥Ç¥Ð¥¤¥¹¤È¤ÎÀÚÃÇ
        Log.d(TAG, "msg: MSG_GATTDISCONNECT");
        mBtGatt.disconnect();
        break;

      case MSG_GATTDISCONNECTED: // ¥Ç¥Ð¥¤¥¹¤È¤ÎÀÚÃÇ´°Î»
        Log.d(TAG, "msg: MSG_GATTDISCONNECTED");
          setButtonsEnabled(false);
          if (mBtGatt != null) {
            mBtGatt.close();
            mBtGatt = null;
          }
          showDialogMessage(mCtx, "¥Ç¥Ð¥¤¥¹¤È¤ÎÀܳ¤¬ÀÚÃǤµ¤ì¤Þ¤·¤¿", false);
          mHandler.sendEmptyMessage(MSG_DOSCAN);
        break;

      case MSG_SW_ON: // Turn On
        Log.d(TAG, "msg: MSG_SW_ON");
        mChUser2.setValue(mCmdSwOn);
        mBtGatt.writeCharacteristic(mChUser2);
        break;

      case MSG_SW_OFF: // Turn Off
        Log.d(TAG, "msg: MSG_SW_OFF");
        mChUser2.setValue(mCmdSwOff);
        mBtGatt.writeCharacteristic(mChUser2);
        break;

      case MSG_SW_PRESS: // PRESS
        Log.d(TAG, "msg: MSG_SW_PRESS");
        mChUser2.setValue(mCmdSwPress);
        mBtGatt.writeCharacteristic(mChUser2);
        break;

      case MSG_ERROR:
        showDialogMessage(this, "½èÍý¤ò·Ñ³¤Ç¤­¤Ê¤¤¤¿¤á½ªÎ»¤·¤Þ¤¹", true);
        break;
    }
    return true;
  }

  @Override
  public void run() {
  }

  // ¥À¥¤¥¢¥í¥°¥á¥Ã¥»¡¼¥¸
  private void showDialogMessage(Context ctx, String msg, final boolean bFinish) {
    new AlertDialog.Builder(ctx).setTitle(R.string.app_name)
        .setMessage(msg)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int whichButton) {
            if (bFinish) {
              finish();
            }
          }
        }).show();
  }

  // ¥×¥í¥°¥ì¥¹¥á¥Ã¥»¡¼¥¸
  private void showProgressMessage(String title, String msg) {
    if (mProgressDlg != null) {
      return;
    }
    mProgressDlg = new ProgressDialog(this);
    mProgressDlg.setTitle(title);
    mProgressDlg.setMessage(msg);
    mProgressDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    mProgressDlg.show();
  }
  private void setButtonsEnabled(boolean isConnected) {
    mButtonConn.setEnabled(!isConnected);
    mButtonTurnOn.setEnabled(isConnected);
    mButtonTurnOff.setEnabled(isConnected);
    mButtonPress.setEnabled(isConnected);
    mButtonDisconn.setEnabled(isConnected);
  }

  private void setButtonsVisibility(boolean visible) {
    int v = (visible)? View.VISIBLE : View.INVISIBLE;
    mButtonConn.setVisibility(v);
    mButtonTurnOn.setVisibility(v);
    mButtonTurnOff.setVisibility(v);
    mButtonPress.setVisibility(v);
    mButtonDisconn.setVisibility(v);
  }

  private void setTvColor(int color) {
    mTvRssi.setTextColor(color);
    mTvAddr.setTextColor(color);
  }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="jp.klab.SwitchBot01">
  <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
  <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
      android:name=".MainActivity"
      android:label="@string/app_name"
      android:configChanges="orientation|screenSize"
      android:screenOrientation="portrait"
      android:theme="@style/AppTheme.NoActionBar">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <!-- ATTENTION: This was auto-generated to add Google Play services to your project for
       App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
    <meta-data
      android:name="com.google.android.gms.version"
      android:value="@integer/google_play_services_version" />
  </application>
</manifest>

ESP32 ¥Ü¡¼¥É¤ÇÁàºî¤·¤Æ¤ß¤ë

Android ¥¢¥×¥ê¤«¤é¤ÎÁàºî¤ò³Îǧ¤·¤¿¤È¤³¤í¤Ç¡¢¼¡¤Ë¥Þ¥¤¥³¥óÊýÌ̤«¤é¤Î¥³¥ó¥È¥í¡¼¥ë¤ò»î¤¹¤³¤È¤Ë¤·¤Þ¤·¤¿¡£ ¼ê¸µ¤Ë¤¢¤ë BLE ¥â¥¸¥å¡¼¥ë¤ÎÃæ¤Ç BLE ¥»¥ó¥È¥é¥ëµ¡Ç½¤ËÂбþ¤·¤Æ¤¤¤ë¤Î¤Ï ESP32 ¥Ü¡¼¥É¤Î ESP32-DevKitC ¤À¤±¤Ê¤Î¤ÇÁªÂò¤Î;ÃϤʤ¯¤³¤ì¤ò»È¤¤¤Þ¤¹¡£

ESP32 ÍѤΠBLE ¥»¥ó¥È¥é¥ë¥³¡¼¥É¤Ï°ÊÁ° ESP-IDF ¥Ù¡¼¥¹¤Ç²¿ÅÙ¤«ºîÀ®¤·¤¿¤³¤È¤¬¤¢¤ê¤Þ¤¹¤¬¡¢À¸»ºÀ­¤Ï Arduino IDE + Arduino core for the ESP32 ´Ä¶­¤Î¤Û¤¦¤¬¹â¤¤¤¿¤á¤Ç¤­¤ì¤Ð¸å¼Ô¤òÍøÍѤ·¤¿¤¤¤È¹Í¤¨¤Þ¤·¤¿¡£

¹¬¤¤¡¢ESP ³¦·¨¤ÇÃø̾¤Ê Neil Kolban ¤µ¤ó¤¬ ESP32 Adruino core ÍѤιⵡǽ¤Ê BLE ¥é¥¤¥Ö¥é¥ê¡ÖESP32 BLE for Arduino¡×¤ò 2017ǯ9·î¤è¤ê¸ø³«¤·¤Æ¤¤¤ë¤³¤È¤òÃΤꡢ¤µ¤Ã¤½¤¯ examples ¥Ç¥£¥ì¥¯¥È¥ê²¼¤Î BLE_client.ino ¤Î¥³¡¼¥É¤ò²¼Éߤ­¤Ë¥×¥í¥°¥é¥à¤ò¼ÂÁõ¤·¤Æ¤ß¤Þ¤·¤¿¡£ ¥×¥í¥°¥é¥àµ¯Æ°»þ¤Ë BLE ¥Ú¥ê¥Õ¥§¥é¥ë¤«¤é¤Î¥¢¥É¥Ð¥¿¥¤¥º¥Ñ¥±¥Ã¥È¤ò¥¹¥­¥ã¥ó¤·¡¢¼«Ê¬¤Î SwitchBot ¤ò¸«¤Ä¤±¤¿¤éÀܳ¤ò³ÎΩ¤·¤Æ¡ÖPress¡×¥³¥Þ¥ó¥É¤ò°ìÅÙȯ¹Ô¤¹¤ë´Ê·é¤ÊÆâÍƤȤ·¤Þ¤·¤¿¡£
Æ°ºî¤ÎÍͻҤȥ½¡¼¥¹¥³¡¼¥É¤Ç¤¹¡£Æ°²è¤Ç¤Ï¥Ü¡¼¥É¾å¤Î¥ê¥»¥Ã¥È¥Ü¥¿¥ó¤ò»°ÅÙ²¡²¼¤·¤Æ¤¤¤Þ¤¹¡£

Æ°²è¡§22Éᡲ»ÎÌÃí°Õ

BLE_SwitchBot01_BLE.ino

/**
 * 
 * BLE_SwitchBot01_BLE.ino  (for ESP32)
 * 
 * BLE ¥»¥ó¥È¥é¥ë. SwitchBot ¤«¤é¤Î¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¤ò¸¡½Ð¤·¤¿¤é
 * °ìÅÙ¤À¤±Æ± GATT ¥µ¡¼¥Ð¤ØÀܳ¡Á½êÄê¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ø
 * Press ¥³¥Þ¥ó¥É¤ò½ñ¤­¹þ¤ó¤Ç¥¢¡¼¥à¤òÆ°¤«¤¹.
 * 
 * Arduino core for ESP32 ¸þ¤±¤Î Neil Kolban »á¤Ë¤è¤ë
 * ²¼µ­ BLE ¥é¥¤¥Ö¥é¥ê¤ò»ÈÍÑ
 * https://github.com/nkolban/ESP32_BLE_Arduino
 *
 */

#include "BLEDevice.h"
#include <HardwareSerial.h>

// ¼ê¸µ¤Î SwitchBot ¤Î¥¢¥É¥ì¥¹
static String addrSwitchBot = "c0:65:9a:7d:61:e1";
// SwitchBot ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹
static BLEUUID serviceUUID("cba20d00-224d-11e6-9fb8-0002a5d5c51b");
// ¾åµ­¥µ¡¼¥Ó¥¹Æâ¤ÎÂоݥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯
static BLEUUID    charUUID("cba20002-224d-11e6-9fb8-0002a5d5c51b");
// SwitchBot ¤Î Press ¥³¥Þ¥ó¥É
static uint8_t cmdPress[3] = {0x57, 0x01, 0x00};

static BLEAddress *pGattServerAddress;
static BLERemoteCharacteristic* pRemoteCharacteristic;
static BLEClient*  pClient = NULL;
static boolean doSendCommand = false;

// BLEDevice::init() ¤Ç¤Î¥·¥ê¥¢¥ë¥Ý¡¼¥Èº®ÍðÂкö
static HardwareSerial hs2(2);

void dbg(const char *format, ...) {
  char b[512];
  va_list va;
  va_start(va, format);
  vsnprintf(b, sizeof(b), format, va);
  va_end(va);
  hs2.print(b);
}

// ¥¢¥É¥Ð¥¿¥¤¥º¸¡½Ð»þ¤Î¥³¡¼¥ë¥Ð¥Ã¥¯
class advdCallback: public BLEAdvertisedDeviceCallbacks {
  void onResult(BLEAdvertisedDevice advertisedDevice) {
    dbg("BLE device found: ");
    String addr = advertisedDevice.getAddress().toString().c_str();
    dbg("addr=[%s]\r\n", addr.c_str());
    // SwitchBot ¤òȯ¸«
    if (addr.equalsIgnoreCase(addrSwitchBot)) {
      dbg("found SwitchBot\r\n");
      advertisedDevice.getScan()->stop();
      pGattServerAddress = new BLEAddress(advertisedDevice.getAddress());
      doSendCommand = true;
    }
  }
};

void setup() {
  hs2.begin(115200, SERIAL_8N1, 16, 17);
  Serial.begin(115200);
  dbg("start");
  // BLE ½é´ü²½
  BLEDevice::init("");
  // ¥Ç¥Ð¥¤¥¹¤«¤é¤Î¥¢¥É¥Ð¥¿¥¤¥º¤ò¥¹¥­¥ã¥ó
  BLEScan* pBLEScan = BLEDevice::getScan();
  pBLEScan->setAdvertisedDeviceCallbacks(new advdCallback());
  pBLEScan->setActiveScan(true);
  pBLEScan->start(30); 
}

void loop() {
  if (doSendCommand == true) {
    if (connectAndSendCommand(*pGattServerAddress)) {
    } else {
      dbg("connectAndSendCommand failed");
    }
    doSendCommand = false;
    dbg("done");
  }
  delay(1000);
}

// SwitchBot ¤Î GATT ¥µ¡¼¥Ð¤ØÀܳ ¡Á Press ¥³¥Þ¥ó¥ÉÁ÷¿®
static bool connectAndSendCommand(BLEAddress pAddress) {
  dbg("start connectAndSendCommand");
  pClient  = BLEDevice::createClient();

  pClient->connect(pAddress);
  dbg("connected\r\n");

  // Âоݥµ¡¼¥Ó¥¹¤òÆÀ¤ë
  BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
  if (pRemoteService == nullptr) {
    dbg("target service not found\r\n");
    return false;
  }
  dbg("found target service\r\n");

  // Âоݥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤òÆÀ¤ë
  pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
  if (pRemoteCharacteristic == nullptr) {
    dbg("target characteristic not found");
    return false;
  }
  dbg("found target characteristic\r\n");

  // ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ë Press ¥³¥Þ¥ó¥É¤ò½ñ¤­¹þ¤à
  pRemoteCharacteristic->writeValue(cmdPress, sizeof(cmdPress), false);

  delay(3000);
  if (pClient) {
    pClient->disconnect();
    pClient = NULL;
  }
  return true;
}

SwitchBot ¤ò¥¤¥ó¥¿¡¼¥Í¥Ã¥È¤´¤·¤ËÁàºî¤¹¤ë

ESP32 ¤È¤¤¤¨¤Ð¡¦¡¦

¾åµ­¤Î¤è¤¦¤Ë ESP32 ¥Ü¡¼¥É¤ÇŬÀÚ¤Ë SwitchBot ¤òÁàºî²Äǽ¤Ç¤¢¤ë¤³¤È¤¬³Îǧ¤Ç¤­¤Þ¤·¤¿¡£¤½¤³¤Ç¤Õ¤È¡¢¤³¤³¤Ë¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥¢¥¯¥»¥¹¤ÎÍ×ÁǤòÍí¤á¤ë¤³¤È¤ò»×¤¤¤Ä¤­¤Þ¤·¤¿¡£ ESP32 ¤¬È÷¤¨¤Æ¤¤¤ë BLE µ¡Ç½¤È WiFi µ¡Ç½¤ò¥Ñ¥é¥ì¥ë¤ËÍøÍѤǤ­¤ë¤³¤È¤Ï°ÊÁ°¤Î»î¤ß¤òÄ̤¸¤Æ³Îǧ¤º¤ß¤Ç¤¹¡£¤½¤Î¤¿¤á¡Ö¥¤¥ó¥¿¡¼¥Í¥Ã¥È¤´¤·¤Ë½êÄê¤Î¥á¥Ã¥»¡¼¥¸¤ò¼õ¿®¤·¤¿¤é SwitchBot ¤òºîÆ°¤µ¤»¤ë¡×¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È¹Í¤¨¤Þ¤·¤¿¡£¤â¤Á¤í¤ó SwitchBot ¸ø¼°¤Î¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥Ï¥ÖÀ½ÉʤǤ¢¤ë¡ÖSwitchBot Hub¡×¤Î¤è¤¦¤Ë¹âµ¡Ç½¤Ê¤â¤Î¤Ë¤ÏÅþÄìµÚ¤Ð¤Ê¤¤¤Ë¤·¤Æ¤â¡¢ESP32 ¥Ü¡¼¥É¤ò»È¤¨¤ÐºÇÄã¸Â¤Î±ó³ÖÁàºî¤Ï¼Â¸½¤Ç¤­¤½¤¦¤Ç¤¹¡£

Æ»¶ñΩ¤Æ

¥¤¥ó¥¿¡¼¥Í¥Ã¥È·Ðͳ¤Ç¤Î ESP32 ¤Ø¤Î¥á¥Ã¥»¡¼¥¸¥ó¥°¤Ë¤Ï MQTT ¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

CloudMQTT

MQTT ¥Ö¥í¡¼¥«¡¼¤ÏºÇ¶á Beebotte ¤¬Î®¹Ô¤Ã¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¤¬¡¢¤¤¤¯¤Ä¤«¤Î¥µ¡¼¥Ó¥¹¤ò»î¤·º£²ó¤Ï¤â¤Ã¤È¤â¼ê¤ËÆëÀ÷¤ó¤À¡ÖCloudMQTT¡×¤òÁª¤Ó¤Þ¤·¤¿¡£ÌµÎÁÏȤâ¼ê¸µ¤ÎÍ×·ï¤Ë¤Ï½½Ê¬¤Ç¤¹¡£

HTTP to MQTT bridge

¥Î¡¼¥Þ¥ë¤Ê HTTP ¥ê¥¯¥¨¥¹¥È¤ÎÂκۤǥá¥Ã¥»¡¼¥¸¤ò Publish ¤Ç¤­¤ì¤Ð²¿¤«¤ÈÊØÍø¤Ç¤¹¡£Beebotte ¤È¤Ï°ã¤¤¸½»þÅÀ¤Ç CloudMQTT ¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë REST API ¤Ï´ÉÍýÍѤΤâ¤Î¤Î¤ß¤Ç¤¹¤¬¡¢petkov ¤µ¤ó¤Ë¤è¤ë¡ÖHTTP to MQTT bridge¡×¤Î¸ºß¤È¤³¤ì¤ò Heroku ¤«¤éÍøÍѤǤ­¤ë¤³¤È¤òÃΤê¤Þ¤·¤¿¡£¤Á¤Ê¤ß¤Ë¡¢Heroku ¤Ë¤Ï CloudMQTT ÍѤΥ¢¥É¥ª¥ó¤âÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¤¶¤Ã¤ÈÀâÌÀ¤òÆɤó¤À¤È¤³¤í¤Ç¤Ïñ¤Ë CloudMQTT ¾å¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¸Æ¤Ó½Ð¤¹ÆâÍƤΤ褦¤Ç HTTP to MQTT bridge ¤ÎÍøÍѤÈÈæ¤ÙºÝΩ¤Ã¤¿¥á¥ê¥Ã¥È¤¬¸«¤¨¤Ê¤¤¤³¤È¤È¡¢¤Þ¤¿¡¢Heroku ¤Ç¥¢¥É¥ª¥ó¤òÍøÍѤ¹¤ë¤Ë¤Ï¥¯¥ì¥¸¥Ã¥È¥«¡¼¥ÉÅÐÏ¿¤¬É¬ÍפǤ¢¤ëÅÀ¤¬¼ã´³Èù̯¤Ç¤â¤¢¤êº£²ó¤ÏÍøÍѤò¸«¹ç¤ï¤»¤Þ¤·¤¿¡£

  • HTTP to MQTT bridge - www.home-assistant.io
  • Deploy your own HTTP to MQTT bridge - heroku.com
    ÀßÄê
    ²Á³ÊÂηÏ

    "ǧ¾ÚºÑ¤ß¥¢¥«¥¦¥ó¥È¤Ç 1 ·î¤¢¤¿¤ê 1,000 »þ´Öʬ¤Î̵ÎÁ dyno »þ´Ö¤ò»È¤¨¤Þ¤¹¡£Ì¤Ç§¾Ú¥¢¥«¥¦¥ó¥È¤Î¾ì¹ç¤Ï 550 »þ´Öʬ¤Ç¤¹¡£ÌµÎÁ¤Î dyno ¤¬¥¢¥¯¥Æ¥£¥Ö¤Ë¤Ê¤ë¤È¥×¡¼¥ë¤«¤é dyno ¤¬¼è¤ê½Ð¤µ¤ì¡¢dyno »þ´Ö¤¬¥×¡¼¥ë¤Ë»Ä¤Ã¤Æ¤¤¤ë¸Â¤ê¡¢ÌµÎÁ¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£"

    ¡ÖDyno¡×¤òÅ°ÄìŪ¤ËÍý²ò¤¹¤ë CodeZine

IFTTT

HTTP ¥¯¥é¥¤¥¢¥ó¥È¤«¤é ESP32 ¤Ø¥á¥Ã¥»¡¼¥¸¤òÁ÷¤ëʬ¤Ë¤Ï°Ê¾å¤Î½àÈ÷¤Ç»ö­¤ê¤Þ¤¹¡£°ìÊý¡¢SwitchBot ¤Î¥á¥¤¥ó¤Î¥­¡¼¥ï¡¼¥É¤Ç¤¢¤ë¡Ö¥¹¥Þ¡¼¥È¥Û¡¼¥à¡×¤Ë¤Ï¤³¤Î¤È¤³¤í¡Ö¥¹¥Þ¡¼¥È¥¹¥Ô¡¼¥«¡¼¡×¤¬¤Ô¤¿¤ê¤È´ó¤êź¤Ã¤Æ¤¤¤ë´¶¤¬¤¢¤ê¤Þ¤¹¤Í¡£¤Ê¤Î¤Ç¡¢¤ªÌó«¤É¤ª¤ê¡Ê¡©¡Ë¼ê¸µ¤Î Google Home Mini ÍÑ¤Ë IFTTT ¥¢¥×¥ì¥Ã¥È¤òÍÑ°Õ¤·¤Þ¤·¤¿¡£¥È¥ê¥¬¡¼¤Ë¤Ï Google Assistant ¥µ¡¼¥Ó¥¹¤ò¡¢¥¢¥¯¥·¥ç¥ó¤Ë¤Ï Webhooks ¥µ¡¼¥Ó¥¹¡Êµì Maker ¥Á¥ã¥Í¥ë¡Ë¤ò³ä¤êÅö¤Æ¡¢¸å¼Ô¤Ø¾å¤Î¥Ö¥ê¥Ã¥¸¤Ø¤Î¥ê¥¯¥¨¥¹¥È¤òÀßÄꤷ¤Þ¤¹¡£

¥³¡¼¥É¥µ¥¤¥º¤ÎĶ²á¤ÈÂнè

°ú¤­Â³¤­ Nick O'Leary ¤µ¤ó¤Ë¤è¤ë Arduino Client for MQTT ¥é¥¤¥Ö¥é¥ê¤òÍøÍѤ·¤Æ CloudMQTT ¤ËÂиþ¤·¥á¥Ã¥»¡¼¥¸¤Î Publish / Subscribe ¤ò¹Ô¤¦¥·¥ó¥×¥ë¤Ê¥¹¥±¥Ã¥Á¤òºîÀ®¡¢ESP32 ¾å¤ÇÌäÂê¤Ê¤¯Æ°ºî¤¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤·¤¿¡£ ¤³¤ì¤ÈÁ°·Ç¤Î BLE ¥»¥ó¥È¥é¥ë¥×¥í¥°¥é¥à¤Î¤Õ¤¿¤Ä¤ò¼´¤È¤·¤Æ·ë¹ç¤·ºÙ¤«¤¤½èÍý¤ò½ñ¤­²Ã¤¨¤ì¤Ð´°À®¤Ç¤·¤ç¤¦¡£

¤Þ¤º¤Ï¥é¥Õ¤Ë·ë¹ç¤·¤Æ¤ß¤Þ¤·¤¿¡£¤¹¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥ë¤ÏÄ̤俤â¤Î¤Î ESP-WROOM-32 ¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Ø¤Î½ñ¤­¹þ¤ß¤Ç¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿¡£¥³¡¼¥É¥µ¥¤¥º¤ÎĶ²á¤Ç¤¹¡£

ºÇÂç1310720¥Ð¥¤¥È¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Î¤¦¤Á¡¢¥¹¥±¥Ã¥Á¤¬1568826¥Ð¥¤¥È¡Ê119%¡Ë¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£

ºÇÂç294912¥Ð¥¤¥È¤ÎRAM¤Î¤¦¤Á¡¢¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤¬70452¥Ð¥¤¥È¡Ê23%¡Ë¤ò»È¤Ã¤Æ¤¤¤Æ¡¢¥í¡¼¥«¥ëÊÑ¿ô¤Ç224460¥Ð¥¤¥È»È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
¥¹¥±¥Ã¥Á¤¬Â礭¤¹¤®¤Þ¤¹¡£http://www.arduino.cc/en/Guide/Troubleshooting#size ¤Ë¤Ï¡¢¾®¤µ¤¯¤¹¤ë¥³¥Ä¤¬½ñ¤¤¤Æ¤¢¤ê¤Þ¤¹¡£
¥Ü¡¼¥ÉESP32 Dev Module¤ËÂФ¹¤ë¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿¡£

¤¢¤é¤¿¤á¤Æ¸µ¤Î¤Õ¤¿¤Ä¤Î¥¹¥±¥Ã¥Á¤Î¥³¡¼¥É¥µ¥¤¥º¤ò³Îǧ¤·¤Æ¤ß¤ë¤È¡¢ÆâÍÆŪ¤Ë¤Ï¥·¥ó¥×¥ë¤Ê BLE ¥×¥í¥°¥é¥à¦¤¬Ã±ÂΤǽñ¤­¹þ¤ß²ÄǽÍÆÎ̤Π94%¤Ë¤âµÚ¤ó¤Ç¤¤¤Þ¤·¤¿¡£ESP32 BLE for Arduino ¥é¥¤¥Ö¥é¥ê¤Î¥Ü¥ê¥å¡¼¥à¤ÎÂ礭¤µ¤¬±®¤¨¤Þ¤¹¡£

ºÇÂç1310720¥Ð¥¤¥È¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Î¤¦¤Á¡¢¥¹¥±¥Ã¥Á¤¬1237529¥Ð¥¤¥È¡Ê94%¡Ë¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£

°Ê²¼¤ò»î¤·¤Þ¤·¤¿¡£

  • Arduino ¸ø¼°¤Î¥¬¥¤¥À¥ó¥¹¤È¥Í¥Ã¥È¾å¤Î¾ðÊó¤ò»²¹Í¤Ë¥³¡¼¥Ç¥£¥ó¥°¥ì¥Ù¥ë¤Ç¤ÎÂнè¤ò¼Â»Ü
    • ·ë²Ì¡§¿ô10KBÄøÅ٤κ︺¤Ëα¤Þ¤Ã¤¿
  • ESP32 BLE for Arduino ¤Î¥¢¡¼¥«¥¤¥Ö¥Ú¡¼¥¸¤«¤é¡¢¤â¤Ã¤È¤â¥¹¥ê¥à¤Ê½éÈǤΠESP32_BLE_Arduino-0.1.0.zip¡Ê2017-09-10¡Ë ¤Ø¤Î¥Ð¡¼¥¸¥ç¥ó¥À¥¦¥ó¤ò»î¤¹
    • ·ë²Ì¡§¤¹¤Ç¤Ë¸½¹Ô¤Î Arduino core for the ESP32 ¤È¤Ï¸ß´¹À­¤¬¤Ê¤¯¥³¥ó¥Ñ¥¤¥ë¥¨¥é¡¼¤¬Â¿È¯¡£¼ê¸µ¤Ç¿ï½ê¤Ë¼ê¤ò²Ã¤¨ºÇ½ªÅª¤Ë¥Ó¥ë¥É²Äǽ¤È¤Ê¤Ã¤¿¤¬Åö³º¥¹¥±¥Ã¥Á¤Î¥³¡¼¥É¥µ¥¤¥º¤Ï½ñ¤­¹þ¤ß²ÄǽÍÆÎÌÂÐÈæ 115% ÄøÅ٤ޤǤˤ·¤«¼ý¤Þ¤é¤º
  • ¥Í¥Ã¥È¾å¤Î¾ðÊó¤Ë¤½¤Ã¤Æ¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¾å¤Î½ñ¤­¹þ¤ß²ÄǽÎΰè¤òÁý¤ä¤·¤Æ¤ß¤ë
    • ·ë²Ì¡§¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¥Æ¡¼¥Ö¥ë¤ÎÊÔ½¸¤Ë¤è¤ê¥³¡¼¥É¤Î½ñ¤­¹þ¤ß¤Ë¤ÏÀ®¸ù¤·¤¿¡£¤À¤¬¥×¥í¥°¥é¥à¤ÏÀµ¾ï¤ËÆ°ºî¤»¤º¥ê¥Ö¡¼¥È¤ò·«¤êÊÖ¤·¤¿

¸½»þÅÀ¤Ç¤Ï¾¤Ë¤³¤ì¤È¤¤¤Ã¤¿Âкö¤â¸«Åö¤¿¤é¤º Arduino IDE ´Ä¶­¤Ç¤Î³«È¯¤Ï¤³¤³¤Ç°ìöÃÇÇ°¤·¤Þ¤·¤¿¡£

ESP-IDF ´Ä¶­¤Ø¤Î°Ü¹Ô ¡Á ´°À®

¤³¤¦¤¤¤Ã¤¿·Ð°Þ¤ò·Ð¤Æ¥Í¥¤¥Æ¥£¥Ö¤Î ESP-IDF ´Ä¶­¤Ø°Ü¹Ô¤·¥×¥í¥°¥é¥à¤ò½ñ¤­Ä¾¤·¤Þ¤·¤¿¡£ Espressif ¤Ï¥³¥¢¥é¥¤¥Ö¥é¥ê¤òÉÑÈˤ˹¹¿·¤·¤Æ¤ª¤ê API ¤Î¸åÊý¸ß´¹À­¤¬É¬¤º¤·¤â°Ý»ý¤µ¤ì¤Ê¤¤¥±¡¼¥¹¤Î¤¢¤ë¤³¤È¤¬µ¤¤¬¤«¤ê¤Ç¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤ÎÅÀ¤Ï¸½ºß¤â¤Ê¤ª³è²Ð»³¾õÂ֤ˤ¢¤ë ESP32 ¸þ¤±¤Î³«È¯¤Î½ÉÌ¿¤È³ä¤êÀÚ¤ë¤Ù¤­¤Ç¤·¤ç¤¦¡£

½àÈ÷

¤Þ¤º ESP-IDF ¤ò¤³¤Î»þÅÀ¤Ç¤ÎºÇ¿·ÈǤإ¢¥Ã¥×¥Ç¡¼¥È¤·¤Þ¤·¤¿¡£

~/esp/esp-idf$ git describe
v3.0-dev-2561-g358c822

MQTT ¥é¥¤¥Ö¥é¥ê¤Ï Tuan ¤µ¤ó¤Ë¤è¤ë¡ÖESP32 MQTT Library¡×¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¡£README ¤Îµ­½Ò¤Ë¤½¤Ã¤Æ <ESPIDF>/components/espmqtt ¤Ø Git ¥µ¥Ö¥â¥¸¥å¡¼¥ë¤È¤·¤Æ°ì¼°¤òÄɲä·¤Þ¤·¤¿¡£

½èÍý¤Îή¤ì

¥×¥í¥°¥é¥à¤Ï°Ê²¼¤ÎÆâÍƤȤ·¤Þ¤·¤¿¡£

  1. WiFi Àܳ¤ò³ÎΩ
  2. MQTT ¥»¥Ã¥·¥ç¥ó¤Î³«»Ï
  3. ¥È¥Ô¥Ã¥¯ "msg" ¤Î ¥á¥Ã¥»¡¼¥¸ "1" ¤ò¼õ¿®¤·¤¿¤é°Ê²¼¤Î BLE ¥»¥ó¥È¥é¥ë½èÍý¤òȯư
    • ¥¢¥É¥Ð¥¿¥¤¥º¥Ñ¥±¥Ã¥È¤Î¥¹¥­¥ã¥ó¤ò¼Â¹Ô
    • ¼ê»ý¤Á¤Î SwitchBot ¤«¤é¤Î¥¢¥É¥Ð¥¿¥¤¥º¤ò¸¡ÃΤ·¤¿¤é¥¹¥­¥ã¥ó¤òÄä»ß¤·¤ÆÀܳ¤ò³ÎΩ
    • SwitchBot ¤Î¥µ¡¼¥Ó¥¹°ìÍ÷¤Î¼èÆÀ¤ò³«»Ï
    • ¥µ¡¼¥Ó¥¹ cba20d00-224d-11e6-9fb8-0002a5d5c51b ¤òȯ¸«¤·¤¿¤é¤½¤ÎÇÛ²¼¤Î¥Ï¥ó¥É¥ë¤ÎÈϰϤòµ­²±
    • ¥µ¡¼¥Ó¥¹°ìÍ÷¤Î¼èÆÀ¤¬´°Î»¤·¤¿¤é¾åµ­¥µ¡¼¥Ó¥¹ÇÛ²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ cba20002-224d-11e6-9fb8-0002a5d5c51b ¤Î¥Ï¥ó¥É¥ë¤ò¼èÆÀ
    • ¾åµ­¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ø Press ¥³¥Þ¥ó¥É {0x57, 0x01, 0x00} ¤ò½ñ¤­¹þ¤ó¤ÇÀÚÃÇ
  4. ¾åµ­ 3. ¤Ø

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§34Éᡲ»ÎÌÃí°Õ ¡Ê¢¨ ¥¦¥§¥¤¥¯¥ï¡¼¥É¡Ö¤Í¤¨, ¥°¡¼¥°¥ë¡×¤ÎȯÀ¼¤â¤¢¤ê¤Þ¤¹¡Ë

¥½¡¼¥¹¥³¡¼¥É


(tanabe)
klab_gijutsu2 at 04:44¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2018ǯ04·î04Æü

ÅÅÇÈˡŬ¹ç¤Î NFC ¥â¥¸¥å¡¼¥ë¤Ç°Â²Á¤Ê NFC ¥¿¥°¤òÍøÍѤ¹¤ë

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

¤Ï¤¸¤á¤Ë

Åö¥Ö¥í¥°¤Îµ­»ö¡ÖNFC ¥¿¥°¤ÇÈëÌ©¾ðÊó¤ò°ÂÁ´¤Ë·È¹Ô¤¹¤ë»î¤ß¡×¤Ç¤Ï MIFARE Ultralight ½àµò¤Î NXP À½¡ÖNTAG21x¡×¥·¥ê¡¼¥º¤ËÌܤò¸þ¤±¤Þ¤·¤¿¡£¤½¤³¤Ç¤Ï»Ô¾ì¤Ç¸½ºß¼çή¤Î¤³¤Î NFC ¥¿¥°À½Éʤε¡Ç½Ì̤Ǥαü¤Î¿¼¤µ¤ò Android ¥Ç¥Ð¥¤¥¹¤ò»È¤Ã¤Æ»î¤·¤Æ¤ß¤Þ¤·¤¿¤¬¡¢ÃÍÃʤâ°Â¤¯¤¹¤Ã¤«¤êµ¤¤ËÆþ¤Ã¤¿ NTAG21x ¤ò¼«ºî¤ÎÁõÃ֤ǤâÍøÍѤ·¤¿¤¤¤È¹Í¤¨¤Þ¤·¤¿¡£·ÈÂÓüËö¤Î²ÄÈÂÀ­¡¢¿ø¤¨ÃÖ¤­·¿ÁõÃ֤γÈÄ¥À­¡¢¤É¤Á¤é¤âÆü¾ïÀ¸³è¤Ç¤Î NFC ¤Î¼ÂÍÑÀ­¤ò»Ù¤¨¤Æ¤¤¤ëÅÚÂæŪ¤ÊÍ×ÁǤǤ¹¤Í¡£

NFC ¥ê¡¼¥À/¥é¥¤¥¿¥â¥¸¥å¡¼¥ëÀ½Éʤòõ¤¹

¤½¤ó¤Ê¤ï¤±¤Ç¤Þ¤º¤ÏÅŻҹ©ºî¸þ¤­¤Î NFC ¥ê¡¼¥À/¥é¥¤¥¿¥â¥¸¥å¡¼¥ë¤òõ¤¹¤³¤È¤«¤é»Ï¤á¤Þ¤·¤¿¡£¥Í¥Ã¥È¤ò¸«ÅϤ·¤Æ¤ß¤ë¤ÈÍÍ¡¹¤Ê¤â¤Î¤¬½Ð²ó¤Ã¤Æ¤ª¤ê¡¢°Ê²¼¤ÎÀ½Éʤʤɤ¬ÌܤˤȤޤê¤Þ¤·¤¿¡£¤¤¤º¤ì¤â¤Ê¤«¤Ê¤«Îɤµ¤½¤¦¤Ç¤¹¡£

¹ñ³°¤Î¥á¡¼¥«¡¼¤Ë¤è¤ë¤³¤ì¤é¤Î¥â¥¸¥å¡¼¥ë¤Ï¸Ä¿Í¤Ç¤â´Êñ¤Ë¹ØÆþ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°ìÊý¡¢¹ñÆâ¥á¡¼¥«¡¼¤ÎÀ½ÉʾðÊó¤òõ¤·¤¿¤È¤³¤í¤Ç¤Ï¡¢¤¤¤¯¤Ä¤â¤Î´ë¶È¤¬ NFC ¥ê¡¼¥À/¥é¥¤¥¿¥â¥¸¥å¡¼¥ë¤ÎÀ½Â¤¡¦ÈÎÇä¤ò¹Ô¤Ã¤Æ¤Ï¤¤¤ë¤â¤Î¤Î¤½¤Î¤Û¤È¤ó¤É¤¬Ë¡¿Í¸þ¤±¤ÎÁȤ߹þ¤ßÍѤǤ¢¤ë¤³¤È¤òÃΤê¤Þ¤·¤¿¡£ ¤½¤ÎÃæ¤Ç¡¢»ä¼«¿È¤¬º£²óÄ´¤Ù¤¿ÈϰϤǤϡ¢2018ǯ3·î»þÅÀ¤Ç¸Ä¿Í¤¬°ìÈ̤Υǥ£¥¹¥È¥ê¥Ó¥å¡¼¥¿¤«¤éÆþ¼ê²Äǽ¤Ê¹ñÆâÀ½Éʤϥ½¥Ë¡¼³ô¼°²ñ¼ÒÍͤˤè¤ë¡ÖRC-S620/S¡×¤Î¤ß¤Ç¤·¤¿¡£¤â¤·Â¾¤Ë¤âÆþ¼ê¤·¤ä¤¹¤¤¹ñÆâÀ½Éʤ¬¤¢¤ì¤Ð¤¼¤Ò¤´¶µ¼¨²¼¤µ¤¤¡£

¤µ¤Æ¡¢¤³¤³¤Çµ¤¤Ë¤Ê¤ë¤Î¤¬¤³¤ì¤é¤ÎÀ½ÉʤÈÅÅÇÈË¡¤È¤Î´Ø·¸¤Ç¤¹¡£

ÅÅÇÈË¡¤È NFC ¥â¥¸¥å¡¼¥ë¤È¤Î´Ø·¸¤Ë¤Ä¤¤¤Æ

¤´¾µÃΤΤ褦¤Ë¡¢ÆüËܹñÆâ¤Ç¡Öµ»Å¬¥Þ¡¼¥¯¡×¤Î¤Ê¤¤ÌµÀþµ¡¤ò»ÈÍѤ¹¤ë¤ÈÅÅÇÈË¡°ãÈ¿¤È¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¡¢³°¹ñÀ½¤Îµ¡´ï¤ò»È¤¤¤¿¤¤¾ì¹ç¤Ê¤É¤Ë¤Ï¤³¤Î¤³¤È¤¬ºÇ½é¤Ë³Îǧ¤¹¤Ù¤­¥Ý¥¤¥ó¥È¤È¤Ê¤ê¤Þ¤¹¡£¤Ç¤Ï¡¢¤ä¤Ï¤êÅż§ÇȤòȯÀ¸¤µ¤»¤ë NFC ¥ê¡¼¥À/¥é¥¤¥¿¤ÏÅÅÇÈË¡¤Ë¤ª¤¤¤Æ¤É¤Î¤è¤¦¤Ë°·¤ï¤ì¤Æ¤¤¤ë¤Î¤Ç¤·¤ç¤¦¡£µ»Å¬¾ÚÌÀ¤¬É¬ÍפʤΤ«¡¢¤½¤ì¤È¤â¼þ°Ï¤Ø¤Î±Æ¶Á¤¬Èù¼å¤Ç¤¢¤ë¤¿¤áÆä˵¬Äꤵ¤ì¤Æ¤¤¤Ê¤¤¤Î¤«¡£¤³¤ÎÅÀ¤Ë¤Ä¤¤¤ÆÄ´¤Ù¤Æ¤ß¤Þ¤·¤¿¡£

¤Þ¤È¤á

·ëÏÀ¤È¤·¤Æ¡¢ÅÅÇÈË¡¤Ë¤Ï NFC ¥ê¡¼¥À/¥é¥¤¥¿¤Ë´Ø¤¹¤ëÌÀ³Î¤Êµ¬Ä꤬¤¢¤ê¡¢¤½¤ì¤ËŬ¹ç¤·¤Ê¤¤À½ÉʤÎÆüËܹñÆâ¤Ç¤Î»ÈÍÑ¤Ï NG ¤Ç¤¢¤ë¤³¤È¤òÃΤê¤Þ¤·¤¿¡£Í×ÅÀ¤òÀ°Íý¤·¤Æ¤ß¤Þ¤¹¡£

  • ¤¤¤ï¤æ¤ëµ»Å¬¾ÚÌÀ¤ÏÆÃÄê̵ÀþÀßÈ÷¤òÂоݤȤ¹¤ë¤â¤Î¤À¤¬¡¢NFC ¥ê¡¼¥À/¥é¥¤¥¿¤ÏÅÅÇÈË¡¤Ë¤ª¤¤¤ÆÆÃÄê̵ÀþÀßÈ÷¤Ë¤Ï¤¢¤¿¤é¤º¡Ö¹â¼þÇÈÍøÍÑÀßÈ÷¡×¤Ë³ºÅö¤·¡¢¤½¤³¤Ë´Þ¤Þ¤ì¤ë¡ÖͶƳ¼°Æɤ߽ñ¤­ÄÌ¿®ÀßÈ÷¡×¤ËʬÎव¤ì¤ë
    • ¤Ä¤Þ¤ê NFC ¥ê¡¼¥À/¥é¥¤¥¿¤Ïµ»Å¬¥Þ¡¼¥¯¤È¤Ï´Ø·¸¤¬¤Ê¤¤
  • ͶƳ¼°Æɤ߽ñ¤­ÄÌ¿®ÀßÈ÷¤Ï¡¢¤½¤ÎÅų¦¶¯ÅÙ¤¬½êÄê¤Î¾ò·ï¤òËþ¤¿¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï¡¢Áí̳Âç¿Ã¤Ë¤è¤ë·¿¼°»ØÄê¤ò¼õ¤±¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¸ÄÊ̤εö²Ä¤Ê¤·¤ËÀßÃÖ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë
    • ·¿¼°»ØÄê¤Î¿½ÀÁ¼Ô¤ÏÆüËܿͤޤ¿¤ÏÆüËܹñÆâ¤ÎË¡¿Í¤Ç¤¢¤ê¤«¤ÄÀ½Â¤¶È¼Ô¤Þ¤¿¤ÏÍ¢Æþ¶È¼Ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
  • Åų¦¶¯ÅÙ¾ò·ï¤È¤ÎÀ°¹çÀ­¤Î³Îǧ¤Ë¤â·¿¼°»ØÄê¤ò¼õ¤±¤ë¤Ë¤âŬÀµ¤ÊÊýË¡¤Ç¤ÎÀ­Ç½»î¸³¤¬É¬¿Ü

¾ÜºÙ

·¿¼°»ØÄêɽ¼¨¤Î¼ÂÎã

¼ê¸µ¤Ë¤¢¤ë¤Õ¤¿¤Ä¤ÎÀ½ÉʤǤη¿¼°»ØÄêɽ¼¨¤È¸ø¼°¥µ¥¤¥È¤«¤é¤Î°úÍѤò¼¨¤·¤Þ¤¹¡£Á°·Ç¤Î RC-S620/S ¤Ë¤â¤·¤Ã¤«¤ê°õºþ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ¡¡¢¨¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨

RC-S620/S ¤Ë¤Ä¤¤¤Æ

µ®½Å¤ÊÁªÂò»è¤È¤·¤Æ

º£²ó¼ê¸µ¤ÇÄ´¤Ù¤¿ÈϰϤǤϡ¢ÆüËܤÎÅÅÇÈË¡¤Ë½à¤¸¤¿·¿¼°»ØÄêɽ¼¨¤Î¤¢¤ë¹ñ³°¥á¡¼¥«¡¼¤Î NFC ¥â¥¸¥å¡¼¥ë¤Ï¸«Åö¤¿¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡¢¤Þ¤¿¡¢¡Ö£³m¤Îµ÷Î¥¤Ë¤ª¤¤¤ÆÅų¦¶¯ÅÙ¤¬500¦ÌV/m¡×¤Ê¤É¤È¤¤¤¦À­Ç½¾ðÊó¤òÌܤˤ¹¤ë¤³¤È¤â¤¢¤ê¤Þ¤»¤ó¡£ ¤½¤Î¤¿¤á¡¢¤¤¤Þ¤Î»þÅÀ¤Ç¼ê¶á¤Ê¼Â¸³¤äÅŻҹ©ºî¤òŬˡ¤Ë¹Ô¤¦¤¿¤á¤Ë¤ÏÆþ¼ê¤¬ÍưפÇÅÅÇÈˡŬ¹ç¤Î RC-S620/S ¤Ïµ®½Å¤ÊÁªÂò»è¤È¤¤¤¦¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£

¸Ä¿ÍŪ¤Ë¤Ï¡¢ÅÅÇÈË¡¤ÎɬÁ³À­¤È½ÅÍ×À­¤ò½½Ê¬¤ËÍý²ò¡¦Ç¼ÆÀ¤·¤Ê¤¬¤é¤â¡¢°ìÊý¤Ç¡¢¤È¤ê¤ï¤± IoT ÊýÌ̤Ǥιñ³°¥á¡¼¥«¡¼¤Ë¤è¤ë¹ñºÝŪ¤Ë¥á¥¸¥ã¡¼¤ÊÀ½Éʤò¸øÁ³¤È»î¤¹¤³¤È¤Î¤Ç¤­¤Ê¤¤¥±¡¼¥¹¤¬È¯À¸¤¹¤ë¤³¤È¤ò¤â¤É¤«¤·¤¯»×¤¦¤³¤È¤â¤¢¤ê¤Þ¤¹¡£¼ê¶á¤Ê¼Â¸³¤ä»îºî¤Î¤¿¤á¤Ë¤ï¤¶¤ï¤¶ÅÅÇȰż¼¤ò¼Ú¤ê¤¿¤êÅϹҤ·¤¿¤ê¤¹¤ë¤ï¤±¤Ë¤â¤¤¤­¤Þ¤»¤ó¤·¤Í¡£¡£ ¡Ê^^¡¨
¤µ¤Ã¤½¤¯¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹ÍͤΥµ¥¤¥È¤«¤é RC-S620/S ¤ò¹ØÆþ¤·¤Þ¤·¤¿¡£ ËÜÍèÁȤ߹þ¤ßÍÑÅӤΤ³¤Î¥â¥¸¥å¡¼¥ë¤ÎÆþ½ÐÎÏü»Ò¤Ï FFC ¥³¥Í¥¯¥¿¤Ç°ìÈÌŪ¤ÊÅŻҹ©ºî¤Ç¤Ï²¿¤«¤È¼è¤ê²ó¤·¤Ë¤¯¤¤¤Î¤Ç¤¹¤¬¡¢Æ±¼Ò¥ª¥ê¥¸¥Ê¥ë¤Î¥Ö¥ì¡¼¥¯¥¢¥¦¥È´ðÈĤÈÀìÍÑ¥±¡¼¥Ö¥ë¤Î¥»¥Ã¥È¤¬¤¢¤ï¤»¤ÆÈÎÇ䤵¤ì¤Æ¤¤¤ë¤¿¤á¤È¤Æ¤â½õ¤«¤ê¤Þ¤¹¡£

ÍøÍѼԸþ¤±¤Î¸ø¼°¥ê¥½¡¼¥¹

ÍøÍѼԸþ¤±¤Ë°Ê²¼¤Î¥ê¥½¡¼¥¹¤¬¸ø¼°¥µ¥¤¥È¤Ç¸ø³«¤µ¤ì¤Æ¤¤¤Þ¤¹¡£³Æ¥À¥¦¥ó¥í¡¼¥É¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤¿µ¬Ì󡦻ÈÍѵöÂú·ÀÌó¤ÎÆâÍƤò½½Ê¬¤Ë³Îǧ¤·¤¿¾å¤Ç¤³¤ì¤é¤òÍøÍѤ·¤Þ¤¹¡£

  • Sony Japan | FeliCa | Ë¡¿Í¤Î¤ªµÒÍÍ | ¥À¥¦¥ó¥í¡¼¥É
    • RC-S620/SÀ½ÉÊ»ÅÍͽñ¡ã´Ê°×ÈÇ¡ä
    • RC-S620/S¥³¥Þ¥ó¥É¥ê¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë¡ã´Ê°×ÈÇ¡ä
      µ¬Ìó
             :
      Âè3¾ò¡Ê»ÈÍѸ¢¡Ë

      1. ¥½¥Ë¡¼¤Ï¡¢ÍøÍѼԤËÂФ·¤Æ¡¢ÍøÍѼԤ¬ÂоÝʸ½ñ¤ò»ÈÍÑÌÜŪ¤Î¤¿¤á¤ËËÜ¥¦¥§¥Ö¥µ¥¤¥È¤«¤éÊ£À½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ëÈóÆÈÀêŪ¤Ê¸¢Íø¤ò̵½þ¤Ë¤ÆÍøÍѼԤ˵öÂú¤·¤Þ¤¹¡£
      2. ÍøÍѼԤϡ¢ÂоÝʸ½ñ¤ÎÁ´Éô¤Þ¤¿¤Ï°ìÉô¤ò¡¢¤µ¤é¤ËÊ£À½¤·¤¿¤ê¡¢¤³¤ì¤ËÂФ¹¤ë½¤Àµ¡¢ÄɲÃÅù¤Î²þÊѤò¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤Þ¤¿¡¢ÂоÝʸ½ñ¤ª¤è¤Ó¤½¤ÎÊ£À½Êª¤ò¡¢Âè»°¼Ô¤ËÈÒÉÛ¤·¤¿¤ê¡¢¥¦¥§¥Ö¥µ¥¤¥È¤Ë¥¢¥Ã¥×¥í¡¼¥É¤¹¤ë¤Ê¤É¤·¤ÆÂè»°¼Ô¤¬¼èÆÀ²Äǽ¤Ê¾õÂ֤ˤ·¤Ê¤¤¤â¤Î¤È¤·¤Þ¤¹¡£
             :
  • Arduino¸þ¤±RC-S620/SÀ©¸æ¥é¥¤¥Ö¥é¥ê¤ÎÄó¶¡
    • ¡ÖArduino¸þ¤±RC-S620/SÀ©¸æ¥é¥¤¥Ö¥é¥ê¡×¥À¥¦¥ó¥í¡¼¥É¥Ú¡¼¥¸
      RC-S620/SÀ©¸æ¥é¥¤¥Ö¥é¥ê »ÈÍѵöÂú·ÀÌó
             :
      Âè1¾ò¡ÊÁí§¡Ë
      ¡¡1.¥½¥Ë¡¼¤Ï¡¢Ëܵ¬Ìó¤ËÄê¤á¤ë³Æ¾ò¹à¤Ë½¾¤¤¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ª¤è¤Ó´ØÏ¢»ñÎÁ¤Ë´Ø¤¹¤ëÈóÆÈÀêŪ¤«¤Ä¾ùÅÏÉÔǽ¤Ê¼¡¤Î¸¢Íø¡Ê⤷Æõö¸¢¤Ï½ü¤¯¡£°Ê²¼¡Ö»ÈÍѸ¢¡×¤È¤·¤Þ¤¹¡Ë¤ò¡¢¤ªµÒÍͤ˵öÂú¤·¤Þ¤¹¡£
      ¡¡¡¡(1)¤ªµÒÍͤ¬¡¢¥½¥Õ¥È¥¦¥§¥¢»ÈÍѼԤò¤·¤Æ¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ª¤è¤Ó´ØÏ¢»ñÎÁ¤ÎÁ´Éô¤â¤·¤¯¤Ï°ìÉô¤ò»ÈÍÑ¡¢Ê£À½¡¢Ê£¼Ì¤Þ¤¿¤Ï²þÊѤ·¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥½¥Õ¥È¥¦¥§¥¢¤ò³«È¯¤¹¤ë¸¢Íø¡£ ¤Ê¤ª¡¢Ëܵ¬Ìó¤Ë¤ª¤¤¤Æ¡¢¥½¥Õ¥È¥¦¥§¥¢»ÈÍѼԤª¤è¤Ó¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥½¥Õ¥È¥¦¥§¥¢¤È¤Ï¡¢¤½¤ì¤¾¤ì¡¢¼¡¤Î°ÕÌ£¤òÍ­¤·¤Þ¤¹¡£
      ¡¡¡¡¡¡­¡¥½¥Õ¥È¥¦¥§¥¢»ÈÍѼԡ§ËÜ¥½¥Õ¥È¥¦¥§¥¢¤òÆþ¼ê夤¤¿¤ªµÒÍÍ1̾¤ÎÊý¡£
      ¡¡¡¡¡¡­¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥½¥Õ¥È¥¦¥§¥¢¡§¥½¥Ë¡¼À½ÈóÀÜ¿¨IC¥«¡¼¥É¥ê¡¼¥À¡¿¥é¥¤¥¿¡¼À½ÉÊ¡ÖRC-S620/S¡×¤òÀ©¸æ¤¹¤ë¤¿¤á¤Î¥½¥Õ¥È¥¦¥§¥¢¥×¥í¥°¥é¥à¡£
      ¡¡¡¡(2)¤ªµÒÍͤ¬¡¢ËܹàÂè1¹æ¤Ë´ð¤Å¤­³«È¯¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥½¥Õ¥È¥¦¥§¥¢¤òÊ£À½¤·¤¿¤¦¤¨¡¢¥½¡¼¥¹¥³¡¼¥É·Á¼°¤Þ¤¿¤Ï¥Ð¥¤¥Ê¥ê·Á¼°¤Ë¤Æ¡¢Âè»°¼Ô¤ËÈÒÉÛ¤¹¤ë¸¢Íø¡£
      ¡¡2.¤ªµÒÍͤϡ¢Á°¹à¤ÇÄê¤á¤ë¾ì¹ç¤ò½ü¤­¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ª¤è¤Ó´ØÏ¢»ñÎÁ¤ÎÁ´Éô¤â¤·¤¯¤Ï°ìÉô¤ò»ÈÍÑ¡¢Ê£À½¡¢Ê£¼Ì¤Þ¤¿¤Ï²þÊѤ·¤Æ¤Ï¤Ê¤é¤Ê¤¤¤â¤Î¤È¤·¤Þ¤¹¡£
             :

¸ø¼°¥ê¥½¡¼¥¹¤Î¥«¥Ð¡¼¤¹¤ëÈÏ°Ï

¤³¤Î¤è¤¦¤Ë¥É¥­¥å¥á¥ó¥È¤Ë²Ã¤¨¥µ¥ó¥×¥ë¥³¡¼¥É¤¬¸ø¼°¤ËÄ󶡤µ¤ì¤Æ¤¤¤ë¤³¤È¤ÏÍøÍѼԤˤȤäƤȤƤâ´ò¤·¤¤ÇÛθ¤Ç¤¹¤¬¡¢¤³¤ì¤é¤Î»²¾È¡¦»ÈÍѤ˺ݤ·¤Æ¤Ï°Ê²¼¤Î»ö¾ð¤ò¤¢¤é¤«¤¸¤áÍý²ò¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ë¤Ç¤·¤ç¤¦¡£

  • RC-S620/S ¤Ï¤¢¤¯¤Þ¤Ç¤âÁȤ߹þ¤ßÍÑÀ½ÉʤǤ¢¤êËÜÍè¤Î¸ÜµÒ¤ÏË¡¿Í¤Ç¤¢¤ë
  • ³Æ»ÅÍͽñ¤ÏËÁƬ¤Î¥Ú¡¼¥¸¤ÎÃí¼á¤Î¤È¤ª¤ê¡ÖÄ´ºº¡¢»îºî¤ª¤è¤Óɾ²Á¡×¤òÌÜŪ¤È¤¹¤ë¡Ö´Ê°×ÈǡפǤ¢¤ê¡¢¡Ö¾¦ÍѸþ¤±¡×¤ÎÈǤϸܵҤ¬¡ÖÀµ¼°¤Ë RC-S620/S ¤òƳÆþ¡×¤¹¤ë¾ì¹ç¤ËÄ󶡤µ¤ì¤ë
  • ¡ÖÀ½ÉÊ»ÅÍͽñ¡ã´Ê°×ÈÇ¡ä¡× 1, 2 ¹à¤Ëµ­ºÜ¤Î¤¢¤ë¤è¤¦¤Ë RC-S620/S ¤Ï FeliCa ¤Ë²Ã¤¨ ISO/IEC 14443 ¡ÊType A, Type B¡Ë ¤Ë¤âÂбþ¤·¤Æ¤¤¤ë¤¬¡¢¼ç´ã¤Ï¤¢¤¯¤Þ¤Ç¤âÁ°¼Ô¤Ç¤¢¤ë
  • ³Æ»ÅÍͽñ¤ª¤è¤Ó¥µ¥ó¥×¥ë¥³¡¼¥É¤Ï FeliCa ¤Þ¤ï¤ê¤Î°ìÉô¤Îµ¡Ç½¤ËÆò½¤·¤¿ÆâÍƤǤ¢¤ë

»×¤¤¤¬¤±¤Ê¤¤±ç·³¤Î¸ºß

¤µ¤Æ¡¢ËÁƬ¤Ç¿¨¤ì¤¿¤è¤¦¤Ë¼ê¸µ¤Ç¼Â¸½¤·¤¿¤¤¤Î¤Ï MIFARE Ultralight NTAG21x ¤Ø¤Î¥¢¥¯¥»¥¹¤Ç¤¹¡£RC-S620/S ¤¬ ISO/IEC 14443 Type A¡ÊMIFARE¡Ë¤ËÂбþ¤·¤Æ¤¤¤ë¤³¤È¤Ï¾åµ­¤ÎÄ̤ê»ÅÍͽñ¤ËÌÀµ­¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤Î¡¢¸ø¼°¤Î¥ê¥½¡¼¥¹¤Ç¤Ï¤½¤Î¤¿¤á¤Î¶ñÂÎŪ¤ÊÊýË¡¤ä¼ê½ç¤¬¤ï¤«¤ê¤Þ¤»¤ó¡£

¤Þ¤º¤½¤â¤½¤â MIFARE ¤Î¶áÀܤò¸¡ÃΤ¹¤ë¤Ë¤Ï¤É¤¦¤¹¤ì¤Ð¤¤¤¤¤Î¤«¡£¡ÖArduino¸þ¤±RC-S620/SÀ©¸æ¥é¥¤¥Ö¥é¥ê¡×¤Î polling() ´Ø¿ô¤Ï FeliCa ¤ò¸¡ÃΤ¹¤ë¤¿¤á¤Ë¡Ö¥³¥Þ¥ó¥É¥ê¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë¡ã´Ê°×ÈÇ¡ä¡×¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¡ÖInListPassiveTarget¡×¤È¤¤¤¦¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¤¤¤Þ¤¹¡£
¤¿¤á¤·¤Ë¡ÖInListPassiveTarget ISO/IEC 14443 Type A¡×¤Î¥­¡¼¥ï¡¼¥É¤Ç¾ðÊó¤ò¸¡º÷¤·¤¿¤È¤³¤í¼¡¤Î¶½Ì£¿¼¤¤»ñÎÁ¤¬ÌܤˤȤޤê¤Þ¤·¤¿¡£

¡ÖPN532¡×¤Ï NXP ¤Ë¤è¤ë NFC ¥â¥¸¥å¡¼¥ë¤Ç¤¹¡£¤³¤Î»ñÎÁ¤ÎÃæ¤Î InListPassiveTarget ¤Îµ­½Ò²Õ½ê¤òõ¤¹¤È Page 115 ¡Ê¾å¿Þ¡Ë¤Ë¤½¤Î¤â¤Î¤º¤Ð¤ê¤Î¥³¥Þ¥ó¥ÉÀâÌÀ¤¬¤¢¤ê¤Þ¤·¤¿¡£

¡ÖRC-S620/S¥³¥Þ¥ó¥É¥ê¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë¡ã´Ê°×ÈÇ¡ä Version 2.11¡× Page 80 ¤Î InListPassiveTarget ¤ÎÀâÌÀ¤ÈÆɤ߹ç¤ï¤»¤Æ¤ß¤ë¤È¡¢¥¿¡¼¥²¥Ã¥È¤¬ FeliCa ¤Î¾ì¹ç¤Î¥Ñ¥é¥á¡¼¥¿ÀâÌÀ¤Ï°ìÃפ·¤Æ¤ª¤ê¡¢¤µ¤é¤Ë¡Ö´Ê°×Èǡפˤϵ­ºÜ¤µ¤ì¤Æ¤¤¤Ê¤¤ ISO/IEC 14443 Type A, B ¤Ø¤ÎÂбþÊýË¡¤ò´Þ¤á 7 ¥Ú¡¼¥¸¤ËÅϤê¾Ü¤·¤¤ÀâÌÀ¤¬·ÇºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤Î¾¤Î¥³¥Þ¥ó¥É¤Ë¤Ä¤¤¤Æ¤âƱÍͤǡ¢CommunicateThruEx ¤Ê¤É RC-S620/S ¦¤Î¤ß¤Ë¸ºß¤¹¤ë¤¤¤¯¤Ä¤«¤Î¥³¥Þ¥ó¥É¤Ï¤¢¤ë¤â¤Î¤Î¡¢Á´ÂΤȤ·¤Æ¤Ï¤¤¤ï¤Ð¥¹¡¼¥Ñ¡¼¥»¥Ã¥È¤Î¥Þ¥Ë¥å¥¢¥ë¤Î¤è¤¦¤Ë¸«¼õ¤±¤é¤ì¤Þ¤·¤¿¡£¼ÂºÝ¤Ë¤³¤Î¥Þ¥Ë¥å¥¢¥ë¤Ëź¤Ã¤Æ¡ÖArduino¸þ¤±RC-S620/SÀ©¸æ¥é¥¤¥Ö¥é¥ê¡×¤Î polling() ´Ø¿ô¤ò°Ê²¼¤ÎÍ×ÎΤǽñ¤­´¹¤¨¤Æ¤ß¤ë¤È ISO/IEC 14443 Type A ¤Î¶áÀܤò¸¡ÃΤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤·¤¿¡£

FeliCa Âбþ¤Î¥ª¥ê¥¸¥Ê¥ë¥³¡¼¥É

/* InListPassiveTarget */
memcpy(buf, "\xd4\x4a\x01\x01\x00\xff\xff\x00\x00", 9);
buf[5] = (uint8_t)((systemCode >> 8) & 0xff);
buf[6] = (uint8_t)((systemCode >> 0) & 0xff);

ret = rwCommand(buf, 9, response, &responseLen);

ISO/IEC 14443 Type A ÍÑ

ret = rwCommand((const uint8_t *)"\xd4\x4a\x01\x00", 4,
                 response, &responseLen);

¤³¤Î¤è¤¦¤Ë¡¢¥á¡¼¥«¡¼¤Î°Û¤Ê¤ë RC-S620/S ¤È PN532 ¤È¤Î´Ö¤Ë¥³¥Þ¥ó¥É¥ì¥Ù¥ë¤Ç¤Î¶¦ÄÌÀ­¤¬¤¢¤ëÍýͳ¤Ï NFC ¥Õ¥©¡¼¥é¥à»ÅÍͤΤɤ³¤«¤Ë¤¢¤ë¤Î¤«¤âÃΤì¤Þ¤»¤ó¤¬¼ê¸µ¤Ç¤Ïº£¤Î¤È¤³¤í³ºÅö¤¹¤ë¾ðÊó¤ÎÆÃÄê¤Ë»ê¤Ã¤Æ¤¤¤Þ¤»¤ó¡£ ¤¢¤ë¤¤¤Ï¡¢Î¾¼Ò¤¬¤È¤â¤Ë¡Ö¥Ç¥Ð¥¤¥¹¤ä¥µ¡¼¥Ó¥¹´Ö¤Î¿·µ¡Ç½¤È¸ß´¹À­¤ò¼Â¸½¤¹¤ë¤¿¤á¤Îµ¬³ÊºöÄê¡×¤ò¥ß¥Ã¥·¥ç¥ó¤Î¤Ò¤È¤Ä¤È¤¹¤ë NFC ¥Õ¥©¡¼¥é¥à¤Î¥³¥¢¥á¥ó¥Ð¡¼¤Ç¤¢¤ë¤³¤È¤Ë´Ø·¸¤¬¤¢¤ë¤Î¤«¤âÃΤì¤Þ¤»¤ó¡£¤¤¤º¤ì¤Ë¤»¤è PN532 ¤Î¥Þ¥Ë¥å¥¢¥ë¤Î¤ª¤«¤²¤ÇÀ褬¸«¤¨¤Æ¤­¤Þ¤·¤¿¡£

NTAG21x ¥Í¥¤¥Æ¥£¥Ö¥³¥Þ¥ó¥É¤Îȯ¹Ô¤Ë¤Ä¤¤¤Æ

ÀèÈ̤ε­»ö¤Ç¤Ï¡¢NTAG21x ¤Î¥á¥â¥ê¥¢¥¯¥»¥¹¤ËɬÍפʼ¡¤Î¤è¤Ã¤Ä¤Î¥Í¥¤¥Æ¥£¥Ö¥³¥Þ¥ó¥É¤òµó¤²¤Þ¤·¤¿¡£

  • GET_VERSION
    NTAG À½ÉʤΥС¼¥¸¥ç¥ó,¥¹¥È¥ì¡¼¥¸¥µ¥¤¥ºÅù¤òÆÀ¤ë
  • READ
    ½êÄê¤Î¥Ú¡¼¥¸¥¢¥É¥ì¥¹¤«¤é»Ï¤Þ¤ë 4 ¥Ú¡¼¥¸Ê¬¡Ê16 ¥Ð¥¤¥È¡Ë¤Î¥Ç¡¼¥¿¤òÆÀ¤ë
  • WRITE
    ½êÄê¤Î¥Ú¡¼¥¸¥¢¥É¥ì¥¹¤Ø 1 ¥Ú¡¼¥¸Ê¬¡Ê4 ¥Ð¥¤¥È¡Ë¤Î¥Ç¡¼¥¿¤ò½ñ¤­¹þ¤à
  • PWD_AUTH
    ¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤¿Îΰè¤Ø¤Î¥¢¥¯¥»¥¹Í×µá¤ËÀè¹Ô¤·¤Æ¥Ñ¥¹¥ï¡¼¥Éǧ¾Ú¤òÍ׵᤹¤ë

¤³¤ì¤é¤ò RC-S620/S ·Ðͳ¤Ç¥¿¡¼¥²¥Ã¥È¤ØÁ÷½Ð¤·¤Æ¤ä¤ì¤Ð NTAG21x ¤Î¥á¥â¥ê¤ò¼«Í³¤ËÁàºî¤Ç¤­¤ë¤Ï¤º¤Ç¤¹¡£

RC-S620/S ¤Ë¤Ï¤³¤Î¤è¤¦¤Ë¥¿¡¼¥²¥Ã¥È¤È¤¹¤ë PICC ¸ÇÍ­¤Î¥³¥Þ¥ó¥É¤òȯ¹Ô¤¹¤ë¤¿¤á¤Î CommunicateThruEX ¥³¥Þ¥ó¥É¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤À¤·¡¢¡Ö¥³¥Þ¥ó¥É¥ê¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë¡ã´Ê°×ÈÇ¡ä Version 2.11¡× Page 71 ¤Î¡ÖËÜ¥³¥Þ¥ó¥É¤Ï 212/424 kbps ¤Î RF ¥Ñ¥±¥Ã¥È¤ÎÁ÷¼õ¿®¤ò¹Ô¤¤¤Þ¤¹¡×¤Îµ­½Ò¤Î¤È¤ª¤ê¤³¤Î¥³¥Þ¥ó¥É¤Ï FeliCa ÀìÍѤǡ¢ÄÌ¿®Â®ÅÙ 106 kbps ¤Î ISO/IEC 14443 ¸þ¤±¤Ë¤Ï»È¤¨¤Þ¤»¤ó¡£

°ìÊý¡¢¡ÖPN532 User Manual Rev.02¡×¤Ë¤Ï¤½¤ì¤ÈƱÍͤε¡Ç½¤ÇÈÆÍÑÀ­¤Î¤¢¤ë InDataExchange, InCommunicateThru ¤Î¤Õ¤¿¤Ä¤Î¥³¥Þ¥ó¥É¤Î¾ðÊ󤬷Ǻܤµ¤ì¤Æ¤¤¤Þ¤¹¡£Æ±¥Þ¥Ë¥å¥¢¥ë¤Î InListPassiveTarget ¥³¥Þ¥ó¥É¤Î¥Ú¡¼¥¸¤Ë¤Ï MaxTg ¥Õ¥£¡¼¥ë¥É¤Ë¤Ä¤¤¤Æ¡ÖThe PN532 is capable of handling 2 targets maximum at once, so this field should not exceed 0x02.¡×¤Èµ­½Ò¤µ¤ì¤Æ¤ª¤ê¡¢InDataExchange ¤Ë¤ª¤¤¤Æ¤Ï target ¡ÊTg¡Ë ¤òÌÀ¼¨Åª¤Ë»ØÄꤹ¤ë¤Î¤ËÂФ·¡¢InCommunicateThru¤Ç¤Ï¡Öit is assumed that a target has been first activated.¡×¤È¤¤¤¦°ã¤¤¤¬¤¢¤ê¤Þ¤¹¡£

  • PN532 User Manual Rev.02 - 7.3.5 InListPassiveTarget
  • PN532 User Manual Rev.02 - 7.3.8 InDataExchange
  • PN532 User Manual Rev.02 - 7.3.9 InCommunicateThru

¤Õ¤¿¤¿¤Ó RC-S620/S ¦¤ËÌܤò¸þ¤±¤ë¤È¡¢¡Ö¥³¥Þ¥ó¥É¥ê¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë¡ã´Ê°×ÈÇ¡ä Version 2.11¡× Page 50 ¤Î InListPassiveTarget ¥³¥Þ¥ó¥ÉÀâÌÀ¤Ç MaxTg ¥Õ¥£¡¼¥ë¥É¤Ë¤Ä¤¤¤Æ¤Ï¡ÖTarget ID ¤ò¼èÆÀ¤¹¤ë Target ¤ÎºÇÂç¿ô. 01h ¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡×¤Èµ­½Ò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤Ä¤Þ¤ê¤³¤ÎÉôʬ¤Î»ÅÍÍ¤Ï PN532 ¤È°Û¤Ê¤ëÍͻҤǤ¢¤ê¡¢¤³¤ÎÍ×ÁǤαƶÁ¤ò¼õ¤±¤ë InDataExchange, InCommunicateThru ¤ÎµóÆ°¤Ï¡¢Î¾¥³¥Þ¥ó¥É¤Î¸ºß̵ͭ¤Î³Îǧ¤ò´Þ¤á RC-S620/S ¾å¤Ç¼ÂºÝ¤Ë»î¤·¤Æ¤ß¤ëɬÍפ¬¤¢¤ê¤½¤¦¤Ç¤¹¡£

Á°·Ç¤Î¤è¤Ã¤Ä¤Î NTAG21x ¥Í¥¤¥Æ¥£¥Ö¥³¥Þ¥ó¥É¤Îȯ¹Ô¤ò RC-S620/S ·Ðͳ¤Ç»î¤ß¤¿¤È¤³¤í¡¢InListPassiveTarget ¤Ë¤è¤ë¥¿¡¼¥²¥Ã¥È¤ÎÊ᪸å¤Ë°Ê²¼¤ÎÁȤ߹ç¤ï¤»¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò¼ê¸µ¤Ç³Îǧ¤·¤Þ¤·¤¿¡£¤Þ¤¿¡¢¤³¤Î·ë²Ì¤«¤é RC-S620/S ¤Ë¤ª¤¤¤Æ¤â InDataExchange, InCommunicateThru ¤Îξ¥³¥Þ¥ó¥É¤òÍøÍѲÄǽ¤Ç¤¢¤ë¤³¤È¤¬ÌÀ¤é¤«¤Ë¤Ê¤ê¤Þ¤·¤¿¡£

  • NTAG: GET_VERSION ¥³¥Þ¥ó¥É ¡Ê0x60¡Ë
    • InCommunicateThru ¥³¥Þ¥ó¥É¡Ê0x42¡Ë·Ðͳ¤Ç¤Îȯ¹Ô¤Î¤ßÍ­¸ú
      • rwCommand((const uint8_t*)"\xd4\x42\x60", 3, response, &responseLen); ¤ÎÍ×ÎÎ
  • NTAG: READ ¥³¥Þ¥ó¥É ¡Ê0x30¡Ë
    • InDataExchange ¥³¥Þ¥ó¥É¡Ê0x40¡Ë¡¢InCommunicateThru ¥³¥Þ¥ó¥É¡Ê0x42¡Ë¤¤¤º¤ì¤ò·Ðͳ¤·¤Æ¤âÍ­¸ú
      • rwCommand((const uint8_t*)"\xd4\x40\x01\x30[³«»Ï¥Ú¡¼¥¸ÈÖ¹æ 1byte]", 5, response, &responseLen); ¤ÎÍ×ÎÎ
      • rwCommand((const uint8_t*)"\xd4\x42\x30[³«»Ï¥Ú¡¼¥¸ÈÖ¹æ 1byte]", 4, response, &responseLen); ¤ÎÍ×ÎÎ
  • NTAG: WRITE ¥³¥Þ¥ó¥É ¡Ê0xA2¡Ë
    • InDataExchange ¥³¥Þ¥ó¥É¡Ê0x40¡Ë·Ðͳ¤Ç¤Îȯ¹Ô¤Î¤ßÍ­¸ú
      • rwCommand((const uint8_t*)"\xd4\x40\x01\xA2[Âоݥڡ¼¥¸ÈÖ¹æ 1byte][½ñ¤­¹þ¤ß¥Ç¡¼¥¿ 4byte]", 9, response, &responseLen); ¤ÎÍ×ÎÎ
  • NTAG: PWD_AUTH ¥³¥Þ¥ó¥É ¡Ê0x1B¡Ë
    • InCommunicateThru ¥³¥Þ¥ó¥É¡Ê0x42¡Ë·Ðͳ¤Ç¤Îȯ¹Ô¤Î¤ßÍ­¸ú
      • rwCommand((const uint8_t*)"\xd4\x42\x1b[¥Ñ¥¹¥ï¡¼¥É 4byte]", 7, response, &responseLen); ¤ÎÍ×ÎÎ

¥é¥¤¥Ö¥é¥ê¤Ø¤Î²ÃÉ®¤È¥Æ¥¹¥È¥×¥í¥°¥é¥à¤ÎºîÀ®

¤³¤³¤Þ¤Ç¤Î·Ð°Þ¤Ç¤ª¤ª¤à¤ÍºàÎÁ¤¬Â·¤Ã¤¿¤È¤³¤í¤Ç¡¢¡ÖArduino¸þ¤±RC-S620/SÀ©¸æ¥é¥¤¥Ö¥é¥ê¡×¤Ø¼«Ê¬¤Î¤Û¤·¤«¤Ã¤¿µ¡Ç½¤òÄɲä·¡¢¤¢¤ï¤»¤ÆÆ°ºî³ÎǧÍѤ˥ƥ¹¥È¥×¥í¥°¥é¥à¤ÎºîÀ®¤ò¹Ô¤¤¤Þ¤¹¡£

ÁÛÄꤷ¤¿ÆâÍÆ

°Ê²¼¤ÎÆâÍƤòÁÛÄꤷ¤Þ¤·¤¿¡£NDEF ¥á¥Ã¥»¡¼¥¸¤Î²ò¼á¤ä ISO/IEC 14443 Type B ¤Î ID ¼èÆÀ¤Ê¤É¼ã´³¤ÎÍ×ÁǤòÄɲ䷤Ƥ¤¤Þ¤¹¡£¤µ¤·¤¢¤¿¤ê¼ê¸µ¤ÇÍÑÅӤΤʤ«¤Ã¤¿ NTAG21x ¥Í¥¤¥Æ¥£¥Ö¤Î WRITE, PWD_AUTH ¥³¥Þ¥ó¥É¤Ïº£²ó¤ÏÍøÍѤ·¤Æ¤¤¤Þ¤»¤ó¡£º£¸åɬÍפˤʤ俤Ȥ­¤Ë¼ÂÁõ¤òÄɲ䷤褦¤È»×¤¤¤Þ¤¹¡£

  • ¥é¥¤¥Ö¥é¥ê¤ØÄɲ乤ë´Ø¿ô¤Î¥¤¥á¡¼¥¸
    • ISO/IEC 14443 Type A ¤Î¶áÀܸ¡ÃÎ¤È ID ¤Î¼èÆÀ
    • ISO/IEC 14443 Type B ¤Î¶áÀܸ¡ÃÎ¤È ID ¤Î¼èÆÀ
    • NTAG21x ÀìÍÑ¡§ ¥á¥â¥ê¤ÎÁí¥Ú¡¼¥¸¿ô¤ò¼èÆÀ
    • MIFARE Ultralight ÍÑ¡§ ½êÄê¤Î¥á¥â¥ê¥Ú¡¼¥¸¤ÎÆâÍƤòÆɤ߽Ф¹
  • ¥Æ¥¹¥È¥×¥í¥°¥é¥à¤Î¥¤¥á¡¼¥¸
    • ¥¿¡¼¥²¥Ã¥È¤¬ ISO/IEC 14443 Type A (MIFARE) ¤Î¾ì¹ç
      • ID ¤ò¼èÆÀ¤·¥·¥ê¥¢¥ë¤Ø½ÐÎÏ
        • MIFARE Ultralight ¤Î¾ì¹ç
          • ¥á¥â¥êÆâÍƤΥÀ¥ó¥×¤ò¥·¥ê¥¢¥ë¤Ø½ÐÎÏ
            • NDEF ¥á¥Ã¥»¡¼¥¸¤¬µ­Ï¿¤µ¤ì¤Æ¤¤¤ë¾ì¹ç
              • NDEF ¥ì¥³¡¼¥ÉÆâÍƤò½ç¼¡¼èÆÀ¤·¥·¥ê¥¢¥ë¤Ø½ÐÎÏ
    • ¥¿¡¼¥²¥Ã¥È¤¬ ISO/IEC 14443 Type B ¤Î¾ì¹ç
      • µ¼»÷ ID ¤Ç¤¢¤ë PUPI (Pseudo-Unique PICC Identifier) ¤ò¼èÆÀ¤·¥·¥ê¥¢¥ë¤Ø½ÐÎÏ
    • ¥¿¡¼¥²¥Ã¥È¤¬ FeliCa (Standard / Lite / Lite-S) ¤Î¾ì¹ç
      • IDm ¤ò¼èÆÀ¤·¥·¥ê¥¢¥ë¤Ø½ÐÎÏ

µ¡´ï¤ÎÀܳ

¼ê¸µ¤Ç¤Ï¤³¤ì¤Þ¤Ç Arduino IDE ¤òÍøÍѤ¹¤ëµ¡²ñ¤Ï¤¢¤ê¤Þ¤·¤¿¤¬ Arduino ¼Âµ¡¤ò°·¤¦¤Î¤Ïº£²ó¤¬½é¤á¤Æ¤Ç¤·¤¿¡£

RC-S620/S ¤È Arduino UNO ¤ò¥·¥ê¥¢¥ëÀܳ¤·¤ÆÀ©¸æ¤ò¹Ô¤¤¡¢¾åµ­¤Î¤è¤¦¤Ë½èÍý¾õ¶·¤ò UNO ¤«¤é USB ·Ðͳ¤Ç PC ¾å¤Î¥·¥ê¥¢¥ë¥¿¡¼¥ß¥Ê¥ë¤Ø¿ï»þ½ÐÎϤ¹¤ë¤³¤È¤òÁÛÄꤷ¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬¡¢UNO ¤Î¥Ï¡¼¥É¥¦¥§¥¢¥·¥ê¥¢¥ë¤¬°ì·ÏÅý¤Î¤ß¤Ç¤¢¤ë¤³¤È¤òÃΤꡢÊÌΩ¤Æ¤Î USB ¥·¥ê¥¢¥ëÊÑ´¹¥â¥¸¥å¡¼¥ë¡ÊFT231X¡Ë¤È Arduino ɸ½à¤Î SoftwareSerial ¥é¥¤¥Ö¥é¥ê¤òÊ»ÍѤ¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

Ʊ¤¸Íýͳ¤Ç¡¢Arduino IDE ¤«¤é UNO ËÜÂΤΠUSB ¥·¥ê¥¢¥ë·Ðͳ¤Ç¥×¥í¥°¥é¥à¤ò½ñ¤­¹þ¤àºÝ¤Ë¤Ï [RC-S620/S ¦ TXD] <--> [RX ¥Ô¥ó] ¤Î·ëÀþ¤ò³°¤·¤ÆÇÓ¾¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¢¤¿¤ê¤Î»ö¾ð¤Ï Arduino ¥æ¡¼¥¶¤Ë¤ÏÅöÁ³¤Î¤³¤È¤Ê¤Î¤Ç¤·¤ç¤¦¤¬¥Ó¥®¥Ê¡¼¤Ë¤Ï¤Á¤ç¤Ã¤È¿·Á¯¤Ç¤·¤¿¡£

  

¥½¡¼¥¹¥³¡¼¥É

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§3ʬ19ÉÃ

  


(tanabe)
klab_gijutsu2 at 08:38¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2017ǯ08·î31Æü

micro:bit ¤È ESP32 ¤Ç¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥Ü¥¿¥ó¤òºî¤ë

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

º£·î¡Ê2017ǯ8·î¡Ë5Æü¤Ë¹ñÆâ¤ÇÀµ¼°ÈÎÇä¤Î»Ï¤Þ¤Ã¤¿ BBC micro:bit ¤ò³Ú¤·¤ó¤Ç¤¤¤Þ¤¹¡£ÃÙ¤ì¤Ð¤»¤Ê¤¬¤é¡¢À¤³¦Ãæ¤Î»Ò¤É¤â¤ÈÂç¿Í¤Ë¿Íµ¤¤Î¤³¤ÎÁÇŨ¤Ê¥³¥ó¥Ô¥å¡¼¥¿¤Î¥Õ¥¡¥ó¤Ë¤Ê¤ê¤Þ¤·¤¿¡£


http://www.bbc.com/
http://www.kitronik.co.uk/

»ä¤¬ micro:bit ¤Ë´Ø¿´¤ò»ý¤Ã¤¿¤Î¤ÏºÇ¶á°·¤Ã¤Æ¤¤¤¿ÏÃÂê¤Ë¤Á¤ç¤¦¤É¤Ô¤Ã¤¿¤ê¤Î¥Ç¥Ð¥¤¥¹¤À¤Ã¤¿¤³¤È¤¬¤­¤Ã¤«¤±¤Ç¤·¤¿¡£º£²ó¤Ï¤½¤ÎÆâÍƤȼ긵¤Ç¤Î»îºî¤ò½ç¤ò¤ª¤Ã¤Æ¾Ò²ð¤·¤Þ¤¹¡£

BLE ¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤ò¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥Ü¥¿¥ó¤È¤·¤Æ»È¤¦¤³¤È

Amazon Dash Button ¤ÎÀ®¸ù¤¬¤Ò¤È¤Ä¤Î·Àµ¡¤Ë¤â¤Ê¤ê ¤³¤Î¿ôǯ¤Î´Ö¤Ë¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥Ü¥¿¥ó¤ÎÍøÍѤÈÉáµÚ¤¬¿Ê¤ß¤Þ¤·¤¿¡£¼ê·Ú¤µ¤È¤¤¤¨¤Ð²¿¤«¤È¥¹¥Þ¥Û¤¬°ú¤­¹ç¤¤¤Ë½Ð¤µ¤ì¤ë¤³¤È¤Î¿¤¤¾õ¶·¤¢¤Ã¤Æ¤è¤êñ½ã¤ÊÁàºî¤Ç¤è¤ê´Êñ¤Ë½êÄê¤Î½èÍý¤ò¸Æ¤Ó½Ð¤»¤ë¤³¤È¤¬ÀìÍѤε¡´ï¤Ç¤¢¤ë¤³¤È¤ÎºÇÂç¤Î¶¯¤ß¤Ç¤·¤ç¤¦¡£

¤¿¤À¤½¤Î°ìÊý¤Ç¡¢µ¡´ï¤ÎÀ­¼Á¾å¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤Î¿¤¯¤¬ÅÅÃÓ¶îÆ°¼°¤Ç¤¢¤ë¤³¤È¤¬º£¸å¤ÎÍÑÅÓ¡¦Í×·ï¤Î³ÈÂç¤Ëȼ¤¤¤è¤êǺ¤Þ¤·¤¤Í×ÁǤȤʤë²ÄǽÀ­¤â¹Í¤¨¤é¤ì¤Þ¤¹¡£¸Â¤é¤ì¤¿µ®½Å¤ÊÅÅÎϤò»È¤Ã¤Æ¼«ÎϤǥ¤¥ó¥¿¡¼¥Í¥Ã¥È¾å¤Î½êÄê¤Î¥µ¡¼¥Ó¥¹¤ò᤭¤Ë¹Ô¤¯¤Î¤Ïɬ¤º¤·¤â¸úΨ¤ÎÎɤ¤¤ä¤êÊý¤Ç¤¢¤ê¤Þ¤»¤ó¤«¤é¡¢¤³¤ÎÅÀ¤Ø¤ÎÂн褬º£¸å¤Î²ÝÂê¤È¤Ê¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£

½éÂå¤Î Amazon Dash Button ¤Ë¹âÍÆÎ̤ǤϤ¢¤ë¤â¤Î¤Î˵Ìܤˤ⥳¥¹¥È¥Ð¥é¥ó¥¹¤Î´í¤Ê¤²¤ÊÊÆ¥¨¥Ê¥¸¥ã¥¤¥¶¡¼¼ÒÀ½¤Î¹â²Á¤Ê¥ê¥Á¥¦¥à°ì¼¡ÅÅÃÓ¤¬Æ⢤µ¤ì¤Æ¤¤¤¿¤³¤È¤Ï¾ÝħŪ¤Ç¤¹

°ì°Æ¤È¤·¤Æ¡¢¾ÊÅÅÀ­¤ËÍ¥¤ì¤¿ BLE ¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤ÈÃç²ðÌò¤Î¥¨¡¼¥¸¥§¥ó¥È¥Ç¥Ð¥¤¥¹¤òÁȤ߹ç¤ï¤»¤Æ¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥Ü¥¿¥ó¤ò¹½À®¤¹¤ë·Á¤òÁÛÄꤷ¤Þ¤·¤¿¡£¿Þ¤Ë¤·¤Æ¤ß¤Þ¤¹¡£

¤³¤Î¤è¤¦¤Ë¹Í¤¨Êý¤Ï¤È¤Æ¤â¥·¥ó¥×¥ë¤Ç¤¹¡£¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤ÏÅÅÃÓ¶îÆ°¡¢¿ø¤¨ÃÖ¤­¤Î¥¨¡¼¥¸¥§¥ó¥È¥Ç¥Ð¥¤¥¹¤Ï AC ÅŸ»¤«¤é¤ÎµëÅŤòÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£ ¥Ü¥¿¥ó¦¤Ï BLE ÄÌ¿®¤ÇɬÍ׺Ǿ®¸Â¤ÎÄÌÃΤò¥¨¡¼¥¸¥§¥ó¥È¤ØÁ÷¤ê¡¢¥¨¡¼¥¸¥§¥ó¥È¦¤Ï¤½¤ì¤ò¥È¥ê¥¬¡¼¤Ë½êÄê¤Î¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥µ¡¼¥Ó¥¹¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥Ü¥¿¥ó¤ÏÄ̾ﲰÆâ¶õ´Ö¤Ç¤ÎÍøÍѤ¬Á°Äó¤Ç¤¹¤«¤é¡¢BLE ¤È WiFi ¤ÎÄÌ¿®µ÷Î¥¤Î°ã¤¤¤Ëα°Õ¤·¤Æµ¡´ï¤ÎÀßÃÖ¡¦±¿ÍѤò¹Ô¤¨¤Ð¤³¤Î¹½À®¤Ë¤ÏÁê±þ¤Î¹çÍýÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¾®¤µ¤Ê¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤Ò¤È¤Ä¤ËÊ£»¨¤Ê½èÍý¤òÆþ¤ì¹þ¤à¤³¤È¤ËÈæ¤Ù¡¢µ¡´ï¤ÎÁȤ߹ç¤ï¤»¤Ë¤è¤Ã¤ÆɬÍפʵ¡Ç½¤ò¼Â¸½¤¹¤ë¤ä¤êÊý¤Ë¤Ï½ÀÆðÀ­¤¬¸«¹þ¤Þ¤ì¤ë¤Ç¤·¤ç¤¦¡£

ÄÌÃΤÎÊýË¡¤ÈÆ»¶ñΩ¤Æ

ÄÌÃÎÊýË¡¤Ë¤Ä¤¤¤Æ

Ä̾BLE ¥Ú¥ê¥Õ¥§¥é¥ë¤«¤é¥»¥ó¥È¥é¥ë¤Ø¤ÎÄÌÃΤϥǥХ¤¥¹´Ö¤ÎÀܳ³ÎΩ¸å¤Ë½êÄê¤Î¼ê³¤­¤Ë¤è¤ê¥»¥Ã¥È¥¢¥Ã¥×¤ò¹Ô¤¦¤³¤È¤Ç¼Â»Ü²Äǽ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ÎÀßÄê¤Ïξ¼Ô¤ÎÀܳ¤¬°Ý»ý¤µ¤ì¤Æ¤¤¤ë´Ö¤Î¤ßÍ­¸ú¤Ç¤¹¡£

¤â¤Á¤í¤ó¤½¤ì¤Ï BLE ¤Î»ÅÍ;å¤Î¤Þ¤Ã¤È¤¦¤Êµ¬Ìó¤Ê¤Î¤Ç¤¹¤¬¡¢Á°·Ç¤Î°Æ¤Ø¤ÎŬÍѤˤϤ¢¤Þ¤êµ¤¤¬¿Ê¤Þ¤º¤Ë¤¤¤Þ¤·¤¿¡£Íýͳ¤Ï°Ê²¼¤Î»°ÅÀ¤Ç¤¹¡£

  1. ¡ÖÀܳ¤Î°Ý»ý¡×¤¬É¬¿Ü¤Ç¤¢¤ë¤³¤È¤Ï BLE ¤Î¾ÊÅÅÀ­¤òºÇÂç¸Â¤Ë³è¤«¤½¤¦¤È¤¹¤ë¼ç»Ý¤Èɬ¤º¤·¤âÀÞ¤ê¹ç¤ï¤Ê¤¤
  2. ¥¨¡¼¥¸¥§¥ó¥È¤Ø¤ÎÄÌÃΤÏɬÍ׺Ǿ®¸Â¤Î¹ç¿Þ¤Î¤ß¤Ç¤è¤¤¤Ë¤â¤«¤«¤ï¤é¤º»Å³Ý¤±¤¬¹ë²Ú¤¹¤®¤ë
  3. µ»½Ñ¾ðÊó¤ä SDK ¤Î¸ø³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤òÍøÍѤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¥°¥ì¡¼¤Ê²òÀϤ¬É¬Í×

Âå¤ï¤ê¤Ë ¥Ç¥Ð¥¤¥¹¤«¤é¤Î¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¥Ñ¥±¥Ã¥È¤ò¹ç¿Þ¤È¤·¤ÆÍøÍѤ¹¤ë¤³¤È¤ò¹Í¤¨¤Þ¤·¤¿¡£¤³¤ÎÊýË¡¤Ê¤é¤è¤ê¥³¥¹¥È¤¬Ä㤯¥Ç¥Ð¥¤¥¹´Ö¤ÎÀܳ¤Ë¹´Â«¤µ¤ì¤ë¤³¤È¤â¤¢¤ê¤Þ¤»¤ó¡£¤Þ¤¿¡¢¥¢¥É¥Ð¥¿¥¤¥º¤ÎÆâÍƤÏʸ»úÄ̤ꥪ¡¼¥×¥ó¤Ê¤Î¤Ç°ìÈÌŪ¤Ê¥Ä¡¼¥ë¤ÇÉáÄ̤ËÆɤá¤ë¤È¤¤¤¦´Ö¸ý¤Î¹­¤µ¤âÍøÅÀ¤Ç¤¹¡£
Ãí°Õ¤ÎɬÍפÊÅÀ¤È¤·¤Æ¤Ï¡¢Ï¢Â³¤·¤ÆȯÀ¸¤¹¤ë¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¥Ñ¥±¥Ã¥È¤Ë¥¨¡¼¥¸¥§¥ó¥È¦¤¬²á¾ê¤ËÈ¿±þ¤·¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤³¤È¤È¡¢Åö³º¥Ç¥Ð¥¤¥¹¤òËÜ·ïÀìÍѤȤ·¤Æ°·¤¦¤Ù¤­¤Ç¤¢¤ë¤³¤È¤¬µó¤²¤é¤ì¤ë¤Ç¤·¤ç¤¦¡£

¥¨¡¼¥¸¥§¥ó¥È¤Ë¤Ä¤¤¤Æ

Á°·Ç¤Î°Æ¤Î¥Ý¥¤¥ó¥È¤Ï BLE ÄÌ¿®¤È¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÄÌ¿®¤ÎξÊý¤ò¥«¥Ð¡¼¤¹¤ë¥¨¡¼¥¸¥§¥ó¥È¤òÍÑ°Õ¤¹¤ëÅÀ¤Ë¤¢¤ê¤Þ¤¹¡£BLE ¤Ä¤­¤ÎÍ·¤ó¤Ç¤¤¤ë¥¹¥Þ¥Û¤òÍøÍѤ¹¤ë¼ê¤â¤¢¤ê¤Þ¤¹¤¬¡¢¡Ö¿ø¤¨ÃÖ¤­¡×¡Ö¾ï»þ²ÔƯ¡×¤òÁ°Äó¤È¤¹¤ë IoT ÁõÃ֤Ȥ·¤ÆÍøÍѤ¹¤ë¤Ë¤Ï¤¤¤µ¤µ¤«¥ª¡¼¥Ð¡¼¥¹¥Ú¥Ã¥¯¤Î´¶¤¬¤¢¤ê¡¢¤Þ¤¿¡¢»ëÅÀ¤Ï°Û¤Ê¤ë¤â¤Î¤Î¥¹¥Þ¥Û·Ï¤È¥Ü¥¿¥ó¤ÎÏ¢·È¤Ë´Ø¤·¤Æ¤Ï¡ÖFlic¡×¤ä¡ÖPochiru¡×¤Î¤è¤¦¤ÊÀèÎã¤â¤¢¤ë¤¿¤á¤â¤¦¤Ò¤È¤Ä¿©»Ø¤¬Æ°¤­¤Þ¤»¤ó¡£

¤½¤³¤Ç ESP32 ¥â¥¸¥å¡¼¥ë¤ò»È¤¦¤³¤È¤Ë¤·¤Þ¤·¤¿¡£ESP-WROOM-32 ¤Ïº£²ó¤ÎÍ×·ï¤òñÂΤǤ¹¤Ù¤ÆËþ¤¿¤·¤Æ¤¤¤ë¤¿¤á¤Þ¤µ¤ËŬÌò¤Ç²Á³ÊÌ̤ǤÎÌ¥ÎϤ⤢¤ê¤Þ¤¹¡£

  • BLE ¥Ú¥ê¥Õ¥§¥é¥ë / ¥»¥ó¥È¥é¥ëÂбþ
  • WiFi Âбþ
  • ¥×¥í¥°¥é¥Þ¥Ö¥ë¤«¤ÄñÂΤDzÔƯ²Äǽ
  • ESP32-DevKitC ESP-WROOM-32³«È¯¥Ü¡¼¥É - ½©·îÅÅ»Ò ¡ï1,480 ¡Ê2017ǯ8·î»þÅÀ¡Ë

¥Ü¥¿¥ó¤Ë¤Ä¤¤¤Æ

²áµî¤Ë¤³¤Î¥Ö¥í¥°¤Ç¥Ô¥Ã¥¯¥¢¥Ã¥×¤·¤¿¤â¤Î°Ê³°¤Ë¤â¼ê¸µ¤Ë¤ÏÊ£¿ô¤Î BLE ¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤¬¤¢¤ê¤Þ¤¹¡£¤½¤ì¤¾¤ì¤Ë¸ÄÀ­¤¬¤¢¤êʤ٤ƻȤäƤߤë¤È¤Ê¤«¤Ê¤«ÌÌÇò¤¤¤Î¤Ç¤¹¤¬¡¢¾å½Ò¤Î¤è¤¦¤Ë¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¥Ñ¥±¥Ã¥È¤òÍøÍѤ¹¤ë¤³¤È¤òÁÛÄꤹ¤ë¤È¼¡¤Î¤è¤¦¤Êµ¡Ç½¡¦µ¡¹½¤¬¤Û¤·¤¤¤È¹Í¤¨¤Þ¤·¤¿¡£

  1. µëÅÅÃæ¤Ë¥¢¥É¥Ð¥¿¥¤¥º¤Î³«»Ï¡¦Ää»ß¤òǤ°Õ¤ËÀ©¸æ¤Ç¤­¤ë¤³¤È
  2. Ê£¿ô¤Î¥Ü¥¿¥ó¤¬ÁõÈ÷¤µ¤ì¤Æ¤¤¤ë¤³¤È
    ¡Ê¡Ö¤Ò¤È¤Ä¤Î¥Ç¥Ð¥¤¥¹¤Ç¤Ò¤È¤Ä¤Î½èÍý¡×¤Ç¤Ï¤Á¤ç¤Ã¤È¼ä¤·¤¤¡£¥¢¥É¥Ð¥¿¥¤¥º¤ò¹ç¿Þ¤È¤¹¤ë°Ê¾å¡¢¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤¬ËÜÍè¤ÎÄÌÃε¡Ç½¤Ë¤ª¤¤¤Æ¥À¥Ö¥ë¥×¥Ã¥·¥å¤äĹ²¡¤·¤È¤¤¤Ã¤¿¥Ü¥¿¥ó¥¢¥¯¥·¥ç¥ó¤Î¶èÊ̤ËÂбþ¤·¤Æ¤¤¤Æ¤â¤½¤ì¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¤È¤¤¤¦»ö¾ð¤â¤¢¤ë¡Ë
  3. ¾åµ­ 2. ¤Ë´ØÏ¢¤·¤Æ¡¢¥¢¥É¥Ð¥¿¥¤¥º¥Ç¡¼¥¿¤ÎÆâÍƤòÊѹ¹²Äǽ¤Ç¤¢¤ë¤³¤È

»ÄÇ°¤Ê¤¬¤é¤³¤ì¤é¤ÎÍ×·ï¤òËþ¤¿¤¹¤â¤Î¤Ï¼ê¸µ¤Ë¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¤¬¡¢¥×¥í¥È¥¿¥¤¥Ô¥ó¥°¤Ç¤¢¤ì¤³¤ì»î¤·¤¿¤È¤³¤í¤Ç¤Ï¤É¤Î¥Ü¥¿¥ó¤â¤½¤ì¤Ê¤ê¤Ë»È¤¨¤ë¤Î¤Ç¤Þ¤¢¤³¤ì¤Ï¤³¤ì¤Ç¡¦¡¦¤È¤â»×¤Ã¤Æ¤¤¤Þ¤·¤¿¡£¤½¤³¤Ç¤¿¤Þ¤¿¤ÞÌܤˤ·¤¿¤Î¤¬ micro:bit ¹ñÆâÈÎÇä¤Î¥Ë¥å¡¼¥¹¤Ç¤¹¡£

¤½¤ì¤Þ¤Ç¤³¤ÎÀ½ÉʤΤ³¤È¤Ï̾Á°¤·¤«ÃΤ餺¤Ë¤¤¤Þ¤·¤¿¡£¤¢¤é¤¿¤á¤Æ¼Ì¿¿¤ò¤ß¤Æ¤Õ¤¿¤Ä¤Î¥¿¥¯¥È¥¹¥¤¥Ã¥Á¤¬ÌܤˤȤޤꡢ¤µ¤é¤Ëµ­»öÃæ¤Î¡Öµ»Å¬¡×¤Îʸ»ú¤¬µ¤¤Ë¤Ê¤Ã¤Æ¾ðÊó¤òÄ´¤Ù¤¿¤È¤³¤í¼Â¤Ï¾å¤Î¤ß¤Ã¤Ä¤ÎÍ×·ï¤ò¤¹¤Ù¤ÆËþ¤¿¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤Ã¤¿¤¿¤á̤鷺¤³¤ì¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£
¤Á¤Ê¤ß¤Ë¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹¤µ¤ó¤¬µîǯ 12·î¤Ë¥ê¥ê¡¼¥¹¤·¤¿ chibi:bit ¤Î¤³¤È¤â¤³¤Î»þ¤ËÃΤê¤Þ¤·¤¿¡£¥·¥ç¥Ã¥×¤Ë¤Ï¤è¤¯¤ªÀ¤ÏäˤʤäƤ¤¤ë¤Î¤Ç¤¹¤¬¡¢°ì¸«¤¢¤Þ¤ê´Ø·¸¤Î¤Ê¤µ¤½¤¦¤Ê¤È¤³¤í¤Ë¤·¤Ã¤«¤êÎɤ¤¤â¤Î¤¬¤¢¤Ã¤¿¤ê¤¹¤ë¤â¤Î¤Ç¤¹¤Í¡£

micro:bit ÍѤËÄɲùØÆþ¤·¤¿¥Ñ¡¼¥Ä

micro:bit ¥Ü¡¼¥É¤ò¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤È¤·¤Æ°·¤¦¤¿¤á¤Ë·ç¤«¤»¤Ê¤¤¤Õ¤¿¤Ä¤Î¥Ñ¡¼¥Ä¤òĴ㤷¤Þ¤·¤¿¡£ ¤¤¤º¤ì¤â±Ñ Kitronik ¼Ò¤ÎÀ½Éʤǡ¢¥Ü¥¿¥óÅÅÃÓ¤«¤éµëÅŤ¹¤ë¤¿¤á¤Î¥ª¥×¥·¥ç¥ó¥Ü¡¼¥É¡ÖMI:power¡×¡ÊľÈβÁ³Ê ¡ò4.16¡Ë¤È¡¢Æ±¥Ü¡¼¥É¤òÁõÃ夷¤¿¾õÂÖ¤ÎÁ´ÂΤò¤¹¤Ã¤Ý¤êʤ¤¦¤³¤È¤Î¤Ç¤­¤ë¡ÖMI:pro Protective Case¡×¡ÊľÈβÁ³Ê ¡ò4.10¡Ë¤Ç¤¹¡£¼Ì¿¿¤Ï¥±¡¼¥¹¤Ë¼ý¤á¤¿¾õÂ֤γ°´Ñ¤Ç¤¹¡£


Á°ÌÌ
ÇØÌÌ
¤Þ¤¿¡¢º£²ó¤Ï»È¤Ã¤Æ¤¤¤Þ¤»¤ó¤¬¡¢³ÈÄ¥¥³¥Í¥¯¥¿ÍѤΡÖEdge Connector Breakout Board¡×¡ÊľÈβÁ³Ê ¡ò4.15¡Ë¤â¤¢¤ï¤»¤ÆÆþ¼ê¤·¤Þ¤·¤¿¡£

;Ã̤ʤ¬¤é Kitronik ¼Ò¤ÏľÈΤò¹Ô¤Ã¤Æ¤Ï¤¤¤ë¤â¤Î¤ÎÆüËܤؤÎÁ÷ÎÁ¤¬ºÇ°Â¤Ç¤â ¡ò30.95 ¤È¹â¤¤¤¿¤á¡¢Á÷ÎÁ¤Î°Â¤¤¥·¥ç¥Ã¥×¤òõ¤·¤Æ±Ñ¹ñÆâ¤Î Pimoroni ¤Ë¤¿¤É¤êÃ夭¡¢¤½¤³¤Ç¡ÖMI:power¡×¤È¡ÖEdge Connector Breakout Board¡×¤ò¹ØÆþ¤·¤Þ¤·¤¿¡£Á÷ÎÁ¤Ï ¡ò5.50¡£8·î7Æü¤ËȯÃí¤· 1½µ´Ö¤ÇÅþÃ夷¤Þ¤·¤¿¡£¤Ê¤ª¡¢¤³¤Î¤Õ¤¿¤Ä¤ÎÀ½Éʤϥ¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹¤µ¤ó¤Î¥µ¥¤¥È¤Ë¤â·ÇºÜ¤µ¤ì¤Æ¤ª¤ê 8·î21Æü¤ËƱ¼Ò¤«¤é¡Ö¤´Ãíʸ¤¤¤¿¤À¤±¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡×¥á¡¼¥ë¤¬ÆϤ­¤Þ¤·¤¿¡£

¤É¤¦¤·¤Æ¤âÍߤ·¤«¤Ã¤¿¡ÖMI:pro Protective Case¡×¤Ï Pimoroni ¤Ë¤â¸«Åö¤¿¤é¤º¡¢¤·¤Ä¤³¤¤¸¡º÷¤ò·Ð¤Æ·ë¶É¤½¤Î»þÅÀ¤ÇÁ÷ÎÁ¤ò´Þ¤áºÇ¤â°Â¤¯ÈÎÇ䤷¤Æ¤¤¤¿ ebay ½ÐÉÊ´ë¶È¤«¤éÇ㤤¤Þ¤·¤¿¡£¤½¤ì¤Ç¤âÁí³Û¤¬ÆüËܹñÆâ¤Ç¤Î micro:bit ËÜÂβÁ³Ê¤è¤ê¤â¹â³Û¤Ç¤Ï¤¢¤ê¤Þ¤·¤¿¤¬¡¢¤Á¤ç¤¦¤É 2½µ´Ö¸å¤Î 8·î25Æü¤ËÆϤ­´ò¡¹¤È¤·¤Æ»È¤Ã¤Æ¤¤¤Þ¤¹¡£

¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹¤µ¤ó¡¢¤¼¤Ò¤³¤Î¡ÖMI:pro Protective Case¡×¤â°·¤Ã¤Æ²¼¤µ¤¤¡ªPimoroni ¤µ¤ó¤âº£¤Î¤È¤³¤í°·¤Ã¤Æ¤¤¤Ê¤¤¤è¤¦¤Ç¤¹¤¬¡¢¤â¤·Æþ²Ù¤µ¤ì¤¿¤é¾¯¤Ê¤¯¤È¤â»ä¤Ï³Î¼Â¤ËÇ㤤¤Þ¤¹¡ª¡Ê^^;

¡ÊÄɵ­¡Ë2017ǯ10·î11Æü¤Ë¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹¤µ¤ó¥µ¥¤¥È¤Ç¤ÎÈÎÇ䤬³«»Ï¤µ¤ì¤Þ¤·¤¿¡£
  MI:ÅŸ»¥Ü¡¼¥ÉÍÑ MI:pro¥±¡¼¥¹ - ¥³¡¼¥ÉÈÖ¹æ KITRONIK-5611

¼ÂÁõ

micro:bit ¦

micro:bit ¦¤Î¥×¥í¥°¥é¥à¤Ï Microsoft MakeCode ¤Ç¼êÁ᤯ºîÀ®¤·¤Þ¤·¤¿¡£°Ê²¼¤ÎÆâÍƤȤ·¤Æ¤¤¤Þ¤¹¡£

  • ÅŸ»¤¬Æþ¤ë¤ÈºÇ¾åÃÊÃæ±û¤Î LED ¤ò 2Éôֳ֤ÇÅÀÌdz«»Ï ¡ÊµëÅžõÂ֤γÎǧÍÑ¡Ë
  • º¸Â¦¤Î¥Ü¥¿¥ó A ¤¬²¡¤µ¤ì¤ë¤È¥Ü¥¿¥ó±¦¤Î LED ¤òÅÀÅô¤· Eddystone-URL ¥Ñ¥±¥Ã¥È¤Ë¥À¥ß¡¼ URL "http://A" ¤ò¤Î¤»¤Æ 4Éô֥¢¥É¥Ð¥¿¥¤¥º¤¹¤ë
  • ±¦Â¦¤Î¥Ü¥¿¥ó B ¤¬²¡¤µ¤ì¤ë¤È¥Ü¥¿¥óº¸¤Î LED ¤òÅÀÅô¤· Eddystone-URL ¥Ñ¥±¥Ã¥È¤Ë¥À¥ß¡¼ URL "http://B" ¤ò¤Î¤»¤Æ 4Éô֥¢¥É¥Ð¥¿¥¤¥º¤¹¤ë

¥¢¥É¥Ð¥¿¥¤¥º¤Ë Eddystone-URL ¥Ñ¥±¥Ã¥È¤ò»ÈÍѤ·¤Æ¤¤¤ë¤Î¤Ï MakeCode ¾å¤Î¡ÖBluetooth¡×¤Î¹à¤Ë¾¤ÎÁªÂò»è¤¬¸«Åö¤¿¤é¤Ê¤«¤Ã¤¿¤¿¤á¤Ç¤¹¡£¤³¤ì¤È¸À¤Ã¤ÆÊÀ³²¤âÁÛÄꤵ¤ì¤º¡¢¤Þ¤¿¡¢¤É¤Î¤è¤¦¤Ê·Á¼°¤Ç¤¢¤ì¥Ç¡¼¥¿¤ÎÆâÍÆ¤Ç A, B ¥Ü¥¿¥ó¤ò¶èÊ̤Ǥ­¤ì¤Ð»ö­¤ê¤ë¤Î¤Ç¤³¤ì¤Ï¤³¤ì¤Ç¤è¤·¤È¤·¤Þ¤·¤¿¡£¿Þ¤Ï¥¨¥Ç¥£¥¿²èÌ̤Υ¹¥¯¥ê¡¼¥ó¥·¥ç¥Ã¥È¤Ç¤¹¡£¤¹¤Ç¤Ë¤³¤¦¤¤¤¦»þÂå¤Ê¤Î¤Ç¤¹¤Í¡£ ¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

ESP-WROOM-32 ¦

ESP32 ¥â¥¸¥å¡¼¥ë¦¤Î¥×¥í¥°¥é¥à¤Ï ESP-IDF ´Ä¶­¤ÇºîÀ®¤·¤Þ¤·¤¿¡£

½èÍý¤Î³µÍ×

  1. ½êÄê¤Î WiFi ¥¢¥¯¥»¥¹¥Ý¥¤¥ó¥È¤ØÀܳ
  2. ½êÄê¤Î URL ¤Ø HTTPS ¥¢¥¯¥»¥¹¤ò¹Ô¤¦¤¿¤á¤Î¥¿¥¹¥¯¤òÀ¸À®¤·¤ÆÂÔµ¡
    ¡Á ²¼µ­ 3. ¤Ç¤ÎÍ×µáȯÀ¸»þ¤Ë¥ê¥¯¥¨¥¹¥ÈÁ÷½Ð¤È¥ì¥¹¥Ý¥ó¥¹¼õ¿®¤ò¹Ô¤¤½ª¤ï¤ì¤ÐºÆ¤ÓÂÔµ¡¾õÂÖ¤Ø
  3. ±Ê³¥ë¡¼¥×¤Ç BLE ¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¥Ñ¥±¥Ã¥È¤Î¥¹¥­¥ã¥ó¤ò³«»Ï
    ¡Á ÂоݤȤ¹¤ë MAC ¥¢¥É¥ì¥¹¤Î¥Ç¥Ð¥¤¥¹¤«¤é¤ÎÂоݤȤ¹¤ëÉäÃú¤ò´Þ¤à Eddystone-URL ¥Ñ¥±¥Ã¥È¤ò¸¡ÃΤ¹¤ë¤È¾åµ­ 2. ¤Î¥¿¥¹¥¯¤Ø½êÄê¤Î URL ¤Ø¤Î¥ê¥¯¥¨¥¹¥È¤òÍ×µá

¥½¡¼¥¹¥³¡¼¥É

¤³¤³¤Ç¤Ï°ìÂæ¤Î micro:bit ¤Î¤ß¤òÂоݤȤ·¤Æ¤¤¤Þ¤¹¤¬¡¢¥½¡¼¥¹¥³¡¼¥ÉÃæ¤Î Entries ¥Æ¡¼¥Ö¥ë¤ØŬµ¹¥¨¥ó¥È¥ê¤òÄɲ乤뤳¤È¤ÇÊ£¿ô¤Î micro:bit ¤òÂоݤȤ¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£

A, B ¥Ü¥¿¥ó¤Î²¡²¼¤Ë¸Æ±þ¤¹¤ë¥¢¥¯¥·¥ç¥ó¤Î¥µ¥ó¥×¥ë¤È¤·¤Æ Gmail ȯ¿®, ·ÈÂÓÅÅÏäΥ³¡¼¥ë¤Î¤Õ¤¿¤Ä¤Î½èÍý¤òɳÉÕ¤±¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤é¤Ï¤¤¤º¤ì¤â Microsoft Flow ¾å¤ËºîÀ®¤·¤¿¥Õ¥í¡¼¤Î URL ¤Ø¤Î GET Í×µá¤Ë¤è¤Ã¤Æ¼Â¸½¤·¤Æ¤¤¤Þ¤¹¡£¤Õ¤¿¤Ä¤Î¥Õ¥í¡¼¤Î¥¹¥¯¥ê¡¼¥ó¥·¥ç¥Ã¥È¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£ ¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

Gmail ȯ¿®

ÅÅÏõ¡¤ò¥³¡¼¥ë¡ÊTwilio API ¤òÍøÍÑ¡Ë

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§1ʬ18Éá¡¡ÊÅÓÃæ¤ÇÅÅÏÃÃå¿®²»¤¬ÌĤê¤Þ¤¹¡£²»Î̤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡Ë


(tanabe)
klab_gijutsu2 at 09:06¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(2)
2017ǯ06·î23Æü

²»¤òÍøÍѤ¹¤ë 5 ¡Ámbed ¥Þ¥¤¥³¥ó¤Ç¤Î±þÍÑ¡§¼ÂÁõÊÔ¡Á ¡Ê½ª¡Ë

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

¤³¤Îµ­»ö¤ÎÆâÍÆ

Á°²ó¤Îµ­»ö¤Ç¤Ï mbed LPC1768 ¤ò»È¤Ã¤Æ²»À¼¿®¹æ¤ÎÆþ½ÐÎϤÈʬÀϤò»î¤ß¤Þ¤·¤¿¡£º£²ó¤Ï¤½¤ÎÆâÍƤò¤â¤È¤Ë¼ÂÍÑÀ­¤Î¸«¹þ¤á¤ë¤â¤Î¤òºî¤Ã¤Æ¤ß¤Þ¤¹¡£

¢¨µ­»ö¤Ç¤Ï²»¤ÎʬÀϤ˰ʲ¼¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹

1. ²»¤ò¥È¥ê¥¬¡¼¤ËÄÌÃΤò¹Ô¤¦¤·¤¯¤ß¤òºî¤ë

¤Þ¤º¡¢½êÄê¤Î²»¤òÌĤ餹¤È¤½¤ì¤ËÈ¿±þ¤·¤Æ½êÄê¤ÎÏ¢ÍíÀè¤ØÄÌÃΤò¹Ô¤¦¤·¤¯¤ß¤òÁÛÄꤷ¤Þ¤·¤¿¡£ÁõÃÖ¤¬²°Æâ¤Ç¾ï»þ½¸²»¤ÈʬÀϤò¹Ô¤¤¡¢½êÄê¤Î¼þÇÈ¿ô¤ÎϢ³À­¤Î¤¢¤ë²»À¼¿®¹æ¤ò¸¡ÃΤ¹¤ë¤È¥¤¥ó¥¿¡¼¥Í¥Ã¥È·Ðͳ¤Ç½êÄê¤ÎÂоݤØÄÌÃΤòÁ÷¤ë¥¤¥á¡¼¥¸¤Ç¤¹¡£¼¡¤Î¤è¤¦¤Ë¹Í¤¨¤Þ¤·¤¿¡£

  • ²»¤ÏÅż§ÇȤËÈæ¤Ù¤è¤ê¾®¤µ¤Ê¥¨¥Í¥ë¥®¡¼¤ÇȯÀ¸¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¤¿¤á²¿¤é¤«¤Î½èÍý¤ò»Ø¼¨¤¹¤ë¤¿¤á¤Î¥È¥ê¥¬¡¼¤È¤·¤Æ¤ÎÍ­ÍÑÀ­¤¬¸«¹þ¤Þ¤ì¤ë
  • ²»¤Ï¿Í´Ö¤Î´±Ç½¤Ëľ·ë¤·¤Æ¤ª¤ê°·¤¤¤¬Èæ³ÓŪÍưפǤ¢¤ë¤¿¤á¾¤ÎÁªÂò»è¤¬ÊĤ¶¤µ¤ì¤¿¾õ¶·¤Ë¤ª¤¤¤Æ°Õ»×¤òÅÁ¤¨¤ë¤¿¤á¤ÎºÇ¸å¤Î¼êÃʤȤʤêÆÀ¤ë
  • ¥Þ¥¤¥³¥ó¤Ï¾ï»þ²ÔƯ¤òÁ°Äó¤È¤¹¤ë¾ðÊó½èÍýÁõÃ֤ι½À®Í×ÁǤȤ·¤Æ¹¥Å¬¤Ç¤¢¤ê¤³¤¦¤·¤¿»È¤¤Êý¤Ï¡ÖIoT¡×¤½¤Î¤â¤Î¤Ç¤â¤¢¤ë

»ÈÅӤϤ¤¤í¤¤¤í¹Í¤¨¤é¤ì¤½¤¦¤Ç¤¹¤¬¡¢¤¿¤È¤¨¤ÐÆü¾ïŪ¤Ë´í¸±¤ÎÀøºß¤¹¤ë¹âÎð¼ÔÀ¤ÂÓ¤äÆȵïÀ¤ÂӤˤª¤¤¤ÆÈó¾ï»þ¤Ë SOS ¤òȯ¿®¤¹¤ë¤¿¤á¤ÎÍÑ¿´ËÀ¤È¤·¤Æ¤âÍ­ÍѤǤ·¤ç¤¦¡£

¤É¤Î¤è¤¦¤Ê²»¤ò»È¤¦¤«

ÄÌÃΤΥȥꥬ¡¼¤È¤¹¤ë²»¤Ë¤Ï½êÄê¤Î¼þÇÈ¿ô¤È¿¶Éý¤Î°Ý»ý¤¬µá¤á¤é¤ì¤Þ¤¹¡£¤â¤Ã¤È¤â´Êñ¤Ë¤½¤Î¤è¤¦¤Ê²»¤ò½Ð¤»¤ë¿È¶á¤ÊÆ»¶ñ¤È¤·¤Æ¡ÖÅ«¡×¤ËÌܤò¸þ¤± 5 ¼ïÎà¤ÎÀ½Éʤò»î¤·¤Æ¤ß¤Þ¤·¤¿¡£¤½¤ì¤¾¤ì¤ËÆÃŤ¬¤¢¤ê¤³¤ì¤é¤ÎÅ«À½Éʤ⻤ò¤¹¤Ù¤Æ¥È¥ê¥¬¡¼¤È¤·¤ÆÍøÍѤ·¤¿¤¤¤È¹Í¤¨¤Þ¤·¤¿¡£

A&F ¼ÒÀ½ ¥µ¥¤¥ì¥ó¥È¥Û¥¤¥Ã¥¹¥ë¡¡¸¤Å«

  • A&F ¥¨¥¤¥¢¥ó¥É¥¨¥Õ ¥µ¥¤¥ì¥ó¥È¥Û¥¤¥Ã¥¹¥ë - www.aandfstore.com
    ¿Í¤Ëʹ¤³¤¨¤ë²ÄÄ°Îΰè¤ÎÄã²»¤È¸¤¤Ë¤·¤«Ê¹¤³¤¨¤Ê¤¤Ä¶²»ÇÈÎΰè(16000¡Á22000Hz°Ê¾å)¤Î ¹â²»¤ò½Ð¤¹¤³¤È¤¬¤Ç¤­¤ë·ÚÎ̤ʥ¢¥ë¥ß¹ç¶â¤«¤éºï¤ê½Ð¤·¤Æºî¤Ã¤¿¡¢¤¿¤Ã¤¿7g¤Î¸¤Å«¤Ç¤¹
  • A&F ¥¨¥¤¥¢¥ó¥É¥¨¥Õ ¥µ¥¤¥ì¥ó¥È ¥Û¥¤¥Ã¥¹¥ë - www.yodobashi.com
  • Ĺ½ê
    • Æü¾ïŪ¤Ê´Ä¶­²»¤È¤Ï¤Û¤È¤ó¤É¶¥¹ç¤·¤Ê¤¤¹â¼þÇȤ⻤ò´Êñ¤Ë½ÐÎϤǤ­¤ë
    • ¿¶Éý¤ÎÂ礭¤Ê²»¤ò¡ÖÀŤ«¡×¤ËÌĤ餹¤³¤È¤¬²Äǽ
    • ¾¯¤Ê¤¤Â©¤ÇÂ礭¤¯Ä¹¤¯²»¤ò½Ð¤»¤ë
    • º£²ó¤ÎÃæ¤Ç¤Ï¤â¤Ã¤È¤â±ó¤¯¤Þ¤Ç²»¤¬ÅÁ¤ï¤ë
  • È÷¹Í
    • ²Á³Ê¤¬¹â¤á¡Ê¼ÂÇä¡ï2,000Á°¸å¡Ë
    • ¸¤Å«¤Ï²»¤¬¿Í´Ö¤Ëʹ¤³¤¨¤Ë¤¯¤¤À­¼Á¾å°ìÈÌŪ¤ÊËɺҡ¦ÈòÆñÍÑÅӤˤÏŬ¤µ¤Ê¤¤¡¡¢¨¤³¤ÎÀ½Éʼ«ÂΤϲÄÄ°²»°è¤ØÀÚ¤êÂؤ¨¤¬²Äǽ
¥µ¥ó¥×¥ë¡Ê¶¯¤¤Â©¡§²»ÎÌÃí°Õ¡Ë
¥Ô¡¼¥¯¤Ï 10000Hz ÉÕ¶á
¼þÇÈ¿ôʬÉÛ

¥³¥¯¥è¼ÒÀ½ ËɺÒÍѵ߽õÅ«

  • ËɺÒÍѵ߽õÅ«¥Ä¥¤¥ó¥¦¥§¡¼¥Ö - µß½õ¡¦ÈòÆñÍÑÉÊ - www.kokuyo-st.co.jp
    ¥Ä¥¤¥ó¥¦¥§¡¼¥Ö¤Ï¿Í¤Î¼ª¤ËºÇ¤âÎɤ¯Ê¹¤³¤¨¤ëÌó3000Hz¡Á5000Hz¤Î¼þÇÈ¿ô¤ÎÃæ¤Ç¡¢2¼ïÎà¤ÎÇÈŤò½Ð¤¹¤¿¤á¡¢¤è¤ê¹­ÈϰϤʿͤؤÎÃí°Õ´­µ¯¤¬²Äǽ¤È¤Ê¤ê¤Þ¤¹¡£ ¾®¤µ¤Ê©¤Ç¤âÂ礭¤Ê²»¤ò½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
  • ¥³¥¯¥è ËɺÒÍѵ߽õÅ« ËɺҤÎã¿Í ¥Ä¥¤¥ó¥¦¥§¡¼¥Ö ¥ª¥ì¥ó¥¸ DRK-WS1YR - www.amazon.co.jp
  • ÆÃÊÌÂÐÃÌ¡¡»³Â¼Éðɧ»á¡ßÎëÌÚ¾¾Èþ»á¡ÊÄ󶡡§¥³¥¯¥è £Ó¡õ£Ô ³ô¼°²ñ¼Ò¡Ë - www.webside.jp
    »³Â¼»á¡¡¤³¤Î¡Ö¥Ä¥¤¥ó¥¦¥§¡¼¥Ö¡×¤Ç¤¹¤¬¡¢°ì¸«¡¢Å«¤È¤Ï¤ï¤«¤ê¤Þ¤»¤ó¤Í¡£¡¦¡¦¡¦
    ¤¤¤Ä¤Ç¤â¡¢¤É¤³¤Ç¤â¡¢Ã¯¤Ç¤â¤¬»ý¤ÁÊ⤱¤ë¤È¤¤¤¦¤Î¤Ï¡¢Èó¾ï¤ËÂ礭¤Ê¥Ý¥¤¥ó¥È¤À¤È»×¤¤¤Þ¤¹¡£¡¦¡¦¡¦
    ÎëÌڻᡡ¤Ò¤È¤Ä¤Î²»¤À¤±¤Ç¤Ï¤Ê¤¯¡¢£²¼ïÎà¡¢£³¼ïÎà¤Î²»¤¬½Ð¤»¤ì¤Ð¡¢¤è¤ê½õ¤±¤òµá¤á¤ä¤¹¤¤¤Î¤Ç¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¡£ ¥Ä¥¤¥ó¥¦¥§¡¼¥Ö¤Ï¡¢3200¥Ø¥ë¥Ä¤È4800¥Ø¥ë¥Ä¤Î²»¤òƱ»þ¤Ë½Ð¤·¤Þ¤¹¡£¡¦¡¦¡¦
    ÎëÌڻᡡ¥Ä¥¤¥ó¥¦¥§¡¼¥Ö¤Ï¡¢Ä̾ï¤Ç700¡Á800¥á¡¼¥È¥ëÀè¤Þ¤Ç¤Ï²»¤¬ÆϤ­¤Þ¤¹¤«¤é¡¢¥¨¥ì¥Ù¡¼¥¿¤ÇÊĤ¸¹þ¤á¤é¤ì¤¿¾ì¹ç¤Ê¤É¤âÍ­¸ú¤Ç¤¹¡£ ¤µ¤é¤Ë¡¢·Ú¤¤Â©¤ÇÂ礭¤Ê²»¤òÌĤ餻¤ë¤Î¤Ç¡¢¤ªÇ¯´ó¤ê¤Ë¤âºÇŬ¤Ç¤¹¡£ÎϤ¬¤Ê¤¯¤Æ¤âƱ¤¸¼þÇÈ¿ô¤¬½Ð¤»¤ë¤è¤¦¤Ë¡¢¤º¤¤¤Ö¤ó¶ìÏ«¤·¤Þ¤·¤¿¡£Â©¤Î¥¨¥Í¥ë¥®¡¼¤ò¤Û¤È¤ó¤É²»¤ËÊÑ´¹¤·¤Æ¡¢Èó¾ï¤Ë¸úΨ¤¬¤¤¤¤¤ó¤Ç¤¹¡£ »³Â¼»á¡¡¤³¤ÎÅ«¤Î¸ú²Ì¤Ï¡¢¤³¤ì¤«¤é¤ÎËɺÒÂкö¤Ë·ç¤«¤»¤Ê¤¤¤è¤¦¤Ë»×¤¤¤Þ¤¹¡£¹âÎð¼Ô¤Ç¤â¡¢ ¿²¤¿¤­¤ê¤Î¿Í¤Ç¤â¡¢Å«¤µ¤¨¿á¤±¤ì¤Ð¼«¤é¤Îµï¾ì½ê¤òÃΤ餻¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
  • Ĺ½ê
    • ¾¯¤Ê¤¤Â©¤Ç¤è¤êÂ礭¤Ê²»¤ò½Ð¤»¤ë
    • ¥×¥é¥¹¥Æ¥£¥Ã¥¯À½¤«¤Ä³¸¤Ä¤­¤Ç¾®¤µ¤¯·ÈÂÓÀ­¤ËÍ¥¤ì¤ë
    • ¥³¥¹¥È¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¹â¤¤¡Ê¼ÂÇä¡ï400Á°¸å¡Ë
  • È÷¹Í
    • ¼ê¸µ¤Ç¤Î³Îǧ¤Ç¤ÏÀ½ÉÊ̾¤ÎͳÍè¤Ç¤â¤¢¤ë¡Ö2¼ïÎà¤ÎÇÈĹ¡×¤Ï¤¢¤Þ¤ê¤Ï¤Ã¤­¤ê¤È´Ñ»¡¤Ç¤­¤Ê¤«¤Ã¤¿¡£¿á¤­Êý¤Î±Æ¶Á¡©
¥µ¥ó¥×¥ë¡Ê¶¯¤¤Â©¡§²»ÎÌÃí°Õ¡Ë
¥Ô¡¼¥¯¤Ï 3200Hz ÉÕ¶á
¼þÇÈ¿ôʬÉÛ

¥â¥ë¥Æ¥ó¼ÒÀ½ ÅŻҥۥ¤¥Ã¥¹¥ë

¥µ¥ó¥×¥ë¡Ê²»ÎÌÃí°Õ¡Ë
¥Ô¡¼¥¯¤Ï 3800Hz ÉÕ¶á
¼þÇÈ¿ôʬÉÛ

¥ì¥â¥ó¼ÒÀ½ ¶ÛµÞÍѸƻÒÅ«

  • ¶ÛµÞÍѸƻÒÅ« - lemon.gr.jp
  • ¶ÛµÞÍÑ ¸Æ»ÒÅ« 885800 - www.amazon.co.jp
    ·ÈÂÓ¤ËÊØÍø¤Ê¥Ú¥ó¥À¥ó¥È¥¿¥¤¥×¤Î¶ÛµÞÍѸƻÒÅ«¤Ç¤¹¡£ ¿È¸µ³Îǧ¤Î¤¿¤á¤ÎID¥«¡¼¥É¤¬ÉÕ¤¤¤Æ¤¤¤Þ¤¹¡£
  • Ĺ½ê
    • ¾¯¤Ê¤¤Â©¤ÇÂ礭¤¯Ä¹¤¯²»¤ò½Ð¤»¤ë
    • ¥¹¥ê¥à¤Ç·Ú¤¯·ÈÂÓ¤·¤ä¤¹¤¤
    • ¥³¥¹¥È¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¤­¤ï¤á¤Æ¹â¤¤¡Ê¼ÂÇä¡ï100¡Á200ÄøÅÙ¡Ë
  • È÷¹Í
    • ¡Ö¥¢¥ë¥ßÀ½¡×¤À¤¬¹äÀ­¤Ë¼ã´³¤ÎÉ԰¤¢¤ê
¥µ¥ó¥×¥ë¡Ê¶¯¤¤Â©¡§²»ÎÌÃí°Õ¡Ë
¥Ô¡¼¥¯¤Ï 4300Hz ÉÕ¶á
¼þÇÈ¿ôʬÉÛ

°ìÈÌŪ¤Ê¥Û¥¤¥Ã¥¹¥ë¡Ê¥á¡¼¥«¡¼ÉÔÌÀ¡Ë

  • Ĺ½ê
    • É´¶ÑŹ¤ÇÇ㤨¤ë¤Ê¤ÉÆþ¼êÀ­¤¬¤è¤¯Ê¶¼º¤·¤Æ¤â¥À¥á¡¼¥¸¤¬¾¯¤Ê¤¤
    • ¥¹¥¿¥ó¥À¡¼¥É¤Ç¤¢¤ë¤¿¤á°ì¸«¤·¤ÆÅ«¤Èǧ¼±¤Ç¤­Ã¯¤Ç¤â´Êñ¤Ë°·¤¨¤ë
  • È÷¹Í
    • ²»Î̤γÎÊݤȻý³¤Ë¿¤¯¤Î©¤¬É¬Í×
¥µ¥ó¥×¥ë¡Ê¶¯¤¤Â©¡§²»ÎÌÃí°Õ¡Ë
¥Ô¡¼¥¯¤Ï 2300Hz ÉÕ¶á
¼þÇÈ¿ôʬÉÛ

¤É¤Î¤è¤¦¤ËÄÌÃΤò¹Ô¤¦¤«

¶ÛµÞÏ¢ÍíÍÑÅÓ¤òÁÛÄꤹ¤ë¤ÈÄÌÃΤÏÊ£¿ô¤ÎÊýË¡¤òÊ»ÍѤ¹¤ë¤³¤È¤¬¹¥¤Þ¤·¤¤¤È¹Í¤¨¤Þ¤·¤¿¡£º£²ó¤Ï°Ê²¼¤Î¤ß¤Ã¤Ä¤ÎÊýË¡¤òÁÛÄꤷ¥µ¡¼¥Ó¥¹¤ÎÁªÄê¤ò¹Ô¤¤¤Þ¤·¤¿¡£

ÅÅÏõ¡¤Ø¤ÎÄÌÃÎ

ÅÅÏäϤâ¤Ã¤È¤â¼êÁᤤÄÌÃμêÃʤǤ·¤ç¤¦¡£ÅÅÏÃÏ¢Íí¤ò¼ê¶á¤Ë°·¤¨¤ë¥µ¡¼¥Ó¥¹¤È¤·¤ÆÊƹñȯ¤Î¡ÖTwilio¡×¤òÃΤꤳ¤ì¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£½êÄê¤ÎÁê¼ê¤ËÂФ·½êÄê¤Î²»À¼¥á¥Ã¥»¡¼¥¸¤òή¤¹¤³¤È¤â´Êñ¤Ë¼Â¸½¤Ç¤­¤Þ¤¹¤¬¡¢¤³¤³¤Ç¤ÏÅÅÏõ¡¤ò¥³¡¼¥ë¤¹¤ë¤À¤±¤Ç¼õ¤±¼ê¤Ï²¿¤´¤È¤«¤ÎȯÀ¸¤ò»¡ÃΤǤ­¤ë¤¿¤á¥³¥¹¥È¤Î¤«¤«¤ë²»À¼ÄÌÏõ¡Ç½¤òÍøÍѤ¹¤ëɬÍפϤʤ¤¤«¤â¤·¤ì¤Þ¤»¤ó¡£

Twilio

  • Twilio - APIs for Text Messaging, VoIP & Voice in the Cloud - www.twilio.com
  • Twilio for KDDI Web Communications | ¥¯¥é¥¦¥ÉÅÅÏÃAPI - twilio.kddi-web.com
    Twilio ¤Ï³«È¯¼Ô¸þ¤±¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¥µ¡¼¥Ó¥¹¡¢¤¿¤Ã¤¿¿ô¹Ô¤Î¥³¡¼¥É¤ò½ñ¤¯¤À¤±¤Ç¥Í¥Ã¥È¤ÈÅÅÏá¦SMS ¤ò¤Ä¤Ê¤®¤Þ¤¹¡£¥Í¥Ã¥È¾å¤Î»ÅÁȤߤòÅÅÏ䫤éÁàºî¤·¤¿¤ê¡¢¥Í¥Ã¥È¾å¤Î¾ðÊó¤òÅÅÏää SMS ¤ËÄÌÃΤ¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
  • API ¥ê¥Õ¥¡¥ì¥ó¥¹ - Á´Twilio API¤ª¤è¤ÓSDK¤Î¾ÜºÙ¥ê¥Õ¥¡¥ì¥ó¥¹ - jp.twilio.com
    Twilio ¤Î REST API ¤ò»È¤Ã¤Æ¡¢¥æ¡¼¥¶¡¼ ¥¢¥«¥¦¥ó¥È¡¢ÅÅÏÃÈֹ桢ÄÌÏᢠ¥Æ¥­¥¹¥È ¥á¥Ã¥»¡¼¥¸¡¢Ï¿²»¤Î¥á¥¿¥Ç¡¼¥¿¤Ë¥¯¥¨¥ê¤òÁ÷¿®¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ȯ¿®ÄÌÏäò³«»Ï¤·¤¿¤ê¥Æ¥­¥¹¥È ¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
           :
  • ÎÁ¶â - twilio.kddi-web.com
    ÅÅÏÃÈÖ¹æÎÁ 1¥ö·î¤¢¤¿¤ê
    050 ÈÖ¹æ 100 ±ß¡ÊÀÇÊÌ¡Ë 108 ±ß¡ÊÀǹþ¡Ë
           :
    ȯ¿®ÎÁ 1 ʬ¤¢¤¿¤ê
           :
    ·ÈÂÓÅÅÏð¸¡Ê070 / 080 / 090 ÈÖ¹æ¡Ë 15 ±ß¡ÊÀÇÊÌ¡Ë 16.2 ±ß¡ÊÀǹþ¡Ë
           :

¥µ¥¤¥ó¥¢¥Ã¥×¤¹¤ë¤È¥È¥é¥¤¥¢¥ë¥¢¥«¥¦¥ó¥È¤È¤·¤Æ»îÍѥݥ¤¥ó¥È¤¬Ä󶡤µ¤ì¡Ê³Û¤ÏÈó¸ø³«¡Ë¡¢Æ±¥Ý¥¤¥ó¥È¤¬¿Ô¤­¤ë¤È¥Õ¥ë¥¢¥«¥¦¥ó¥È¤Ø¤Î¥¢¥Ã¥×¥°¥ì¡¼¥É¤È¥¯¥ì¥¸¥Ã¥È¥«¡¼¥ÉÈÖ¹æ¤ÎÅÐÏ¿¤òÂ¥¤µ¤ì¤ë¤·¤¯¤ß¤Ç¤¹¡£¤³¤Î¥Ý¥¤¥ó¥È¤Ç 050 ÈÖ¹æ¤ò°ì·ï¼èÆÀ¤·¤Þ¤·¤¿¡£¥×¥í¥°¥é¥à¤«¤é´Êñ¤ËÅÅÏÃÏ¢Íí¤ò°·¤¨¤ë¤Î¤ÏÊØÍø¤Ê¤Î¤Ç¥È¥é¥¤¥¢¥ë½ªÎ»¸å¤âÍøÍѤò·Ñ³¤·¤¿¤¤¤È¹Í¤¨¤Æ¤¤¤Þ¤¹¡£¤Á¤Ê¤ß¤Ë¥³¡¼¥ë¤À¤±¤Ê¤é¾åµ­¤Î¡Öȯ¿®ÎÁ¡×¤ÏȯÀ¸¤·¤Þ¤»¤ó¡£

¥á¥Ã¥»¡¼¥¸¥×¥Ã¥·¥å¤Ë¤è¤ëÄÌÃÎ

¥¹¥Þ¥Û¡¦¥Ç¥¹¥¯¥È¥Ã¥×¡Ê¥Ö¥é¥¦¥¶¡Ë¤Ø¤Î¥×¥Ã¥·¥åÄÌÃΤâ¹Ô¤¤¤Þ¤¹¡£¥á¥¸¥ã¡¼¤Ê Pushover ¤ä Pushbullet ¤Ï¤½¤ì¤¾¤ì IFTTT ¤ËÀìÍÑ¥Á¥ã¥Í¥ë¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤â¤¢¤êÊØÍø¤Ë°·¤¨¤Þ¤¹¡£Pushover ¤ÏÀìÍÑ¥¢¥É¥ì¥¹¤Ø¤Î¥á¡¼¥ëÁ÷¿®¤Ë¤è¤Ã¤ÆÄÌÃνèÍý¤ò¥­¥Ã¥¯¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£

¥á¡¼¥ë¤Ç¤ÎÄÌÃÎ

¼ê¸µ¤Ç»È¤¤´·¤ì¤¿ SendGrid ¤òÍøÍѤ·¤Æ¥á¡¼¥ë¤Ç¤ÎÄÌÃΤò¹Ô¤¤¤Þ¤¹¡£

»îºî 1

°Ê²¼¤ÎÍ×ÎΤǻîºî¤ò¹Ô¤¤¤Þ¤·¤¿¡£

  • »ÈÍѤ·¤¿¥½¥Õ¥È¥¦¥§¥¢»ñ»º
  • ¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÀܳ¤ÎÍøÍѤËȼ¤¤ÁõÃ֤˰ʲ¼¤Î¥¢¥À¥×¥¿¤òÄɲÃ
  • ½èÍý¤Îή¤ì
    1. ¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È 33330Hz, FFT ¥µ¥¤¥º 1024 ¤Ç½¸²»¤È¼þÇÈ¿ôʬÀϤò¥ë¡¼¥×¼Â¹Ô¤¹¤ë
    2. FFT ½èÍý¤Ë¤ª¤¤¤Æ¼¡¤ÎÂÓ°è¤Î¥Ô¡¼¥¯¼þÇÈ¿ô¤¬¸¡ÃΤµ¤ì¤ì¤Ð 1. ¤òÃæÃǤ· 3. ¤Ø°Ü¹Ô¤¹¤ë
      ¤¿¤À¤·¥Î¥¤¥º¤Ë¤è¤ë±Æ¶Á¤òÍÞ¤¨¤ë¤¿¤á½êÄê¤Î²ó¿ô°Ê¾å¤ÎϢ³¸¡ÃΤò¾ò·ï¤È¤¹¤ë
      • 9800Hz¡Á16000Hz¡Ê¸¤Å«·Ï¡Ë
      • 2000Hz¡Á4500Hz¡Ê¥Û¥¤¥Ã¥¹¥ëÁ´ÈÌ¡Ë
    3. Á°²ó¤ÎÄÌÃΤ«¤é½êÄê¤Î»þ´Ö¤¬·Ð²á¤·¤Æ¤¤¤ì¤Ð 4. ¤Ø¡£
      ·Ð²á¤·¤Æ¤¤¤Ê¤±¤ì¤Ð 1. ¤Ø¡ÊÄÌÃΤÎÉÑȯ¤ò²óÈò¡Ë
    4. Google ¥É¥é¥¤¥Ö¾å¤Î½êÄê¤Î¥¨¥ó¥È¥ê¤ËÂФ¹¤ë GET ¥ê¥¯¥¨¥¹¥È¤ò»î¹Ô¡£
      ¥ì¥¹¥Ý¥ó¥¹¥³¡¼¥É¤¬ 200 ¤Ê¤é 5. ¤Ø
      ¤½¤ì°Ê³°¤Ê¤é 1. ¤Ø¡ÊÄÌÃΤÎ̵¸ú²½¤ò¥ê¥â¡¼¥È¤«¤é²Äǽ¤È¤¹¤ë¤¿¤á¤ÎÁ¼ÃÖ¡Ë
      • ½êÄê¤Î¥¢¥«¥¦¥ó¥È¤Î Google ¥É¥é¥¤¥Ö¾å¤Î¥¨¥ó¥È¥ê¤Ø¤ÎÂè»°¼Ô¤«¤é¤Î¥¢¥¯¥»¥¹¤Ë¤ª¤¤¤Æ¤Ï¡¢Åö³º¥¨¥ó¥È¥ê¤Î¶¦Í­¤¬¥ª¥ó¤Î¾õÂ֤ʤé 200 ¤¬ÊÖ¤µ¤ì¡¢¶¦Í­¥ª¥Õ¤Î¾õÂ֤ʤé 302 ¤¬ÊÖ¤µ¤ì¤ë¡£¤³¤Î»ÅÍͤòÄ㥳¥¹¥È¤Ç¼è¤ê²ó¤»¤ë´Ê°×¥Õ¥é¥°¤È¤·¤ÆÍøÍÑ
    5. Twilio ¤Ø¼ê»ý¤Á¤ÎÅÅÏäΥ³¡¼¥ë¤ò¥ê¥¯¥¨¥¹¥È
      • º£²ó¤Ï¥³¡¼¥ë¤Î¤ß¤òÌÜŪ¤È¤·Ã»»þ´Ö¤Ç¥¿¥¤¥à¥¢¥¦¥È¤µ¤»¤ë
    6. SendGrid ¤Ø¼ê»ý¤Á Gmail ¥¢¥É¥ì¥¹¤Ø¤Î¥á¡¼¥ëÄÌÃΤò¥ê¥¯¥¨¥¹¥È
      • Gmail ¤Î¥Õ¥£¥ë¥¿ÀßÄê¤Ë¤è¤êÅö³º¥á¡¼¥ë¤Ï Pushover ÄÌÃÎ¥­¥Ã¥¯ÍѤΥ¢¥É¥ì¥¹¤ØžÁ÷
    7. ¤Õ¤¿¤¿¤Ó 1. ¤Ø

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§2ʬ31Éá¡¡¡¢¨²»ÎÌÃí°Õ

¥½¡¼¥¹¥³¡¼¥É

Sonic06_FFT3

  • main.cpp
    
    // ½êÄê¤Î¼þÇÈ¿ô¿®¹æ¤ò½êÄê¤Î²ó¿ô°Ê¾åϢ³¸¡ÃΤ¹¤ë¤ÈÄÌÃΤò¹Ô¤¦
    
    #include "mbed.h"
    #include "rtos.h"
    #include "EthernetInterface.h"
    #include "HTTPClient.h"
    #include "FastAnalogIn.h"
    
    #define DEVELOP
    #ifdef DEVELOP
    #define dbg(...) printf(__VA_ARGS__)
    #else
    #define dbg(...)
    #endif
    
    //#define USE_DHCP
    #if !defined(USE_DHCP)
    #define IP      "192.168.0.113"
    #define GATEWAY "192.168.0.1"
    #define MASK    "255.255.255.0"
    #endif
    
    #define SAMPLE_RATE 33330
    // n >= 2, n = power of 2
    #define FFTSIZE 1024
    // length of ip >= 2+sqrt(n/2)
    const int IP_LEN = 4 + sqrt((double)(FFTSIZE/2));
    // Åö³º¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö
    const float SEC_PER_SAMPLEPOINT = 1.0 / SAMPLE_RATE;
    
    // ÄÌÃΤκÇû´Ö³ÖÉÃ
    #define INTERVAL_NOTIFICATION 180
    
    // ¸¤Å«·Ï¼þÇÈ¿ôÂÓ
    #define FREQ_LOW1   9800
    #define FREQ_HIGH1 16000
    
    // ¥Û¥¤¥Ã¥¹¥ë·Ï¼þÇÈ¿ôÂÓ
    #define FREQ_LOW2  2000
    #define FREQ_HIGH2 4500
    
    // ÂоݼþÇÈ¿ôϢ³¸¡Ãβó¿ôïçÃÍ
    #define MAXHITCOUNT 20
    
    // for Twilio
    #define TWILIO_SID  "AC1f7aa23e****************"
    #define TWILIO_AUTH "ef3638ca7*****************"
    #define URL_POSTDATA_TWILIO \
      "https://api.twilio.com/2010-04-01/Accounts/" TWILIO_SID "/Calls"
    #define REQUEST_HEADER_FOR_TWILIO \
      "Content-Type: "       "application/x-www-form-urlencoded"   "\r\n"
    #define POSTDATA_TWILIO \
      "To=%2B8190********" "&" \
      "From=%2B8150********" "&"  \
      "Url=http://demo.twilio.com/docs/voice.xml"  "&" \
      "Timeout=5"
    
    // for SendGrid
    #define SENDGRID_APIKEY "SG.UNFbQr_DQRmu8J********"
    #define REQUEST_HEADER_FOR_SENDGRID \
      "Authorization: Bearer " SENDGRID_APIKEY "\r\n" \
      "Content-Type: application/x-www-form-urlencoded\r\n"
    #define URL_POSTDATA_SENDGRID "https://api.sendgrid.com/api/mail.send.json"
    #define MAILTO    "********@gmail.com"
    #define MAILFROM  "mkttanabe2012@gmail.com"
    #define MAILSUBJECT "** ALERT [%s] **"
    #define MAILBODY  "%dHz"
    
    // Google ¥É¥é¥¤¥Ö¾å¤Î¥Õ¥é¥°¥¨¥ó¥È¥ê URL
    #define URL_FLAGFILE \
      "https://docs.google.com/spreadsheets/d/1FR_RaR_AsyPAsIYU****************"
    
    Ticker tick;
    double *recBufp = NULL;
    int countTick = 0;
    FastAnalogIn mic(p20);
    AnalogOut speaker(p18);
    DigitalOut led(LED4);
    
    osThreadId mainThreadID;
    EthernetInterface eth;
    HTTPClient http;
    
    void rdft(int n, int isgn, double *a, int *ip, double *w);
    
    void setDummyTime() {
      struct tm t;
      t.tm_sec = t.tm_min = t.tm_hour = t.tm_mday = t.tm_mon = 1;
      t.tm_year = 100;
      time_t seconds = mktime(&t);
      set_time(seconds);
    }
    
    int initNetwork() {
      int sts;
      led = 1;
      dbg("start eth.init\r\n" );
    #ifdef USE_DHCP
      sts = eth.init();
    #else
      sts = eth.init(IP, MASK, GATEWAY);
    #endif
      if (sts != 0) {
        dbg("ech.init error!\r\n" );
        return -1;
      }
      dbg("start eth.connect\r\n" );
      sts = eth.connect();
      if (sts != 0) {
        dbg("eth.connect error!\r\n" );
        return -2;
      }
      dbg("my IP Address = %s\r\n", eth.getIPAddress());
      led = 0;
      return 0;
    }
    
    // Google¥É¥é¥¤¥Ö¾å¤Î½êÄê¤Î¥Õ¥é¥°¥¨¥ó¥È¥ê¤ò¥Á¥§¥Ã¥¯
    int checkFlagFile() {
      char buf[8];
      for (int i = 0; i < 6; i++) {
        int sts = http.get(URL_FLAGFILE, buf, sizeof(buf),
              HTTP_CLIENT_DEFAULT_TIMEOUT);
        if (sts == HTTP_OK) {
          int rc = http.getHTTPResponseCode();
          // ¶¦Í­¥ª¥ó¤Ê¤é 200, ¥ª¥Õ¤Ê¤é 302
          dbg("Flag is %s\r\n", 
            (rc == 200) ? "enabled" :
            (rc == 302) ? "disabled" : "?????");
          return rc;
        }
        dbg("sts=%d retrying..\r\n", sts);
        wait(5);
      }
      return -1;
    }
    
    int httpsPost(const char *targetUrl,
          const char *postData,
          const char *optHeader,
          const char *authId,
          const char *authPass) {
      int sts;
      char buf[64];
      HTTPText dataToPost((char*)postData);
      HTTPText resData(buf, sizeof(buf));
      http.setHeader(optHeader);
    
      for (int i = 0; i < 3; i++) {
        dbg("request to [%s]..\r\n", targetUrl);
        http.basicAuth(authId, authPass);
        sts = http.post(targetUrl, dataToPost, &resData, HTTP_CLIENT_DEFAULT_TIMEOUT);
        if (sts == HTTP_OK) {
          dbg("received HTTPS response OK\r\n");
          dbg("head of data [%s]\r\n", buf);
          dbg("done\r\n\r\n");
          break;
        } else {
          dbg("HTTPS request error=%d, status=%d\r\n", sts, http.getHTTPResponseCode());
          dbg("head of data [%s]\r\n", buf);
          dbg("sts=%d retrying..\r\n", sts);
          wait(5);
        }
      }
      return sts;
    }
    
    int doFFT(double *FFTBuffer) {
      int ip[IP_LEN];
      double *w = (double*)malloc(sizeof(double) * (FFTSIZE / 2));
      ip[0] = 0;
      rdft(FFTSIZE, 1, FFTBuffer, ip, w);
    
      double maxAmp = 0;
      int index = 0;
      int endIdx = FFTSIZE/2;
      for (int i = 0; i < endIdx ; i++) {
        double a = FFTBuffer[i*2]; // ¼ÂÉô
        double b = FFTBuffer[i*2 + 1]; // µõÉô
        // a+ib ¤ÎÀäÂÐÃÍ ¢å a^2 + b^2 = r ¤¬¿¶ÉýÃÍ
        double r = sqrt(a*a + b*b);
        if (r > maxAmp) {
          maxAmp = r;
          index = i;
        }
      }
      float freq = index * SAMPLE_RATE / FFTSIZE;
      free(w);
      return (int)freq;
    }
    
    // ¥µ¥ó¥×¥ê¥ó¥°
    void flip() {
      // AnalogIn.read() ¤ÎÃÍÈÏ°Ï¤Ï 0¡Á1.0 ¤Ë¤Ä¤­Ãæ¿´Ãͤò 0 ¤Ë
      recBufp[countTick++] = mic.read() - 0.5;
      if (countTick == FFTSIZE) {
        tick.detach();
        countTick = 0;
        osSignalSet(mainThreadID, 1); // ½¸²»´°Î»ÄÌÃÎ
      }
    }
    
    // ÄÌÃÎ
    int checkAndNotify(int freq, time_t *lastNotificationTime) {
      int pastSeconds = time(NULL) - *lastNotificationTime;
      // Á°²ó¤ÎÄÌÃΤ«¤é½êÄê¤Î»þ´Ö¤¬·Ð²á¤Î¾ì¹ç¤Î¤ß¼¡½èÍý¤Ø
      if (pastSeconds > INTERVAL_NOTIFICATION) {
        // ÄÌ¿®½èÍý¤Î¤¿¤á¤Ë ½¸²»¡¦FFTÍѥХåե¡¤ò°ìö³«Êü
        free(recBufp);
        recBufp = NULL;
        // Google ¥É¥é¥¤¥Ö¾å¤Î½êÄê¤Î¥Õ¥é¥°¥¨¥ó¥È¥ê¤ò¥Á¥§¥Ã¥¯
        // ¶¦Í­¤¬¥ª¥ó¤Ê¤é 200 ¤¬ÊÖ¤ê ¥ª¥Õ¤Ê¤é ¤¬ÊÖ¤ë
        dbg("checking flagFile..\r\n");
        int rc = checkFlagFile();
        dbg("rc=%d\r\n", rc);
        if (rc == 200) {
          for (int i = 0; i < 8; i++) {
            led = !led;
            wait_ms(200);
          }
          // Twilio ¤Ç·ÈÂÓÅÅÏäò¥³¡¼¥ë
          httpsPost(URL_POSTDATA_TWILIO, POSTDATA_TWILIO,
            REQUEST_HEADER_FOR_TWILIO, TWILIO_SID, TWILIO_AUTH);
    
          // SendGrid ¤Ç¥á¡¼¥ëÁ÷¿®
          char b[256];
          snprintf(b, sizeof(b), "from=" MAILFROM
              "&to=" MAILTO "&subject=" MAILSUBJECT
              "&text=" MAILBODY, eth.getIPAddress(), freq);
          dbg("mes=[%s]\r\n", b);
          
          httpsPost(URL_POSTDATA_SENDGRID, b,
            REQUEST_HEADER_FOR_SENDGRID, NULL, NULL);
    
          // º£²óÄÌÃλþ¹ï¤òÊÝ»ý
          *lastNotificationTime = time(NULL);
        }
        recBufp = (double*)malloc(sizeof(double) * FFTSIZE);
        return 1;
      }
      // Á°²ó¤Îȯ¸Æ¤«¤é½êÄê¤Î»þ´Ö¤¬·Ð²á¤·¤Æ¤¤¤Ê¤¤
      dbg("pastSeconds=%d..\r\n", pastSeconds);   
      return 0;
    }
    
    int main()
    {
      mainThreadID = osThreadGetId();
      setDummyTime();
      initNetwork();
      // ½¸²»ÍÑ·óFFTÍѥХåե¡
      recBufp = (double*)malloc(sizeof(double) * FFTSIZE);
      time_t lastNotificationTime = 0;
      dbg("sampleRate=%dHz interval=%fsec\r\n", SAMPLE_RATE, SEC_PER_SAMPLEPOINT);
      
      tick.attach(&flip, SEC_PER_SAMPLEPOINT);
      // ÂоݼþÇÈ¿ô¿®¹æ¸¡½Ð¿ô
      int hitCount = 0;
    
      while (1) {
        // ¥µ¥ó¥×¥ê¥ó¥°´°Î»¤Þ¤ÇÂÔµ¡
        osSignalWait(1, osWaitForever);
        // ¥Ô¡¼¥¯¼þÇÈ¿ô¤òÆÀ¤ë
        int freq = doFFT(recBufp);
        if (freq > FREQ_LOW1 && freq <= FREQ_HIGH1 ||
          freq > FREQ_LOW2 && freq <= FREQ_HIGH2) {
          dbg("detected! %dHz\r\n", freq);
          led = 1;
          // ½êÄê²ó¿ô°Ê¾åϢ³¸¡ÃΤξì¹ç¤Î¤ßÄÌÃνèÍý¤Ø
          if (hitCount++ > MAXHITCOUNT) {
            hitCount = 0;
            checkAndNotify(freq, &lastNotificationTime);
          }
        } else {
          if (hitCount > 0) {
            dbg("ignored..\r\n");
          }
          hitCount = 0;
          led = 0;
        }
        tick.attach(&flip, SEC_PER_SAMPLEPOINT);
      }
      if (recBufp) {
        free(recBufp);
      }
      return 0;
    }
    
    

»îºî 1 ¤ÎÌäÂêÅÀ¤Ë¤Ä¤¤¤Æ

»îºî 1 ¤Ç¤Ï½¸²»¤·¤¿¿®¹æ¤ÎÃæ¤Ç¤â¤Ã¤È¤â¿¶Éý¤ÎÂ礭¤¤¼þÇÈ¿ô¡Ê¥Ô¡¼¥¯¼þÇÈ¿ô¡Ë¤òɾ²Á¤·¤Æ¤ª¤ê¡¢¤Þ¤¿¡¢ÂоÝÈϰϤμþÇÈ¿ô¤¬ FFT ½èÍý¤Ë¤ª¤¤¤Æ½êÄê¤Î²ó¿ô°Ê¾å "Ϣ³¤·¤Æ" ¸¡ÃΤµ¤ì¤ë¤³¤È¤òȽÄê¾ò·ï¤È¤·¤Æ¤¤¤Þ¤¹¡£¤½¤Î¤¿¤á¼þÊÕ²»¤ÎÂ礭¤Ê´Ä¶­¤Ç¤ÏÂоݲ»¤ò¼è¤ê¤³¤Ü¤¹²ÄǽÀ­¤¬¤¢¤ê¡¢ÁõÃÖ¡¦²»¸»´Ö¤Îµ÷Î¥¤¬È½Äê¤Ë±Æ¶Á¤òµÚ¤Ü¤¹Åٹ礤¤â¾¯¤Ê¤¯¤¢¤ê¤Þ¤»¤ó¡£¤³¤ÎÅÀ¤Î²þÁ±¤¬É¬Íפȹͤ¨¤Þ¤·¤¿¡£

²¼¤ÎÆ°²è¤Ë¤ÏÀŤ«¤Ê¾õ¶·¤ÈÁû¤¬¤·¤¤¾õ¶·¤Ç¤ÎÁõÃÖ¤ÎÈ¿±þ¤ò³Îǧ¤·¤¿ÍͻҤò¼ý¤á¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ë¼þ°Ï¤Î²»¤¬Â礭¤¤¤ÈÉ餱¤Æ¤·¤Þ¤¤¤Þ¤¹¡£

Æ°²è¡§41Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¡Ê»÷¤¿Ïá§Amazon Echo ¤¬È¿±þ¤·¤Ê¤¤¤Î¤ÇÂçÀ¼¤ÇÅÜÌĤë¿Í¡§Youtube ¤è¤ê¡Ë

»îºî 2

°Ê²¼¤ÎÆâÍÆ¤Ç¥×¥í¥°¥é¥à¤Î½¤Àµ¤ò¹Ô¤¤¤Þ¤·¤¿¡£

  1. ¥Ô¡¼¥¯¼þÇÈ¿ô¥Ù¡¼¥¹¤ÎȽÄê¤òÊѹ¹
    • ¥Ô¡¼¥¯¼þÇÈ¿ô¤Î»²¾È¤ËÂ夨¿®¹æ¤Ë´Þ¤Þ¤ì¤ëÂоÝÈϰϤμþÇÈ¿ôÀ®Ê¬¤òǽưŪ¤Ë¥Á¥§¥Ã¥¯¤¹¤ë¡£¤³¤ì¤Ë¤è¤ê¼þÊÕ²»¤Ë¤è¤ë´³¾Ä¤òÍÞ¤¨¤é¤ì¤ë
  2. ¸¡ÃΤιͤ¨Êý
    • ¾åµ­¤Î¥Á¥§¥Ã¥¯¤Ë¤ª¤¤¤Æ½êÄê¤Î¥ì¥Ù¥ë°Ê¾å¤Î¿¶ÉýÃͤòȼ¤¦¤â¤Î¤Îȯ¸«¤ò¤â¤Ã¤Æ¸¡ÃΤȤߤʤ¹¡£¤³¤ì¤Ë¤è¤êÂоݲ»¤¬Èù¼å¤Ç¤â¥Ô¥Ã¥¯¥¢¥Ã¥×¤¬²Äǽ¤È¤Ê¤ë
  3. Ϣ³À­¤ÎȽÄêÊýË¡
    • ²»¤ÎϢ³À­¤ÎȽÄê¤Ï¡ÖÂоݼþÇÈ¿ô¤¬½êÄê¤Î²ó¿ô°Ê¾å³¤±¤Æ¥Ô¡¼¥¯¸¡½Ð¤µ¤ì¤ë¤³¤È¡×¤ò¾ò·ï¤È¤·¤Æ¤¤¤¿¤¬¡¢¤³¤ì¤ò¡ÖÁ°²ó¤Î¸¡½Ð¤«¤é½êÄê»þ´ÖÆâ¤ÎºÆ¸¡½Ð¤¬½êÄê¤Î²ó¿ô°Ê¾å·«¤êÊÖ¤µ¤ì¤ë¤³¤È¡×¤ËÊѹ¹¤¹¤ë¡£¤³¤ì¤Ë¤è¤êÂоݲ»¤¬ÅÓÀڤ줬¤Á¤Ç¤âÀÚ¤ê¼Î¤Æ¤Î²ÄǽÀ­¤òÍÞ¤¨¤é¤ì¤ë
  4. ÂоݼþÇÈ¿ôÈϰϤθ«Ä¾¤·
    • ½¾Íè¤Ï 2000Hz¡Á4500Hz¡Ê¥Û¥¤¥Ã¥¹¥ëÁ´È̡ˤª¤è¤Ó 9800Hz¡Á16000Hz¡Ê¸¤Å«·Ï¡Ë¤Î¤Õ¤¿¤Ä¤Î¥ì¥ó¥¸¤òÂоݤȤ·¤Æ¤¤¤¿¤¬¡¢Á°¼Ô¤Ï ´ð²»¤È¤·¤ÆÆü¾ïÀ¸³è¤ËÅо줹¤ëµ¡²ñ¤¬¾¯¤Ê¤¯¤Ê¤¤¤¿¤áº®Íð¤Ë¤Ä¤Ê¤¬¤ë¥±¡¼¥¹¤âÁÛÄꤵ¤ì¤ë¡£¤½¤³¤Ç¡Ö¾å²»¡×¤Î¸ºß¤ËÃíÌܤ·¤¿
      • Çܲ» - wikipedia
        ¾å²» ²»¤òÀµ¸¹ÇȤËʬ²ò¤·¤¿¤È¤­¤Ë¡¢ºÇ¤âÄ㤤¼þÇÈ¿ô¤Ç¤¢¤ë´ð²»°Ê³°¤ÎÀ®Ê¬¤ò ¾å²»¡Ê¤¸¤ç¤¦¤ª¤ó¡¢overtone¡Ë¤È¤¤¤¦¡£¤³¤Î¾å²»¤Ë¤ÏÇܲ»¤Ç¤Ê¤¤²»¤â´Þ¤Þ¤ì¤ë¡£ Çܲ»¤Ï¡¢´ð²»¤Î¡Ê2°Ê¾å¤Î¡ËÀ°¿ôÇܤμþÇÈ¿ô¤Î¾å²»¤Ç¤¢¤ë¤È¸À¤¤´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
      • ¡Ö¤É¤Î¤è¤¦¤Ê²»¤ò»È¤¦¤«¡×¹à¤Ë·ÇºÜ¤Î³Æ²»¸»¤Î¼þÇÈ¿ôʬÉÛ¡Ê¥¹¥Ú¥¯¥È¥ë¡Ë¿Þ¤ò»²¾È¤¹¤ë¤ÈÇܲ»¤ò´Þ¤à¾å²»¤¬¹â¼þÇÈÎΰè¤Þ¤ÇË­¤«¤ËÌĤäƤ¤¤ëÍͻҤ¬¸«¤Æ¤È¤ì¤ë¡£È´¿è¤ò°Ê²¼¤Ë¼¨¤¹¡£¢¨¿Þ¤Î½Ä¼´ºÇÂçÃÍ¤Ï 15kHz
      • ¾åµ­ 1, 2 ¤ÎÁ¼Ã֤ˤè¤ê¿¶Éý¤Î¾®¤µ¤ÊÀ®Ê¬¤Ç¤¢¤Ã¤Æ¤âºÙ¤«¤¯¸¡ÃβÄǽ¤È¤Ê¤ëÇطʤ⤢¤ê¡¢¼Â¸³Åª¤Ë 10000Hz °Ê¾å¤Î²»¤òÂоݤȤ¹¤ë²þÄû¤ò²Ã¤¨¤¿¡£¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È 33330Hz ¤Ç½¸²»¤·¤Æ¤¤¤ë¤¿¤áÍýÏÀ¾å 16600Hz ÉÕ¶á¤Þ¤Ç½¦¤¦¤³¤È¤¬²Äǽ¡¡ →¥µ¥ó¥×¥ê¥ó¥°ÄêÍý
        ¡Ê»ÈÍѤ·¤Æ¤¤¤ë¥Þ¥¤¥¯¥â¥¸¥å¡¼¥ë¤Î¥«¥Ð¡¼¤¹¤ë²»°è¤Ï¸ø¾Î¡Ö100Hz¡Á15kHz¡× →¥Ç¡¼¥¿¥·¡¼¥È¡Ë
      • ¤à¤í¤ó¼þ°Ï¤ÎÀ¸³è²»Åù¤¬ 10000Hz °Ê¾å¤Î¾å²»¤òȯÀ¸¤µ¤»¤ë¤³¤È¤â¤¢¤ë¤¬¡¢°Õ¿ÞŪ¤Ê¤â¤Î¤Ç¤Ê¤¤¸Â¤ê¾åµ­ 3 ¤ÎϢ³À­¥Á¥§¥Ã¥¯¤ò¤¹¤êÈ´¤±¤ë²ÄǽÀ­¤Ï¼ÂÍѾåÄ㤤¤È¹Í¤¨¤é¤ì¤ë

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§2ʬ3Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¥½¡¼¥¹¥³¡¼¥É

¡ÊÍøÍѤ¹¤ë¥×¥Ã¥·¥åÄÌÃÎ¥µ¡¼¥Ó¥¹¤ò Pushover ¤«¤é Pushbullet ¤ËÊѹ¹¤·¤Æ¤¤¤Þ¤¹¡Ë

Sonic06_FFT3

  • main.cpp
    
    // ½êÄê¤Î¼þÇÈ¿ô¿®¹æ¤ò½êÄê¤Î²ó¿ô°Ê¾åϢ³¸¡ÃΤ¹¤ë¤ÈÄÌÃΤò¹Ô¤¦
    // ²þÄûÈÇ¡§Ï¢Â³À­¤Î¤¢¤ë 10kHz °Ê¾å¤Î¼þÇÈ¿ôÀ®Ê¬¤ò¥¿¡¼¥²¥Ã¥È¤È¤¹¤ë
    
    #include "mbed.h"
    #include "rtos.h"
    #include "EthernetInterface.h"
    #include "HTTPClient.h"
    #include "FastAnalogIn.h"
    
    #define DEVELOP
    #ifdef DEVELOP
    #define dbg(...) printf(__VA_ARGS__)
    #else
    #define dbg(...)
    #endif
    
    //#define USE_DHCP
    #if !defined(USE_DHCP)
    #define IP      "192.168.0.113"
    #define GATEWAY "192.168.0.1"
    #define MASK    "255.255.255.0"
    #endif
    
    #define SAMPLE_RATE 33330
    // n >= 2, n = power of 2
    #define FFTSIZE 1024
    // length of ip >= 2+sqrt(n/2)
    const int IP_LEN = 4 + sqrt((double)(FFTSIZE/2));
    // Åö³º¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö
    const float SEC_PER_SAMPLEPOINT = 1.0 / SAMPLE_RATE;
    
    // ÄÌÃΤκÇû´Ö³ÖÉÃ
    #define INTERVAL_NOTIFICATION 180
    
    #define MAXHITCOUNT 30
    short indexOf10000Hz;
    
    // for Twilio
    #define TWILIO_SID  "AC1f7aa23e****************""
    #define TWILIO_AUTH "ef3638ca7****************""
    #define URL_POSTDATA_TWILIO \
        "https://api.twilio.com/2010-04-01/Accounts/" TWILIO_SID "/Calls"
    #define REQUEST_HEADER_FOR_TWILIO \
      "Content-Type: "       "application/x-www-form-urlencoded"   "\r\n"
    #define POSTDATA_TWILIO \
      "To=%2B8190********"" "&" \
      "From=%2B8150********"" "&"  \
      "Url=http://demo.twilio.com/docs/voice.xml"  "&" \
      "Timeout=5"
    
    // for SendGrid
    #define SENDGRID_APIKEY "SG.UNFbQr_DQRmu8J********"
    #define REQUEST_HEADER_FOR_SENDGRID \
      "Authorization: Bearer " SENDGRID_APIKEY "\r\n" \
      "Content-Type: application/x-www-form-urlencoded\r\n"
    #define URL_POSTDATA_SENDGRID "https://api.sendgrid.com/api/mail.send.json"
    #define MAILTO    "********@gmail.com"
    #define MAILFROM  "mkttanabe2012@gmail.com"
    #define MAILSUBJECT "** ALERT [%s] **"
    #define MAILBODY  "%dHz"
    
    // for IFTTT
    #define IFTTT_KEY "dSIwDguVEYfZ1SgiISL"********@"
    #define IFTTT_EVENT_NAME "ALERT"
    #define REQUEST_HEADER_FOR_IFTTT \
      "Content-Type: application/json\r\n"
    #define URL_POSTDATA_IFTTT  "https://maker.ifttt.com/trigger/" \
          IFTTT_EVENT_NAME "/with/key/" IFTTT_KEY
    
    // Google ¥É¥é¥¤¥Ö¾å¤Î¥Õ¥é¥°¥¨¥ó¥È¥ê URL
    #define URL_FLAGFILE \
      "https://docs.google.com/spreadsheets/d/1FR_RaR_AsyPAsIYU****************"
    
    Ticker tick;
    double *recBufp = NULL;
    int countTick = 0;
    FastAnalogIn mic(p20);
    AnalogOut speaker(p18);
    DigitalOut led(LED4);
    
    osThreadId mainThreadID;
    EthernetInterface eth;
    HTTPClient http;
    
    void rdft(int n, int isgn, double *a, int *ip, double *w);
    
    void setDummyTime() {
      struct tm t;
      t.tm_sec = t.tm_min = t.tm_hour = t.tm_mday = t.tm_mon = 1;
      t.tm_year = 100;
      time_t seconds = mktime(&t);
      set_time(seconds);
    }
    
    int initNetwork() {
      int sts;
      led = 1;
      dbg("start eth.init\r\n" );
    #ifdef USE_DHCP
      sts = eth.init();
    #else
      sts = eth.init(IP, MASK, GATEWAY);
    #endif
      if (sts != 0) {
        dbg("ech.init error!\r\n" );
        return -1;
      }
      dbg("start eth.connect\r\n" );
      sts = eth.connect();
      if (sts != 0) {
        dbg("eth.connect error!\r\n" );
        return -2;
      }
      dbg("my IP Address = %s\r\n", eth.getIPAddress());
      led = 0;
      return 0;
    }
    
    // Google¥É¥é¥¤¥Ö¾å¤Î½êÄê¤Î¥Õ¥é¥°¥¨¥ó¥È¥ê¤ò¥Á¥§¥Ã¥¯
    int checkFlagFile() {
      char buf[8];
      for (int i = 0; i < 6; i++) {
        int sts = http.get(URL_FLAGFILE, buf, sizeof(buf),
              HTTP_CLIENT_DEFAULT_TIMEOUT);
        if (sts == HTTP_OK) {
          int rc = http.getHTTPResponseCode();
          // ¶¦Í­¥ª¥ó¤Ê¤é 200, ¥ª¥Õ¤Ê¤é 302
          dbg("Flag is %s\r\n", 
            (rc == 200) ? "enabled" :
            (rc == 302) ? "disabled" : "?????");
          return rc;
        }
        dbg("sts=%d retrying..\r\n", sts);
        wait(5);
      }
      return -1;
    }
    
    int httpsPost(const char *targetUrl,
          const char *postData,
          const char *optHeader,
          const char *authId,
          const char *authPass) {
      int sts;
      char buf[64];
      HTTPText dataToPost((char*)postData);
      HTTPText resData(buf, sizeof(buf));
      http.setHeader(optHeader);
      
      for (int i = 0; i < 3; i++) {
        //dbg("postData=[%s]\r\n", postData);
        dbg("request to [%s]..\r\n", targetUrl);
        http.basicAuth(authId, authPass);
        sts = http.post(targetUrl, dataToPost, &resData, HTTP_CLIENT_DEFAULT_TIMEOUT);
        if (sts == HTTP_OK) {
          dbg("received HTTPS response OK\r\n");
          dbg("head of data [%s]\r\n", buf);
          dbg("done\r\n\r\n");
          break;
        } else {
          dbg("HTTPS request error=%d, status=%d\r\n", sts, http.getHTTPResponseCode());
          dbg("head of data [%s]\r\n", buf);
          dbg("sts=%d retrying..\r\n", sts);
          wait(5);
        }
      }
      return sts;
    }
    
    int doFFT(double *FFTBuffer) {
      int ip[IP_LEN];
      double *w = (double*)malloc(sizeof(double) * (FFTSIZE / 2));
      ip[0] = 0;
      rdft(FFTSIZE, 1, FFTBuffer, ip, w);
      bool found = false;
      float freq;
      int endIdx = FFTSIZE/2;
      for (int i = endIdx - 1; i >= indexOf10000Hz; i--) {
        freq = i * SAMPLE_RATE / FFTSIZE;
        double a = FFTBuffer[i*2];
        double b = FFTBuffer[i*2 + 1];
        double mag = sqrt(a*a + b*b);
        if (mag > 0.2) {
          dbg("freq=%f mag=%f\r\n", freq, mag);
          found = true;
          break;
        }
      }
      free(w);
      return (found) ? (int)freq : 0;
    }
    
    // ¥µ¥ó¥×¥ê¥ó¥°
    void flip() {
      // AnalogIn.read() ¤ÎÃÍÈÏ°Ï¤Ï 0¡Á1.0 ¤Ë¤Ä¤­Ãæ¿´Ãͤò 0 ¤Ë
      recBufp[countTick++] = mic.read() - 0.5;
      if (countTick == FFTSIZE) {
        tick.detach();
        countTick = 0;
        osSignalSet(mainThreadID, 1); // ½¸²»´°Î»ÄÌÃÎ
      }
    }
    
    // ÄÌÃÎ
    int checkAndNotify(int freq, time_t *lastNotificationTime) {
      int pastSeconds = time(NULL) - *lastNotificationTime;
      // Á°²ó¤ÎÄÌÃΤ«¤é½êÄê¤Î»þ´Ö¤¬·Ð²á¤Î¾ì¹ç¤Î¤ß¼¡½èÍý¤Ø
      if (pastSeconds > INTERVAL_NOTIFICATION) {
        // ÄÌ¿®½èÍý¤Î¤¿¤á¤Ë ½¸²»¡¦FFTÍѥХåե¡¤ò°ìö³«Êü
        free(recBufp);
        recBufp = NULL;
        // Google ¥É¥é¥¤¥Ö¾å¤Î½êÄê¤Î¥Õ¥é¥°¥¨¥ó¥È¥ê¤ò¥Á¥§¥Ã¥¯
        // ¶¦Í­¤¬¥ª¥ó¤Ê¤é 200 ¤¬ÊÖ¤ê ¥ª¥Õ¤Ê¤é ¤¬ÊÖ¤ë
        dbg("checking flagFile..\r\n");
        int rc = checkFlagFile();
        dbg("rc=%d\r\n", rc);
        if (rc == 200) {
          for (int i = 0; i < 8; i++) {
            led = !led;
            wait_ms(200);
          }
          // Twilio ¤Ç·ÈÂÓÅÅÏäò¥³¡¼¥ë
          httpsPost(URL_POSTDATA_TWILIO, POSTDATA_TWILIO,
            REQUEST_HEADER_FOR_TWILIO, TWILIO_SID, TWILIO_AUTH);
    
          // SendGrid ¤Ç¥á¡¼¥ëÁ÷¿®
          char b[256];
          snprintf(b, sizeof(b), "from=" MAILFROM
              "&to=" MAILTO "&subject=" MAILSUBJECT
              "&text=" MAILBODY, eth.getIPAddress(), freq);
          dbg("mes=[%s]\r\n", b);
          httpsPost(URL_POSTDATA_SENDGRID, b,
            REQUEST_HEADER_FOR_SENDGRID, NULL, NULL);
    
          // IFTTT ·Ðͳ¤Ç Pushbullet ÄÌÃΤò¥­¥Ã¥¯
          snprintf(b, sizeof(b),
            "{\"value1\":\"ALERT [%s]\", \"value2\":\"%dHz\", \"value3\":\"\"}\r\n",
            eth.getIPAddress(), freq);
          httpsPost(URL_POSTDATA_IFTTT, b,
            REQUEST_HEADER_FOR_IFTTT, NULL, NULL);
    
          // º£²óÄÌÃλþ¹ï¤òÊÝ»ý
          *lastNotificationTime = time(NULL);
        }
        recBufp = (double*)malloc(sizeof(double) * FFTSIZE);
        return 1;
      }
      // Á°²ó¤Îȯ¸Æ¤«¤é½êÄê¤Î»þ´Ö¤¬·Ð²á¤·¤Æ¤¤¤Ê¤¤
      dbg("pastSeconds=%d..\r\n", pastSeconds);   
      return 0;
    }
    
    int main()
    {
       dbg("**** TARGET FREQUENCY MODE ****\r\n");
       int endIdx = FFTSIZE/2 - 1;
       for (int i = 0; i <= endIdx; i++) {
        float freq0 = i * SAMPLE_RATE / FFTSIZE;
        // 10kHz °Ê¾å¤Î¹â¼þÇȲ»¤ò¥¿¡¼¥²¥Ã¥È¤È¤¹¤ë
        if (freq0 >= 10000) {
          indexOf10000Hz = i;
          float freq1 = endIdx * SAMPLE_RATE / FFTSIZE;
          dbg("idx0=%d freq=%f\r\nidx1=%d freq=%f\r\n",
              i, freq0, endIdx, freq1);
          break;
        }
      }
      mainThreadID = osThreadGetId();
      setDummyTime();
      initNetwork();
      // ½¸²»ÍÑ·óFFTÍѥХåե¡
      recBufp = (double*)malloc(sizeof(double) * FFTSIZE);
      time_t lastNotificationTime = 0;
      
      dbg("sampleRate=%dHz interval=%fsec\r\n", SAMPLE_RATE, SEC_PER_SAMPLEPOINT);
      
      tick.attach(&flip, SEC_PER_SAMPLEPOINT);
      // ÂоݼþÇÈ¿ô¿®¹æ¸¡½Ð¿ô
      int hitCount = 0;
      time_t prevHitTime = 0;
      while (1) {
        osSignalWait(1, osWaitForever);
        // ´Æ»ëÂоݤȤ¹¤ë¼þÇÈ¿ôÎΰè¤ÎÀ®Ê¬¤¬½êÄê¥ì¥Ù¥ë°Ê¾å¤Î¿¶Éý¤Ê¤é¤½¤Î¼þÇÈ¿ô¡¢
        // ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð 0 ¤¬ÊÖ¤ë
        int freq = doFFT(recBufp);
        if (freq != 0) {
          // Á°²ó¸¡½Ð¤«¤é1ÉðÊÆâ¤ÎºÆ¸¡½Ð¤Ê¤é¥«¥¦¥ó¥È¥¢¥Ã¥×
          if (time(NULL) - prevHitTime <= 1) {
            // ½êÄê¤Î²ó¿ô°Ê¾å¸¡ÃΤξì¹ç¤ÏÄÌÃνèÍý¤Ø
            if (++hitCount >= MAXHITCOUNT) {
              dbg("checkAndNotify\r\n");
              checkAndNotify(freq, &lastNotificationTime);
              hitCount = 0;   
            }
          } else {
            hitCount = 1;
            dbg("restart\r\n");
          }
          prevHitTime = time(NULL);
        }
        tick.attach(&flip, SEC_PER_SAMPLEPOINT);
      }
      if (recBufp) {
        free(recBufp);
      }
      return 0;
    }
    
    

2. Ãå¿®²»¤Ç±ó³ÖÁàºî¤ò¹Ô¤¦¤·¤¯¤ß¤òºî¤ë

¼«Âð¤Î¸ÇÄêÅÅÏõ¡¤ÎÃå¿®²»¤ò¥È¥ê¥¬¡¼¤Ë½èÍý¤ò¹Ô¤¦¤·¤¯¤ß¤ò¹Í¤¨¤Þ¤·¤¿¡£¼¡¤Î¥¤¥á¡¼¥¸¤Ç¤¹¡£

  • ¼ê»ý¤Á¤Î·ÈÂÓÅÅÏäʤɽêÄê¤ÎÅÅÏÃÈֹ椫¤é¤Î¥³¡¼¥ë¤ËÂФ¹¤ë¸ÇÍ­¤ÎÃå¿®²»¤ò¼«Âð¸ÇÄêÅÅÏäØÀßÄꤷ¤Æ¤ª¤¯
  • ÅÅÏõ¡¤Î¦¤ËÀßÃÖ¤·¤¿ÁõÃÖ¤ÏÅö³ºÃå¿®²»¤Ë¤è¤ë¥³¡¼¥ë¤òÂÔ¤Á³¤±¤ë
  • ÁõÃ֤ϽêÄê²ó¿ô¤Î¥³¡¼¥ë¤òϢ³¤·¤Æ¸¡ÃΤ¹¤ë¤È½êÄê¤Îµ¡´ï¤Ø¤ÎÄÌÅŤò¥ª¥ó¡¿¥ª¥Õ¤¹¤ë
»ÈÅӤȤ·¤ÆËÉÈÈÌÜŪ¤Ç¤Î²°Æâ¾ÈÌÀ¤Î±ó³ÖÁàºî¤Ê¤É¤¬¹Í¤¨¤é¤ì¤ë¤Ç¤·¤ç¤¦¡£

²áµî¤Î»î¤ß¤È¤ÎÈæ³Ó

¼ê¸µ¤Ç²áµî¤Ë²¿ÅÙ¤«Æ±Íͤαó³ÖÁàºî¤ò»î¤ß¤¿¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¤¤º¤ì¤â¥¤¥ó¥¿¡¼¥Í¥Ã¥È¾å¤Î¥µ¡¼¥Ó¥¹¤òÍøÍѤ·¤ÆÁõÃÖ¤ØÄÌÃΤò¹Ô¤¤¡¢¤½¤ì¤ò¥È¥ê¥¬¡¼¤Ë½èÍý¤ò¹Ô¤¦¤â¤Î¤Ç¤¹¡£

¤³¤ì¤é¤Ï¤¤¤º¤ì¤â¤ª¤ª¤à¤Í´üÂÔÄ̤ê¤ËÆ°¤­¤Þ¤·¤¿¤¬¡¢°ìÊý¤Ç¼¡¤Î¤è¤¦¤Ê¥¸¥ì¥ó¥Þ¤â¤¢¤ê¤Þ¤·¤¿¡£

  • ³°Éô¥µ¡¼¥Ó¥¹Â¦½èÍý¤ÎÃÙ±äȯÀ¸¤ä°ì»þÄä»ß¤Î²ÄǽÀ­¤ò²óÈò¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡§ÌäÂê Âç
  • ±ó³ÖÁàºî¤Ë¤Ï¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÀܳ´Ä¶­¤¬É¬¿Ü¡§ÌäÂê Ãæ
  • ¥¯¥é¥¤¥¢¥ó¥È¥¢¥×¥ê¡ÊWeb¥Ö¥é¥¦¥¶¤ò´Þ¤à¡Ë¤ÎÁàºî¤Ë¼ê´Ö¤¬¤«¤«¤ë¡§ÌäÂê ¾®

¤½¤ì¤ËÂФ·¤Æ¡¢ÁõÃ֤ؤÎÄÌÃΤˡֲ»¡×¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤Ï¼¡¤Î¥á¥ê¥Ã¥È¤¬µó¤²¤é¤ì¤Þ¤¹¡£

  • ºÒ³²»þÅù¤ÎÆüì¤Ê¾õ¶·°Ê³°¤Ç¤ÎȯÃå¿®¾å¤Î¥È¥é¥Ö¥ë¤Î²ÄǽÀ­¤Ï¤Û¤ÜÅÙ³°»ë¤Ç¤­¤ë
  • ȯÃå¿®¤Ë¤Ï¥Í¥Ã¥ÈÀܳ´Ä¶­¤âÆÃÊ̤ʥ¢¥×¥ê¥±¡¼¥·¥ç¥ó¤âÉÔÍ×
  • ȯ¿®ÅÅÏÃÈÖ¹æ¤Ë¤³¤À¤ï¤é¤Ê¤±¤ì¤Ð·ÈÂÓÅÅÏõ¡¤ò·È¹Ô¤¹¤ëɬÍפâ¤Ê¤¤

¤³¤¦¤¤¤Ã¤¿ÆÃŤò³è¤«¤·¤¦¤Þ¤¯»È¤¨¤ÐÍ­ÍѤʥġ¼¥ë¤È¤Ê¤ê¤½¤¦¤Ç¤¹¡£

½àÈ÷

¸½ºß¼«Âð¤Ç¤Ï¸ÇÄêÅÅÏõ¡¤È¤·¤Æ¥æ¥Ë¥Ç¥ó¼ÒÀ½¤Î¡ÖUCT-002¡×¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£

¥È¥ê¥¬¡¼¤È¤¹¤ëÃå¿®²»¤È¤·¤Æ¡¢¤³¤Î UCT-002 ¤Î¡Ö¥Ñ¥¿¡¼¥ó2¡×¤òÁª¤Ó¤Þ¤·¤¿¡£¼¡¤Î¤è¤¦¤Ê²»¤Ç¤¹¡£

  • ²»¤ÎÍÍ»Ò
  • ÇÈ·Á¤Î³µ´Ñ¡ÊAudacity ¤Ë¤è¤ë¡Ë
  • ¼þÇÈ¿ôʬÉÛ
ÆÃħ¤ò¤Þ¤È¤á¤Æ¤ß¤Þ¤¹¡£

  • 1ÉôÖȯ¿¶ ¡Á 2ÉôÖ̵²» ¤ò·«¤êÊÖ¤¹
  • Ê£¿ô¤Î¼þÇÈ¿ô¤Î²»¤ò¾®¹ï¤ß¤Ëȯ¿¶
  • mbed ¾å¤ÇÁ°½Ð¤Î¥×¥í¥°¥é¥à¤ò»È¤Ã¤Æ¥Ô¡¼¥¯¼þÇÈ¿ô¤ò³Îǧ¤¹¤ë¤È°Ê²¼¤ÎÀ®Ê¬¤¬¸¡½Ð¤µ¤ì¤¿
    • 1204Hz
    • 1009Hz
    • 976Hz
    • 813Hz
    • 781Hz

»îºî

°Ê¾å¤ÎÆâÍƤò¤â¤È¤Ë¼¡¤ÎÍ×ÎΤǻîºî¤ò¹Ô¤¤¤Þ¤·¤¿¡£

  • ¤³¤ÎÅÅÏõ¡¤ÏÁõÃ֤ؤÎÌ©Àܤ¬²Äǽ¤Ç¤¢¤ë¤¿¤á¤³¤³¤Ç¤Ï¾ï¤Ë¥Ô¡¼¥¯¼þÇÈ¿ô¤ËÃíÌܤ¹¤ë
  • ¾å¤Ëµó¤²¤¿ 5¼ïÎà¤Î¼þÇÈ¿ôÀ®Ê¬¤ò´Æ»ëÂоݤȤ¹¤ë
  • ¡ÖÂоݼþÇÈ¿ô¤ò½êÄê²ó¿ô°Ê¾åϢ³¸¡ÃΤ¹¤ë¤³¤È¡×¤È¡Ö¤½¤Î¸å¤Ë 2ÉÃÄøÅÙ¤ÎÈó¸¡ÃΤ¬Â³¤¯¤³¤È¡×¤ò¤â¤Ã¤Æ°ì²ó¤Î¥³¡¼¥ë¤ÈȽÃǤ¹¤ë
  • ¥³¡¼¥ë¤ò 3²óϢ³¤·¤Æǧ¼±¤·¤¿¸å¤Ë¤â¤¦°ìÅÙÂоݼþÇÈ¿ô¤ò¸¡ÃΤ¹¤ë¤È¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë
  • ¥¢¥¯¥·¥ç¥ó¤ÎÆâÍÆ¤Ï ACÅŸ»µ¡´ï¤Ø¤ÎÄÌÅÅ¡£Á°¤Ëºî¤Ã¤¿¥ê¥ì¡¼¤Ä¤­ÅŸ»¥±¡¼¥Ö¥ë¤ò mbed LPC1768 ¤Î p10 ¤ËÀܳ¤· Hi / Low ¤Çµ¡´ï¤Ø¤ÎÄÌÅÅ̵ͭ¤òÀÚ¤êÂؤ¨¤ë
  • ¥¢¥¯¥·¥ç¥óȯÀ¸»þ¤Ë¤Ï¥á¡¼¥ë¤ÇÄÌÃΤ¹¤ë

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§1ʬ40Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¤³¤ÎÆ°²è¤Ç¤Ï·ÈÂÓÅÅÏ䫤鼫Âð¸ÇÄêÅÅÏäò¥³¡¼¥ë¤·¤Æ¾ÈÌÀ¤Î ON/OFF ¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£

Æ°²è¡§1ʬ24Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

PC ¾å¤ÇÂоÝÃå¿®²»¤ò¥µ¥ó¥×¥ê¥ó¥°¡Á²þÊѤ·¤¿¤â¤Î¤ò¿ô¼ïÎàÌĤ餷¡¢ÁõÃÖ¤¬¤½¤ì¤é¤Ë¤Ï±þ¤¸¤Ê¤¤ÍͻҤò¼ý¤á¤Æ¤¤¤Þ¤¹¡£

¥½¡¼¥¹¥³¡¼¥É

Sonic09_FFT4

  • main.cpp
    
    // ½êÄê¥Ñ¥¿¡¼¥ó¤ÎÅÅÏÃÃå¿®²»¤ËÈ¿±þ¤·¤Æ¥¢¥¯¥·¥ç¥ó¤òµ¯¤³¤¹
    // ¥æ¥Ë¥Ç¥ó¼ÒÀ½ UCT-002 ¤ÎÃå¿®²»¡Ö¥Ñ¥¿¡¼¥ó2¡×¤Ø¤ÎÂбþÈÇ
    // 1ÉÃȯ¿¶¡Á2ÉÃ̵²» ¤Î·«¤êÊÖ¤·
    
    #include "mbed.h"
    #include "rtos.h"
    #include "EthernetInterface.h"
    #include "HTTPClient.h"
    
    #define DEVELOP
    #ifdef DEVELOP
    #define dbg(...) printf(__VA_ARGS__)
    #else
    #define dbg(...)
    #endif
    
    //#define USE_DHCP
    #if !defined(USE_DHCP)
    #define IP      "192.168.0.113"
    #define GATEWAY "192.168.0.1"
    #define MASK    "255.255.255.0"
    #endif
    
    #define SAMPLE_RATE 33330
    // n >= 2, n = power of 2
    #define FFTSIZE 1024
    // length of ip >= 2+sqrt(n/2)
    const int IP_LEN = 4 + sqrt((double)(FFTSIZE/2));
    
    // ȯ¿¶²»¤Ë´Þ¤Þ¤ì¤ë¼þÇÈ¿ôÀ®Ê¬¡Ê´Æ»ëÂоݡË
    int tgtF[] = {1204, 1009, 976, 813, 781};
    #define isTargetFreq(F) \
      (F == tgtF[0] || F == tgtF[1] || F == tgtF[2] || F == tgtF[3] || F == tgtF[4])
    
    // for SendGrid
    #define SENDGRID_APIKEY "SG.UNFbQr_DQRmu8J********"
    #define REQUEST_HEADER_FOR_SENDGRID \
      "Authorization: Bearer " SENDGRID_APIKEY "\r\n" \
      "Content-Type: application/x-www-form-urlencoded\r\n"
    #define URL_POSTDATA_SENDGRID "https://api.sendgrid.com/api/mail.send.json"
    #define MAILTO    "********@gmail.com"
    #define MAILFROM  "mkttanabe2012@gmail.com"
    #define MAILSUBJECT "** Power %s **"
    #define MAILBODY  "callCount:%d"
    
    Ticker tick;
    double *recBufp = NULL;
    int countTick;
    Timer timer;
    bool recDone;
    AnalogIn mic(p20);
    DigitalOut led(LED4);
    DigitalOut relay(p10); // ¥ê¥ì¡¼¤Ä¤­ÅŸ»¥±¡¼¥Ö¥ë¤òÀܳ
    
    EthernetInterface eth;
    HTTPClient http;
    osThreadId mainThreadID;
    
    // Åö³º¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö
    const float SEC_PER_SAMPLEPOINT = 1.0 / SAMPLE_RATE;
    // ²»À¼¿®¹æ¤Ï¼Â¿ô¥Ç¡¼¥¿¤Ë¤Ä¤­¼ÂÎ¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹¡ÊReal DFT¡Ë´Ø¿ô¤ò»È¤¦
    void rdft(int n, int isgn, double *a, int *ip, double *w);
    
    void setDummyTime() {
      struct tm t;
      t.tm_sec = t.tm_min = t.tm_hour = t.tm_mday = t.tm_mon = 1;
      t.tm_year = 100;
      time_t seconds = mktime(&t);
      set_time(seconds);
    }
    
    int initNetwork() {
      int sts;
      led = 1;
      dbg("start eth.init\r\n" );
    #ifdef USE_DHCP
      sts = eth.init();
    #else
      sts = eth.init(IP, MASK, GATEWAY);
    #endif
      if (sts != 0) {
        dbg("ech.init error!\r\n" );
        return -1;
      }
      dbg("start eth.connect\r\n" );
      sts = eth.connect();
      if (sts != 0) {
        dbg("eth.connect error!\r\n" );
        return -2;
      }
      dbg("my IP Address = %s\r\n", eth.getIPAddress());
      led = 0;
      return 0;
    }
    
    int httpsPost(const char *targetUrl,
          const char *postData,
          const char *optHeader,
          const char *authId,
          const char *authPass) {
      int sts;
      char buf[64];
      HTTPText dataToPost((char*)postData);
      HTTPText resData(buf, sizeof(buf));
      http.setHeader(optHeader);
      
      for (int i = 0; i < 3; i++) {
        //dbg("postData=[%s]\r\n", postData);
        dbg("request to [%s]..\r\n", targetUrl);
        http.basicAuth(authId, authPass);
        sts = http.post(targetUrl, dataToPost, &resData, HTTP_CLIENT_DEFAULT_TIMEOUT);
        if (sts == HTTP_OK) {
          dbg("received HTTPS response OK\r\n");
          dbg("head of data [%s]\r\n", buf);
          dbg("done\r\n\r\n");
          break;
        } else {
          dbg("HTTPS request error=%d, status=%d\r\n", sts, http.getHTTPResponseCode());
          dbg("head of data [%s]\r\n", buf);
          dbg("sts=%d retrying..\r\n", sts);
          wait(5);
        }
      }
      return sts;
    }
    
    int doFFT(double *FFTBuffer) {
      int ip[IP_LEN];
      double *w = (double*)malloc(sizeof(double) * (FFTSIZE/2));
      ip[0] = 0;
      rdft(FFTSIZE, 1, FFTBuffer, ip, w);
    
      double maxAmp = 0;
      int index;
      for (int i = 0; i < FFTSIZE/2; i++) {
        double a = FFTBuffer[i*2]; // ¼ÂÉô
        double b = FFTBuffer[i*2 + 1]; // µõÉô
        double r = sqrt(a*a + b*b);
        if (r > maxAmp) {
          maxAmp = r;
          index = i;
        }
      }
      double freq = index * SAMPLE_RATE / FFTSIZE;
      if (freq > 0 && maxAmp > 1.0) {
        //dbg("freq=%d mag=%f\r\n", (int)freq, maxAmp);
      }
      free(w);
      return (int)freq;
    }
    
    // ¥µ¥ó¥×¥ê¥ó¥°
    void flip() {
      // AnalogIn.read() ¤ÎÃÍÈÏ°Ï¤Ï 0¡Á1.0 ¤Ë¤Ä¤­Ãæ¿´Ãͤò 0 ¤Ë
      recBufp[countTick++] = mic.read() - 0.5;
      if (countTick == FFTSIZE) {
      tick.detach();
      osSignalSet(mainThreadID, 1); // ½¸²»´°Î»ÄÌÃÎ
      }
    }
    
    // ¥á¡¼¥ëÁ÷¿®
    void sendMail(int callCount) {
      char b[128];
      snprintf(b, sizeof(b), "from=" MAILFROM
            "&to=" MAILTO "&subject=" MAILSUBJECT
            "&text=" MAILBODY, (relay == 1) ? "ON" : "OFF", callCount+1);
      httpsPost(URL_POSTDATA_SENDGRID, b,
            REQUEST_HEADER_FOR_SENDGRID, NULL, NULL);
    }
    
    int main() {
      time_t lastDetectedTime = 0, lastActionTime = 0;
      time_t lastNonDetectedTime = 0;
      int blankPeriod = 0, ringCount = 0, callCount = 0;
    
      relay = 0;
      setDummyTime();
      mainThreadID = osThreadGetId();
      initNetwork();
      recBufp = (double*)malloc(sizeof(double) * FFTSIZE);
      dbg("start\r\n");
    
      while (1) {
        countTick = 0;
        tick.attach(&flip, SEC_PER_SAMPLEPOINT);
        osSignalWait(1, osWaitForever);
        if (time(NULL) - lastDetectedTime >= 4) {
          // 4ÉðʾåÂоݲ»¤òÈó¸¡ÃΤʤ饳¡¼¥ë¥«¥¦¥ó¥¿¤ò¥ê¥»¥Ã¥È
          callCount = 0;
        }
        int freq = doFFT(recBufp);
        if (isTargetFreq(freq)) {
          // Á°²ó¤Î¥¢¥¯¥·¥ç¥ó¤«¤é½êÄê¤Î»þ´Ö¤¬·Ð²á¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¼õ¤±Î®¤¹
          if (lastActionTime > 0) {
            int w = time(NULL) - lastActionTime;
            if (w < 30) {
              dbg("pending.. %dsec\r\n", w);
              continue;
            }
          }
          ringCount++;
          if (callCount >= 3) {
            // ¥¢¥¯¥·¥ç¥ó¼Â¹Ô
            relay = !relay;
            dbg("Power %s\r\n", (relay == 1) ? "On" : "Off");
            free(recBufp);
            sendMail(callCount);
            recBufp = (double*)malloc(sizeof(double) * FFTSIZE);
            callCount = ringCount = 0;
            lastActionTime = time(NULL);
          }
          lastDetectedTime = time(NULL);
        } else { // ÈóÂоݲ»
          blankPeriod += (time(NULL) - lastNonDetectedTime);
          if (blankPeriod > 30) {
            blankPeriod = 0;
          }
          lastNonDetectedTime = time(NULL);
          if (ringCount > 7) {
            if (callCount == 0 ||
              blankPeriod >= 2 && blankPeriod < 4) {
              callCount++;
              dbg("call count=%d\r\n", callCount);
              blankPeriod = 0;
            }
          }
          ringCount = 0;
        }
      }
      if (recBufp) {
        free(recBufp);
      }
      return 0;
    }
    
    

¤ª¤ï¤ê¤Ë

²»¤òÂêºà¤Ë¼ê¸µ¤Ç¹Ô¤Ã¤Æ¤­¤¿¼Â¸³¤È»îºî¤ÎÆâÍƤò 5 ²ó¤Ëʬ¤±¤Æ¾Ò²ð¤·¤Þ¤·¤¿¡£²»¤òÇÞÂΤȤ¹¤ë¼êË¡¤Ïµì¤¯¤Æ¿·¤·¤¤±ü¤Î¿¼¤¤À¤³¦¤Ç¤¹¡£¿·¤¿¤ÊÀ½Éʤ䥵¡¼¥Ó¥¹¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¹½ÃÛ¤¹¤ëºÝ¤ÎÆ»¶ñΩ¤Æ¤Î¤Ò¤È¤Ä¤È¤·¤Æ¡¢¤¢¤ë¤¤¤Ï¡¢Â¾¤ÎÊýË¡¤¬¤¹¤Ù¤ÆÍøÍѤǤ­¤Ê¤¤¾ì¹ç¤ÎÉúʼ¤È¤·¤Æ¤âÍ­ÍѤǤ·¤ç¤¦¡£¤È¤Æ¤â¶½Ì£¿¼¤¤·Ð¸³¤Ç¤·¤¿¡£


(tanabe)
klab_gijutsu2 at 11:54¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)¨¢TrackBack(0)
2017ǯ06·î20Æü

²»¤òÍøÍѤ¹¤ë 4 ¡Ámbed ¥Þ¥¤¥³¥ó¤Ç¤Î±þÍÑ¡§½àÈ÷ÊÔ¡Á

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

¤³¤Îµ­»ö¤ÎÆâÍÆ

IoT ÊýÌ̤ǤαþÍѤòÁÛÄꤷ¥Þ¥¤¥³¥ó·Ï¤Ç¤â²»¤Ë´Ø¤¹¤ë¼Â¸³¤È»îºî¤ò¹Ô¤¤¤Þ¤·¤¿¡£º£²ó¤Ï¤½¤Î½àÈ÷ÊԤǤ¹¡£¤³¤³¤Ç¤Ï¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤È¤·¤Æ mbed LPC1768 ¥Ü¡¼¥É¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£´ðËÜŪ¤Ê¹Í¤¨Êý¤Ï´Ä¶­¤Ë°Í¸¤·¤Ê¤¤¤¿¤áÍ×ÁǤο¤¯¤Ï¾¤ÎÀ½Éʸþ¤±¤ËÆɤßÂؤ¨¤ë¤³¤È¤â²Äǽ¤Ç¤·¤ç¤¦¡£

½àÈ÷ 1. ÉôÉʤòÍÑ°Õ¤¹¤ë

²»À¼¥Ç¡¼¥¿¤ÎÆþ½ÐÎÏÍѤ˰ʲ¼¤ÎÉôÉʤòÍÑ°Õ¤·¤Þ¤·¤¿¡£

¥Þ¥¤¥¯¥â¥¸¥å¡¼¥ë¤ò mbed LPC1768 ¤Î p20¡ÊAnalogIn¡Ë¤Ë¡¢¥ª¡¼¥Ç¥£¥ª¥¢¥ó¥×¤ò p18¡ÊAnalogOut¡Ë¤ËÀܳ¤·¤Þ¤·¤¿¡£¤³¤ì¤ò¼Â¸³¤Ë»È¤¤¤Þ¤¹¡£

½àÈ÷ 2. mbed ¥Þ¥¤¥³¥ó¤Ç¤Î²»À¼Æþ½ÐÎϽèÍý¤ò³Ð¤¨¤ë

²¿¤Ï¤È¤â¤¢¤ì²»À¼¥Ç¡¼¥¿¤ÎÆþ½ÐÎÏÊýË¡¤«¤é¤Ç¤¹¡£¥ê¥Õ¥¡¥ì¥ó¥¹¤ò³Îǧ¤·¤Þ¤¹¡£

  • AnalogIn - ¥¢¥Ê¥í¥°ÆþÎÏ - developer.mbed.org
    val = name.read();
    val¤Ë¤Ï0(0V)¡Á1.0(3.3V)¤Î¿ôÃÍ¡Êfloat¡Ë¤¬ÂåÆþ¤µ¤ì¤Þ¤¹¡£

    val = name.read_u16();
    val¤Ë¤Ï0(0V)¡Á65535(0xffff, 3.3V)¤Î¿ôÃͤ¬ÂåÆþ¤µ¤ì¤Þ¤¹¡£¡Ê¾å°Ì12¥Ó¥Ã¥È¤¬Í­¸ú¡Ë
    • AN10974 LPC176x/175x 12-bit ADC design guidelines¡ÊPDF¡Ë - www.nxp.com
      Page 3 of 19 ¤è¤ê
      The LPC175x/6x family is based on the ARM Cortex M3 core, and includes a 12-bit Analog-to-Digital (ADC) module with input multiplexing among eight pins, conversion rates up to 200 kHz, and multiple result registers.
  • AnalogOut - ¥¢¥Ê¥í¥°½ÐÎÏ - developer.mbed.org
    name = 0.5;
    0(0V)¡Á1(3.3V)¤Î¿ôÃÍ¡Êfloat¡Ë¤Ç½ÐÎϤò»ØÄꤷ¤Þ¤¹¡£

    name.write_u16 = 1000;
    0(0V)¡Á65535(0xffff, 3.3V)¤Î¿ôÃÍ¡Êunsigned short¡Ë¤Ç½ÐÎϤò»ØÄꤷ¤Þ¤¹¡£¡Ê¾å°Ì10¥Ó¥Ã¥È¤¬Í­¸ú¡Ë

»îºî 1

¤Þ¤º¡¢¤´¤¯ÁÇËѤÊÏ¿²»¡¦ºÆÀ¸¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤ß¤Þ¤·¤¿¡£¼¡¤ÎÆâÍƤǤ¹¡£

  • ¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ï 4000Hz
  • ÆþÎÏ¿®¹æ¤ò 4000Hz ¤Ç¥µ¥ó¥×¥ê¥ó¥°¤¹¤ë¤¿¤á¤Î»þ´Ö´Ö³Ö w ¤ò·×»»
    w = 1sec / 4000Hz = 0.00025sec = 0.25msec = 250¦Ìsec
  • ¥¢¥Ê¥í¥°ÆþÎϤ«¤é w ´Ö³Ö¤ÇÆɤ߼è¤Ã¤¿Ãͤò¥µ¥ó¥×¥ê¥ó¥°ÍѥХåե¡¤Î½ªÃ¼¤Þ¤Ç½ç¼¡³ÊǼ¤¹¤ë
  • ¥µ¥ó¥×¥ê¥ó¥°ÍѥХåե¡¤Ë³ÊǼ¤·¤¿Ãͤò w ´Ö³Ö¤Ç½ç¼¡¥¢¥Ê¥í¥°½ÐÎϤؽñ¤­¹þ¤à ¡Á̵¸Â¥ë¡¼¥×

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§20Éá¡¡¡¢¨²»ÎÌÃí°Õ

¥½¡¼¥¹¥³¡¼¥É

sonic01_mic

  • main.cpp
    
    #include "mbed.h"
    
    #define SAMPLE_RATE 4000
    #define BUFSIZE 7680
    
    AnalogIn mic(p20);
    AnalogOut speaker(p18);
    DigitalOut led(LED4);
    float recBuf[BUFSIZE];
    
    int main() {
      // Åö³º¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö
      float w = 1.0 / SAMPLE_RATE;
    
      // Ï¿²»³«»Ï¤Þ¤Ç¤Ë LED ¤ò 3²óÅÀÌǤµ¤»¤ë
      led = 1;
      for (int i = 0; i < 6; i++) {
        wait(0.5);
        led = !led;
      }
      // Ï¿²»
      for (int i = 0; i < BUFSIZE; i++) {
        recBuf[i] = mic.read();
        wait(w);
      }
      led = 0;
    
      // ºÆÀ¸
      while (1) {
        for (int i = 0; i < BUFSIZE; i++) {
          speaker = recBuf[i] ;
          wait(w);
        }
      }
      return 0;
    }
    
    

»îºî 1 ¤ÎÌäÂêÅÀ¤Ë¤Ä¤¤¤Æ

¤³¤Î¤è¤¦¤Ë¤È¤Æ¤âû¤¤¥³¡¼¥É¤Ç´Êñ¤Ë²»À¼¥Ç¡¼¥¿¤ÎÆþ½ÐÎϤò¼Â¸½¤Ç¤­¤Þ¤·¤¿¡£¤·¤«¤·¡¢Ï¿²»¤ÈºÆÀ¸¤ò»î¤·¤Æ¤¤¤ë¤ÈÈù̯¤Ê°ãÏ´¶¤¬¤¢¤ê¤Þ¤·¤¿¡£Ï¿²»¤·¤¿²»¤ÈºÆÀ¸¤µ¤ì¤ë²»¤Î¹â¤µ¤¬°ã¤¦¤è¤¦¤Êµ¤¤¬¤·¤¿¤Î¤Ç¤¹¡£¤³¤Î¤³¤È¤ò³Ú´ï¤ò»È¤Ã¤Æ³Îǧ¤·¤Æ¤ß¤Þ¤·¤¿¡£

ºÆÀ¸²»¤Î¹â¤µ¤¬¤ª¤«¤·¤¤¡©

Æ°²è¡§21Éá¡¡¡¢¨²»ÎÌÃí°Õ

¤³¤ÎÆ°²è¤Ç¤Ï³Ú´ï¤Î²»¤òÏ¿²»¤·ºÆÀ¸»þ¤Ë¹ç¤ï¤»ÃƤ­¤Ê¤É¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£¤Ê¤ª¡¢Á°·Ç¤Î°Â²Á¤Ê¥¹¥Ô¡¼¥«¡¼¤Ç¤Ï¤ä¤Ï¤ê²»¼Á¤¬Éϼå¤Ê¤Î¤Ç¡¢¤³¤ÎÆ°²è°Ê¹ß¤Ç¤Ï¥¢¥ó¥×Æ⢤Υ¹¥Ô¡¼¥«¡¼¡ÊPHILIPS ¼ÒÀ½ BT50¡Ë¤ò AnalogOut ¥Ý¡¼¥È¤Ë¤Ä¤Ê¤¤¤ÇºÆÀ¸¤Ë»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£

ÌäÂê¤Î¸¶°ø¤ÈÂнèÊýË¡

¤³¤Î¤ª¤«¤·¤Ê¸½¾Ý¤Î¸¶°ø¤Ï»îºî 1 ¤Î¥³¡¼¥É¤Ë¤ª¤¤¤Æ¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö¤òÀ©¸æ¤·¤Æ¤¤¤ë wait() ´Ø¿ô¤Ë¤¢¤ê¤Þ¤¹¡£mbed ¥×¥í¥°¥é¥ß¥ó¥°¤Ë¤ª¤¤¤Æ¤­¤ï¤á¤Æ¥«¥¸¥å¥¢¥ë¤Ë»ÈÍѤµ¤ì¤ë¤³¤Î´Ø¿ô¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¤ò¤¢¤é¤¿¤á¤Æ³Îǧ¤·¤¿¤È¤³¤í¡ÖWhen you call wait your board's CPU will be busy in a loop waiting for the required time to pass¡×¤È¤Îµ­½Ò¤¬¤¢¤ê¡¢¤È¤ê¤¢¤¨¤º°Ê²¼¤ÎÆâÍƤÇÀºÅ٤γÎǧ¤ò¹Ô¤¤¤Þ¤·¤¿¡£

  • ¼¡¤Î¤ß¤Ã¤Ä¤Î¥Ñ¥¿¡¼¥ó¤Ë¤Ä¤¤¤Æ¡¢¥¤¥ó¥¿¡¼¥Ð¥ë 10¦ÌÉ䫤é 250¦ÌÉäޤǤΠ1¦ÌÉùï¤ß¤Î¥ë¡¼¥×Æâ¤Ç¤½¤ì¤¾¤ì 1000²ó wait() ¤ò¸Æ¤Ó½Ð¤·½êÍ×»þ´Ö¤ÈÍýÏÀ»þ´Ö¤Îº¹°ã¤ò·×¬¤¹¤ë
    • wait() ¤Î¤ß
    • wait() + AnalogIn.read()
    • wait() + AnalogOut.write()
¥¤¥ó¥¿¡¼¥Ð¥ë 250¦ÌÉäǤηë²Ì¤Ï¼¡¤ÎÄ̤ê¤Ç¤¹¡£
  • wait() ¤Î¤ß
    • wait=250us ½êÍ×»þ´Ö¡§250666us ÍýÏÀ»þ´Ö¡§250000us ¸íº¹¡§666us (0.266400%)
  • wait() + AnalogIn.read()
    • wait=250us ½êÍ×»þ´Ö¡§271662us ÍýÏÀ»þ´Ö¡§250000us ¸íº¹¡§21662us (8.664801%)
  • wait() + AnalogOut.write()
    • wait=250us ½êÍ×»þ´Ö¡§252363us ÍýÏÀ»þ´Ö¡§250000us ¸íº¹¡§2363us (0.945200%)

¤³¤Î¤è¤¦¤Ë wait() + AnalogIn.read() ¤ÇÂçÉý¤ÊÃٱ䤬ȯÀ¸¤·¤Æ¤¤¤Þ¤¹¡£°ìÊý¡¢wait() + AnalogOut.write() ¤Ç¤ÏÁêÂÐŪ¤ËÃٱ䤬¾®¤µ¤¤¤¿¤á»îºî 1 ¤Î¥×¥í¥°¥é¥à¤Ï·ë²Ì¤È¤·¤Æ¡ÖÄ㤤¥ì¡¼¥È¤Ç¥µ¥ó¥×¥ê¥ó¥°¡×¤·¤¿¥Ç¡¼¥¿¤ò¡Ö¹â¤¤¥ì¡¼¥È¤ÇºÆÀ¸¡×¤¹¤ë½êºî¤È¤Ê¤Ã¤Æ¤¤¤Þ¤·¤¿¡£¾å¤Î¸¡¾Ú¤Ç¤Î¥¤¥ó¥¿¡¼¥Ð¥ë 10¡Á250¦ÌÉäò²£¼´¡¢½êÍ×»þ´Ö¤Î¸íº¹¤Î³ä¹ç¤ò½Ä¼´¤Ë¥×¥í¥Ã¥È¤·¤¿¥°¥é¥Õ¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£

¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö¤Î¥³¥ó¥È¥í¡¼¥ë¤Ë mbed ɸ½à¤Î¥¿¥¤¥Þ³ä¹þ¤ßµ¡¹½¤Ç¤¢¤ë Ticker ¤ò»È¤Ã¤ÆƱ¤¸¸¡¾Ú¤ò¹Ô¤¤¤Þ¤·¤¿¡£ ¥¤¥ó¥¿¡¼¥Ð¥ë 250¦ÌÉäǤηë²Ì¤Ï¼¡¤ÎÄ̤ê¤Ç¤¹¡£

  • Analog read / write ¤Ê¤·
    • ticker=250us ½êÍ×»þ´Ö¡§249770us ÍýÏÀ»þ´Ö¡§250000us ¸íº¹¡§230us (0.092000%)
  • AnalogIn.read() ¸Æ¤Ó½Ð¤·¤Ä¤­
    • ticker=250us ½êÍ×»þ´Ö¡§249791us ÍýÏÀ»þ´Ö¡§250000us ¸íº¹¡§209us (0.083600%)
  • AnalogOut.write() ¸Æ¤Ó½Ð¤·¤Ä¤­
    • ticker=250us ½êÍ×»þ´Ö¡§249772us ÍýÏÀ»þ´Ö¡§250000us ¸íº¹¡§228us (0.091200%)

¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

¤³¤Î¤è¤¦¤Ë·ë²Ì¤Ï wait() »ÈÍÑ»þ¤è¤ê¤â°µÅÝŪ¤ËÎɹ¥¤Ç¤¹¡£¤½¤Î°ìÊý¤Ç¡¢AnalogIn.read() Ê»ÍÑ»þ¤Î¥¤¥ó¥¿¡¼¥Ð¥ë 25¦ÌÉÃÉÕ¶á¤Î¡ÖÊɡפθºß¤¬Ìܤ˻ߤޤê¤Þ¤¹¡£¼ê¸µ¤Î¸¡¾Ú¤Ç¤Ï¤³¤Î·ë²Ì¤Ë¤ÏÌÀ³Î¤ÊºÆ¸½À­¤¬¤ß¤é¤ì¤Þ¤·¤¿¡£25¦ÌÉðʲ¼¤Î³ä¹þ¤ß¤òɬÍפȤ·¤Ê¤¤¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤òÍøÍѤ¹¤ì¤ÐÂ礭¤Ê»Ù¾ã¤Ï¤Ê¤µ¤½¤¦¤Ç¤¹¤¬¡¢¹­¤¯ÍѤ¤¤é¤ì¤ë¥ì¡¼¥È 44100Hz ¤Î¾ì¹ç¤Ë¤Ï 1sec / 44100Hz ¢â 23¦Ìsec ¤È¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö¤¬ 25¦ÌÉäò³ä¤ê¹þ¤à¤³¤È¤¬Èù̯¤Ë»ÄÇ°¤Ç¤â¤¢¤ê¤Þ¤¹¡£

°ìÏ¢¤ÎÄ´ºº¤Î²áÄø¤Ç Erik Olieman »á¤Ë¤è¤ë FastAnalogIn ¥é¥¤¥Ö¥é¥ê¤Î¸ºß¤òÃΤê¤Þ¤·¤¿¡£

½êÄê¤Î¥¢¥Ê¥í¥°ÆþÎϥݡ¼¥È¤ËÂФ¹¤ë mbed ɸ½à¤Î AnalogIn.read() ¤¬¡¢¸Æ¤Ó½Ð¤·¤ÎÅÔÅÙ¡¢Åö³º¥Ý¡¼¥È¤ËÂбþ¤¹¤ë ADC ¥Á¥ã¥Í¥ë·Ðͳ¤Ç AD ÊÑ´¹¤ò¹Ô¤¦»ÅÍ͡ʤ½¤Î¤¿¤áÃÙ¤¤¡Ë¤Ç¤¢¤ë¤Î¤ËÂФ·¡¢FastAnalogIn ¤Ï ADC ¤Î BURST mode ¤òÍøÍѤ·¤ÆÊÑ´¹¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤ÇºÇÂç 200kHz¤Ç·«¤êÊÖ¤·¼Â¹Ô¤· read() ¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡ÖºÇ¸å¤Ë¥µ¥ó¥×¥ê¥ó¥°¤·¤¿Ã͡פòľ¤Á¤ËÊÖ¤¹ÆâÍƤǼÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ¡Ê¢¨ Á°·Ç¤Î ADC ¥É¥­¥å¥á¥ó¥ÈÃæ¤Î "conversion rates up to 200 kHz" ¤Î¤¯¤À¤ê¤Ï BURST mode ²¼¤Î¤³¤Î½êºî¤ò»Ø¤¹¤â¤Î¤È¹Í¤¨¤é¤ì¤ë¡Ë

  • FastAnalogIn - a mercurial repository | mbed - developer.mbed.org
    When you read an AnalogIn object it will enable the corresponding ADC channel, depending on the implementation do either one or multiple measurements for more accuracy, and return that value to your program. This way the ADC is only active when it is required, and it is fairly straightforward. However the downside is, is that an ADC is relatively slow.
          :
    This library uses the 'burst' feature of the microcontroller. This allows the ADC on the background to perform the AD conversions without requiring intervention from the microcontroller's core. Also there are no interrupts used, so also your time-sensitive code is not affected.
          :
    • FastAnalogIn Class Reference - developer.mbed.org
      AnalogIn does a single conversion when you read a value (actually several conversions and it takes the median of that). This library runns the ADC conversion automatically in the background. When read is called, it immediatly returns the last sampled value.
            :
  • ADC_LPC1768 - John Kneen: Microcontrollers - 6. Selecting and triggering the analogue to digital conversion. - sites.google.com
    Bit 16 : BURST

    1 The AD converter does repeated conversions at up to 200 kHz, scanning (if necessary) through the pins selected by bits set to ones in the SEL field.
          :

·×¬ÍÑ¥³¡¼¥É¤ÎÃæ¤Î AnalogIn ¤ò¤³¤Î FastAnalogIn ¤ËÊѹ¹¤·¤ÆƱÍͤη׬¤ò¹Ô¤Ã¤¿¤È¤³¤í 25¦ÌÉðʲ¼¤Î¥¤¥ó¥¿¡¼¥Ð¥ë¤Ç¤ÎÀ®ÀÓ¤¬·àŪ¤Ë²þÁ±¤µ¤ì¤Þ¤·¤¿¡£Á°·Ç¤Î¤Õ¤¿¤Ä¤Î¥°¥é¥Õ¤Î½Ä¼´ºÇÂçÃͤ¬¡Ö100%¡×¤Ç¤¢¤Ã¤¿¤Î¤ËÂФ·¡¢²¼¤Î¥°¥é¥Õ¤Ç¤Ï¡Ö1.00%¡×¤Ç¤¢¤ë¤³¤È¤ËÍ×ÃíÌܤǤ¹¡£

¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

»îºî 2

¾å¤Î¡ÖÂнèÊýË¡¡×¤òÈ¿±Ç¤·¤¿·Á¤ÇÏ¿²»¡¦ºÆÀ¸¥×¥í¥°¥é¥à¤ò½ñ¤­Ä¾¤·¤Þ¤·¤¿¡£¸¡¾Ú¾å¤ÎÊص¹¤ò·ó¤Í¤Æ¼¡¤ÎÆâÍƤȤ·¤Æ¤¤¤Þ¤¹¡£

  • Ï¿²»¡¦ºÆÀ¸¤ËÍ×ÁÇ¿ô 14000 ¤Î unsigned short ·¿ÇÛÎó¤ò»ÈÍѤ¹¤ë
  • ¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È 8000Hz, 16000Hz, 22000Hz, 30720Hz, 44100Hz ¤Î½ç¤ËÏ¿²»¤ÈºÆÀ¸¤ò¹Ô¤¦
  • ¥ì¡¼¥È¤¬¹â¤¯¤Ê¤ë¤Û¤ÉÏ¿²»²Äǽ»þ´Ö¤Ïû¤¯¤Ê¤ë¤¬¡¢ºÆÀ¸¤Ï¤¤¤º¤ì¤â 8ÉôÖÄøÅÙ·«¤êÊÖ¤·¹Ô¤¦

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§1ʬ28Éá¡¡¡¢¨²»ÎÌÃí°Õ

¤³¤ÎÆ°²è¤Ç¤Ï³Æ¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ë¤ª¤¤¤Æ¥­¡¼¥Ü¡¼¥É¤Î¡Ö¥Õ¥¡¡×¤Î²»¡ÊF5¡§698.456Hz¡Ë¤òÏ¿²»¤·¡¢¤½¤ÎºÆÀ¸²»¤ò°ÊÁ°ºîÀ®¤·¤¿¥Ô¡¼¥¯¼þÇÈ¿ôɽ¼¨¥×¥í¥°¥é¥à¤È³Ú´ïÍѤΥÁ¥å¡¼¥Ê¡¼¡ÊKORG ¼ÒÀ½ AW-2G¡Ë¤Ç³Îǧ¤·¤Æ¤¤¤Þ¤¹¡£

¥½¡¼¥¹¥³¡¼¥É

sonic07_mic3

  • main.cpp
    // ¥µ¥ó¥×¥ê¥ó¥°¤ÈºÆÀ¸
    // ¥ì¡¼¥È 8000,16000,22000,30720,44100Hz ¤Î½ç¤Ë¥µ¥ó¥×¥ê¥ó¥°¤ò¹Ô¤¤
    // ¤½¤ì¤¾¤ì 8ÉÃÄøÅ٥롼¥×ºÆÀ¸¤¹¤ë
    // FastAnalogIn ¥é¥¤¥Ö¥é¥ê¤ò»ÈÍÑ
    
    #include "mbed.h"
    #include "FastAnalogIn.h"
    
    #define DEVELOP
    #ifdef DEVELOP
    #define dbg(...) printf(__VA_ARGS__)
    #else
    #define dbg(...)
    #endif
    
    #define BUFSIZE 14000
    
    Ticker tick;
    Timer timer;
    int countTick,interval_us, sampleTime;
    bool recDone;
    unsigned short *recBufp = NULL;
    AnalogOut speaker(p18);
    FastAnalogIn mic(p20);
    DigitalOut led(LED4);
    
    // ¥µ¥ó¥×¥ê¥ó¥°
    void flipRec() {
      recBufp[countTick++] = mic.read_u16() & 0xFFFC;
      if (countTick == BUFSIZE) {
        tick.detach();
        recDone = true;
      }
    }
    
    // ºÆÀ¸
    void flipPlay() {
      speaker.write_u16(recBufp[countTick++]);
      if (countTick == BUFSIZE) {
        countTick = 0;
      }
    }
    
    void recAndPlay(int sampleRate) {
      // Åö³º¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö usec
      interval_us = 1.0 / sampleRate * 1000000;
      // Åö³º¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°»þ´Ö usec
      sampleTime = BUFSIZE * interval_us / sizeof(short);
      dbg("rate=%5dHz irq=%dus time=%dms\r\n",
    ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡sampleRate, interval_us, sampleTime/1000);
      
      // ¥µ¥ó¥×¥ê¥ó¥°³«»Ï¤Þ¤Ç¤Ë LED ¤ò 3²óÅÀÌǤµ¤»¤ë
      led = 1;
      for (int i = 0; i < 6; i++) {
        wait(0.4);
        led =! led;
      }
      // ¥µ¥ó¥×¥ê¥ó¥°
      countTick = 0;
      recDone = false;
      tick.attach_us(&flipRec, interval_us);
      while (!recDone) {
        wait(0.2);
      }
      led = 0;
      wait(1);
      // 8ÉÃÄøÅ٥롼¥×ºÆÀ¸
      countTick = 0;
      tick.attach_us(&flipPlay, interval_us);
      wait(8);
      tick.detach();
    }
    
    int main() {
      recBufp = (unsigned short*)malloc(BUFSIZE);
      recAndPlay(8000);
      recAndPlay(16000);
      recAndPlay(22000);
      recAndPlay(30720);
      recAndPlay(44100);
      dbg("done\r\n");
      if (recBufp) {
        free(recBufp);
      }
      return 0;
    }
    
    
    

½àÈ÷ 3. Ǥ°Õ¤Î¼þÇÈ¿ô¤Î²»ÇȤòÀ¸À®¡¦½ÐÎϤ¹¤ë

ÀèÈ̤ÎAndroid ´Ä¶­¤Ç¤Î»î¤ß¤ÈƱÍͤ˼긵¤Î mbed ¥Þ¥¤¥³¥ó¤Ç¥µ¥¤¥óÇÈ¿®¹æ¤òÀ¸À®¡¦½ÐÎϤ·¤Æ¤ß¤Þ¤¹¡£Android ÈǤǤÎÅþãÅÀ¤òƧ½±¤Ç¤­¤ë¤Î¤Ç¤¢¤Þ¤ê¼ê¤Ï¤«¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£

»îºî

°Ê²¼¤ÎÍ×ÎÎ¤Ç¥×¥í¥°¥é¥à¤òºîÀ®¤·¤Þ¤·¤¿¡£

  • 400Hz¡Á14000Hz ¤ÎÈϰϤΠ10¼ïÎà¤Î¼þÇÈ¿ô¤Î¥µ¥¤¥óÇÈ¿®¹æ¤ò½ç¼¡À¸À®¤¹¤ë
  • ¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ï 33330Hz¡Ê¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö 30¦ÌÉáˤȤ·¡¢¥Ð¥Ã¥Õ¥¡¾å¤Ë³Æ¼þÇÈ¿ô 100¥ß¥êÉÃʬ¤Î¿®¹æ¥Ç¡¼¥¿¤ò¹½ÃÛ¤·¤Æ¤½¤ì¤¾¤ì 4ÉôÖÄøÅÙ AnalogOut ¥Ý¡¼¥È¤Ø½ÐÎϤ¹¤ë
  • unsigned short ·¿ÇÛÎó¤ò°ú¿ô¤Ë¤È¤ë AnalogOut.write_u16() ¤Î°ú¿ôÈÏ°Ï¤Ï 0¡Á65535 ¤Ç¤¢¤ë¤¿¤á¿®¹æÀ¸À®»þ¤ËľήÀ®Ê¬¤È¤·¤Æ 65535 / 2 ¤ò²Ã¤¨¤ë

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§1ʬ15Éá¡¡¡¢¨²»ÎÌÃí°Õ

¤³¤ÎÆ°²è¤Ç¤ÏÆóÂæ¤Î¥¿¥Ö¥ì¥Ã¥È¾å¤Î¤Õ¤¿¤Ä¤Î¥×¥í¥°¥é¥à¤ò»È¤Ã¤Æ¿®¹æ¤Î³Îǧ¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£

ºÇ½é¤Ë 400Hz ¥µ¥¤¥óÇÈ¿®¹æ¤Î¼ýÏ¿¤µ¤ì¤¿ Youtube Æ°²è¤ò»È¤Ã¤Æ³Îǧ¤ò¹Ô¤¤¡¢¤½¤Î¸å mbed ¥Þ¥¤¥³¥ó¤«¤é 10¼ïÎà¤Î¼þÇÈ¿ô¤Î¥µ¥¤¥óÇÈ¿®¹æ¤ò½çÈÖ¤Ë 4É交ÄÌĤ餷¤Æ¤¤¤Þ¤¹¡£

¥½¡¼¥¹¥³¡¼¥É

sonic08_sine2

  • main.cpp
    
    // ¥µ¥¤¥óÇȲ»À¼¿®¹æ¤òÀ¸À®¡¦½ÐÎϤ¹¤ë
    
    #include "mbed.h"
    
    #define DEVELOP
    #ifdef DEVELOP
    #define dbg(...) printf(__VA_ARGS__)
    #else
    #define dbg(...)
    #endif
    
    #define SAMPLE_RATE 33330
    #define PI 3.141592653589793238462
    #define MAG 3000
    
    Ticker tick;
    int count = 0;
    const int BUFSIZE = SAMPLE_RATE / 10; // ¥Ð¥Ã¥Õ¥¡¥µ¥¤¥º 100¥ß¥êÉÃʬ
    unsigned short waveBuf[BUFSIZE];
    // Åö³º¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö ÉÃ
    const float SEC_PER_SAMPLEPOINT = 1.0 / SAMPLE_RATE;
    const float a0 = 65535 / 2;
    
    AnalogOut speaker(p18);
    
    // ½ÐÎÏ
    void flip() {
       speaker.write_u16(waveBuf[count++]);
       (count >= BUFSIZE) ? count = 0 : 1;
    }
    
    void outputSineWave(int freq) {
      for (int i = 0; i < BUFSIZE; i++) {
        float currentSec = i * SEC_PER_SAMPLEPOINT;
        double val = a0 + MAG * sin(2.0*PI * freq * currentSec);
        waveBuf[i] = (unsigned short)val;
      }
      count = 0;
      tick.attach(&flip, SEC_PER_SAMPLEPOINT;
      wait(4); // 4ÉÃÄøÅÙ½ÐÎÏ
      tick.detach();  
    }
    
    int main() {
      dbg("interval=%fs\r\n", SEC_PER_SAMPLEPOINT);
      outputSineWave(400);
      outputSineWave(800);
      outputSineWave(1200);
      outputSineWave(1600);
      outputSineWave(2000);
      outputSineWave(4000);
      outputSineWave(8000);
      outputSineWave(10000);
      outputSineWave(12000);
      outputSineWave(14000);
      return 0;
    }
    
    

½àÈ÷ 4. ½¸²»¤·¤¿¥Ç¡¼¥¿¤Î¼þÇÈ¿ôʬÀϤò¹Ô¤¦

½àÈ÷ÊԤκǸå¤ËÆþÎÏ¿®¹æ¤ÎʬÀϤò»î¤ß¤Þ¤¹¡£

Â籺ÈÇ FFT ¤Ë¤Ä¤¤¤Æ

¤³¤³¤Ç¤Ï¹âÀ­Ç½¤«¤Ä¥³¥ó¥Ñ¥¯¥È¤Ê FFT ¥é¥¤¥Ö¥é¥ê¤È¤·¤Æ¹­¤¯ÍøÍÑ¡ÊNASA ¤ÎÎã¡Ë¤µ¤ì¤Æ¤¤¤ëÂ籺ÂóºÈÍ͡ʵþÅÔÂç³Ø¿ôÍý²òÀϸ¦µæ½ê ½õ¶µ¡Ë¤Ë¤è¤ë¥é¥¤¥»¥ó¥¹¥Õ¥ê¡¼¤ÎÈÆÍÑ FFT ¥Ñ¥Ã¥±¡¼¥¸¡ÊÄ̾ΠÂ籺ÈÇ FFT¡Ë¤ò»È¤Ã¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£ÀèÈÌ Android ´Ä¶­²¼¤ÇÍøÍѤ·¤¿ JTransforms ¤Ï¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤òÊìÂΤȤ¹¤ë¥½¥Õ¥È¥¦¥§¥¢¤Ç¤¹¡£

  • Â籺 ÂóºÈ (Ooura, Takuya) - µþÅÔÂç³Ø¿ôÍý²òÀϸ¦µæ½ê - www.kurims.kyoto-u.ac.jp
    • ÈÆÍÑ FFT (¹â® ¥Õ¡¼¥ê¥¨/¥³¥µ¥¤¥ó/¥µ¥¤¥ó ÊÑ´¹) ¥Ñ¥Ã¥±¡¼¥¸
      °ì¼¡¸µ DFT / DCT / DST

      ¾ÜºÙ
      °ì¼¡¸µ¡¤£²¤ÎÀ°¿ô¾è¸Ä¤Î¥Ç¡¼¥¿¤ÎÎ¥»¶ Fourier ÊÑ´¹¡¤ ¥³¥µ¥¤¥óÊÑ´¹¡¤¥µ¥¤¥óÊÑ´¹Åù¤ò¹Ô¤¤¤Þ¤¹¡¥¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¤Ï C ¤È Fortran ¤Î FFT ¥³¡¼¥É¤¬´Þ¤Þ¤ì¤Þ¤¹¡¥
            :

      ÆâÍÆ
      fft4g.c : FFT ¥Ñ¥Ã¥±¡¼¥¸ in C - ¹â®ÈÇ (´ð¿ô 4, 2)
            :

      ¥Õ¥¡¥¤¥ë¤Î°ã¤¤
      ´Ê°×ÈǤϺî¶ÈÍÑÇÛÎó¤ò°ìÀڻȤ¤¤Þ¤»¤ó¡¥¹â®ÈǤϻ°³Ñ´Ø¿ôɽ¤Ê¤É¤Îºî¶ÈÍÑÇÛÎó¤ò»È¤¤¤Þ¤¹¡¥¹â®ÈǤϴʰ×ÈǤËÈæ¤Ù¤Æ¹â®¤«¤Ä¹âÀºÅÙ¡¥¹â®ÈǤλÅÍͤϤ¹¤Ù¤ÆƱ¤¸¡¥

      ¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥ë¡¼¥Á¥ó
      cdft() : Ê£ÁÇÎ¥»¶ Fourier ÊÑ´¹ rdft() : ¼ÂÎ¥»¶ Fourier ÊÑ´¹
            :

      ¥é¥¤¥»¥ó¥¹
      Copyright Takuya OOURA, 1996-2001

      ¤³¤Î¥½¡¼¥¹¥³¡¼¥É¤Ï¥Õ¥ê¡¼¥½¥Õ¥È¤Ç¤¹¡¥¾¦ÍÑÌÜŪ¤ò´Þ¤á¡¤¤³¤Î¥³¡¼¥É¤Î»ÈÍÑ¡¤ ¥³¥Ô¡¼¡¤½¤ÀµµÚ¤ÓÇÛÉۤϼ«Í³¤Ë¹Ô¤Ã¤Æ·ë¹½¤Ç¤¹¡¥¤¿¤À¤·¡¤¤³¤Î¥³¡¼¥É¤Î½¤Àµ¤ò ¹Ô¤Ã¤¿¾ì¹ç¤Ï¡¤¤½¤Î¤³¤È¤òÌÀµ­¤·¤Æ¤¯¤À¤µ¤¤¡¥
    • ²»À¼¿®¹æ¤Ï¼Â¿ô¥Ç¡¼¥¿¤Ë¤Ä¤­¼ÂÎ¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹´Ø¿ô rdft() ¤ò»ÈÍѤ¹¤ë¡£»È¤¤Êý¤Ï¥·¥ó¥×¥ë¡£FFT ¥µ¥¤¥º¤ò 2¤Î¤Ù¤­¾è¤ÎÃͤȤ¹¤ë¤³¤È¤ËÃí°Õ¡£
      -------- Real DFT / Inverse of Real DFT --------

       [usage]
        <case1>
         ip[0] = 0; // first time only
         rdft(n, 1, a, ip, w);
        <case2>
         ip[0] = 0; // first time only
         rdft(n, -1, a, ip, w);

       [parameters]
        n     :data length (int)
            n >= 2, n = power of 2

        a[0...n-1]  :input/output data (double *)
            <case1>
             output data
              a[2*k] = R[k], 0<=k<n/2
              a[2*k+1] = I[k], 0<k<n/2
              a[1] = R[n/2]
            <case2>
             input data
              a[2*j] = R[j], 0<=j<n/2
              a[2*j+1] = I[j], 0<j<n/2
              a[1] = R[n/2]

        ip[0...*]   :work area for bit reversal (int *)
            length of ip >= 2+sqrt(n/2)
            strictly, 
            length of ip >= 
             2+(1<<(int)(log(n/2+0.5)/log(2))/2).
            ip[0],ip[1] are pointers of the cos/sin table.

        w[0...n/2-1]   :cos/sin table (double *)
            w[],ip[] are initialized if ip[0] == 0.

       [remark]
        Inverse of 
         rdft(n, 1, a, ip, w);
        is 
         rdft(n, -1, a, ip, w);
         for (j = 0; j <= n - 1; j++) {
          a[j] *= 2.0 / n;
         }

»îºî

¥ì¡¼¥È 33330Hz ¤Ç¥µ¥ó¥×¥ê¥ó¥°¤·¤¿²»À¼¿®¹æ¤ò mbed ¥Þ¥¤¥³¥ó¾å¤Î FFT ½èÍý¤Ë¤«¤±¤Æ¥Ô¡¼¥¯¼þÇÈ¿ô¤òµá¤á¥³¥ó¥½¡¼¥ë¤ØϢ³½ÐÎϤ¹¤ëÆâÍƤǻîºî¤ò¹Ô¤¤¤Þ¤·¤¿¡£¼ê¸µ¤Î³Îǧ¤Ç¤Ï mbed LPC1768 ¤Î¥á¥â¥êÍÆÎ̾å FFT ¥µ¥¤¥º¤Ï 210 = 1024 ¤¬¸Â³¦¤Ç¤¢¤ê¤½¤Î±Æ¶Á¤é¤·¤­¤â¤Î¤¬¼ã´³±®¤¨¤ë¤â¤Î¤Î½½Ê¬¤Ë¼ÂÍÑ¿å½à¤Ë¤¢¤ë¤È¹Í¤¨¤é¤ì¤Þ¤¹¡£

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§1ʬ33Éá¡¡¡¢¨²»ÎÌÃí°Õ

¤³¤ÎÆ°²è¤Ç¤ÏÆóÂæ¤Î¥¿¥Ö¥ì¥Ã¥È¾å¤Î¤Õ¤¿¤Ä¤Î¥×¥í¥°¥é¥à¤ò»È¤Ã¤Æ¥Æ¥¹¥È¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£

±¦¤Î¥¿¥Ö¥ì¥Ã¥È¤«¤é½ç¼¡½êÄê¤Î¼þÇÈ¿ô¤Î¥µ¥¤¥óÇÈ¿®¹æ¤ò½ÐÎϤ·¡¢¤½¤ì¤ò mbed ¥Þ¥¤¥³¥ó¤Èº¸Â¦¤Î¥¿¥Ö¥ì¥Ã¥È¤Ç¤½¤ì¤¾¤ì FFT ½èÍý¤Ë¤«¤±Î¾¼Ô¤Î·ë²Ì¤ò´Ñ»¡¤·¤Æ¤¤¤Þ¤¹¡£

¥½¡¼¥¹¥³¡¼¥É

sonic05_FFT2

  • main.cpp
    
    // Â籺ÈÇ FFT ¥é¥¤¥Ö¥é¥ê¤ÇÆþÎϲ»À¼¿®¹æ¤Î¥Ô¡¼¥¯¼þÇÈ¿ô¤òÆÀ¤ë
    
    #include "mbed.h"
    
    #define DEVELOP
    #ifdef DEVELOP
    #define dbg(...) printf(__VA_ARGS__)
    #else
    #define dbg(...)
    #endif
    
    #define PI = 3.141592653589793238462;
    #define SAMPLE_RATE 33330
    // n >= 2, n = power of 2
    #define FFTSIZE 1024
    // length of ip >= 2+sqrt(n/2)
    const int IP_LEN = 4 + sqrt((double)(FFTSIZE/2));
    
    Ticker tick;
    double *recBufp = NULL;
    int countTick;
    Timer timer;
    bool recDone;
    AnalogIn mic(p20);
    DigitalOut led(LED4);
    
    // Åö³º¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö ÉÃ
    const float SEC_PER_SAMPLEPOINT = 1.0 / SAMPLE_RATE;
    
    void rdft(int n, int isgn, double *a, int *ip, double *w);
    
    int doFFT(double *FFTBuffer) {
      int ip[IP_LEN];
      double *w = (double*)malloc(sizeof(double) * (FFTSIZE/2));
      ip[0] = 0;
      rdft(FFTSIZE, 1, FFTBuffer, ip, w);
    
      double maxAmp = 0;
      int index;
      for (int i = 0; i < FFTSIZE/2; i++) {
        double a = FFTBuffer[i*2]; // ¼ÂÉô
        double b = FFTBuffer[i*2 + 1]; // µõÉô
        // a+ib ¤ÎÀäÂÐÃÍ ¢å a^2 + b^2 = r ¤¬¿¶ÉýÃÍ
        double r = sqrt(a*a + b*b);
        if (r > maxAmp) {
          maxAmp = r;
          index = i;
        }
      }
      double freq = index * SAMPLE_RATE / FFTSIZE;
      if (freq > 0 && maxAmp > 1.0) {
        dbg("freq=%d mag=%f\r\n", (int)freq, maxAmp);
      }
      free(w);
      return (int)freq;
    }
    
    // ¥µ¥ó¥×¥ê¥ó¥°
    void flip() {
      // AnalogIn.read() ¤ÎÃÍÈÏ°Ï¤Ï 0¡Á1.0 ¤Ë¤Ä¤­Ãæ¿´Ãͤò 0 ¤Ë
      recBufp[countTick++] = mic.read() - 0.5;
      if (countTick == FFTSIZE) {
        tick.detach();
        recDone = true;
      }
    }
    
    int main() {
      recBufp = (double*)malloc(sizeof(double) * FFTSIZE);
      while (1) {
        countTick = 0;
        recDone = false;
        tick.attach(&flip, SEC_PER_SAMPLEPOINT);
        while (!recDone) {
          wait_ms(100);
        }
        doFFT(recBufp);
      }
      if (recBufp) {
        free(recBufp);
      }
      return 0;
    }
    
    

(tanabe)
klab_gijutsu2 at 17:21¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)¨¢TrackBack(0)
2017ǯ06·î15Æü

²»¤òÍøÍѤ¹¤ë 3 ¡ÁAndroid ¥Ç¥Ð¥¤¥¹¤Ç¤Î²»ÇÈÄÌ¿®¡§¼ÂÁõÊÔ¡Á

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

¤³¤Îµ­»ö¤ÎÆâÍÆ

Á°²ó¤Îµ­»ö¤Ç¤Ï Android ¥Ç¥Ð¥¤¥¹´Ö¤Ç²»ÇÈÄÌ¿®¤ò¹Ô¤¦¤¿¤á¤Î½àÈ÷¤È¤·¤Æ¼¡¤Î¤ß¤Ã¤Ä¤ÎÍ×ÁǤËÌܤò¸þ¤±¤Þ¤·¤¿¡£

º£²ó¤Ï¤³¤ì¤é¤òÁǺà¤È¤·¤Æ²»À¼¿®¹æ¤Ç¥Ó¥Ã¥È¥Ç¡¼¥¿¤òÁ÷¼õ¿®¤·¤Æ¤ß¤Þ¤¹¡£»ÍÃʳ¬¤Ëʬ¤±½ç¼¡µ¡Ç½¤ò²Ã¤¨¤Ê¤¬¤é»îºî¤ò¹Ô¤¤¤Þ¤¹¡£

2017-11-29 Äɵ­¡§
Ëܵ­»ö¤Ë·ÇºÜ¤Î¥³¡¼¥É¤Ï³«È¯»þ¤Ë Android 5.x ´Ä¶­¤ò»ÈÍѤ·¤Æ¤ª¤ê¡¢Android 6.0 °Ê¹ß¤Ç¤Ï android.permission.RECORD_AUDIO ¤Ë¤Ä¤¤¤Æ¼Â¹Ô»þ¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¼èÆÀ¤¬É¬ÍפǤ¹¡£
¤³¤Î·ï¤Ø¤ÎÂбþÎã¤È¤·¤Æ sonic01 ¤Î MainActivity.java ¤Ë¼ê¤ò²Ã¤¨¤Þ¤·¤¿¡£ ¡Êdiff¡Ë
¾¤Î¥×¥í¥¸¥§¥¯¥È¤Ë¤Ä¤¤¤Æ¤âŬµ¹²ÃÌ£¤·¤Æ²¼¤µ¤¤¡£

1. ¥Ó¥Ã¥È¥Ç¡¼¥¿¤ò²»À¼¿®¹æ¤ÇÁ÷¼õ¿®¤¹¤ë 1

ÁÛÄꤷ¤¿ÆâÍÆ

¤Þ¤ººÇ½é¤Î»îºî¤ËºÝ¤·¼¡¤ÎÆâÍƤòÁÛÄꤷ¤Þ¤·¤¿¡£

  • Á÷¿®Â¦¤ÏÁ÷¿®ÀìÍÑ¡¢¼õ¿®Â¦¤Ï¼õ¿®ÀìÍѤȤ¹¤ë
  • Á÷¿®Â¦¤ÏǤ°Õ¤Îʸ»úÎó¤ò½êÄê¤Îµ¬Â§¤Ëź¤Ã¤Æ¥µ¥¤¥óÇÈ¿®¹æ¤ËÊÑ´¹¤·¥ª¡¼¥Ç¥£¥ª½ÐÎϤ¹¤ë
  • ¼õ¿®Â¦¤Ï½¸²»Ãæ¤Ë½êÄê¤Îµ¬Â§¤Ëź¤Ã¤¿²»À¼¿®¹æ¤ò¸¡ÃΤ¹¤ë¤È¤½¤³¤«¤éʸ»úÎó¾ðÊó¤òÉü¸µ¤·²èÌ̤Ëɽ¼¨¤¹¤ë
  • ³«È¯¾å¤ÎÊص¹¤Î¤¿¤á¤Ë²ÄÄ°²»¤ò»ÈÍѤ¹¤ë

°Ê²¼¤Ë¤Ä¤¤¤Æ¤Ï¤È¤ê¤¢¤¨¤º¸å¤Þ¤ï¤·¤Ç¤¹¡£

  • ÅÁÁ÷¸úΨ
  • ¸í¤ê¤Ø¤ÎÂкö

¼þÇÈ¿ôÊÑÄ´¡ÊFSK¡Ë¤Ë¤Ä¤¤¤Æ

½êÄê¤Î¥Ç¡¼¥¿¤ò²»À¼¿®¹æ¤ËÊÑ´¹¤¹¤ë¤¿¤á¤Ë¼þÇÈ¿ôÊÑÄ´Êý¼°¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£¼¡¤Î¹Í¤¨Êý¤Ç¤¹¡£

  • ¤Õ¤¿¤Ä¤Î¼þÇÈ¿ô A, B ¤Ë 0 ¤È 1 ¤ò³ä¤êÅö¤Æ¤ë
  • ¸µ¥Ç¡¼¥¿¤Î¥Ó¥Ã¥ÈʤӤò¾åµ­ A, B ¤ËÃÖ¤­´¹¤¨¤½¤ì¤é¤ò½êÄê¤Î»þ´Ö´Ö³Ö¤ÇÀÚ¤êÂؤ¨¤ë

  • FSK - ¡ÖÄÌ¿®ÍѸì¤Î´ðÁÃÃμ±¡×¤è¤ê
    Àµ¸¹ÇȤËÂФ·¤Æ¥Ç¥£¥¸¥¿¥ë¿®¹æ¤ÇÊÑÄ´¤ò¹Ô¤Ê¤¦¤¤¤ï¤æ¤ë¥Ç¥£¥¸¥¿¥ëÊÑÄ´¤ÎÊý¼°¤Î°ì¤Ä¤Ç¡¢¥Ç¥£¥¸¥¿¥ëÃͤòÀµ¸¹ÇȤμþÇÈ¿ô¤ËÂбþ¤µ¤»¤ÆÅÁÁ÷¤¹¤ëÊý¼°¤Î¤³¤È¡£¶ñÂÎŪ¤Ë¤Ï¥Ç¥£¥¸¥¿¥ëÃͤÎ1/0¤ËÂбþ¤µ¤»¤Æ2¤Ä¤Î¼þÇÈ¿ô¤ò·è¤á¡¢ÆþÎϤµ¤ì¤ë¥Ç¥£¥¸¥¿¥ë¿®¹æ¤Ë±þ¤¸¤Æ¤½¤ì¤¾¤ì¤Î¼þÇÈ¿ô¤ÎÀµ¸¹ÇȤò¸ò¸ß¤ËÁ÷½Ð¤¹¤ë¤³¤È¤Ç¼Â¸½¤µ¤»¤ë¡£

»îºî

½èÍý¤Î¥¤¥á¡¼¥¸

¤¶¤Ã¤¯¤ê°Ê²¼¤ÎÍ×ÎΤǼÂÁõ¤ò»î¤ß¤Þ¤·¤¿¡£

  • ¼þÇÈ¿ôÊÑÄ´¤Ë¤ª¤¤¤Æ¤Ï 8000Hz ¤ò 0, 10000Hz ¤ò 1 ¤È¤·¤Æ°·¤¤ 1 ¥Ó¥Ã¥È¤¢¤¿¤ê¤Îȯ¿¶»ý³»þ´Ö¤ò 100¥ß¥êÉäȤ¹¤ë ¡Ê¤è¤Ã¤ÆÅÁÁ÷®ÅÙ¤Ï 10bps¡Ë

  • ¿®¹æ½ÐÎϤ˺ݤ·¤Æ¤Ïñ°ì¥Ð¥Ã¥Õ¥¡¾å¤Ë½ª»Ï¤Î´°·ë¤·¤¿¥Ç¡¼¥¿¤ò¹½ÃÛ¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯À¸À®ºÑ¤ß¤Î 8000Hz, 10000Hz ¿®¹æ¤òºÆÀ¸¥Ð¥Ã¥Õ¥¡¤Ë½ç¼¡Ä¾Àܽñ¤­¹þ¤à
  • º£²ó¤Ï»²¾È¤·¤Æ¤¤¤Ê¤¤¤¬ËöÈø¤Ë½ªÃ¼¤ÎÉäÃú¤È¤·¤Æ 12000Hz ¤Î¿®¹æ¤ò 1ÉôÖÉÕÍ¿¤¹¤ë
  • º¸¡§Á÷¿®Â¦¡¡±¦¡§¼õ¿®Â¦

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§ 1ʬ30Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¥½¡¼¥¹¥³¡¼¥É

Á÷¿®Â¦¡§ sonic05

  • MainActivity.java
    
    /**
     *
     * sonic05
     *
     * ʸ»úÎó¤ò¥µ¥¤¥óÇÈ¿®¹æ¤ËÃÖ¤­´¹¤¨¤Æ½ÐÎϤ¹¤ë
     * Lo -> 8000Hz, Hi -> 10000Hz
     * Âиþ¤Î¼õ¿®¥×¥í¥°¥é¥à¤Ï sonic06
     *
     */
    
    package jp.klab.sonic05;
    
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ToggleButton;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final float SEC_PER_SAMPLEPOINT = 1.0f / SAMPLE_RATE;
      private static final int AMP = 4000;
      private static final int ELMS_1SEC = SAMPLE_RATE;
      private static final int ELMS_100MSEC = SAMPLE_RATE/10;
    
      private static final int FREQ_LOW  = 8000;
      private static final int FREQ_HI  = 10000;
      private static final int FREQ_END = 12000;
    
      private static final int MSG_PLAY_START   = 120;
      private static final int MSG_PLAY_END   = 130;
    
      private static final byte [] BITS = new byte [] {
          (byte)0x80, (byte)0x40, (byte)0x20, (byte)0x10,
          (byte)0x08, (byte)0x04, (byte)0x02, (byte)0x01};
    
      private Handler mHandler;
      private AudioTrack mAudioTrack = null;
      private ToggleButton mButton01;
      private EditText mEditText01;
      private short mPlayBuf1[];
      private short mPlayBuf2[];
      private short mPlayBuf3[];
      private String mText;
    
      // ¥µ¥¤¥óÇȥǡ¼¥¿¤òÀ¸À®
      private void createSineWave(short[] buf, int freq, int amplitude, boolean doClear) {
        if (doClear) {
          Arrays.fill(buf, (short) 0);
        }
        for (int i = 0; i < ELMS_1SEC; i++) {
          float currentSec = i * SEC_PER_SAMPLEPOINT; // ¸½ºß°ÌÃ֤ηвáÉÿô
          double val = amplitude * Math.sin(2.0 * Math.PI * freq * currentSec);
          buf[i] += (short)val;
        }
      }
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mButton01 = (ToggleButton)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mEditText01 = (EditText)findViewById(R.id.editText01);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
    
        mPlayBuf1 = new short[ELMS_1SEC];
        mPlayBuf2 = new short[ELMS_1SEC];
        mPlayBuf3 = new short[ELMS_1SEC];
        createSineWave(mPlayBuf1, FREQ_LOW, AMP, true); // Low
        createSineWave(mPlayBuf2, FREQ_HI,  AMP, true); // Hi
        createSineWave(mPlayBuf3, FREQ_END, AMP, true); // END
    
        // ºÆÀ¸ÍÑ
        mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes,
                        AudioTrack.MODE_STREAM);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioTrack != null) {
          if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioTrack");
            mAudioTrack.stop();
            mAudioTrack.flush();
          }
          mAudioTrack = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
          mAudioTrack.stop();
          mAudioTrack.flush();
        }
        if (mButton01.isChecked()) {
          mText = mEditText01.getText().toString();
          if (mText.length() > 0) {
            new Thread(this).start();
          } else {
            mButton01.setChecked(false);
          }
        }
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_PLAY_START:
            Log.d(TAG, "MSG_PLAY_START");
            break;
          case MSG_PLAY_END:
            Log.d(TAG, "MSG_PLAY_END");
            mButton01.setChecked(false);
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        mHandler.sendEmptyMessage(MSG_PLAY_START);
        byte[] strByte = null;
        try {
          strByte = mText.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
        }
        mAudioTrack.play();
        for (int i = 0; i < strByte.length; i++) {
          valueToWave(strByte[i]);
        }
        valueToWave((byte) 0x20); // ¥À¥ß¡¼
        mAudioTrack.write(mPlayBuf3, 0, ELMS_1SEC); // ½ªÃ¼
    
        mAudioTrack.stop();
        mAudioTrack.flush();
        mHandler.sendEmptyMessage(MSG_PLAY_END);
      }
    
      // »ØÄꤵ¤ì¤¿¥Ð¥¤¥ÈÃͤò²»À¼¿®¹æ¤ËÃÖ¤­´¹¤¨¤ÆºÆÀ¸¤¹¤ë
      private void valueToWave(byte val) {
        for (int i = 0; i < BITS.length; i++) {
          // ¥Ó¥Ã¥È¤´¤È¤Ë Hi, Low ¤ò½ÐÎÏ
          mAudioTrack.write(((val & BITS[i]) != 0) ? mPlayBuf2 : mPlayBuf1, 0, ELMS_100MSEC);
        }
      }
    }
    
    

¼õ¿®Â¦¡§ sonic06

  • MainActivity.java
    
    /**
     *
     * sonic06
     *
     * üËö¤Î¥Þ¥¤¥¯¤«¤é½¸²»¤·¤¿¿®¹æ¤ò¥Ð¥¤¥È¥Ç¡¼¥¿¤ËÊÑ´¹¤¹¤ë
     * Lo -> 8000Hz, Hi -> 10000Hz
     * FFT ½èÍý¤Ë JTransforms ¥é¥¤¥Ö¥é¥ê¤òÍøÍÑ
     * Âиþ¤ÎÁ÷¿®¥×¥í¥°¥é¥à¤Ï sonic05
     *
     */
    
    package jp.klab.sonic06;
    
    
    import org.jtransforms.fft.DoubleFFT_1D;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.io.UnsupportedEncodingException;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final short THRESHOLD_SILENCE = 0x00ff;
      private static final int FREQ_LOW =  8000;
      private static final int FREQ_HI  = 10000;
    
      private static final int MSG_RECORD_START = 100;
      private static final int MSG_RECORD_END   = 110;
      private static final int MSG_DATA_RECV  = 130;
    
      private static final byte [] BITS = new byte [] {
          (byte)0x80, (byte)0x40, (byte)0x20, (byte)0x10,
          (byte)0x08, (byte)0x04, (byte)0x02, (byte)0x01};
    
      private Handler mHandler;
      private AudioRecord mAudioRecord = null;
    
      private Button mButton01;
      private TextView mTextView02;
    
      private boolean mInRecording = false;
      private boolean mStop = false;
      private int mBufferSizeInShort;
    
      private short mRecordBuf[];
      private short mTestBuf[];
      private DoubleFFT_1D mFFT;
      private double mFFTBuffer[];
      private int mFFTSize;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        mButton01 = (Button)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mTextView02 = (TextView)findViewById(R.id.textView02);
        mTextView02.setOnClickListener(this);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
    
        mBufferSizeInShort = bufferSizeInBytes / 2;
        // Ï¿²»ÍѥХåե¡
        mRecordBuf = new short[mBufferSizeInShort];
    
        // FFT ½èÍýÍÑ
        mTestBuf =  new short[SAMPLE_RATE/10]; // 100msec
        mFFTSize = mBufferSizeInShort;
        mFFT = new DoubleFFT_1D(mFFTSize);
        mFFTBuffer = new double[mFFTSize];
    
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        mStop = true;
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioRecord != null) {
          if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioRecord");
            mAudioRecord.stop();
          }
          mAudioRecord = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (v == (View)mButton01) {
          // ½¸²»³«»Ï or ½ªÎ»
          if (!mInRecording) {
            mInRecording = true;
            new Thread(this).start();
          } else {
            mInRecording = false;
          }
        } else if (v == (View)mTextView02) {
          // ɽ¼¨¥Ç¡¼¥¿¤ò¥¯¥ê¥¢
          mTextView02.setText("");
        }
        return;
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_RECORD_START:
            Log.d(TAG, "MSG_RECORD_START");
            mButton01.setText("STOP");
            break;
          case MSG_RECORD_END:
            Log.d(TAG, "MSG_RECORD_END");
            mButton01.setText("START");
            break;
          case MSG_DATA_RECV:
            //Log.d(TAG, "MSG_DATA_RECV");
            byte[] ch = new byte[] {(byte)msg.arg1};
            try {
              // ¼õ¿®¥Ç¡¼¥¿¤òɽ¼¨
              String s = new String(ch, "UTF-8");
              s = mTextView02.getText() + s;
              mTextView02.setText(s);
            } catch (UnsupportedEncodingException e) {
            }
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        int dataCount = 0;
        int bitCount = 0;
        byte val = 0;
        boolean bSilence = false;
        mHandler.sendEmptyMessage(MSG_RECORD_START);
        // ½¸²»³«»Ï
        mAudioRecord.startRecording();
        while (mInRecording && !mStop) {
          // ²»À¼¥Ç¡¼¥¿Æɤ߹þ¤ß
          mAudioRecord.read(mRecordBuf, 0, mBufferSizeInShort);
          bSilence = true;
          for (int i = 0; i < mBufferSizeInShort; i++) {
            short s = mRecordBuf[i];
            if (s > THRESHOLD_SILENCE) {
              bSilence = false;
            }
          }
          if (bSilence) { // Àżä
            dataCount = bitCount = 0;
            continue;
          }
          int copyLength = 0;
          // ¥Ç¡¼¥¿¤ò mTestBuf ¤Ø½ç¼¡¥¢¥Ú¥ó¥É
          if (dataCount < mTestBuf.length) {
            // mTestBuf ¤Î»ÄÎΰè¤Ë±þ¤¸¤Æ¥³¥Ô¡¼¤¹¤ë¥µ¥¤¥º¤ò·èÄê
            int remain = mTestBuf.length - dataCount;
            if (remain > mBufferSizeInShort) {
              copyLength = mBufferSizeInShort;
            } else {
              copyLength = remain;
            }
            System.arraycopy(mRecordBuf, 0, mTestBuf, dataCount, copyLength);
            dataCount += copyLength;
          }
          if (dataCount >= mTestBuf.length) {
            byte ret = doFFT(mTestBuf);
            //Log.d(TAG, "ret=" + ret);
            if (ret == -1) { // FREQ_LOW, FREQ_HI °Ê³°¤Î¼þÇÈ¿ô¤Î¾ì¹ç
              dataCount = bitCount = 0;
              continue;
            } else {
              // ¥Ð¥¤¥È¥Ç¡¼¥¿¤ò½ç¼¡¹½À®
              if (bitCount == 0) {
                val = 0;
              }
              val |= (ret == 1) ? BITS[bitCount] : 0;
              if (bitCount < 7) {
                bitCount++;
              } else { // 1¥Ð¥¤¥Èʬ´°Î»
                bitCount = 0;
                Message msg = new Message();
                msg.what = MSG_DATA_RECV;
                msg.arg1 = (int) val;
                mHandler.sendMessage(msg);
              }
            }
            dataCount = 0;
            // mRecordBuf ¤ÎÅÓÃæ¤Þ¤Ç¤ò mTestBuf ¤Ø¥³¥Ô¡¼¤·¤Æ FFT ¤·¤¿¾ì¹ç¤Ï
            // mRecordBuf ¤Î»Ä¥Ç¡¼¥¿¤ò mTestBuf ÀèƬ¤Ø¥³¥Ô¡¼¤·¤¿¾å¤Ç·Ñ³
            if (copyLength < mBufferSizeInShort) {
              int startPos = copyLength;
              copyLength = mBufferSizeInShort - copyLength;
              System.arraycopy(mRecordBuf, startPos, mTestBuf, 0, copyLength);
              dataCount += copyLength;
            }
          }
        }
        // Ï¿²»½ªÎ»
        mAudioRecord.stop();
        mHandler.sendEmptyMessage(MSG_RECORD_END);
      }
    
      private byte doFFT(short[] data) {
        for (int i = 0; i < mFFTSize; i++) {
          mFFTBuffer[i] = (double)data[i];
        }
        mFFT.realForward(mFFTBuffer);
    
        // ½èÍý·ë²Ì¤ÎÊ£ÁÇ¿ôÇÛÎ󤫤é¥Ô¡¼¥¯¼þÇÈ¿ôÀ®Ê¬¤ÎÍ×ÁÇÈÖ¹æ¤òÆÀ¤ë
        double maxAmp = 0;
        int index = 0;
        for (int i = 0; i < mFFTSize/2; i++) {
          double a = mFFTBuffer[i*2]; // ¼ÂÉô
          double b = mFFTBuffer[i*2 + 1]; // µõÉô
          // a+ib ¤ÎÀäÂÐÃÍ ¢å a^2 + b^2 = r ¤¬¿¶ÉýÃÍ
          double r = Math.sqrt(a*a + b*b);
          if (r > maxAmp) {
            maxAmp = r;
            index = i;
          }
        }
        // ¥Ô¡¼¥¯¼þÇÈ¿ô¤òµá¤á¤ë
        int freq = index * SAMPLE_RATE / mFFTSize;
        return (byte)((freq == FREQ_LOW) ? 0 : (freq == FREQ_HI) ? 1 : -1);
      }
    }
    
    

¼þÇÈ¿ôÀÚ¤êÂؤ¨²Õ½ê¤ÎÇÈ·Á¤ò¸«¤ë

¿®¹æÃæ¤Î Lo¡Ê8000Hz¡Ë¤«¤é Hi¡Ê10000Hz¡Ë¡¢Hi ¤«¤é Lo ¤Ø¤ÎÀÚ¤êÂؤ¨Éôʬ¤ÎÇÈ·Á¤Î³Îǧ¤ò¹Ô¤¤¤Þ¤·¤¿¡£

Lo, Hi ¤È¤â¤Ë 10 ¤Ç³ä¤êÀÚ¤ì¤ë¼þÇÈ¿ô¤Ê¤Î¤Ç¡¢ÀèƬ¤«¤é 100¥ß¥êÉøå¤Î°ÌÃ֤Ǥα¿Æ°±ß¾å¤Î Y ºÂɸ¤Ï 1Éøå¤Î°ÌÃÖ¤ÈÅù¤·¤¯ 0 ¤Ç¤¢¤ê¡¢¤½¤³¤ËƱ¤¸¤¯ Y=0 »Ï¤Þ¤ê¤ÎÊ̤μþ´ü¤Î¥µ¥¤¥óÇȤòÀܹ礷¤Æ¤â°ÌÁê¤ÎÉÔϢ³¤ÏȯÀ¸¤·¤Ê¤¤¤Ï¤º¤Ç¤¹¡£ ¡Ê¤¿¤À¤·¼þ´ü¤Î°ã¤¤¤¬·Ñ¤®ÌÜÁ°¸å¤Î¥«¡¼¥Ö¤Î·Á¾õ¤Î°ã¤¤¤È¤·¤Æɽ¤ì¤ë¤¿¤áÇÈ·Á¤È¤·¤Æ´°àú¤Ç¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¡Ë

°Ê²¼¤ÏÁ÷¿®Â¦¥¢¥×¥ê¤«¤é¤Î¿®¹æ½ÐÎϤò PC ¤ËÀܳ¤·¤¿¥Þ¥¤¥¯¤«¤é¼è¤ê¹þ¤ó¤À Audacity ¤Î¥¹¥¯¥ê¡¼¥ó¥·¥ç¥Ã¥È¤Ç¤¹¡£

Lo -> Hi Éôʬ¤Î¥º¡¼¥à

¸å³¤Î Hi -> Lo Éôʬ¤òƱÍͤ˥º¡¼¥à

2. ¥Ó¥Ã¥È¥Ç¡¼¥¿¤ò²»À¼¿®¹æ¤ÇÁ÷¼õ¿®¤¹¤ë 2

¾å¤ÎºÇ½é¤Î»îºî¤Ç¤Ï¤Þ¤º²»¤Ë¤è¤ë¥Ç¡¼¥¿¤ÎÁ÷¼õ¿®¼«ÂΤ¬²Äǽ¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤·¤¿¤¬¡¢Æ°ºî¤¬ÉÔ°ÂÄê¤Ç²¿¤è¤êÄÌ¿®¤ÎÃÙ¤µ¤¬ÌܤˤĤ­¤Þ¤¹¡£¤³¤ÎÅÀ¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Æ¤ß¤Þ¤¹¡£

ÅÁÁ÷¸úΨ²þÁ±¤Î¹Í¤¨Êý

¸úΨ¤ò²þÁ±¤¹¤ë¤¿¤á¤ËÅÁ㤹¤ë¾ðÊó¤ÎÆâÍƤ˼ê¤ò²Ã¤¨¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£1¥Ð¥¤¥Èʬ¤Î¥­¥ã¥é¥¯¥¿¥Ç¡¼¥¿¤ò¥Ó¥Ã¥È¤´¤È¤Ë 0,1 ¤òɽ¤ï¤¹¤Õ¤¿¤Ä¤Î¼þÇÈ¿ô¤ÎÇȤÎÍåÎó¤Çɽ¸½¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢256¼ïÎà¤Î¼þÇÈ¿ô¤òÍѤ¤¤ÆľÀÜ 0x00 ¡Á 0xFF ¤òɽ¸½¤¹¤ë·Á¤Ë¤¹¤ì¤ÐÍýÏÀ¾åÅÁÁ÷¸úΨ¤¬ 8Çܸþ¾å¤¹¤ë¤Ï¤º¤Ç¤¹¡£¤³¤ì¤ò¶ñÂ⽤·¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤¹¡£

»îºî

½èÍý¤Î¥¤¥á¡¼¥¸

°Ê²¼¤ÎÍ×ÎΤǼÂÁõ¤ò¹Ô¤¤¤Þ¤·¤¿¡£

  • Á÷¿®Â¦¤Ï¥Ð¥¤¥ÈÃÍ 0x00 ¡Á 0xFF ¤ò 400Hz ¡Á 5500Hz ¤Î 20Hz ¹ï¤ß¤Î 256 ¥Ñ¥¿¡¼¥ó¤Î¼þÇÈ¿ô¤«¤éÀ®¤ë²»À¼¿®¹æ¤ËÊÑÄ´¤¹¤ë
  • ¼õ¿®Â¦¤Ï¡Ö¡Ê¸¡ÃΤ·¤¿¥Ô¡¼¥¯¼þÇÈ¿ô - 400¡Ë/ 20¡×¤ÎÊ¿°×¤Ê·×»»¤Ç¸µ¤Î¥Ð¥¤¥ÈÃͤØÉü¹æ¤¹¤ë
  • ¥¢¥×¥ê¤Î UI ¤ÏºÇ½é¤Î»îºî¤ÈƱ¤¸

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§ 1ʬ¡¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¥½¡¼¥¹¥³¡¼¥É

Á÷¿®Â¦¡§ sonic07     GitHub

  • MainActivity.java
    /**
     * sonic07
     *
     * ʸ»úÎó¤ò¥µ¥¤¥óÇÈ¿®¹æ¤ËÃÖ¤­´¹¤¨¤Æ½ÐÎϤ¹¤ë
     * ÅÁÁ÷¸úΨ²þÁ±ÈÇ
     * Âиþ¤Î¼õ¿®¥×¥í¥°¥é¥à¤Ï sonic08
     *
     */
    
    package jp.klab.sonic07;
    
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ToggleButton;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final float SEC_PER_SAMPLEPOINT = 1.0f / SAMPLE_RATE;
      private static final int AMP = 4000;
      private static final int FREQ_BASE = 400;
      private static final int FREQ_STEP = 20;
      private static final int FREQ_KEY = 300;
      private static final int ELMS_1SEC = SAMPLE_RATE;
      private static final int ELMS_100MSEC = SAMPLE_RATE/10;
      private static final int ELMS_MAX = 256;
    
      private static final int MSG_PLAY_START   = 120;
      private static final int MSG_PLAY_END   = 130;
    
      private Handler mHandler;
      private AudioTrack mAudioTrack = null;
      private ToggleButton mButton01;
      private EditText mEditText01;
      private short mPlayBuf[] = new short[SAMPLE_RATE];
      private short mSignals[][] = new short[ELMS_MAX][SAMPLE_RATE/10];
      private String mText;
    
      // ¥µ¥¤¥óÇȥǡ¼¥¿¤òÀ¸À®
      private void createSineWave(short[] buf, int freq, int amplitude, boolean doClear) {
        if (doClear) {
          Arrays.fill(buf, (short) 0);
        }
        for (int i = 0; i < buf.length; i++) {
          float currentSec = i * SEC_PER_SAMPLEPOINT; // ¸½ºß°ÌÃ֤ηвáÉÿô
          double val = amplitude * Math.sin(2.0 * Math.PI * freq * currentSec);
          buf[i] += (short)val;
        }
      }
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mButton01 = (ToggleButton)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mEditText01 = (EditText)findViewById(R.id.editText01);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
    
        // ÀèƬ¡¦½ªÃ¼¤ÎÌÜ°õÍÑ¿®¹æ¥Ç¡¼¥¿
        createSineWave(mPlayBuf, FREQ_KEY, AMP, true);
    
        // 256¼ïÎà¤Î¿®¹æ¥Ç¡¼¥¿¤òÀ¸À®
        for (int i = 0; i < ELMS_MAX; i++) {
          createSineWave(mSignals[i], (short) (FREQ_BASE + FREQ_STEP*i), AMP, true);
        }
    
        // ºÆÀ¸ÍÑ
        mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes,
                        AudioTrack.MODE_STREAM);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioTrack != null) {
          if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioTrack");
            mAudioTrack.stop();
            mAudioTrack.flush();
          }
          mAudioTrack = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
          mAudioTrack.stop();
          mAudioTrack.flush();
        }
        if (mButton01.isChecked()) {
          mText = mEditText01.getText().toString();
          if (mText.length() > 0) {
            new Thread(this).start();
          } else {
            mButton01.setChecked(false);
          }
        }
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_PLAY_START:
            Log.d(TAG, "MSG_PLAY_START");
            break;
          case MSG_PLAY_END:
            Log.d(TAG, "MSG_PLAY_END");
            mButton01.setChecked(false);
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        mHandler.sendEmptyMessage(MSG_PLAY_START);
        byte[] strByte = null;
        try {
          strByte = mText.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
        }
        mAudioTrack.play();
        mAudioTrack.write(mPlayBuf, 0, ELMS_1SEC); // ³«»Ï
        for (int i = 0; i < strByte.length; i++) {
          valueToWave(strByte[i]);
        }
        mAudioTrack.write(mPlayBuf, 0, ELMS_1SEC); // ½ªÃ¼
    
        mAudioTrack.stop();
        mAudioTrack.flush();
        mHandler.sendEmptyMessage(MSG_PLAY_END);
      }
    
      // »ØÄꤵ¤ì¤¿¥Ð¥¤¥ÈÃͤò²»À¼¿®¹æ¤ËÃÖ¤­´¹¤¨¤ÆºÆÀ¸¤¹¤ë
      private void valueToWave(byte val) {
        mAudioTrack.write(mSignals[val], 0, ELMS_100MSEC);
      }
    }
    
    
    

¼õ¿®Â¦¡§ sonic08     GitHub

  • MainActivity.java
    
    /**
     * sonic08
     *
     * üËö¤Î¥Þ¥¤¥¯¤«¤é½¸²»¤·¤¿¿®¹æ¤ò¥Ð¥¤¥È¥Ç¡¼¥¿¤ËÊÑ´¹¤¹¤ë
     * ÅÁÁ÷¸úΨ²þÁ±ÈÇ
     * FFT ½èÍý¤Ë JTransforms ¥é¥¤¥Ö¥é¥ê¤òÍøÍÑ
     * Âиþ¤ÎÁ÷¿®¥×¥í¥°¥é¥à¤Ï sonic07
     *
     */
    
    package jp.klab.sonic08;
    
    import org.jtransforms.fft.DoubleFFT_1D;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.io.UnsupportedEncodingException;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final short THRESHOLD_SILENCE = 0x00ff;
      private static final int FREQ_BASE = 400;
      private static final int FREQ_STEP = 20;
      private static final int FREQ_MAX = 400 + 255 * 20;
      private static final int UNITSIZE = SAMPLE_RATE/10; // 100msecʬ
    
      private static final int MSG_RECORD_START = 100;
      private static final int MSG_RECORD_END   = 110;
      private static final int MSG_DATA_RECV  = 120;
    
      private Handler mHandler;
      private AudioRecord mAudioRecord = null;
    
      private Button mButton01;
      private TextView mTextView02;
    
      private boolean mInRecording = false;
      private boolean mStop = false;
      private int mBufferSizeInShort;
    
      private short mRecordBuf[];
      private short mTestBuf[];
      private DoubleFFT_1D mFFT;
      private double mFFTBuffer[];
      private int mFFTSize;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        mButton01 = (Button)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mTextView02 = (TextView)findViewById(R.id.textView02);
        mTextView02.setOnClickListener(this);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
    
        mBufferSizeInShort = bufferSizeInBytes / 2;
        // ½¸²»ÍѥХåե¡
        mRecordBuf = new short[mBufferSizeInShort];
    
        // FFT ½èÍýÍÑ
        mTestBuf =  new short[UNITSIZE];
        mFFTSize = UNITSIZE;
        mFFT = new DoubleFFT_1D(mFFTSize);
        mFFTBuffer = new double[mFFTSize];
    
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        mStop = true;
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioRecord != null) {
          if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioRecord");
            mAudioRecord.stop();
          }
          mAudioRecord = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (v == (View)mButton01) {
          // ½¸²»³«»Ï or ½ªÎ»
          if (!mInRecording) {
            mInRecording = true;
            new Thread(this).start();
          } else {
            mInRecording = false;
          }
        } else if (v == (View)mTextView02) {
          // ɽ¼¨¥Ç¡¼¥¿¤ò¥¯¥ê¥¢
          mTextView02.setText("");
        }
        return;
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_RECORD_START:
            Log.d(TAG, "MSG_RECORD_START");
            mButton01.setText("STOP");
            break;
          case MSG_RECORD_END:
            Log.d(TAG, "MSG_RECORD_END");
            mButton01.setText("START");
            break;
          case MSG_DATA_RECV:
            //Log.d(TAG, "MSG_DATA_RECV");
            byte[] ch = new byte[] {(byte)msg.arg1};
            try {
              // ¼õ¿®¥Ç¡¼¥¿¤òɽ¼¨
              String s = new String(ch, "UTF-8");
              s = mTextView02.getText() + s;
              mTextView02.setText(s);
            } catch (UnsupportedEncodingException e) {
            }
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        int dataCount = 0;
        boolean bSilence = false;
        mHandler.sendEmptyMessage(MSG_RECORD_START);
        // ½¸²»³«»Ï
        mAudioRecord.startRecording();
        while (mInRecording && !mStop) {
          // ²»À¼¥Ç¡¼¥¿Æɤ߹þ¤ß
          mAudioRecord.read(mRecordBuf, 0, mBufferSizeInShort);
          bSilence = true;
          for (int i = 0; i < mBufferSizeInShort; i++) {
            short s = mRecordBuf[i];
            if (s > THRESHOLD_SILENCE) {
              bSilence = false;
            }
          }
          if (bSilence) { // Àżä
            dataCount = 0;
            continue;
          }
          int copyLength = 0;
          // ¥Ç¡¼¥¿¤ò mTestBuf ¤Ø½ç¼¡¥¢¥Ú¥ó¥É
          if (dataCount < mTestBuf.length) {
            // mTestBuf ¤Î»ÄÎΰè¤Ë±þ¤¸¤Æ¥³¥Ô¡¼¤¹¤ë¥µ¥¤¥º¤ò·èÄê
            int remain = mTestBuf.length - dataCount;
            if (remain > mBufferSizeInShort) {
              copyLength = mBufferSizeInShort;
            } else {
              copyLength = remain;
            }
            System.arraycopy(mRecordBuf, 0, mTestBuf, dataCount, copyLength);
            dataCount += copyLength;
          }
          if (dataCount >= mTestBuf.length) {
            // 100ms ʬί¤Þ¤Ã¤¿¤é FFT ¤Ë¤«¤±¤ë
            int freq = doFFT(mTestBuf);
            // ÂԤäƤ¿ÈϰϤμþÇÈ¿ô¤«¥Á¥§¥Ã¥¯
            if (freq >= FREQ_BASE && freq <= FREQ_MAX) {
              int val = (int) ((freq - FREQ_BASE) / FREQ_STEP);
              if (val >= 0 && val <= 255) {
                Message msg = new Message();
                msg.what = MSG_DATA_RECV;
                msg.arg1 = val;
                mHandler.sendMessage(msg);
              } else {
                freq = -1;
              }
            } else {
              freq = -1;
            }
            dataCount = 0;
            if (freq == -1) {
              continue;
            }
            // mRecordBuf ¤ÎÅÓÃæ¤Þ¤Ç¤ò mTestBuf ¤Ø¥³¥Ô¡¼¤·¤Æ FFT ¤·¤¿¾ì¹ç¤Ï
            // mRecordBuf ¤Î»Ä¥Ç¡¼¥¿¤ò mTestBuf ÀèƬ¤Ø¥³¥Ô¡¼¤·¤¿¾å¤Ç·Ñ³
            if (copyLength < mBufferSizeInShort) {
              int startPos = copyLength;
              copyLength = mBufferSizeInShort - copyLength;
              System.arraycopy(mRecordBuf, startPos, mTestBuf, 0, copyLength);
              dataCount += copyLength;
            }
          }
        }
        // ½¸²»½ªÎ»
        mAudioRecord.stop();
        mHandler.sendEmptyMessage(MSG_RECORD_END);
      }
    
      private int doFFT(short[] data) {
        for (int i = 0; i < mFFTSize; i++) {
          mFFTBuffer[i] = (double)data[i];
        }
        // FFT ¼Â¹Ô
        mFFT.realForward(mFFTBuffer);
    
        // ½èÍý·ë²Ì¤ÎÊ£ÁÇ¿ôÇÛÎ󤫤é¥Ô¡¼¥¯¼þÇÈ¿ôÀ®Ê¬¤ÎÍ×ÁÇÈÖ¹æ¤òÆÀ¤ë
        double maxAmp = 0;
        int index = 0;
        for (int i = 0; i < mFFTSize/2; i++) {
          double a = mFFTBuffer[i*2]; // ¼ÂÉô
          double b = mFFTBuffer[i*2 + 1]; // µõÉô
          // a+ib ¤ÎÀäÂÐÃÍ ¢å a^2 + b^2 = r ¤¬¿¶ÉýÃÍ
          double r = Math.sqrt(a*a + b*b);
          if (r > maxAmp) {
            maxAmp = r;
            index = i;
          }
        }
        // ¥Ô¡¼¥¯¼þÇÈ¿ô¤òµá¤á¤ë
        int freq = index * SAMPLE_RATE / mFFTSize;
        //Log.d(TAG, "peak=" + freq + "Hz");
        return freq;
      }
    }
    
    

3. ¥Ó¥Ã¥È¥Ç¡¼¥¿¤ò²»À¼¿®¹æ¤ÇÁ÷¼õ¿®¤¹¤ë 3

ÅÁÁ÷¸úΨ¤Î²þÁ±¤Ë³¤­¡¢¼¡¤ÎÍ×ÁǤËÌܤò¸þ¤±¤Æ¤ß¤Þ¤¹¡£

  • ¸í¤êȯÀ¸¤Ø¤ÎÂнè
  • Ķ²»ÇȤÎÍøÍÑ

¸í¤êȯÀ¸¤Ø¤ÎÂнè¤Ë¤Ä¤¤¤Æ

¾¤ÎÄÌ¿®ÊýË¡¤ÈƱÍͤˡ¢²»ÇȤˤè¤ëÄÌ¿®¤Ë¤ª¤¤¤Æ¤âÁ÷¼õ¿®¤ÎºÝ¤Ë²¿¤é¤«¤ÎÍýͳ¤Ç¥Ç¡¼¥¿¤Ë¸í¤ê¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÌäÂê¤Ø¤ÎÂнè¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Æ¤ß¤Þ¤¹¡£

¤Þ¤º¸í¤ê¤ò¸¡½Ð²Äǽ¤Ç¤¢¤ë¤³¤È¡¢¤µ¤é¤Ë¡¢¼«Æ°Åª¤Ë¥Ç¡¼¥¿¤òÄûÀµ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ì¤ÐÍýÁÛŪ¤Ç¤·¤ç¤¦¡£¤·¤«¤·¤Ê¤¬¤é¡¢¸í¤êÄûÀµ¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¤Ï²¿¤é¤«¤Î·Á¤Ç¥Ç¡¼¥¿¤Î¾éĹ²½¤¬É¬¿Ü¤È¤Ê¤êɬÁ³Åª¤ËÅÁÁ÷¸úΨ¤È¤Î¥È¥ì¡¼¥É¥ª¥Õ¤È¤Ê¤ê¤Þ¤¹¡£¾éĹ²½¤µ¤ì¤¿¤è¤êÂ礭¤Ê¥Ç¡¼¥¿¤ò¼ø¼õ¤¹¤ë¤³¤È¤Ç¼«Æ°ÄûÀµ¼Â¸½¤Î²ÄǽÀ­¸þ¾å¤òÁªÂò¤¹¤Ù¤­¤«¡©¤¢¤ë¤¤¤Ï¡¢¸í¤ê̵ͭȽÄê¤Î¤ß¤ò²Äǽ¤È¤¹¤ë¥¹¥ê¥à¤Ê¥Ç¡¼¥¿¤òû»þ´Ö¤Ç¼ø¼õ¤¹¤ë¤³¤È¤ò»Ý¤È¤¹¤ë¤«¡©

¤¿¤È¤¨¤Ð¡¢¥×¥é¥¤¥Ù¡¼¥È¤Ê´Ä¶­¤Ç¤Î²»ÇÈÄÌ¿®¤Î±þÍѤòÁÛÄꤹ¤ë¤È¡¢¥¨¥é¡¼È¯À¸¤Ëµ¤¤Å¤¤¤¿ÍøÍѼԤ¬¼«È¯Åª¤ËÁ÷¼õ¿®¤òºÆ»î¹Ô¤¹¤ë¤Î¤Ï¤´¤¯ÉáÄ̤μ«Á³¤Êή¤ì¤Ç¤¹¡£¤³¤Î¾ìÌ̤ǤÏÄûÀµµ¡Ç½¤è¤ê¤â¤¹¤ß¤ä¤«¤ËÄÌ¿®¤¬¹Ô¤ï¤ì¤ë¤³¤È¤Î¤Û¤¦¤¬µá¤á¤é¤ì¤ë¤Ç¤·¤ç¤¦¡£¤Þ¤¿¡¢¥Ñ¥Ö¥ê¥Ã¥¯¤Ê¶õ´Ö¤Ç¤Î¥Ó¡¼¥³¥ó·Ï¥µ¡¼¥Ó¥¹¤Ë¤ª¤¤¤Æ¤ÏÁ÷¤ê¼ê¤¬Æ±°ì¤Î¾ðÊó¤ò½êÄê¤Î´ü´Ö²¿Å٤ⷫ¤êÊÖ¤·È¯¿®¤¹¤ë¡Ê¤½¤ì¤â¤Þ¤¿Ã±Êý¸þÄÌ¿®¤Ç¤¢¤ë¤³¤È¤Ëµ¯°ø¡Ë¤³¤È¤¬°ìÈÌŪ¤Ê¤Î¤Ç¼õ¤±¼ê¤Ë¤Ï¾ðÊó¼èÆÀ¤ËÀ®¸ù¤¹¤ë¤Þ¤Ç²¿ÅÙ¤â¥Á¥ã¥ó¥¹¤¬Ä󶡤µ¤ì¤Þ¤¹¡£

¤³¤Î¤è¤¦¤Ë¹Í¤¨¤ë¤È¡¢¤³¤³¤Ç¤Ï¸í¤êÄûÀµ¤Î¤¿¤á¤Îµ¡¹½¤Ï¸½ºß¤ÎÏÃÂê¤ËÉԲķç¤ÎÍ×ÁǤǤϤʤ¯¡¢¤à¤·¤í¸í¤ê¤Î¸¡½Ð¤Þ¤Ç¤¬½ÅÍפǤ¢¤ë¤³¤È¤¬¸«¤¨¤Æ¤­¤Þ¤¹¡£

Ķ²»ÇȤÎÍøÍѤˤĤ¤¤Æ

¤³¤³¤Þ¤Ç¤Î»îºî¤Ç¤Ï³«È¯¾å¤ÎÊص¹¤«¤é²ÄÄ°²»°è¤Î¿®¹æ¤ÇÄÌ¿®¤ò¹Ô¤Ã¤Æ¤­¤Þ¤·¤¿¡£

¡Ö²»¤òÍøÍѤ¹¤ë 1¡×ËÁƬ¤Î¡Ö¤Ï¤¸¤á¤Ë¡×¤Î¹à¤Ç¤â¿¨¤ì¤¿¤è¤¦¤Ë¡¢²»À¼¿®¹æ¤òÍøÍѤ¹¤ëºÝ¤Î²»°è¤ÎÁªÄê¤Ï´Ä¶­¤ä»ÈÅӤȤΤ«¤Í¤¢¤¤¤Ë¤è¤Ã¤Æñ¤ËŬºàŬ½ê¤ÇȽÃǤµ¤ì¤ë¤Ù¤­¤Ï¤º¤Î¤â¤Î¤Ç¤¹¤¬¡¢¤½¤Î¤³¤È¤È¤Ï¤¢¤Þ¤ê´Ø·¸¤Ê¤¯ÍΤÎÅìÀ¾¤òÌä¤ï¤º¡ÖĶ²»ÇȡסÖUltrasonic¡×¤Ï¿Íµ¤¤¬¤¢¤ê¤Þ¤¹¤Í¡£¤½¤í¤½¤í¤³¤Î¤¢¤¿¤ê¤Ç½¾Íè¤Î²ÄÄ°²»¤Ë²Ã¤¨Ä¶²»ÇȤⰷ¤Ã¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤¹¡£

»îºî

½èÍý¤Î¥¤¥á¡¼¥¸

°Ê²¼¤ÎÍ×ÎΤǼÂÁõ¤ò¹Ô¤¤¤Þ¤·¤¿¡£

²ÄÄ°²»¥â¡¼¥É¤ÈĶ²»Çȥ⡼¥É

¡ÖĶ²»Çȥ⡼¥É¡×¤òÄɲá£

  • Á÷¿®Â¦¤Ï½êÄê¤Î¥Ð¥¤¥ÈÃÍ 0x00 ¡Á 0xFF ¤ò°Ê²¼¤Î¼þÇÈ¿ô°è¤Ç¹½À®¤µ¤ì¤ë²»À¼¿®¹æ¤ËÊÑÄ´¤¹¤ë
    ¡ÊÁ°¹à¤Î¤Õ¤¿¤Ä¤á¤Î»îºî¤Ç¤Ï 20Hz¹ï¤ß¤È¤·¤¿¤¬ 10Hz¹ï¤ß¤Ç¤âÀ­Ç½¾å¤Î»Ù¾ã¤¬¸«¤é¤ì¤Ê¤¤¤¿¤áÂÓ°èÉý¤òÀáÌó¡Ë
    • ²ÄÄ°²»¥â¡¼¥É¡§500Hz ¡Á 3050Hz¡Ê10Hz ¹ï¤ß¡Ë
    • Ķ²»Çȥ⡼¥É¡§14000Hz ¡Á 16550Hz¡Ê10Hz ¹ï¤ß¡Ë

ÀèüÉäÃú¤È½ªÃ¼ÉäÃú

ȯ¿®¤¹¤ë²»À¼¿®¹æ¤ÎÀèƬ¤È½ªÃ¼¤ËÌÜ°õ¤È¤·¤Æ¾å¿Þ¤ÎÈϰϤ˴ޤޤì¤Ê¤¤½êÄê¤Î¼þÇÈ¿ô¤Î¿®¹æ¤ò 1ÉôÖÉÕÍ¿¤¹¤ë¡£

  • ÀèüÉäÃú¡§³Æ¥â¡¼¥É¤Ç»ÈÍѤ¹¤ë²»°è¤ÎÀèƬ¼þÇÈ¿ô ¡Ý 80Hz¡Ê¡á420Hz,13920Hz¡Ë
  • ½ªÃ¼ÉäÃú¡§³Æ¥â¡¼¥É¤Ç»ÈÍѤ¹¤ë²»°è¤ÎÀèƬ¼þÇÈ¿ô ¡Ý 100Hz¡Ê¡á400Hz, 13900Hz¡Ë

¸í¤ê¸¡½Ð

¼¡¤ÎÆâÍƤǸí¤ê¸¡½Ðµ¡¹½¤òÄɲá£

  • Á÷¿®Â¦¤ÏÀèüÉäÃú¤È¥Ç¡¼¥¿ËÜÂΤδ֤˥ǡ¼¥¿¤Î 32¥Ó¥Ã¥È CRC ·×»»·ë²Ì¡Êjava.util.zip.CRC32 »ÈÍѡˤò 4 * 100¥ß¥êÉôÖȯ¿®¤¹¤ë
  • ¼õ¿®Â¦¤ÏÀèüÉäÃú¤ò¸¡ÃΤ¹¤ë¤È¾åµ­ CRC Ãͤò¼èÆÀ¡¦Éü¹æ¤·¤ÆÊÝ»ý¡£½ªÃ¼ÉäÃú¸¡½Ð»þ¤ËÉü¹æ¤º¤ß¥Ç¡¼¥¿ËÜÂΤΠCRC ¤ò·×»»¤·Î¾¼Ô¤òÈæ³Ó¤¹¤ë¤³¤È¤Ç¸í¤ê¤Î²ÄǽÀ­¤Î̵ͭ¤òȽÄꤹ¤ë
    • ¥Ç¡¼¥¿ËÜÂΤμõ¤±ÅϤ·¤Ë¼ºÇÔ¤·¤¿¥±¡¼¥¹¤Î¤ß¤Ê¤é¤º CRC Ãͤμõ¤±ÅϤ·¤Ë¼ºÇԤΥ±¡¼¥¹¤â¤¢¤ê¤¨¤ë¤¬¡¢¸½»þÅÀ¤Ç¤Ï CRC Ã;ðÊó¼ø¼õ¤Î¾éĹ²½¤Ï¹Í¤¨¤º°ìΧ¤Ë¡Ö¥¨¥é¡¼¡×¤È¤ß¤Ê¤¹

UI

  • º¸¡§Á÷¿®Â¦¡¡±¦¡§¼õ¿®Â¦
    ξ¼Ô¤È¤â¡ÖUltrasonic¡×¥¹¥¤¥Ã¥Á¤ÇĶ²»Çȥ⡼¥É¤Ø°Ü¹Ô

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§ 1ʬ19Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¥½¡¼¥¹¥³¡¼¥É

Á÷¿®Â¦¡§ sonic09     GitHub

  • MainActivity.java
    
    /**
     * sonic09
     *
     * ʸ»úÎó¤ò¥µ¥¤¥óÇÈ¿®¹æ¤ËÃÖ¤­´¹¤¨¤Æ½ÐÎϤ¹¤ë
     * 32¥Ó¥Ã¥ÈCRCÉÕÍ¿, Ķ²»Çȥ⡼¥ÉÄɲÃ
     * Âиþ¤Î¼õ¿®¥×¥í¥°¥é¥à¤Ï sonic10
     *
     */
    
    package jp.klab.sonic09;
    
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.CompoundButton;
    import android.widget.EditText;
    import android.widget.Switch;
    import android.widget.ToggleButton;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    import java.util.zip.CRC32;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener,
        Switch.OnCheckedChangeListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final float SEC_PER_SAMPLEPOINT = 1.0f / SAMPLE_RATE;
      private static final int FREQ_BASE_LOW = 500;
      private static final int FREQ_BASE_HIGH = 14000;
      private static final int AMP_SMALL = 5000;
      private static final int AMP_LARGE = 28000;
    
      private static final int ELMS_1SEC = SAMPLE_RATE;
      private static final int ELMS_UNITSEC = SAMPLE_RATE/10;
      private static final int ELMS_MAX = 256;
    
      private static final int MSG_PLAY_START   = 120;
      private static final int MSG_PLAY_END   = 130;
    
      private int FREQ_STEP = 10;
      private int AMP;
      private int FREQ_BASE;
      private int FREQ_OUT;
      private int FREQ_IN;
    
      private Handler mHandler;
      private AudioTrack mAudioTrack = null;
      private ToggleButton mButton01;
      private EditText mEditText01;
      private Switch mSwitch01;
    
      private short mSigIn[] = new short[SAMPLE_RATE];
      private short mSigOut[] = new short[SAMPLE_RATE];
      private short mSignals[][] = new short[ELMS_MAX][ELMS_UNITSEC];
      private String mText;
    
      // ¥µ¥¤¥óÇȥǡ¼¥¿¤òÀ¸À®
      private void createSineWave(short[] buf, int freq, int amplitude, boolean doClear) {
        if (doClear) {
          Arrays.fill(buf, (short) 0);
        }
        for (int i = 0; i < buf.length; i++) {
          float currentSec = i * SEC_PER_SAMPLEPOINT; // ¸½ºß°ÌÃ֤ηвáÉÿô
          double val = amplitude * Math.sin(2.0 * Math.PI * freq * currentSec);
          buf[i] += (short)val;
        }
      }
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mButton01 = (ToggleButton)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mEditText01 = (EditText)findViewById(R.id.editText01);
        mSwitch01 = (Switch)findViewById(R.id.switch01);
        mSwitch01.setOnCheckedChangeListener(this);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
        setParams(false);
    
        mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes,
                        AudioTrack.MODE_STREAM);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioTrack != null) {
          if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioTrack");
            mAudioTrack.stop();
            mAudioTrack.flush();
          }
          mAudioTrack = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
          mAudioTrack.stop();
          mAudioTrack.flush();
        }
        if (mButton01.isChecked()) {
          mText = mEditText01.getText().toString();
          if (mText.length() > 0) {
            new Thread(this).start();
          } else {
            mButton01.setChecked(false);
          }
        }
      }
      @Override
      public void onCheckedChanged(CompoundButton b, boolean isChecked) {
        setParams(isChecked);
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_PLAY_START:
            Log.d(TAG, "MSG_PLAY_START");
            break;
          case MSG_PLAY_END:
            Log.d(TAG, "MSG_PLAY_END");
            mButton01.setChecked(false);
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        mHandler.sendEmptyMessage(MSG_PLAY_START);
        byte[] strByte = null;
        try {
          strByte = mText.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
        }
        mAudioTrack.play();
        mAudioTrack.write(mSigIn, 0, ELMS_1SEC); // ÀèüÉäÃú
        // ¥Ç¡¼¥¿ËÜÂΤΠCRC32 ¤ò·×»»¤·¤Æȯ¿®
        CRC32 crc = new CRC32();
        crc.reset();
        crc.update(strByte, 0, strByte.length);
        long crcVal = crc.getValue();
        //Log.d(TAG, "crc=" + Long.toHexString(crcVal));
        byte crcData[] = new byte[4];
        for (int i = 0; i < 4; i++) {
          crcData[i] = (byte)(crcVal >> (24-i*8));
          valueToWave((short) (crcData[i] & 0xFF));
        }
        // ¥Ç¡¼¥¿ËÜÂÎ
        for (int i = 0; i < strByte.length; i++) {
          valueToWave(strByte[i]);
        }
        mAudioTrack.write(mSigOut, 0, ELMS_1SEC); // ½ªÃ¼ÉäÃú
    
        mAudioTrack.stop();
        mAudioTrack.flush();
        mHandler.sendEmptyMessage(MSG_PLAY_END);
      }
    
      // »ØÄꤵ¤ì¤¿¥Ð¥¤¥ÈÃͤò²»À¼¿®¹æ¤ËÃÖ¤­´¹¤¨¤ÆºÆÀ¸¤¹¤ë
      private void valueToWave(short val) {
        //Log.d(TAG, "val=" + val);
        mAudioTrack.write(mSignals[val], 0, ELMS_UNITSEC);
      }
    
      private void setParams(boolean useUltrasonic) {
        AMP = (useUltrasonic) ? AMP_LARGE : AMP_SMALL;
        FREQ_BASE = (useUltrasonic) ? FREQ_BASE_HIGH : FREQ_BASE_LOW;
        FREQ_OUT = FREQ_BASE - 100;
        FREQ_IN = FREQ_OUT + 20;
        // Àèü¡¦½ªÃ¼ÉäÃú¤Î¿®¹æ¥Ç¡¼¥¿¤òÀ¸À®
        createSineWave(mSigIn, FREQ_IN, AMP, true);
        createSineWave(mSigOut, FREQ_OUT, AMP, true);
        // 256¼ïÎà¤Î¿®¹æ¥Ç¡¼¥¿¤òÀ¸À®
        for (int i = 0; i < ELMS_MAX; i++) {
          createSineWave(mSignals[i], (short) (FREQ_BASE + FREQ_STEP * i), AMP, true);
        }
    
      }
    }
    
    

¼õ¿®Â¦¡§ sonic10     GitHub

  • MainActivity.java
    
    /**
     * sonic10
     *
     * üËö¤Î¥Þ¥¤¥¯¤«¤é½¸²»¤·¤¿¿®¹æ¤ò¥Ð¥¤¥È¥Ç¡¼¥¿¤ËÊÑ´¹¤¹¤ë
     * CRC32¤Ë¤è¤ë¸í¤ê¸¡½Ð, Ķ²»Çȥ⡼¥É¤ØÂбþ
     * FFT ½èÍý¤Ë JTransforms ¥é¥¤¥Ö¥é¥ê¤òÍøÍÑ
     * Âиþ¤ÎÁ÷¿®¥×¥í¥°¥é¥à¤Ï sonic09
     *
     */
    
    package jp.klab.sonic10;
    
    import org.jtransforms.fft.DoubleFFT_1D;
    import android.graphics.Color;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CompoundButton;
    import android.widget.Switch;
    import android.widget.TextView;
    
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.zip.CRC32;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener,
          Switch.OnCheckedChangeListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final short THRESHOLD_SILENCE = 0x00ff;
      private static final int FREQ_BASE_LOW = 500;
      private static final int FREQ_BASE_HIGH = 14000;
      private static final int FREQ_STEP = 10;
      private static final int UNITSIZE = SAMPLE_RATE/10; // 100msecʬ
    
      private static final int MSG_RECORD_START = 100;
      private static final int MSG_RECORD_END   = 110;
      private static final int MSG_DATA_RECV  = 120;
      private static final int MSG_RECV_OK    = 200;
      private static final int MSG_RECV_NG    = 210;
    
      private int FREQ_BASE = FREQ_BASE_LOW;
      private int FREQ_OUT = FREQ_BASE - 100;
      private int FREQ_IN = FREQ_OUT + 20;
      private int FREQ_MAX = FREQ_BASE + FREQ_STEP * 255;
    
      private Handler mHandler;
      private AudioRecord mAudioRecord = null;
    
      private Button mButton01;
      private TextView mTextView02;
      private TextView mTextView03;
      private Switch mSwitch01;
    
      private boolean mInRecording = false;
      private boolean mStop = false;
      private int mBufferSizeInShort;
    
      private short mRecordBuf[];
      private short mTestBuf[];
      private DoubleFFT_1D mFFT;
      private double mFFTBuffer[];
      private int mFFTSize;
      private byte mValueCount = -1;
      private long mCrc32Val = 0;
      private String mRecvStr;
      private ArrayList<Byte> mDataArrayList = new ArrayList<Byte>();
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        mButton01 = (Button)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mTextView02 = (TextView)findViewById(R.id.textView02);
        mTextView02.setOnClickListener(this);
        mTextView03 = (TextView)findViewById(R.id.textView03);
        mTextView03.setTextColor(Color.RED);
        mSwitch01 = (Switch)findViewById(R.id.switch01);
        mSwitch01.setOnCheckedChangeListener(this);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
    
        mBufferSizeInShort = bufferSizeInBytes / 2;
        // ½¸²»ÍѥХåե¡
        mRecordBuf = new short[mBufferSizeInShort];
    
        // FFT ½èÍýÍÑ
        mTestBuf =  new short[UNITSIZE];
        mFFTSize = UNITSIZE;
        mFFT = new DoubleFFT_1D(mFFTSize);
        mFFTBuffer = new double[mFFTSize];
    
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        mStop = true;
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioRecord != null) {
          if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioRecord");
            mAudioRecord.stop();
          }
          mAudioRecord = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (v == (View)mButton01) {
          // ½¸²»³«»Ï or ½ªÎ»
          if (!mInRecording) {
            mInRecording = true;
            new Thread(this).start();
          } else {
            mInRecording = false;
          }
        } else if (v == (View)mTextView02) {
          // ɽ¼¨¥Ç¡¼¥¿¤ò¥¯¥ê¥¢
          mTextView02.setText("");
          mTextView03.setText("");
        }
        return;
      }
      @Override
      public void onCheckedChanged(CompoundButton b, boolean isChecked) {
        if (b == (CompoundButton)mSwitch01) {
          FREQ_BASE = (isChecked) ? FREQ_BASE_HIGH : FREQ_BASE_LOW;
          FREQ_OUT = FREQ_BASE - 100;
          FREQ_IN = FREQ_OUT + 20;
          FREQ_MAX = FREQ_BASE + FREQ_STEP * 255;
        }
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_RECORD_START:
            Log.d(TAG, "MSG_RECORD_START");
            mButton01.setText("STOP");
            mSwitch01.setEnabled(false);
            break;
          case MSG_RECORD_END:
            Log.d(TAG, "MSG_RECORD_END");
            mButton01.setText("START");
            mSwitch01.setEnabled(true);
            break;
          case MSG_DATA_RECV:
            //Log.d(TAG, "MSG_DATA_RECV");
            byte[] ch = new byte[] {(byte)msg.arg1};
            try {
              // ¼õ¿®¥Ç¡¼¥¿¤òɽ¼¨
              String s = new String(ch, "UTF-8");
              s = mTextView02.getText() + s;
              mTextView02.setText(s);
            } catch (UnsupportedEncodingException e) {
            }
            mTextView03.setText("");
            break;
          case MSG_RECV_OK:
            mTextView03.setText("OK!");
            break;
          case MSG_RECV_NG:
            mTextView03.setText("NG!");
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        int dataCount = 0;
        boolean bSilence = false;
        mHandler.sendEmptyMessage(MSG_RECORD_START);
        // ½¸²»³«»Ï
        mAudioRecord.startRecording();
        while (mInRecording && !mStop) {
          // ²»À¼¥Ç¡¼¥¿Æɤ߹þ¤ß
          mAudioRecord.read(mRecordBuf, 0, mBufferSizeInShort);
          bSilence = true;
          for (int i = 0; i < mBufferSizeInShort; i++) {
            short s = mRecordBuf[i];
            if (s > THRESHOLD_SILENCE) {
              bSilence = false;
            }
          }
          if (bSilence) { // Àżä
            dataCount = 0;
            continue;
          }
          int copyLength = 0;
          // ¥Ç¡¼¥¿¤ò mTestBuf ¤Ø½ç¼¡¥¢¥Ú¥ó¥É
          if (dataCount < UNITSIZE) {//mTestBuf.length) {
            // mTestBuf ¤Î»ÄÎΰè¤Ë±þ¤¸¤Æ¥³¥Ô¡¼¤¹¤ë¥µ¥¤¥º¤ò·èÄê
            int remain = UNITSIZE - dataCount;
            if (remain > mBufferSizeInShort) {
              copyLength = mBufferSizeInShort;
            } else {
              copyLength = remain;
            }
            System.arraycopy(mRecordBuf, 0, mTestBuf, dataCount, copyLength);
            dataCount += copyLength;
          }
          if (dataCount >= UNITSIZE) {//mTestBuf.length) {
            // 100ms ʬί¤Þ¤Ã¤¿¤é FFT ¤Ë¤«¤±¤ë
            int freq = doFFT(mTestBuf);
            if (mValueCount < 0) {
              // ¥Ç¡¼¥¿½ªÎ»
              if (freq == FREQ_OUT && mCrc32Val != 0) {
                byte check [] = new byte[mDataArrayList.size()];
                for (int i = 0; i < check.length; i++) {
                  check[i] = mDataArrayList.get(i);
                }
                CRC32 crc = new CRC32();
                crc.reset();
                crc.update(check, 0, check.length);
                long crcVal = crc.getValue();
                Log.d(TAG, "crc check=" +  Long.toHexString(crcVal));
                if (crcVal == mCrc32Val) {
                  mHandler.sendEmptyMessage(MSG_RECV_OK);
                } else {
                  mHandler.sendEmptyMessage(MSG_RECV_NG);
                }
                mCrc32Val = 0;
              }
            }
            // ÂԤäƤ¿ÈϰϤμþÇÈ¿ô¤«¥Á¥§¥Ã¥¯
            if (freq >= FREQ_BASE && freq <= FREQ_MAX) {
              int val = (int) ((freq - FREQ_BASE) / FREQ_STEP);
              if (val >= 0 && val <= 255) {
                if (mValueCount > 4) {
                  mDataArrayList.add((byte)val);
                  Message msg = new Message();
                  msg.what = MSG_DATA_RECV;
                  msg.arg1 = val;
                  mHandler.sendMessage(msg);
                }
              } else {
                freq = -1;
              }
            } else {
              freq = -1;
            }
            dataCount = 0;
            if (freq == -1) {
              continue;
            }
            // mRecordBuf ¤ÎÅÓÃæ¤Þ¤Ç¤ò mTestBuf ¤Ø¥³¥Ô¡¼¤·¤Æ FFT ¤·¤¿¾ì¹ç¤Ï
            // mRecordBuf ¤Î»Ä¥Ç¡¼¥¿¤ò mTestBuf ÀèƬ¤Ø¥³¥Ô¡¼¤·¤¿¾å¤Ç·Ñ³
            if (copyLength < mBufferSizeInShort) {
              int startPos = copyLength;
              copyLength = mBufferSizeInShort - copyLength;
              System.arraycopy(mRecordBuf, startPos, mTestBuf, 0, copyLength);
              dataCount += copyLength;
            }
          }
        }
        // ½¸²»½ªÎ»
        mAudioRecord.stop();
        mHandler.sendEmptyMessage(MSG_RECORD_END);
      }
    
      private int doFFT(short[] data) {
        for (int i = 0; i < mFFTSize; i++) {
          mFFTBuffer[i] = (double)data[i];
        }
        // FFT ¼Â¹Ô
        mFFT.realForward(mFFTBuffer);
    
        // ½èÍý·ë²Ì¤ÎÊ£ÁÇ¿ôÇÛÎ󤫤é¥Ô¡¼¥¯¼þÇÈ¿ôÀ®Ê¬¤ÎÍ×ÁÇÈÖ¹æ¤òÆÀ¤ë
        double maxAmp = 0;
        int index = 0;
        for (int i = 0; i < mFFTSize/2; i++) {
          double a = mFFTBuffer[i*2]; // ¼ÂÉô
          double b = mFFTBuffer[i*2 + 1]; // µõÉô
          // a+ib ¤ÎÀäÂÐÃÍ ¢å a^2 + b^2 = r ¤¬¿¶ÉýÃÍ
          double r = Math.sqrt(a*a + b*b);
          if (r > maxAmp) {
            maxAmp = r;
            index = i;
          }
        }
        // ¥Ô¡¼¥¯¼þÇÈ¿ô¤òµá¤á¤ë
        int freq = index * SAMPLE_RATE / mFFTSize;
        byte val = (byte)((freq-FREQ_BASE)/FREQ_STEP);
    
        if (freq == FREQ_IN) { // ÀèüÉäÃú
          mValueCount = 0;
          mCrc32Val = 0;
          if (!mDataArrayList.isEmpty()) {
            mDataArrayList.clear();
          }
          return freq;
        } else if (freq == FREQ_OUT) { // ½ªÃ¼ÉäÃú
          mValueCount = -1;
          return freq;
        }
    
        // ÀèüÉäÃúľ¸å¤Î 4¥Ð¥¤¥È¤Ï32¥Ó¥Ã¥ÈCRC
        if (mValueCount >= 0 &&  mValueCount < 4) {
          mCrc32Val |=  (val & 0xFF);
          if (mValueCount != 3) {
            mCrc32Val <<= 8;
          } else {
            Log.d(TAG, "mCrc32Val=" + Long.toHexString(mCrc32Val));
          }
        }
        mValueCount++;
        return freq;
      }
    }
    
    

4. ¥Ó¥Ã¥È¥Ç¡¼¥¿¤ò²»À¼¿®¹æ¤ÇÁ÷¼õ¿®¤¹¤ë 4

¤³¤³¤Þ¤Ç¤Î»îºî¤Ç¤ÏñÊý¸þ¤ÎÄÌ¿®¤Î¤ß¤ò°·¤Ã¤Æ¤­¤Þ¤·¤¿¡£¤³¤ì¤Ï°Ê²¼¤ÎÍýͳ¤Ë¤è¤ë¤â¤Î¤Ç¤¹¡£

  1. ½¸²»¡¦È¯²»¤Îξµ¡Ç½¤òº®ºß¤µ¤»¤ë¤È¼«µ¡¤Îȯ¤·¤¿¿®¹æ²»¤Ë¤è¤ëº®Í𤬵¯¤³¤êÆÀ¤ë
  2. ÅÁÁ÷¤¬´ðËÜŪ¤ËÄ㮤Ǥ¢¤ë¤¿¤áµ¡´ï´Ö¤ÇÁê¸ß¤ËÄÌ¿®¤ò¹Ô¤¦¤Ê¤éÁÐÊý¤Î¹´Â«»þ´Ö¤¬Ä¹¤¯¤Ê¤ë¤³¤È¤Ë¤Ê¤ê¼ÂÍÑÀ­¤òÁÛÄꤷ¤Ë¤¯¤¤
  3. ÁÐÊý¸þÄÌ¿®¤Ëȼ¤¤¥×¥í¥È¥³¥ë¤¬ÈÑ»¨²½¤¹¤ë¤³¤È¤è¤ê¤âñÊý¸þÄÌ¿®¤Ç¤¢¤ë¤³¤È¤ò³è¤«¤»¤ëÍÑÅÓ¤òÁª¤Ö¤Ù¤­

¤³¤ì¤é¤Ï¤ª¤½¤é¤¯¹Í¤¨Êý¤È¤·¤Æ´Ö°ã¤Ã¤Æ¤¤¤Ê¤¤¤è¤¦¤Ë»×¤¤¤Þ¤¹¤¬¡¢°ìÊý¤Ç¡¢ÆóÂæ¤Îµ¡´ï¤¬Áê¸ß¤Ë²»¤Ç¾ðÊó¤ò¤ä¤ê¤È¤ê¤¹¤ë¸÷·Ê¤òÁÛÁü¤¹¤ë¤ÈÍýͳ¤Î¤Ê¤¤¹¥´ñ¿´¤ò¤¯¤¹¤°¤é¤ì¤Þ¤¹¡£¤½¤³¤Ç¡¢¼Â¸³¤Î°ì´Ä¤È¤·¤ÆºÇ¸å¤Ë¥Ç¥Ð¥¤¥¹´Ö¤ÎÁÐÊý¸þÄÌ¿®¤ò»î¤¹¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

ÁÐÊý¸þÄÌ¿®¤ò¹Í¤¨¤ë

ÁÐÊý¸þÄÌ¿®¤ÎÊýË¡¤È¤·¤Æ°Ê²¼¤ÎÆâÍƤòÁÛÄꤷ¤Þ¤·¤¿¡£

»îºî

½èÍý¤Î¥¤¥á¡¼¥¸

°Ê²¼¤ÎÍ×ÎΤǼÂÁõ¤ò¹Ô¤¤¤Þ¤·¤¿¡£

¡Ö¤·¤ê¤È¤ê¡×¤òÂêºà¤È¤¹¤ë

  • µ¡´ï´Ö¤Ç¼«Î§Åª¤Ë¤¢¤ëÄøÅÙ°ÕÌ£¤Î¤¢¤ë±þ½·¤ò¹Ô¤ï¤»¤ë¤¿¤á¤Ë±Ññ¸ì¤Î¤·¤ê¤È¤ê¤òÂêºà¤È¤·¤¿
    ability -> yellow -> warn -> national .... ¤ÎÍ×ÎÎ
  • µ¡´ï´Ö¤Î±þ½·¤Ï¼«Æ°²½¤·ºÇ½é¤Îñ¸ì¤òȯ¿®¤¹¤ë¤¿¤á¤Ë½é²ó¤Î¤ß UI ¤òÁàºî¤¹¤ë·Á¤È¤·¤¿

½¸²»¡¦È¯²»¤ÎÀÚ¤êÂؤ¨

  • ½¸²»¾õÂ֤ǤÎÂÔµ¡Ãæ¤ËÀèüÉäÃú¤Î¿®¹æ²»¤ò¸¡ÃΤ·¤¿¤é¥Ç¡¼¥¿ÅþÃå¤È¤ß¤Ê¤·¸å³½èÍý¤ò³«»Ï¡£¤½¤Î¸å½ªÃ¼ÉäÃú¤ò¸¡ÃΤ·¤¿¤é½êÄê¤Î»þ´Ö´Ö³Ö¤ò¤ª¤¤¤Æȯ¿®¤ò¹Ô¤¦¡£È¯¿®¤¬´°Î»¤·¤¿¤é½¸²»¾õÂ֤ǤÎÂÔµ¡¤ËÌá¤ë

ºÆÁ÷Í×µá

  • ¼õ¿®¡¦Éü¹æ¤·¤¿¥Ç¡¼¥¿¤ÎÆâÍƤ˸í¤ê¤ò¸¡½Ð¤·¤¿¾ì¹ç¡¢¡Ö?¡×ʸ»ú¤òȯ¿®¤¹¤ë¤³¤È¤ÇÁê¼ê¤ËºÆÁ÷¤òÍ׵᤹¤ë

UI

  • ¥¿¥¤¥È¥ëÉôʬ¤ò¥¿¥Ã¥×¤¹¤ë¤ÈºÇ½é¤Îñ¸ì¤òȯ¿®¡£¤¢¤È¤Ï¥¨¥ó¥É¥ì¥¹

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§ 1ʬ29Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¥½¡¼¥¹¥³¡¼¥É

sonic11     GitHub

  • MainActivity.java
    
    /**
     *
     * sonic11
     *
     * ¥µ¥¤¥óÇȲ»À¼¿®¹æ¤Ë¤è¤ëȾÆó½Å¼°¤Ç¤ÎÁÐÊý¸þÄÌ¿®¤Î¤·¤¯¤ß¤Î»îºî
     * ÆóÂæ¤Îµ¡´ï´Ö¤Ç¡Ö¤·¤ê¤È¤ê¡×¤ò¹Ô¤¦
     * FFT ½èÍý¤Ë JTransforms ¥é¥¤¥Ö¥é¥ê¤òÍøÍÑ
     *
     */
    
    package jp.klab.sonic11;
    
    import org.jtransforms.fft.DoubleFFT_1D;
    import android.graphics.Color;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CompoundButton;
    import android.widget.Switch;
    import android.widget.TextView;
    
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.zip.CRC32;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener,
          Switch.OnCheckedChangeListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final float SEC_PER_SAMPLEPOINT = 1.0f / SAMPLE_RATE;
      private static final short THRESHOLD_SILENCE = 0x00ff;
      private static final int THRESHOLD_COUNT_SILENCE = 25; // ̵²»¶è´ÖȽÄêÍÑ
      private static final int FREQ_BASE_LOW = 500;
      private static final int FREQ_BASE_HIGH = 14000;
      private static final int AMP_SMALL = 28000;
      private static final int AMP_LARGE = 28000;
    
      private static final int ELMS_1SEC = SAMPLE_RATE;
      private static final int ELMS_UNITSEC = SAMPLE_RATE/10;
      private static final int ELMS_MAX = 256;
      private static final int FREQ_STEP = 10;
      private static final int UNITSIZE = SAMPLE_RATE/10; // 100msecʬ
    
      private static final int MSG_RECORD_START  = 100;
      private static final int MSG_RECORD_END    = 110;
      private static final int MSG_DATA_RECV     = 130;
      private static final int MSG_DATA_SEND_START = 140;
      private static final int MSG_RECV_OK     = 200;
      private static final int MSG_RECV_NG     = 210;
    
      private int AMP;
      private int FREQ_BASE;
      private int FREQ_OUT;
      private int FREQ_IN;
      private int FREQ_MAX = FREQ_BASE + FREQ_STEP * 255;
    
      private Handler mHandler;
      private AudioRecord mAudioRecord = null;
      private AudioTrack mAudioTrack = null;
    
      private Button mButton01;
      private TextView mTextView01;
      private TextView mTextView02;
      private TextView mTextView03;
      private TextView mTextView04;
      private Switch mSwitch01;
    
      private short mSigIn[] = new short[SAMPLE_RATE];
      private short mSigOut[] = new short[SAMPLE_RATE];
      private short mSignals[][] = new short[ELMS_MAX][SAMPLE_RATE/10];
    
      private boolean mInRecording = false;
      private boolean mStop = false;
      private int mBufferSizeInShort;
    
      private short mRecordBuf[];
      private short mTestBuf[];
      private DoubleFFT_1D mFFT;
      private double mFFTBuffer[];
      private int mFFTSize;
      private byte mValueCount = -1;
      private long mCrc32Val = 0;
      private ArrayList<Byte> mDataArrayList = new ArrayList<Byte>();
      private int mLastFreq;
      private String mRecvWord = "";
      private String mSendWord = "";
      private boolean mRecvOK;
    
      // ¥µ¥¤¥óÇȥǡ¼¥¿¤òÀ¸À®
      private void createSineWave(short[] buf, int freq, int amplitude, boolean doClear) {
        if (doClear) {
          Arrays.fill(buf, (short) 0);
        }
        for (int i = 0; i < buf.length; i++) {
          float currentSec = i * SEC_PER_SAMPLEPOINT; // ¸½ºß°ÌÃ֤ηвáÉÿô
          double val = amplitude * Math.sin(2.0 * Math.PI * freq * currentSec);
          buf[i] += (short)val;
        }
      }
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        mButton01 = (Button)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mTextView01 = (TextView)findViewById(R.id.textView01);
        mTextView01.setOnClickListener(this);
        mTextView02 = (TextView)findViewById(R.id.textView02);
        mTextView02.setOnClickListener(this);
        mTextView03 = (TextView)findViewById(R.id.textView03);
        mTextView03.setTextColor(Color.RED);
        mTextView04 = (TextView)findViewById(R.id.textView04);
        mSwitch01 = (Switch)findViewById(R.id.switch01);
        mSwitch01.setOnCheckedChangeListener(this);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
    
        mBufferSizeInShort = bufferSizeInBytes / 2;
        // ½¸²»ÍѥХåե¡
        mRecordBuf = new short[mBufferSizeInShort];
    
        // FFT ½èÍýÍÑ
        mTestBuf = new short[UNITSIZE];
        mFFTSize = UNITSIZE;
        mFFT = new DoubleFFT_1D(mFFTSize);
        mFFTBuffer = new double[mFFTSize];
    
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes);
    
        mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            SAMPLE_RATE,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufferSizeInBytes,
            AudioTrack.MODE_STREAM);
    
        setParams(false);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        mStop = true;
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioRecord != null) {
          if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioRecord");
            mAudioRecord.stop();
          }
          mAudioRecord = null;
        }
        if (mAudioTrack != null) {
          if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioTrack");
            mAudioTrack.stop();
            mAudioTrack.flush();
          }
          mAudioTrack = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (v == (View)mButton01) {
          // ½¸²»³«»Ï or ½ªÎ»
          if (!mInRecording) {
            mInRecording = true;
            new Thread(this).start();
          } else {
            mInRecording = false;
          }
        } else if (v == (View)mTextView01) {
          // ¤·¤ê¤È¤ê¤Î³«»Ï¡¦ºÆ³«
          // ¤¹¤Ç¤Ë½¸²»Ãæ¤Ê¤é¼«Ê¬¤Ç¼«Ê¬¤Î²»¤ò½¦¤ï¤Ê¤¤¤è¤¦¤Ë
          // ¥¹¥ì¥Ã¥É¤ò°ìö½ªÎ»
          boolean running = mInRecording;
          if (mInRecording) {
            mStop = true;
            try {
              while (mInRecording) {
                Thread.sleep(100);
              }
            } catch (InterruptedException e) {
            }
          }
          // ¥é¥ó¥À¥à¤ËÁª¤ó¤À±Ññ¸ì¤ò²»¤Çȯ¿®
          mSendWord = words.getWord();
          doSendWord(mSendWord);
          if (running) {
            // ½¸²»¥¹¥ì¥Ã¥ÉºÆ²ÔƯ
            mInRecording = true;
            mStop = false;
            new Thread(this).start();
          }
        } else if (v == (View)mTextView02) {
          mTextView02.setText("");
          mTextView03.setText("");
        }
        return;
      }
    
      @Override
      public void onCheckedChanged(CompoundButton b, boolean isChecked) {
        if (b == (CompoundButton)mSwitch01) {
          setParams(isChecked);
        }
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_RECORD_START:
            Log.d(TAG, "MSG_RECORD_START");
            mButton01.setText("STOP");
            mSwitch01.setEnabled(false);
            break;
          case MSG_RECORD_END:
            Log.d(TAG, "MSG_RECORD_END");
            mButton01.setText("START");
            mSwitch01.setEnabled(true);
            break;
          case MSG_DATA_RECV:
            //Log.d(TAG, "MSG_DATA_RECV");
            if (mRecvWord.length() <= 0) {
              mTextView02.setText("RECV: ");
            }
            byte[] ch = new byte[] {(byte)msg.arg1};
            try {
              // ¼õ¿®¥Ç¡¼¥¿¤òɽ¼¨
              String s = new String(ch, "UTF-8");
              mRecvWord += s;
              s = mTextView02.getText() + s;
              mTextView02.setText(s);
            } catch (UnsupportedEncodingException e) {
            }
            mTextView03.setText("");
            break;
          case MSG_DATA_SEND_START:
            mTextView04.setText("SEND: " + mSendWord);
            break;
          case MSG_RECV_OK:
            mTextView03.setText("OK!");
            break;
          case MSG_RECV_NG:
            mTextView03.setText("NG!");
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        int dataCount = 0;
        boolean bSilence = false;
        long countSilence = 0;
        mHandler.sendEmptyMessage(MSG_RECORD_START);
        // ½¸²»³«»Ï
        mAudioRecord.startRecording();
        while (mInRecording && !mStop) {
          // ²»À¼¿®¹æÆɤ߹þ¤ß
          mAudioRecord.read(mRecordBuf, 0, mBufferSizeInShort);
          bSilence = true;
          for (int i = 0; i < mBufferSizeInShort; i++) {
            short s = mRecordBuf[i];
            if (s > THRESHOLD_SILENCE) {
              bSilence = false;
              break;
            }
          }
          if (bSilence) { // Àżä
            dataCount = 0;
            countSilence++;
          } else {
            countSilence = 0;
          }
          // ñ¸ì¤ò¼õ¿®¤º¤ß¤«¤Ä°ìÄê´ü´Ö°Ê¾åÀż䤬³¤¤¤¿¤éÁ÷¿®¤Ë¤Þ¤ï¤ë
          if (countSilence > THRESHOLD_COUNT_SILENCE &&
              mLastFreq == FREQ_OUT && mRecvWord.length() > 0) {
            if (mRecvOK) { // ľÁ°¤Î¼õ¿®¡¦Éü¹æ·ë²Ì¤¬Àµ¾ï¤À¤Ã¤¿
              if (!mRecvWord.equals("?")) {
                // ¼õ¿®¤·¤¿Ã±¸ì¤Î¤·¤ê¤È¤ê¸ì¤ò¼èÆÀ
                mSendWord = words.getWord(mRecvWord);
              }
            } else {
              // ºÆÁ÷Í×µá
              mSendWord = "?";
            }
            Log.d(TAG, "mSendWord=" + mSendWord);
            // ñ¸ì¤òȯ¿®
            doSendWord(mSendWord);
            continue;
          }
    
          int copyLength = 0;
          // ¥Ç¡¼¥¿¤ò mTestBuf ¤Ø½ç¼¡¥¢¥Ú¥ó¥É
          if (dataCount < UNITSIZE) {
            // mTestBuf ¤Î»ÄÎΰè¤Ë±þ¤¸¤Æ¥³¥Ô¡¼¤¹¤ë¥µ¥¤¥º¤ò·èÄê
            int remain = UNITSIZE - dataCount;
            if (remain > mBufferSizeInShort) {
              copyLength = mBufferSizeInShort;
            } else {
              copyLength = remain;
            }
            System.arraycopy(mRecordBuf, 0, mTestBuf, dataCount, copyLength);
            dataCount += copyLength;
          }
          if (dataCount >= UNITSIZE) {
            // 100ms ʬί¤Þ¤Ã¤¿¤é FFT ¤Ë¤«¤±¤ë
            int freq = doFFT(mTestBuf);
            mLastFreq = freq;
            if (mValueCount < 0) {
              // ¥Ç¡¼¥¿½ªÎ»
              if (freq == FREQ_OUT && mCrc32Val != 0) {
                byte check [] = new byte[mDataArrayList.size()];
                for (int i = 0; i < check.length; i++) {
                  check[i] = mDataArrayList.get(i);
                }
                //Log.d(TAG, "mRecvWord=" + mRecvWord);
                CRC32 crc = new CRC32();
                crc.reset();
                crc.update(check, 0, check.length);
                long crcVal = crc.getValue();
                //Log.d(TAG, "crc check=" +  Long.toHexString(crcVal));
                mRecvOK = false;
                if (crcVal == mCrc32Val) {
                  mRecvOK = true;
                  mHandler.sendEmptyMessage(MSG_RECV_OK);
                } else {
                  mHandler.sendEmptyMessage(MSG_RECV_NG);
                }
                mCrc32Val = 0;
              }
            }
            // ÂԤäƤ¿ÈϰϤμþÇÈ¿ô¤«¥Á¥§¥Ã¥¯
            if (freq >= FREQ_BASE && freq <= FREQ_MAX) {
              int val = (int) ((freq - FREQ_BASE) / FREQ_STEP);
              if (val >= 0 && val <= 255) {
                if (mValueCount > 4) {
                  mDataArrayList.add((byte)val);
                  Message msg = new Message();
                  msg.what = MSG_DATA_RECV;
                  msg.arg1 = val;
                  mHandler.sendMessage(msg);
                }
              } else {
                freq = -1;
              }
            } else {
              freq = -1;
            }
            dataCount = 0;
            if (freq == -1) {
              continue;
            }
            // mRecordBuf ¤ÎÅÓÃæ¤Þ¤Ç¤ò mTestBuf ¤Ø¥³¥Ô¡¼¤·¤Æ FFT ¤·¤¿¾ì¹ç¤Ï
            // mRecordBuf ¤Î»Ä¥Ç¡¼¥¿¤ò mTestBuf ÀèƬ¤Ø¥³¥Ô¡¼¤·¤¿¾å¤Ç·Ñ³
            if (copyLength < mBufferSizeInShort) {
              int startPos = copyLength;
              copyLength = mBufferSizeInShort - copyLength;
              System.arraycopy(mRecordBuf, startPos, mTestBuf, 0, copyLength);
              dataCount += copyLength;
            }
          }
        }
        // ½¸²»½ªÎ»
        mAudioRecord.stop();
        mInRecording = false;
        mHandler.sendEmptyMessage(MSG_RECORD_END);
      }
    
      private int doFFT(short[] data) {
        for (int i = 0; i < mFFTSize; i++) {
          mFFTBuffer[i] = (double)data[i];
        }
        // FFT ¼Â¹Ô
        mFFT.realForward(mFFTBuffer);
    
        // ½èÍý·ë²Ì¤ÎÊ£ÁÇ¿ôÇÛÎ󤫤é¥Ô¡¼¥¯¼þÇÈ¿ôÀ®Ê¬¤ÎÍ×ÁÇÈÖ¹æ¤òÆÀ¤ë
        double maxAmp = 0;
        int index = 0;
        for (int i = 0; i < mFFTSize/2; i++) {
          double a = mFFTBuffer[i*2]; // ¼ÂÉô
          double b = mFFTBuffer[i*2 + 1]; // µõÉô
          // a+ib ¤ÎÀäÂÐÃÍ ¢å a^2 + b^2 = r ¤¬¿¶ÉýÃÍ
          double r = Math.sqrt(a*a + b*b);
          if (r > maxAmp) {
            maxAmp = r;
            index = i;
          }
        }
        // ¥Ô¡¼¥¯¼þÇÈ¿ô¤òµá¤á¤ë
        int freq = index * SAMPLE_RATE / mFFTSize;
        byte val = (byte)((freq-FREQ_BASE)/FREQ_STEP);
    
        if (freq == FREQ_IN) { // ÀèüÉäÃú
          mValueCount = 0;
          mCrc32Val = 0;
          if (!mDataArrayList.isEmpty()) {
            mDataArrayList.clear();
          }
          mRecvWord = "";
          return freq;
        } else if (freq == FREQ_OUT) { // ½ªÃ¼ÉäÃú
          mValueCount = -1;
          return freq;
        }
    
        // ÀèüÉäÃúľ¸å¤Î 4¥Ð¥¤¥È¤Ï32¥Ó¥Ã¥ÈCRC
        if (mValueCount >= 0 &&  mValueCount < 4) {
          mCrc32Val |=  (val & 0xFF);
          if (mValueCount != 3) {
            mCrc32Val <<= 8;
          } else {
            Log.d(TAG, "mCrc32Val=" + Long.toHexString(mCrc32Val));
          }
        }
        mValueCount++;
        return freq;
      }
    
      // »ØÄꤵ¤ì¤¿¥Ð¥¤¥ÈÃͤò²»À¼¿®¹æ¤ËÃÖ¤­´¹¤¨¤ÆºÆÀ¸¤¹¤ë
      private void valueToWave(short val) {
        //Log.d(TAG, "val=" + val);
        mAudioTrack.write(mSignals[val], 0, ELMS_UNITSEC);
      }
    
      private void doSendWord(String str) {
        mSendWord = str;
        mHandler.sendEmptyMessage(MSG_DATA_SEND_START);
        Log.d(TAG, "mSendWord=" + mSendWord);
        byte[] strByte = null;
        try {
          strByte = mSendWord.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
        }
        mAudioTrack.play();
        mAudioTrack.write(mSigIn, 0, ELMS_1SEC); // ÀèüÉäÃú
        // ¥Ç¡¼¥¿ËÜÂΤΠCRC32 ¤ò·×»»¤·¤Æȯ¿®
        CRC32 crc = new CRC32();
        crc.reset();
        crc.update(strByte, 0, strByte.length);
        long crcVal = crc.getValue();
        //Log.d(TAG, "crc=" + Long.toHexString(crcVal));
        byte crcData[] = new byte[4];
        for (int i = 0; i < 4; i++) {
          crcData[i] = (byte)(crcVal >> (24-i*8));
          valueToWave((short) (crcData[i] & 0xFF));
        }
        // ¥Ç¡¼¥¿ËÜÂÎ
        for (int i = 0; i < strByte.length; i++) {
          valueToWave(strByte[i]);
        }
        mAudioTrack.write(mSigOut, 0, ELMS_1SEC); // ½ªÃ¼ÉäÃú
        mAudioTrack.stop();
        mAudioTrack.flush();
        mLastFreq = -1;
        mRecvWord = "";
      }
    
      private void setParams(boolean useUltrasonic) {
        AMP = (useUltrasonic) ? AMP_LARGE : AMP_SMALL;
        FREQ_BASE = (useUltrasonic) ? FREQ_BASE_HIGH : FREQ_BASE_LOW;
        FREQ_OUT = FREQ_BASE - 100;
        FREQ_IN = FREQ_OUT + 20;
        // Àèü¡¦½ªÃ¼ÉäÃú¤Î¿®¹æ¥Ç¡¼¥¿¤òÀ¸À®
        createSineWave(mSigIn, FREQ_IN, AMP, true);
        createSineWave(mSigOut, FREQ_OUT, AMP, true);
        // 256¼ïÎà¤Î¿®¹æ¥Ç¡¼¥¿¤òÀ¸À®
        for (int i = 0; i < ELMS_MAX; i++) {
          createSineWave(mSignals[i], (short) (FREQ_BASE + FREQ_STEP * i), AMP, true);
        }
        FREQ_MAX = FREQ_BASE + FREQ_STEP * 255;
      }
    }
    
    

(tanabe)
klab_gijutsu2 at 09:00¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
2017ǯ06·î02Æü

²»¤òÍøÍѤ¹¤ë 2 ¡ÁAndroid ¥Ç¥Ð¥¤¥¹¤Ç¤Î²»ÇÈÄÌ¿®¡§½àÈ÷ÊÔ¡Á

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

¤³¤Îµ­»ö¤ÎÆâÍÆ

Á°²ó¤Îµ­»ö¤Ç¤Ï²»¤òÇÞÂΤȤ¹¤ëµ¡´ï´Ö¤Î¾ðÊóÄÌ¿®¤¬¶áǯ¤Õ¤¿¤¿¤ÓÃíÌܤµ¤ì¤Æ¤¤¤ë¤³¤È¤Ë¿¨¤ìÊ£¿ô¤Î¶ñÂÎŪ¤Ê»öÎã¤òµó¤²¤Þ¤·¤¿¡£¶áµ÷Î¥ÄÌ¿®¼êÃʤȤ·¤Æ¤Î²»ÇȤÎÍøÍѤˤϵ»½ÑŪ¹¥´ñ¿´¤ò¤½¤½¤é¤ì¤Þ¤¹¤¬¡¢¤½¤ì¤ò¤É¤Î¤è¤¦¤Ë·Á¤Ë¤¹¤ì¤Ð¤è¤¤¤Î¤«¤Ï°Æ³°¥Ô¥ó¤ÈÍè¤Þ¤»¤ó¡£¤½¤³¤Ç¡¢Android ¥Ç¥Ð¥¤¥¹¤òÂêºà¤Ë¼ê¸µ¤Ç¹Ô¤Ã¤¿²»ÇÈÄÌ¿®¤Î¼Â¸³¤È»îºî¤ÎÆâÍƤò¤³¤ì¤«¤é²¿²ó¤«¤Ëʬ¤±¤Æ¾Ò²ð¤·¤Þ¤¹¡£º£²ó¤Ï½àÈ÷ÊԤȤ·¤Æ¼ÂÁõ¤ËɬÍפÊÍ×ÁǤÎÀ°Íý¤ò¹Ô¤¤¤Þ¤¹¡£

2017-11-29 Äɵ­¡§
Ëܵ­»ö¤Ë·ÇºÜ¤Î¥³¡¼¥É¤Ï³«È¯»þ¤Ë Android 5.x ´Ä¶­¤ò»ÈÍѤ·¤Æ¤ª¤ê¡¢Android 6.0 °Ê¹ß¤Ç¤Ï android.permission.RECORD_AUDIO ¤Ë¤Ä¤¤¤Æ¼Â¹Ô»þ¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¼èÆÀ¤¬É¬ÍפǤ¹¡£
¤³¤Î·ï¤Ø¤ÎÂбþÎã¤È¤·¤Æ sonic01 ¤Î MainActivity.java ¤Ë¼ê¤ò²Ã¤¨¤Þ¤·¤¿¡£ ¡Êdiff¡Ë
¾¤Î¥×¥í¥¸¥§¥¯¥È¤Ë¤Ä¤¤¤Æ¤âŬµ¹²ÃÌ£¤·¤Æ²¼¤µ¤¤¡£

½àÈ÷ 1. Andorid ¤Ç¤Î²»À¼Æþ½ÐÎϽèÍý¤ò³Ð¤¨¤ë

¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤ê³«È¯´Ä¶­¤ä API ¤Ë°ã¤¤¤Ï¤¢¤Ã¤Æ¤â²»¤ò°·¤¦½èÍý¤ÎËܼÁ¤ÏÊѤï¤ê¤Þ¤»¤ó¡£¼ê¸µ¤Ç¥¿¡¼¥²¥Ã¥È¤È¤·¤Æ Android ¤òÁª¤ó¤À¤Î¤Ï°Ê²¼¤ÎÍýͳ¤Ë¤è¤ë¤â¤Î¤Ç¤¹¡£

  • ¥á¥¸¥ã¡¼¤Ç¤¢¤ë
  • ¥µ¥¦¥ó¥É I/O ¤òɸ½à¤ÇÍøÍѤǤ­¤ë¡Ê¥Þ¥¤¥³¥ó·Ï¤ÈÈæ¤Ù¤Æ¤ÎÍøÅÀ¡Ë
  • ¥Ý¡¼¥¿¥Ö¥ë¤Ç¤¢¤ë¤¿¤á±þÍѤ¬Íø¤­¤ä¤¹¤¯ IoT ÊýÌ̤ȤÎÏ¢·ÈÀ­¤âÎɤ¤¡ÊPC ¤ÈÈæ¤Ù¤Æ¤ÎÍøÅÀ¡Ë
  • ³«È¯´Ä¶­¤ÎÀ©Ì󤴤Ȥ¬ÁêÂÐŪ¤Ë¾¯¤Ê¤¤¡Ê¾¤Î¥¹¥Þ¥Û·Ï¤ÈÈæ¤Ù¤Æ¤ÎÍøÅÀ¡Ë

¤Þ¤º¡¢º£²ó»ÈÍѤ·¤¿²»À¼Æþ½ÐÎÏ API ¤Î¾ðÊó¤ò¥ê¥Õ¥¡¥ì¥ó¥¹¤è¤ê°úÍѤ·¤Þ¤¹¡£ÆäËÆñ¤·¤¤Í×ÁǤâ¤Ê¤¯Ê¬¤«¤ê¤ä¤¹¤¤ÆâÍƤǤ·¤¿¡£

ÆþÎÏ¡§AudioRecord ¥¯¥é¥¹

  • AudioRecord
    The AudioRecord class manages the audio resources for Java applications to record audio from the audio input hardware of the platform.
          :
    Upon creation, an AudioRecord object initializes its associated audio buffer that it will fill with the new audio data.
          :
    Data should be read from the audio hardware in chunks of sizes inferior to the total recording buffer size.
    • AudioRecord (constructor)
      AudioRecord (int audioSource,
            int sampleRateInHz,
            int channelConfig,
            int audioFormat,
            int bufferSizeInBytes)
            :
      Parameters
            :
      bufferSizeInBytes
      int: the total size (in bytes) of the buffer where audio data is written to during the recording. New audio data can be read from this buffer in smaller chunks than this size. See getMinBufferSize(int, int, int) to determine the minimum required buffer size for the successful creation of an AudioRecord instance. Using values smaller than getMinBufferSize() will result in an initialization failure.
    • getMinBufferSize
      int getMinBufferSize (
            int sampleRateInHz,
            int channelConfig,
            int audioFormat)

      Returns the minimum buffer size required for the successful creation of an AudioRecord object, in byte units.
            :
    • startRecording
      void startRecording ()

      Starts recording from the AudioRecord instance.
    • read
      int read (short[] audioData,
            int offsetInShorts,
            int sizeInShorts)

      Reads audio data from the audio hardware for recording into a short array. The format specified in the AudioRecord constructor should be ENCODING_PCM_16BIT to correspond to the data in the array.
            :
    • getRecordingState
      int getRecordingState ()

      Returns the recording state of the AudioRecord instance.

      See also:
            RECORDSTATE_STOPPED
            RECORDSTATE_RECORDING
    • stop
      void stop ()

      Stops recording.

½ÐÎÏ¡§AudioTrack ¥¯¥é¥¹

  • AudioTrack
    The AudioTrack class manages and plays a single audio resource for Java applications. It allows streaming of PCM audio buffers to the audio sink for playback.
          :
    An AudioTrack instance can operate under two modes: static or streaming. In Streaming mode, the application writes a continuous stream of data to the AudioTrack, using one of the write() methods.
          :
    The static mode should be chosen when dealing with short sounds that fit in memory and that need to be played with the smallest latency possible.
          :
    • AudioTrack (constructor)
      AudioTrack (
            int streamType,
            int sampleRateInHz,
            int channelConfig,
            int audioFormat,
            int bufferSizeInBytes,
            int mode)
            :
      Parameters
            :
      int: the total size (in bytes) of the internal buffer where audio data is read from for playback. This should be a nonzero multiple of the frame size in bytes.
            :
      If the track's creation mode is MODE_STREAM, this should be the desired buffer size for the AudioTrack to satisfy the application's latency requirements. If bufferSizeInBytes is less than the minimum buffer size for the output sink, it is increased to the minimum buffer size.
            :
      See getMinBufferSize(int, int, int) to determine the estimated minimum buffer size for an AudioTrack instance in streaming mode.
    • play
      void play ()

      Starts playing an AudioTrack.

      If track's creation mode is MODE_STATIC, you must have called one of the write methods¡ÊÃæά¡Ëprior to play().

      If the mode is MODE_STREAM, you can optionally prime the data path prior to calling play(), by writing up to bufferSizeInBytes (from constructor). If you don't call write() first, or if you call write() but with an insufficient amount of data, then the track will be in underrun state at play(). In this case, playback will not actually start playing until the data path is filled to a device-specific minimum level.
            :
    • write
      int write (
            short[] audioData,
            int offsetInShorts,
            int sizeInShorts)

      Writes the audio data to the audio sink for playback (streaming mode), or copies audio data for later playback (static buffer mode). The format specified in the AudioTrack constructor should be ENCODING_PCM_16BIT to correspond to the data in the array.
            :
    • getPlayState
      int getPlayState ()

      Returns the playback state of the AudioTrack instance.

      See also:
            PLAYSTATE_STOPPED
            PLAYSTATE_PAUSED
            PLAYSTATE_PLAYING
    • pause
      void pause ()

      Pauses the playback of the audio data. Data that has not been played back will not be discarded. Subsequent calls to play() will play this data back. See flush() to discard this data.
            :
    • stop
      void stop ()

      Stops playing the audio data.
            :
    • flush
      void flush ()

      Flushes the audio data currently queued for playback. Any data that has been written but not yet presented will be discarded. No-op if not stopped or paused, or if the track's creation mode is not MODE_STREAM.
            :

»îºî

Android ´Ä¶­¤Ç¤Î²»À¼Æþ½ÐÎϤδðËÜŪ¤ÊºîË¡¤ò³Ð¤¨¤ë¤¿¤á¤ËºÇ½é¤Ë¤´¤¯¥·¥ó¥×¥ë¤Ê¥¢¥×¥ê¤ò½ñ¤¤¤Æ¤ß¤Þ¤·¤¿¡£ ÆþÎϦ¤È½ÐÎϦ¤Ï¿¤¯¤Î¾ì¹çµ¡Ç½Åª¤Ëʬ¤±¤é¤ì¤Þ¤¹¤¬¡¢¤³¤³¤Ç¤Ï¤½¤ÎξÊý¤ÎÍ×ÁǤò¼¡¤ÎÆâÍƤÇñ°ì¤Î¥×¥í¥°¥é¥à¤ËÁȤßÆþ¤ì¤Æ¤¤¤Þ¤¹¡£

  • UI ¾å¤Î¥Ü¥¿¥ó¤ò²¡²¼¤¹¤ë¤È¥Þ¥¤¥¯¥í¥Õ¥©¥ó¤«¤é¤ÎÏ¿²»¤ò³«»Ï¤¹¤ë
  • ºÆÅ٥ܥ¿¥ó¤ò²¡²¼¤¹¤ë¤ÈÏ¿²»¤ò½ªÎ»¤·¤½¤ÎÆâÍƤòºÆÀ¸¤¹¤ë
  • ²»À¼¥Ç¡¼¥¿¤Ï¥á¥â¥ê¾å¤Ç°·¤¤¥Õ¥¡¥¤¥ë¤Ï»ÈÍѤ·¤Ê¤¤

½èÍý¤Î¥¤¥á¡¼¥¸

   

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§33Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¥½¡¼¥¹¥³¡¼¥É

sonic01     GitHub

  • MainActivity.java
    
    /**
     *
     * sonic01
     *
     * üËö¤Î¥Þ¥¤¥¯¤«¤é²»À¼¤òÏ¿²»¤·¥¹¥Ô¡¼¥«¡¼¤ÇºÆÀ¸¤¹¤ë
     * Android ɸ½à¤Î AudioRecord, AudioTrack ¤ò»ÈÍÑ
     *
     * ¥µ¥ó¥×¥ê¥ó¥°¼þÇÈ¿ô 44.1kHz
     * Î̻Ҳ½¥Ó¥Ã¥È¿ô 16
     * ¥â¥Î¥é¥ë
     *
     */
    
    package jp.klab.sonic01;
    
    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ProgressBar;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final int BLOCK_NUMBER = 300;
    
      private static final int MSG_RECORD_START = 100;
      private static final int MSG_RECORD_END   = 110;
      private static final int MSG_PLAY_END   = 130;
    
      private Handler mHandler;
      private AudioRecord mAudioRecord = null;
      private AudioTrack mAudioTrack = null;
    
      private Button mButton01;
      private ProgressBar mProgressBar;
    
      private boolean mInRecording = false;
      private boolean mStop = false;
      private int mBufferSizeInShort;
    
      private short mPlayBuf[];
      private short mRecordBuf[];
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        mButton01 = (Button)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mProgressBar = (ProgressBar)findViewById(R.id.progressBar);
        mProgressBar.setMax(BLOCK_NUMBER);
        mProgressBar.setProgress(0);
    
        /***** add for Android 6.0 or later ****/
        // https://developer.android.com/training/permissions/requesting.html
        // https://developer.android.com/topic/libraries/support-library/index.html#backward
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) !=
            PackageManager.PERMISSION_GRANTED) {
          // RECORD_AUDIO ¤Î¼Â¹Ô»þ¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¤òÍ×µá
          ActivityCompat.requestPermissions(this,
              new String[]{Manifest.permission.RECORD_AUDIO}, 1);
        }
        initAudio();
        /**** add end ****/
    
    /***** move to initAudio() ****
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
    
        mBufferSizeInShort = bufferSizeInBytes / 2;
        // Ï¿²»ÍѥХåե¡
        mRecordBuf = new short[mBufferSizeInShort];
        // ºÆÀ¸ÍѥХåե¡
        mPlayBuf = new short[mBufferSizeInShort * BLOCK_NUMBER];
    
        // Ï¿²»ÍÑ
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes);
        // ºÆÀ¸ÍÑ
        mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes,
                        AudioTrack.MODE_STREAM);
    ****/
      }
    
      /**** add for Android 6.0 or later ****/
      // https://developer.android.com/training/permissions/requesting.html
      @Override
      public void onRequestPermissionsResult(int requestCode,
                           String permissions[], int[] grantResults) {
        switch (requestCode) {
          case 1: {
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              initAudio();
            } else {
              finish();
            }
            return;
          }
        }
      }
    
      private void initAudio() {
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    
        mBufferSizeInShort = bufferSizeInBytes / 2;
        // Ï¿²»ÍѥХåե¡
        mRecordBuf = new short[mBufferSizeInShort];
        // ºÆÀ¸ÍѥХåե¡
        mPlayBuf = new short[mBufferSizeInShort * BLOCK_NUMBER];
    
        // Ï¿²»ÍÑ
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
            SAMPLE_RATE,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufferSizeInBytes);
        // ºÆÀ¸ÍÑ
        mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            SAMPLE_RATE,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufferSizeInBytes,
            AudioTrack.MODE_STREAM);
      }
      /**** add end ****/
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        mStop = true;
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioRecord != null) {
          if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioRecord");
            mAudioRecord.stop();
          }
          mAudioRecord = null;
        }
        if (mAudioTrack != null) {
          if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioTrack");
            mAudioTrack.stop();
            mAudioTrack.flush();
          }
          mAudioTrack = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (v == (View)mButton01) {
          // ½¸²»³«»Ï or ½ªÎ»
          if (!mInRecording) {
            mInRecording = true;
            new Thread(this).start();
          } else {
            mInRecording = false;
          }
        }
        return;
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_RECORD_START:
            Log.d(TAG, "MSG_RECORD_START");
            mButton01.setText("STOP");
            break;
          case MSG_RECORD_END:
            Log.d(TAG, "MSG_RECORD_END");
            mButton01.setEnabled(false);
            break;
          case MSG_PLAY_END:
            Log.d(TAG, "MSG_PLAY_END");
            mButton01.setEnabled(true);
            mButton01.setText("START");
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        mHandler.sendEmptyMessage(MSG_RECORD_START);
        // ½¸²»³«»Ï
        mAudioRecord.startRecording();
        int count = 0;
        while (mInRecording && !mStop) {
          mAudioRecord.read(mRecordBuf, 0, mBufferSizeInShort);
          // ºÆÀ¸ÍѥХåե¡¤Ï¥ê¥ó¥°¥Ð¥Ã¥Õ¥¡¤È¤·¤Æ°·¤¦
          if (count * mBufferSizeInShort >= mPlayBuf.length) {
            count = 0;
            mProgressBar.setProgress(0);
          }
          // ºÆÀ¸ÍѥХåե¡¤Ø½¸²»¤·¤¿¥Ç¡¼¥¿¤ò¥¢¥Ú¥ó¥É
          System.arraycopy(mRecordBuf, 0, mPlayBuf, count * mBufferSizeInShort, mBufferSizeInShort);
          mProgressBar.setProgress(++count);
        }
        // ½¸²»½ªÎ»
        mAudioRecord.stop();
        mProgressBar.setProgress(0);
        mHandler.sendEmptyMessage(MSG_RECORD_END);
        if (mStop) {
          return;
        }
        // ºÆÀ¸
        mAudioTrack.setPlaybackRate(SAMPLE_RATE);
        mAudioTrack.play();
        mAudioTrack.write(mPlayBuf, 0, count * mBufferSizeInShort);
        mAudioTrack.stop();
        mAudioTrack.flush();
        mHandler.sendEmptyMessage(MSG_PLAY_END);
      }
    }
    
    
  • AndroidManifest.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="jp.klab.sonic01">
      <uses-permission android:name="android.permission.RECORD_AUDIO"/>
      <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
          android:name=".MainActivity"
          android:label="@string/app_name"
          android:configChanges="orientation|screenSize"
          android:screenOrientation="unspecified"
          android:theme="@style/AppTheme.NoActionBar">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
        </activity>
        <!-- ATTENTION: This was auto-generated to add Google Play services to your project for
           App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
        <meta-data
          android:name="com.google.android.gms.version"
          android:value="@integer/google_play_services_version" />
      </application>
    </manifest>
    
    

½àÈ÷ 2. Ǥ°Õ¤Î¼þÇÈ¿ô¤Î²»ÇȤòÀ¸À®¡¦½ÐÎϤ¹¤ë

²»¤Ë¤è¤ë¾ðÊóÅÁã¡Ê¸À¸ì²»¤ò½ü¤¯¡Ë¤Ë¤ª¤¤¤Æ¤Ï¡¢ÅÁ¤¨¤¿¤¤ÆâÍƤΰÕÌ£¤ò¹½À®¤¹¤ëÍ×ÁǤȤ·¤Æ¡Ö²»¤Î¹â¤µ¡Ê¼þÇÈ¿ô¡Ë¡×¤È¡Ö²»¤ÎÂ礭¤µ¡Ê¿¶Éý¡Ë¡×¤¬µó¤²¤é¤ì¤Þ¤¹¡£¤³¤ì¤é¤ò½êÄê¤Îµ¬Â§¤Ë´ð¤Å¤¤¤ÆÁȤ߹ç¤ï¤»¤ë¤³¤È¤ÇÁ÷¤ê¼ê¤È¼õ¤±¼ê¤Î´Ö¤Ç¤Î¤ä¤ê¤È¤ê¤¬²Äǽ¤È¤Ê¤ë¤Ç¤·¤ç¤¦¡£Á÷¤ê¼ê¦¤Ë¤Ï¤½¤³¤ÇǤ°Õ¤Î¼þÇÈ¿ô¡¦¿¶Éý¤Î²»¤òºî¤ë½èÍý¤¬É¬ÍפȤʤê¤Þ¤¹¡£¤³¤ì¤¬¤Õ¤¿¤Ä¤á¤Î²ÝÂê¤Ç¤¹¡£

¥µ¥¤¥óÇȤˤĤ¤¤Æ

²»¤ÎÇÈ·Á¤Ë¤Ï¼ïÎब¤¢¤ê¤Þ¤¹¤¬¡¢¤³¤³¤Ç¤Ï´ðËÜÇÈ·Á¤Î¤Ò¤È¤Ä¤Ç¤¢¤ë¥µ¥¤¥óÇȤò»È¤¦¤³¤È¤Ë¤·¤Þ¤·¤¿¡£¥µ¥¤¥óÇȤò¥×¥í¥°¥é¥à¤ÇÀ¸À®¤¹¤ë¤¿¤á¤Ë¤½¤ÎÀ­¼Á¡¦ÆÃħ¤È´ØÏ¢¤¹¤ë¾ðÊó¤òÀ°Íý¤·¤Æ¤ß¤Þ¤¹¡£

  • Àµ¸¹ÇÈ - wikipedia ¤è¤ê
    Àµ¸¹Çȡʤ»¤¤¤²¤ó¤Ï¡¢sine wave¡¢sinusoidal wave¡Ë¤Ï¡¢Àµ¸¹´Ø¿ô¤È¤·¤Æ´Ñ¬²Äǽ¤Ê¼þ´üŪÊѲ½¤ò¼¨¤¹ÇÈÆ°¤Î¤³¤È¤Ç¤¢¤ë¡£¤½¤ÎÇÈ·Á¤ÏÀµ¸¹¶ÊÀþ¡Ê¤»¤¤¤²¤ó¤­¤ç¤¯¤»¤ó¡¢sine curve¡Ë¤â¤·¤¯¤Ï¥·¥Ì¥½¥¤¥É (Sinusoid) ¤È¸Æ¤Ð¤ì¡¢¿ô³Ø¡¢¿®¹æ½èÍý¡¢Åŵ¤¹©³Ø¤ª¤è¤Ó¤½¤Î¾¤ÎʬÌî¤Ë¤ª¤¤¤Æ½ÅÍפÊƯ¤­¤ò¤¹¤ë¡£       :
  • Àµ¸¹Çȸòή¤Ã¤Æ¡¢¼Â¤Ï±ß±¿Æ°¤Ê¤ó¤Ç¤¹ - manapo.com ÍͤΥµ¥¤¥È¤è¤ê
    ¤¢¤ëÅÀ¤òÃæ¿´¤Ë²óž¤¹¤ë±¿Æ°¤Ï¡Ö±ß±¿Æ°¡×¤È¸À¤ï¤ì¡¢ ʪÍý¤ÎÀ¤³¦¤Ç¤Ï¤è¤¯½Ð¤Æ¤¯¤ë¸ÀÍդǤ⤢¤ë¡£¤³¤Î±ß±¿Æ°¤Îµ°Àפò²óž³ÑÅÙ¤ò²£¼´¤Ë¤·¤Æ¥°¥é¥Õ¤Ë¤¹¤ë¤È¡¢¤³¤Î¤è¤¦¤ËÀµ¸¹ÇȤηÁ¤Ë¤Ê¤ë¡£
    ³ÑÅÙ¤¬90¡ë¤Î¤È¤³¤í¤Ç»³¤Ë¤Ê¤ê¡¢180¡ë¤Î¤È¤³¤í¤Ç½ÐȯÅÀ¤ÈƱ¤¸¤Ë¤Ê¤ê¡¢270¡ë¤Î¤È¤³¤í¤Çë¤Ë¤Ê¤ê¡¢360¡ë¤Î¤È¤³¤í¤Ç¸µ¤ËÌá¤ë¡£

    ¿Þ¤Ç¤Ï²óž³ÑÅ٤ǤϤʤ¯¡¢¾¯¤·¤Ç¤âÍý²ò¤·¤ä¤¹¤¤¤è¤¦¤Ë»þ´Ö¤È¤·¤Æ¤¢¤ë¡£¸À¤¤´¹¤¨¤ë¤È¡¢±ß±¿Æ°¤Ç£±²óž¤¹¤ë¤Î¤ËɬÍפʻþ´Ö¤ò¼þ´ü¤È¸Æ¤Ö¤Î¤Ç¤¢¤ë¡£¤½¤·¤Æ¡¢£±Éô֤βóž¿ô¤¬Â¨¤Á¼þÇÈ¿ô¤Ç¤¢¤ë¡£
  •  https://www.youtube.com/embed/ij0K2tUVEGs - surikenclub Íͤˤè¤ë Youtube Æ°²è
  • Âè5¾Ï¡¡¥Õ¡¼¥ê¥¨µé¿ô - Masasi.Sanae ÍͤΥµ¥¤¥È¤è¤ê
    ¡¦1Éô֤ËÉÁ¤«¤ì¤ëÇȤβó¿ô¤ò¡Ö¼þÇÈ¿ô¡×¤È¤¤¤¤¡¤Ã±°Ì¤Ï¥Ø¥ë¥Ä(Hz)¤òÍѤ¤¤Þ¤¹¡£
    ¡¦1Éô֤˿ʤà³ÑÅ٤Τ³¤È¤ò¡Ö³Ñ®Å١פȤ¤¤¤¦Ø¡Ê¥ª¥á¥¬¡Ë¤Çɽ¤·¤Þ¤¹¡£
    ¡¦²£¼´¤«¤é¤ÎÇȤﶤì¶ñ¹ç¤ò¡Ö¿¶Éý¡×¤È¤¤¤¤¤Þ¤¹¡£

    sinÇÈ¡¤cosÇȤÎ1¤Ä¤ÎÇȤ¬¸½¤ì¤ë³ÑÅ١ʼþ´ü¤È¤¤¤¤¤Þ¤¹¡Ë¤Ï360¡ë¤Ç¤¹¤«¤é

        ³Ñ®ÅÙ¡á¼þÇÈ¿ô¡ß360¡ë

    ¤¬À®¤êΩ¤Á¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¼þÇÈ¿ô¤¬3¡¤³Ñ®ÅÙ1080¡ë¡¤¿¶Éý1¤ÎsinÇȤòɽ¤·¤Æ¤¤¤Þ¤¹¡£
    ¼þÇÈ¿ôk¡¤¿¶Éýa¤ÎsinÇȤÏy=a sin k¦Øt¤Çɽ¤µ¤ì¤Þ¤¹¡£¡Ê¦Ø=360¡ë¡Ë

    y=sin 1080¡ët=sin 3¦Øt

  • ¥é¥¸¥¢¥ó¡Ê¸ÌÅÙË¡¡Ë - wikipedia ¤è¤ê
    ¥é¥¸¥¢¥ó¡Êradian, ñ°Ìµ­¹æ: [rad]¡Ë¤Ï¡¢¹ñºÝñ°Ì·Ï (SI) ¤Ë¤ª¤±¤ë³ÑÅÙ¡ÊÊ¿Ì̳ѡˤÎñ°Ì¤Ç¤¢¤ë¡£±ß¼þ¾å¤Ç¤½¤Î±ß¤ÎȾ·Â¤ÈƱ¤¸Ä¹¤µ¤Î¸Ì¤òÀÚ¤ê¼è¤ë2ËܤÎȾ·Â¤¬À®¤¹³Ñ¤ÎÃͤÈÄêµÁ¤µ¤ì¤ë¡£

    1¥é¥¸¥¢¥ó¤ÏÅÙ¿ôË¡¤Ç¤Ï (180/¦Ð)¡ë ¤Ç¡¢¤ª¤è¤½ 57.29578¡ë ¤ËÁêÅö¤¹¤ë¡£180¡ë¤Ï¸ÌÅÙË¡¤Ë¤ª¤¤¤Æ¤Ï ¦Ð rad ¤Ç¤¢¤ê¡¢360¡ë ¤Ï 2¦Ð rad ¤Ç¤¢¤ë¡£
          :
    ¿ô³Ø¤Ç»°³Ñ´Ø¿ô¤ò°·¤¦»þ¤Ï¡¢³ÑÅ٤˥饸¥¢¥ó¤òÍѤ¤¤ë¤Î¤¬ÉáÄ̤Ǥ¢¤ë¡£¤½¤ÎÍýͳ¤Ï¡¢¤½¤ì¤¬¡Ö¼«Á³¡×¤À¤«¤é¤Ç¤¢¤ê¡¢Â¿¤¯¤Î¸ø¼°¤¬´Ê·é¤Ë½ñ¤±¤ë¤è¤¦¤Ë¤Ê¤ë¡£

    ¡Ê¢¨È¾·Â r ¤Î±ß¤Î±ß¼þ¤Ï 2 ¦Ð r ¤Ç¤¢¤ë¤¿¤á ±ß¡Ê¡á360¡ë¡Ë¤ò¸ÌÅÙË¡¤Çɽ¤¹¤È¡Ö2 ¦Ð r ¡à r¡×¡£¤è¤Ã¤Æ 360¡ë ¡á 2¦Ð ¥é¥¸¥¢¥ó¡Ë

°Ê¾å¤Î¤³¤È¤«¤é¡¢¿¶Éý¤¬ A¡¢³Ñ®ÅÙ ¦Ø ¤Î¥µ¥¤¥óÇÈ¿®¹æ¤Î¤¢¤ë»þÅÀ t Éäˤª¤±¤ëÃÍ y ¤Ï¼¡¤Î¼°¤Ë¤è¤Ã¤ÆÆÀ¤é¤ì¤Þ¤¹¡£

    y = A * sin ( ¦Ø * t )

¤³¤³¤Ç¡¢³Ñ®ÅÙ ¡á ¼þÇÈ¿ô¡Ê f Hz ¡Ë¡ß 360¡ë ¤Ç¤¢¤ê 360¡ë ¡á 2¦Ð ¥é¥¸¥¢¥ó ¤Ç¤¢¤ë¤¿¤á³Ñ®Å٤ϡּþÇÈ¿ô¡Ê f Hz ¡Ë ¡ß 2¦Ð¡×¤Èɽ¤»¤ë¤¿¤á¤³¤Î¼°¤Ï¼¡¤Î¤è¤¦¤Ë¤â½ñ¤±¤Þ¤¹¡£

    y = A * sin ( 2¦Ð * f * t )

¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¤Ë¤Ä¤¤¤Æ

½êÄê¤Î¼þÇÈ¿ô¤Î¿®¹æ¤ò½ÐÎϤ¹¤ë¤¿¤á¤Ë¤ÏÁê±þ¤Î¥µ¥ó¥×¥ê¥ó¥°¡ÊɸËܲ½¡Ë¥ì¡¼¥È¤¬É¬ÍפȤʤê¤Þ¤¹¡£

¥ª¡¼¥Ç¥£¥ª CD ¤Îµ¬³Ê¤ÇºÎÍѤµ¤ì¤Æ¤¤¤ë¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È 44,100Hz ¤Ç¤¢¤ì¤ÐÍýÏÀ¾å 22,000Hz ÉÕ¶á¤Þ¤Ç¤ÎºÆ¸½¤¬²Äǽ¤Ç¤¢¤ë¤¿¤á¼ÂÍѾå¤ÎÉÔ­¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¡£¤Þ¤¿¡¢½½Ê¬¤Ê¥À¥¤¥Ê¥ß¥Ã¥¯¥ì¥ó¥¸¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¿¶Éý¾ðÊó¤ÎÎ̻Ҳ½¤Ë¤Ï¤³¤ì¤â¥ª¡¼¥Ç¥£¥ª CD ¤ÈƱÍÍ¤Ë 16¥Ó¥Ã¥È¤òÍѤ¤¤ë¤³¤È¤È¤·¤Þ¤¹¡£¡Ê¤Á¤Ê¤ß¤Ë DVD ¤Ï 24¥Ó¥Ã¥È¤À¤½¤¦¤Ç¤¹¡Ë

·×»»¤·¤Æ¤ß¤ë¤È¡¢¡Ö¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È 44,100Hz¡¦Î̻Ҳ½¥Ó¥Ã¥È¿ô 16¡¦¥â¥Î¥é¥ë¡×¤Ç 1Éô֤ο®¹æ¤ò¹½À®¤¹¤ë¤Ë¤Ï¡¢44,100ÅÀ * 2¥Ð¥¤¥È * 1¥Á¥ã¥Í¥ë = 88,200¥Ð¥¤¥È¤Î¥á¥â¥ê¶õ´Ö¤¬É¬ÍפȤ¤¤¦¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£

´ØÏ¢¾ðÊó

»îºî

°Ê¾å¤Î¾ðÊó¤ò¤â¤È¤Ë¥×¥í¥°¥é¥à¤ò»îºî¤·¤Þ¤·¤¿¡£200Hz ¡Á 14,000Hz ¤ÎÈϰϤΠ10¼ïÎà¤Î¼þÇÈ¿ô¤Î¥µ¥¤¥óÇÈ¿®¹æ¤òÀ¸À®¡¦½ÐÎϤ¹¤ë¤â¤Î¤Ç¤¹¡£¤³¤³¤Ç¤ÏÍ×ÁÇ¿ô 44,100 ¤Î short ·¿ÇÛÎó¤Ë 1ÉÃʬ¤Î¥µ¥¤¥óÇȥǡ¼¥¿¤ò³ÊǼ¤·¥ë¡¼¥×ºÆÀ¸¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§2ʬ13Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª


ʬÀϤ˻ÈÍѤ·¤Æ¤¤¤ë¥¢¥×¥ê¡§ AudioUtil Spectrum Analyzer - play.google.com

¥½¡¼¥¹¥³¡¼¥É

sonic03     GitHub

  • MainActivity.java
    
    /**
     *
     * sonic03
     *
     * ¥µ¥¤¥óÇÈ¿®¹æ¤òÀ¸À®¤·¤ÆÌĤ餹
     *
     * ¥µ¥ó¥×¥ê¥ó¥°¼þÇÈ¿ô 44.1kHz
     * Î̻Ҳ½¥Ó¥Ã¥È¿ô 16
     * ¥â¥Î¥é¥ë
     *
     */
    
    package jp.klab.sonic03;
    
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.ToggleButton;
    
    import java.util.Arrays;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final float SEC_PER_SAMPLEPOINT = 1.0f / SAMPLE_RATE;
      private static final int AMP = 4000;
    
      private static final int [] FREQS =
          new int[] {200, 400, 800, 1600, 2000, 4000, 8000, 10000, 12000, 14000};
      private static final int DO = 262 * 2;
      private static final int RE = 294 * 2;
      private static final int MI = 330 * 2;
      private static final int FA = 349 * 2;
      private static final int SO = 392 * 2;
      private static final int RA = 440 * 2;
      private static final int SI = 494 * 2;
    
      private static final int MSG_PLAY_START = 120;
      private static final int MSG_PLAY_END   = 130;
    
      private Handler mHandler;
      private AudioTrack mAudioTrack = null;
      private ToggleButton mButtons[];
      private int mIdxButtonPushed = -1;
      private int mBufferSizeInShort;
      private short mPlayBuf[];
    
      // 1ÉÃʬ¤Î¥µ¥¤¥óÇȥǡ¼¥¿¤òÀ¸À®
      private void createSineWave(int freq, int amplitude, boolean doClear) {
        if (doClear) {
          Arrays.fill(mPlayBuf, (short) 0);
        }
        for (int i = 0; i < SAMPLE_RATE; i++) {
          float currentSec = i * SEC_PER_SAMPLEPOINT; // ¸½ºß°ÌÃ֤ηвáÉÿô
          // y(t) = A * sin(2¦Ð * f * t)
          double val = amplitude * Math.sin(2.0 * Math.PI * freq * currentSec);
          mPlayBuf[i] += (short)val;
        }
      }
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        mButtons = new ToggleButton[11];
        (mButtons[0] = (ToggleButton)findViewById(R.id.button01)).setOnClickListener(this);
        (mButtons[1] = (ToggleButton)findViewById(R.id.button02)).setOnClickListener(this);
        (mButtons[2] = (ToggleButton)findViewById(R.id.button03)).setOnClickListener(this);
        (mButtons[3] = (ToggleButton)findViewById(R.id.button04)).setOnClickListener(this);
        (mButtons[4] = (ToggleButton)findViewById(R.id.button05)).setOnClickListener(this);
        (mButtons[5] = (ToggleButton)findViewById(R.id.button06)).setOnClickListener(this);
        (mButtons[6] = (ToggleButton)findViewById(R.id.button07)).setOnClickListener(this);
        (mButtons[7] = (ToggleButton)findViewById(R.id.button08)).setOnClickListener(this);
        (mButtons[8] = (ToggleButton)findViewById(R.id.button09)).setOnClickListener(this);
        (mButtons[9] = (ToggleButton)findViewById(R.id.button10)).setOnClickListener(this);
        (mButtons[10] = (ToggleButton)findViewById(R.id.button11)).setOnClickListener(this);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
        // ºÆÀ¸ÍѥХåե¡
        mPlayBuf = new short[SAMPLE_RATE]; // 1ÉÃʬ¤Î¥Ð¥Ã¥Õ¥¡¤ò³ÎÊÝ
    
        // ºÆÀ¸ÍÑ
        mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes,
                        AudioTrack.MODE_STREAM);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioTrack != null) {
          if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioTrack");
            mAudioTrack.stop();
            mAudioTrack.flush();
          }
          mAudioTrack = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        for (int i = 0; i < mButtons.length; i++) {
          if (mButtons[i] == (ToggleButton)v) {
            mIdxButtonPushed = i;
            break;
          }
        }
        if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
          mAudioTrack.stop();
          mAudioTrack.flush();
        }
        if (mButtons[mIdxButtonPushed].isChecked()) {
          new Thread(this).start();
        }
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_PLAY_START:
            Log.d(TAG, "MSG_PLAY_START");
            break;
          case MSG_PLAY_END:
            Log.d(TAG, "MSG_PLAY_END");
            mButtons[mIdxButtonPushed].setChecked(false);
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        mHandler.sendEmptyMessage(MSG_PLAY_START);
        if (mAudioTrack.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) {
          mAudioTrack.stop();
          mAudioTrack.flush();
        }
        mAudioTrack.play();
        if (mIdxButtonPushed != 10) {
          createSineWave(FREQS[mIdxButtonPushed], AMP, true);
          for (int i = 0; i < 5; i++) { // 5ÉÃÄøÅÙÌĤ餹
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE);
          }
        } else { // SONG
          for (int i = 0; i < 2; i++) {
            mAudioTrack.play();
            createSineWave(DO, AMP, true);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(RE, AMP, true);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(MI, AMP, true);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(FA, AMP, true);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(MI, AMP, true);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(RE, AMP, true);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(DO, AMP, true);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE);
    
            // ϲ»
            createSineWave(DO, AMP, true);
            createSineWave(MI, AMP, false);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(RE, AMP, true);
            createSineWave(FA, AMP, false);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(MI, AMP, true);
            createSineWave(SO, AMP, false);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(FA, AMP, true);
            createSineWave(RA, AMP, false);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(MI, AMP, true);
            createSineWave(SO, AMP, false);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(RE, AMP, true);
            createSineWave(FA, AMP, false);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE / 2);
            createSineWave(DO, AMP, true);
            createSineWave(MI, AMP, false);
            mAudioTrack.write(mPlayBuf, 0, SAMPLE_RATE);
          }
        }
        mAudioTrack.stop();
        mAudioTrack.flush();
        mHandler.sendEmptyMessage(MSG_PLAY_END);
      }
    }
    
    
  • AndroidManifest.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="jp.klab.sonic03">
      <uses-permission android:name="android.permission.RECORD_AUDIO"/>
      <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
          android:name=".MainActivity"
          android:label="@string/app_name"
          android:configChanges="orientation|screenSize"
          android:screenOrientation="unspecified"
          android:theme="@style/AppTheme.NoActionBar">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
        </activity>
        <!-- ATTENTION: This was auto-generated to add Google Play services to your project for
           App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
        <meta-data
          android:name="com.google.android.gms.version"
          android:value="@integer/google_play_services_version" />
      </application>
    </manifest>
    
    

¥¹¥×¥ì¥Ã¥É¥·¡¼¥È¤ò»È¤Ã¤Æ¤Î¸¡¾Ú

Á°½Ò¤Î¤è¤¦¤Ë¾å¤Î¥³¡¼¥É¤Î createSineWave ´Ø¿ô¤ÏÍ×ÁÇ¿ô 44,100 ¤Î short ·¿ÇÛÎó¤Ë 44,100Hz¡¦16¥Ó¥Ã¥È¡¦¥â¥Î¥é¥ë 1ÉÃʬ¤Î¥µ¥¤¥óÇȥǡ¼¥¿¤òÀ¸À®¤·¤Æ¤¤¤Þ¤¹¡£

¤³¤ÎÇÛÎó¤ÎÀèƬ 441 Í×ÁÇʬ¡¢¤Ä¤Þ¤ê 1/100 ÉÃʬ¤Î¥Ç¡¼¥¿¤È¤½¤ì¤ò¥°¥é¥Õ²½¤·¤¿¤â¤Î¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£¤½¤ì¤¾¤ì´üÂÔÄ̤ê¤ÎÇÈ·Á¤¬À¸À®¤µ¤ì¤Æ¤¤¤ë¤³¤È¤¬¸«¤Æ¤È¤ì¤Þ¤¹¡£

  • ¼þÇÈ¿ô 400Hz ¤ò»ØÄꤷ¤¿¾ì¹ç¡§400Hz/100 ¤Ë¤Ä¤­ 4 ¼þ´üʬ¤Î½ÐÎÏ
    element,value
    0,0
    1,227
    2,454
    3,680
    4,903
    5,1124
    6,1341
    7,1553
    8,1761
    9,1962
    10,2158
    11,2346
    12,2527
    13,2699
    14,2863
    15,3017
    16,3162
    17,3296
    18,3420
    19,3533
    20,3634
    21,3723
    22,3800
    23,3865
    24,3917
    25,3957
    26,3984
    27,3997
    28,3998
    29,3986
    30,3961
    31,3923
    32,3872
    33,3809
    34,3733
    35,3646
    36,3546
    37,3435
    38,3312
    39,3179
    40,3036
    41,2883
    42,2720
    43,2549
    44,2369
    45,2182
    46,1987
    47,1786
    48,1579
    49,1368
    50,1151
    51,931
    52,708
    53,483
    54,256
    55,28
    56,-199
    57,-426
    58,-652
    59,-876
    60,-1097
    61,-1314
    62,-1527
    63,-1735
    64,-1937
    65,-2134
    66,-2323
    67,-2505
    68,-2678
    69,-2843
    70,-2999
    71,-3145
    72,-3280
    73,-3405
    74,-3519
    75,-3622
    76,-3712
    77,-3791
    78,-3858
    79,-3911
    80,-3953
    81,-3981
    82,-3996
    83,-3999
    84,-3988
    85,-3965
    86,-3928
    87,-3879
    88,-3818
    89,-3743
    90,-3657
    91,-3559
    92,-3449
    93,-3328
    94,-3197
    95,-3055
    96,-2902
    97,-2741
    98,-2571
    99,-2392
    100,-2205
    101,-2012
    102,-1812
    103,-1606
    104,-1394
    105,-1179
    106,-959
    107,-736
    108,-511
    109,-284
    110,-56
    111,170
    112,398
    113,624
    114,848
    115,1069
    116,1287
    117,1501
    118,1709
    119,1913
    120,2110
    121,2300
    122,2482
    123,2657
    124,2823
    125,2980
    126,3127
    127,3264
    128,3390
    129,3506
    130,3610
    131,3702
    132,3782
    133,3850
    134,3905
    135,3948
    136,3978
    137,3995
    138,3999
    139,3990
    140,3968
    141,3934
    142,3886
    143,3826
    144,3753
    145,3669
    146,3572
    147,3464
    148,3344
    149,3214
    150,3073
    151,2922
    152,2762
    153,2592
    154,2415
    155,2229
    156,2036
    157,1837
    158,1632
    159,1421
    160,1206
    161,987
    162,764
    163,539
    164,313
    165,85
    166,-142
    167,-369
    168,-596
    169,-820
    170,-1042
    171,-1260
    172,-1474
    173,-1684
    174,-1887
    175,-2085
    176,-2276
    177,-2460
    178,-2636
    179,-2803
    180,-2961
    181,-3109
    182,-3247
    183,-3375
    184,-3492
    185,-3597
    186,-3691
    187,-3773
    188,-3842
    189,-3899
    190,-3944
    191,-3975
    192,-3994
    193,-3999
    194,-3992
    195,-3972
    196,-3939
    197,-3893
    198,-3834
    199,-3763
    200,-3680
    201,-3585
    202,-3478
    203,-3360
    204,-3231
    205,-3091
    206,-2941
    207,-2782
    208,-2614
    209,-2437
    210,-2253
    211,-2061
    212,-1862
    213,-1658
    214,-1448
    215,-1233
    216,-1014
    217,-792
    218,-567
    219,-341
    220,-113
    221,113
    222,341
    223,567
    224,792
    225,1014
    226,1233
    227,1448
    228,1658
    229,1862
    230,2061
    231,2253
    232,2437
    233,2614
    234,2782
    235,2941
    236,3091
    237,3231
    238,3360
    239,3478
    240,3585
    241,3680
    242,3763
    243,3834
    244,3893
    245,3939
    246,3972
    247,3992
    248,3999
    249,3994
    250,3975
    251,3944
    252,3899
    253,3842
    254,3773
    255,3691
    256,3597
    257,3492
    258,3375
    259,3247
    260,3109
    261,2961
    262,2803
    263,2636
    264,2460
    265,2276
    266,2085
    267,1887
    268,1684
    269,1474
    270,1260
    271,1042
    272,820
    273,596
    274,369
    275,142
    276,-85
    277,-313
    278,-539
    279,-764
    280,-987
    281,-1206
    282,-1421
    283,-1632
    284,-1837
    285,-2036
    286,-2229
    287,-2415
    288,-2592
    289,-2762
    290,-2922
    291,-3073
    292,-3214
    293,-3344
    294,-3464
    295,-3572
    296,-3669
    297,-3753
    298,-3826
    299,-3886
    300,-3934
    301,-3968
    302,-3990
    303,-3999
    304,-3995
    305,-3978
    306,-3948
    307,-3905
    308,-3850
    309,-3782
    310,-3702
    311,-3610
    312,-3506
    313,-3390
    314,-3264
    315,-3127
    316,-2980
    317,-2823
    318,-2657
    319,-2482
    320,-2300
    321,-2110
    322,-1913
    323,-1709
    324,-1501
    325,-1287
    326,-1069
    327,-848
    328,-624
    329,-398
    330,-170
    331,56
    332,284
    333,511
    334,736
    335,959
    336,1179
    337,1394
    338,1606
    339,1812
    340,2012
    341,2205
    342,2392
    343,2571
    344,2741
    345,2902
    346,3055
    347,3197
    348,3328
    349,3449
    350,3559
    351,3657
    352,3743
    353,3818
    354,3879
    355,3928
    356,3965
    357,3988
    358,3999
    359,3996
    360,3981
    361,3953
    362,3911
    363,3858
    364,3791
    365,3712
    366,3622
    367,3519
    368,3405
    369,3280
    370,3145
    371,2999
    372,2843
    373,2678
    374,2505
    375,2323
    376,2134
    377,1937
    378,1735
    379,1527
    380,1314
    381,1097
    382,876
    383,652
    384,426
    385,199
    386,-28
    387,-256
    388,-483
    389,-708
    390,-931
    391,-1151
    392,-1368
    393,-1579
    394,-1786
    395,-1987
    396,-2182
    397,-2369
    398,-2549
    399,-2720
    400,-2883
    401,-3036
    402,-3179
    403,-3312
    404,-3435
    405,-3546
    406,-3646
    407,-3733
    408,-3809
    409,-3872
    410,-3923
    411,-3961
    412,-3986
    413,-3998
    414,-3997
    415,-3984
    416,-3957
    417,-3917
    418,-3865
    419,-3800
    420,-3723
    421,-3634
    422,-3533
    423,-3420
    424,-3296
    425,-3162
    426,-3017
    427,-2863
    428,-2699
    429,-2527
    430,-2346
    431,-2158
    432,-1962
    433,-1761
    434,-1553
    435,-1341
    436,-1124
    437,-903
    438,-680
    439,-454
    440,-227
    
  • ¼þÇÈ¿ô 1,600Hz ¤ò»ØÄꤷ¤¿¾ì¹ç¡§1,600Hz/100 ¤Ë¤Ä¤­ 16 ¼þ´üʬ¤Î½ÐÎÏ
    element,value
    0,0
    1,903
    2,1761
    3,2527
    4,3162
    5,3634
    6,3917
    7,3998
    8,3872
    9,3546
    10,3036
    11,2369
    12,1579
    13,708
    14,-199
    15,-1097
    16,-1937
    17,-2678
    18,-3280
    19,-3712
    20,-3953
    21,-3988
    22,-3818
    23,-3449
    24,-2902
    25,-2205
    26,-1394
    27,-511
    28,398
    29,1287
    30,2110
    31,2823
    32,3390
    33,3782
    34,3978
    35,3968
    36,3753
    37,3344
    38,2762
    39,2036
    40,1206
    41,313
    42,-596
    43,-1474
    44,-2276
    45,-2961
    46,-3492
    47,-3842
    48,-3994
    49,-3939
    50,-3680
    51,-3231
    52,-2614
    53,-1862
    54,-1014
    55,-113
    56,792
    57,1658
    58,2437
    59,3091
    60,3585
    61,3893
    62,3999
    63,3899
    64,3597
    65,3109
    66,2460
    67,1684
    68,820
    69,-85
    70,-987
    71,-1837
    72,-2592
    73,-3214
    74,-3669
    75,-3934
    76,-3995
    77,-3850
    78,-3506
    79,-2980
    80,-2300
    81,-1501
    82,-624
    83,284
    84,1179
    85,2012
    86,2741
    87,3328
    88,3743
    89,3965
    90,3981
    91,3791
    92,3405
    93,2843
    94,2134
    95,1314
    96,426
    97,-483
    98,-1368
    99,-2182
    100,-2883
    101,-3435
    102,-3809
    103,-3986
    104,-3957
    105,-3723
    106,-3296
    107,-2699
    108,-1962
    109,-1124
    110,-227
    111,680
    112,1553
    113,2346
    114,3017
    115,3533
    116,3865
    117,3997
    118,3923
    119,3646
    120,3179
    121,2549
    122,1786
    123,931
    124,28
    125,-876
    126,-1735
    127,-2505
    128,-3145
    129,-3622
    130,-3911
    131,-3999
    132,-3879
    133,-3559
    134,-3055
    135,-2392
    136,-1606
    137,-736
    138,170
    139,1069
    140,1913
    141,2657
    142,3264
    143,3702
    144,3948
    145,3990
    146,3826
    147,3464
    148,2922
    149,2229
    150,1421
    151,539
    152,-369
    153,-1260
    154,-2085
    155,-2803
    156,-3375
    157,-3773
    158,-3975
    159,-3972
    160,-3763
    161,-3360
    162,-2782
    163,-2061
    164,-1233
    165,-341
    166,567
    167,1448
    168,2253
    169,2941
    170,3478
    171,3834
    172,3992
    173,3944
    174,3691
    175,3247
    176,2636
    177,1887
    178,1042
    179,142
    180,-764
    181,-1632
    182,-2415
    183,-3073
    184,-3572
    185,-3886
    186,-3999
    187,-3905
    188,-3610
    189,-3127
    190,-2482
    191,-1709
    192,-848
    193,56
    194,959
    195,1812
    196,2571
    197,3197
    198,3657
    199,3928
    200,3996
    201,3858
    202,3519
    203,2999
    204,2323
    205,1527
    206,652
    207,-256
    208,-1151
    209,-1987
    210,-2720
    211,-3312
    212,-3733
    213,-3961
    214,-3984
    215,-3800
    216,-3420
    217,-2863
    218,-2158
    219,-1341
    220,-454
    221,454
    222,1341
    223,2158
    224,2863
    225,3420
    226,3800
    227,3984
    228,3961
    229,3733
    230,3312
    231,2720
    232,1987
    234,256
    235,-652
    236,-1527
    237,-2323
    238,-2999
    239,-3519
    240,-3858
    241,-3996
    242,-3928
    243,-3657
    244,-3197
    245,-2571
    246,-1812
    247,-959
    248,-56
    249,848
    250,1709
    251,2482
    252,3127
    253,3610
    254,3905
    255,3999
    256,3886
    257,3572
    258,3073
    259,2415
    260,1632
    261,764
    262,-142
    263,-1042
    264,-1887
    265,-2636
    266,-3247
    267,-3691
    268,-3944
    269,-3992
    270,-3834
    271,-3478
    272,-2941
    273,-2253
    274,-1448
    275,-567
    276,341
    277,1233
    278,2061
    279,2782
    280,3360
    281,3763
    282,3972
    283,3975
    284,3773
    285,3375
    286,2803
    287,2085
    288,1260
    289,369
    290,-539
    291,-1421
    292,-2229
    293,-2922
    294,-3464
    295,-3826
    296,-3990
    297,-3948
    298,-3702
    299,-3264
    300,-2657
    302,-1069
    303,-170
    304,736
    305,1606
    306,2392
    307,3055
    308,3559
    309,3879
    310,3999
    311,3911
    312,3622
    313,3145
    314,2505
    315,1735
    316,876
    317,-28
    318,-931
    319,-1786
    320,-2549
    321,-3179
    322,-3646
    323,-3923
    324,-3997
    325,-3865
    326,-3533
    327,-3017
    328,-2346
    329,-1553
    330,-680
    331,227
    332,1124
    333,1962
    334,2699
    335,3296
    336,3723
    337,3957
    338,3986
    339,3809
    340,3435
    341,2883
    342,2182
    343,1368
    344,483
    345,-426
    346,-1314
    347,-2134
    348,-2843
    349,-3405
    350,-3791
    351,-3981
    352,-3965
    353,-3743
    354,-3328
    355,-2741
    356,-2012
    357,-1179
    358,-284
    359,624
    360,1501
    361,2300
    362,2980
    363,3506
    364,3850
    365,3995
    366,3934
    367,3669
    368,3214
    369,2592
    370,1837
    371,987
    372,85
    373,-820
    374,-1684
    375,-2460
    376,-3109
    377,-3597
    378,-3899
    379,-3999
    380,-3893
    381,-3585
    382,-3091
    383,-2437
    384,-1658
    385,-792
    386,113
    387,1014
    388,1862
    389,2614
    390,3231
    391,3680
    392,3939
    393,3994
    394,3842
    395,3492
    396,2961
    397,2276
    398,1474
    399,596
    400,-313
    401,-1206
    402,-2036
    403,-2762
    404,-3344
    405,-3753
    406,-3968
    407,-3978
    408,-3782
    409,-3390
    410,-2823
    411,-2110
    412,-1287
    413,-398
    414,511
    415,1394
    416,2205
    417,2902
    418,3449
    419,3818
    420,3988
    421,3953
    422,3712
    423,3280
    424,2678
    425,1937
    426,1097
    427,199
    428,-708
    429,-1579
    430,-2369
    431,-3036
    432,-3546
    433,-3872
    434,-3998
    435,-3917
    436,-3634
    437,-3162
    438,-2527
    439,-1761
    440,-903
    

½àÈ÷ 3. ½¸²»¤·¤¿¥Ç¡¼¥¿¤Î¼þÇÈ¿ôʬÀϤò¹Ô¤¦

FFT¡ÊFast Fourier Transform ¹â®¥Õ¡¼¥ê¥¨ÊÑ´¹¡Ë¤Ë¤Ä¤¤¤Æ

̵¶Á¼¼¤Î¤è¤¦¤Ë¿Í°ÙŪ¤ÊÆüì´Ä¶­¤ò½ü¤­À¤³¦¤Ï»¨Â¿¤Ê²»¤ÇËþ¤Á¤Æ¤¤¤Þ¤¹¡£¿Í´Ö¤ÎǾ¤Ï¼«¿È¤¬Ìµ°Õ¼±¤Î¤¦¤Á¤ËÊ£¿ô¤Î²»¤ÎÃ椫¤éɬÍפʲ»¤òÁª¤êʬ¤±¤Æ¤ª¤ê¡Ê¥«¥¯¥Æ¥ë¥Ñ¡¼¥Æ¥£¡¼¸ú²Ì¡Ë¡¢ÀŤ«¤Ë´¶¤¸¤é¤ì¤ë¼¼Æâ¤Ç¤¢¤Ã¤Æ¤â¥ì¥³¡¼¥À¡¼¤Ç¤ÎÏ¿²»ÆâÍƤòºÆÀ¸¤¹¤ë¤È°Õ³°¤Ê¥Î¥¤¥º¤Ëµ¤¤Å¤¯¤È¤¤¤Ã¤¿·Ð¸³¤Ï°ìÈÌŪ¤Ê¤â¤Î¤Ç¤¹¤Í¡£¤½¤Î¤¿¤á¡¢¼õ¤±¼ê¦¤ÎÁõÃÖ¤¬ÆÃÄê¤Î²»¤ò¸¡ÃΤ¹¤ë¤¿¤á¤Ë¤ÏɬÍפʤâ¤Î¤À¤±¤òÌÀ¼¨Åª¤Ë¥Ô¥Ã¥¯¥¢¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤¬¤ß¤Ã¤Ä¤á¤Î²ÝÂê¤Ç¤¹¡£¹­¤¯ÃΤé¤ì¤ë¥Õ¡¼¥ê¥¨ÊÑ´¹¤ò²»À¼¿®¹æ¤ËŬÍѤ¹¤ì¤Ð²»¤Î²ô¤ò¼þÇÈ¿ôÀ®Ê¬¤´¤È¤ËʬÀϤǤ­¤Þ¤¹¡£

¥Õ¡¼¥ê¥¨ÊÑ´¹¤È¤Ï

  • ¥Õ¡¼¥ê¥¨ÊÑ´¹¤ÎËܼÁ - apphokuson ÍͤΥµ¥¤¥È¤è¤ê

    Á´¤Æ¤Î¿®¹æ¤Ï¡¢¾å¿Þ¤Î¤è¤¦¤ËÇȤέ¤·¤¢¤ï¤»¤Çɽ¸½¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£

    ¶ñÂÎŪ¤Ë¤Ï¡¢¼þÇÈ¿ô¤¬1¤ÎÇÈ1¤È¼þÇÈ¿ô¤¬2¤ÎÇÈ2¤È¼þÇÈ¿ô¤¬3¤ÎÇÈ3¤È¡¦¡¦¡¦¼þÇÈ¿ô¤¬ n¤ÎÇÈn¤ò­¤·¹ç¤ï¤»¤ë¤³¤È¤Ç¡¢¤¢¤é¤æ¤ë¿®¹æ¤òɽ¸½¤¹¤ë¤³¤È¤¬½ÐÍè¤ë¤Î¤Ç¤¹¡£
          :
    ¼þÇÈ¿ô¤ò²£¼´¤Ë¡¢¿¶Éý¤ÎÂ礭¤µ¡Ê¥Ñ¥ï¡¼Ã͡ˤò½Ä¼´¤Ë¤È¤Ã¤Æ¥°¥é¥Õ¤ò½ñ¤­¤Ê¤ª¤·¤Æ¤ß¤Þ¤¹¡£
          :
    ¤³¤Î·ë²Ì¤Ï¡¢º¸¿Þ¤Î¿®¹æ¤Ë¼þÇÈ¿ô£±¤ÎÇȤ¬Â礭¤µ£´¤Ç´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¡¢¼þÇÈ¿ô£²¤Î ÇȤ¬Â礭¤µ0.5¤Ç´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¡¢¼þÇÈ¿ô£³¤ÎÇȤ¬¡¦¡¦¡¦¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
          :
    ¥Õ¡¼¥ê¥¨ÊÑ´¹¤ò¹Ô¤¨¤Ð¡¢¡Ö¿®¹æ¤Ë´Þ¤Þ¤ì¤ë¼þÇÈ¿ô¤ÎÀ®Ê¬Èæ¡×¤òÆÀ¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
          :

    ¡Ê¢¨°úÍѤ˺ݤ·É½µ­¤Ë°ìÉô¼ê¤ò²Ã¤¨¤µ¤»¤Æ夭¤Þ¤·¤¿ tanabe¡Ë

    • Åý·×Ū²»À¼Ç§¼±¤Î´ðËܸ¶Íý - ¼Äºêδ¹¨ÍͤΥµ¥¤¥È¤è¤ê
      ²»À¼¿®¹æ¤Ï,°ì¼¡¸µ¤Î»þ·ÏÎó¥Ç¡¼¥¿¤Ç¤¹¡¥²£¼´¤ò»þ´Ö,½Ä¼´¤ò²»¤ÎÂ礭¤µ¤È¤·¤Æ¥°¥é¥Õ¤òºîÀ®¤¹¤ë¤È,°Ê²¼¤Î¤è¤¦¤Ê¿Þ¤¬ÆÀ¤é¤ì¤Þ¤¹¡¥

¹â®¥Õ¡¼¥ê¥¨ÊÑ´¹¤È¤Ï

  • ¹â®¥Õ¡¼¥ê¥¨ÊÑ´¹ - wikipedia ¤è¤ê
    ¹â®¥Õ¡¼¥ê¥¨ÊÑ´¹¡Ê¤³¤¦¤½¤¯¥Õ¡¼¥ê¥¨¤Ø¤ó¤«¤ó¡¢±Ñ: Fast Fourier Transform¡¢FFT¡Ë ¤È¤Ï¡¢Î¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹ (Discrete Fourier Transform¡¢DFT) ¤ò·×»»µ¡¾å¤Ç¹â®¤Ë ·×»»¤¹¤ë¥¢¥ë¥´¥ê¥º¥à¡£FFT¤ÎµÕÊÑ´¹¤òIFFT (Inverse FFT) ¤È¸Æ¤Ö¡£
    • Î¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹ÆþÌç - EnergyChord ÍͤΥµ¥¤¥È¤è¤ê
      ¥³¥ó¥Ô¥å¡¼¥¿¤Ç¹Ô¤ï¤ì¤ë¥Õ¡¼¥ê¥¨ÊÑ´¹¤Ï´ðËÜŪ¤ËÎ¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹¤Ç¤¢¤ë¡¥¤Ê¤¼¤Ê¤é¡¤ÅŻҷ׻»µ¡¤ÏϢ³Î̤ò¤½¤Î¤Þ¤Þ°·¤¦¤³¤È¤¬¤Ç¤­¤Ê¤¤¤¿¤á¡¤¥³¥ó¥Ô¥å¡¼¥¿¤¬½èÍý¤¹¤ë¥Ç¡¼¥¿¤Ïɬ¤ºÎ¥»¶²½¤µ¤ì¤ëɬÍפ¬¤¢¤ë¤«¤é¤Ç¤¢¤ë¡¥¤Ä¤Þ¤ê¡¤¥³¥ó¥Ô¥å¡¼¥¿¤Ë¤è¤ë¥Ç¡¼¥¿½èÍý¤¬Åö¤¿¤êÁ°¤È¤Ê¤Ã¤¿¸½Âåµ»½Ñ¤Ë¤ª¤¤¤Æ¤Ï¡¤¥Õ¡¼¥ê¥¨ÊÑ´¹¤È¸À¤¨¤ÐÎ¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹¤ò»Ø¤¹¤È¸À¤Ã¤Æ¤â²á¸À¤Ç¤Ï¤Ê¤¤¡¥
      • Î¥»¶²½¤È¤Ï - ITÍѸ켭ŵ¥Ð¥¤¥Ê¥ê¤è¤ê
        Î¥»¶²½¤È¤Ï¡¢¤¢¤ëϢ³¤·¤¿¾ðÊó¤ò¡¢ÈóϢ³¤ÎÃͤËʬ³ä¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£
        Ϣ³¤·¤¿Ãͤò»ý¤Ã¤¿¾ðÊó¤ò²òÀϤ¹¤ë¤³¤È¤ÏÈó¾ï¤Ëº¤Æñ¤Ç¤¢¤ë¤¬¡¢Î¥»¶²½¤ò¹Ô¤¤ÈóϢ³¤Ê¿ôÃͤËÃÖ¤­´¹¤¨¤ë¤³¤È¤Ç¡¢¶á»÷Ū¤Ê·×»»·ë²Ì¤òÈæ³ÓŪÍưפ˻»½Ð¤¹¤ë¤³¤È¤¬²Äǽ¤È¤Ê¤ë¡£
    • ¥Õ¡¼¥ê¥¨ÊÑ´¹¤ÈÎ¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹ - ´äËÜ¿¿Íµ»ÒÍͤΥµ¥¤¥È¤è¤ê
            :
      ¥Õ¡¼¥ê¥¨ÊÑ´¹¤Ç¤Ï¡¢ÇÈy(t)¤ò¹½À®¤¹¤ë»°³Ñ´Ø¿ô¤È¤½¤Î¼þÇÈ¿ô¡¦¿¶Éý¡¦½é´ü°ÌÁê¤Ê¤É¤òÃΤ뤳¤È¤¬¤Ç¤­¤ë¤¿¤á¡¢ÇȤÎÆÃħ¤òÌÀ³Î¤Ëª¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

      Î¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹

      ¤³¤ì¤Þ¤Ç¤Ï¡¢Ï¢Â³´Ø¿ô¤ËÂФ¹¤ë¥Õ¡¼¥ê¥¨ÊÑ´¹¤ª¤è¤Ó¥Õ¡¼¥ê¥¨ÀÑʬ¡ÊµÕ¥Õ¡¼¥ê¥¨ÊÑ´¹¡Ë¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Æ¤­¤¿¡£¼ÂºÝ¡¢²»À¼¤ä²»³Ú¤Ê¤É¤Ï¡¢Ï¢Â³Åª¤ÊÇȤȤ·¤Æ½ÐÎϤµ¤ì¤ë¡£¤·¤«¤·¡¢¥³¥ó¥Ô¥å¡¼¥¿¤ÏÎ¥»¶ÃͤǤ·¤«°·¤¨¤Ê¤¤¤¿¤á¡¢Analog-Didital (AD) ÊÑ´¹´ï¤ò»È¤Ã¤Æ¡¢°ìÄê´Ö³Ö¤Ç¥µ¥ó¥×¥ê¥ó¥°¤·¡¢¥³¥ó¥Ô¥å¡¼¥¿¤¬Ä¾ÀÜ°·¤¨¤ëÎ¥»¶Åª¤ÊÇȤËÊÑ´¹¤µ¤ì¤ë¡£
            :


      Ϣ³Ū¤ÊÇȤÈÎ¥»¶Åª¤ÊÇȤδط¸

      ¥Õ¡¼¥ê¥¨ÊÑ´¹¤Ï¡¢Ï¢Â³Åª¤ÊÇȤò»°³Ñ´Ø¿ô¤ò½Å¤Í¹ç¤ï¤»¤ë¤³¤È¤Çɽ¤½¤¦¤È¤¹¤ë¤â¤Î¤Ç¤¢¤Ã¤¿¡£Î㤨¤Ð¡¢²¼¿Þ¤Î¤è¤¦¤Ë¡¢£¸¸Ä¤Î¼þ´ü´Ø¿ô¤ò½Å¤Í¹ç¤ï¤»¤¿¤â¤Î¤¬¼ÂºÝ¤Î²»¤Ç¤¢¤Ã¤¿¤È¤¹¤ë¡£


      ¼¡¤Ë¡¢ADÊÑ´¹¤Ë¤è¤Ã¤Æ¡¢£±Éô֤ˣ´¸Ä¤Î¥µ¥ó¥×¥ê¥ó¥°¿ô¡Ê£´Åùʬ¡Ë¤ÇϢ³Ū¤ÊÇȤ¬Î¥»¶²½¤µ¤ì¤¿¤È¤¹¤ë¡Ê¹õ´Ý¡Ë¡£¤è¤¯¸«¤Æ¤ß¤ë¤È¡¢cos 3t ¤ÎÎ¥»¶¤Î£´ÅÀ¤Ï cos t ¤ÎÎ¥»¶¤Î£´ÅÀ¤ÈÁ´¤¯Æ±¤¸¤Ç¤¢¤ë¡£¼Â¤Ï sin 3t ¤È sin t ¤Ë¤Ä¤¤¤Æ¤âƱÍͤǤ¢¤ë¡£
      ¤Ä¤Þ¤ê¡¢Î¥»¶²½¤µ¤ì¤¿ÇȤˤª¤¤¤Æ¤Ï¡¢¹â¼þÇÈ¿ô¤ÎÇȤÏÄã¼þÇÈ¿ô¤ÎÇȤ˵ۼý¤µ¤ì¤Æ¤·¤Þ¤¦¡£º£¤Î¾ì¹ç¤Ï¡¢½Å¤Í¹ç¤ï¤»¤é¤ì¤¿Ê£»¨¤ÊÇȤ¬¡¢k=0,1,2 ¤Î»°³Ñ´Ø¿ô¤Î¤ß¤Çɽ¤»¤ë¤È¤¤¤¦¤³¤È¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡£
      ¤·¤«¤·¡¢ÍưפËͽÁۤǤ­¤ë¤è¤¦¤Ë¡¢¥µ¥ó¥×¥ê¥ó¥°¿ô¤ò Áý¤ä¤¹¤È¡¢¤³¤ÎÌäÂê¤Ï²ò¾Ã¤¹¤ë¡£
            :
      Î¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹¤òÍѤ¤¤¿²»¤Ê¤É¤Î²òÀϤä²Ã¹©¤Ë¤Ï¡¢¥µ¥ó¥×¥ê¥ó¥°¤ÏÈó¾ï¤Ë½ÅÍפÊÍ×ÁǤǤ¢¤ê¡¢°·¤¦ÇȤˤĤ¤¤Æ¤¢¤ëÄøÅÙÆÃħ¤äÀ­¼Á¤òÃΤäƤ¤¤ëɬÍפ¬¤¢¤ë¡£Î㤨¤Ð¡¢¿Í´Ö¤¬Ê¹¤¯¤³¤È¤¬¤Ç¤­¤ë²»¤Î¼þÇÈ¿ô¤Ï¡¢20 Hz¤«¤é20 kHz¤È¸À¤ï¤ì¤Æ¤¤¤ë¡Ê°ìÈÌŪ¤Ë¤Ï15 kHz¤¯¤é¤¤¤Þ¤Ç¡Ë¤Î¤Ç¡¢¿Í´Ö¤¬Ê¹¤¯¤³¤È¤¬¤Ç¤­¤ë¤¹¤Ù¤Æ¤Î¼þÇÈ¿ô¤ò¥«¥Ð¡¼¤·¤è¤¦¤È¤¹¤ë¤È¡¢¥µ¥ó¥×¥ê¥ó¥°¿ô¤Ï£±Éô֤¢¤¿¤ê¡¢20000(Hz)¡ß2=40000 ²óɬÍפȤʤ롣
            :

FFT ¥é¥¤¥Ö¥é¥ê¡ÖJTransforms¡×

Android ¤Ë¤Ïɸ½à¤Î Visualizer ¥¯¥é¥¹¤Ë FFT ÍѤΠAPI getFft() ¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤À¤·¡¢¤¢¤¯¤Þ¤Ç¤â¡ÖThe Visualizer class enables application to retrieve part of the currently playing audio for visualization purpose.¡×¤Ç¤¢¤ê¡¢¡ÖFrequency data: 8-bit magnitude FFT by using the getFft(byte[]) method¡×¤Èµ¡Ç½Åª¤Ë¤â¹µ¤¨¤á¤ÊÆâÍƤȤʤäƤ¤¤Þ¤¹¡£ Android ¤Ç»È¤¨¤ë FFT ¥é¥¤¥Ö¥é¥ê¤Ë¤ÏÊ£¿ô¤ÎÁªÂò»è¤¬¤¢¤ê¤Þ¤¹¤¬¡¢Piotr Wendykier »á¤Ë¤è¤ë JTransforms ¤¬¹âÀ­Ç½¤«¤Ä¥á¥¸¥ã¡¼¤Ç¤¢¤ë¤³¤È¤òÃΤꤳ¤ì¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

  • JTransforms - Piotr Wendykier - sites.google.com
    JTransforms is the first, open source, multithreaded FFT library written in pure Java. Currently, four types of transforms are available: Discrete Fourier Transform (DFT), Discrete Cosine Transform (DCT), Discrete Sine Transform (DST) and Discrete Hartley Transform (DHT). The code is derived from General Purpose FFT Package written by Takuya Ooura and from Java FFTPack written by Baoshe Zhang.

    ¡ÊGoogle Ìõ¡Ë
    JTransforms¤Ï¡¢½ã¿è¤ÊJava¤Ç½ñ¤«¤ì¤¿ºÇ½é¤Î¥ª¡¼¥×¥ó¥½¡¼¥¹¤Î¥Þ¥ë¥Á¥¹¥ì¥Ã¥É FFT¥é¥¤¥Ö¥é¥ê¤Ç¤¹¡£¸½ºß¡¢Î¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹¡ÊDFT¡Ë¡¢Î¥»¶¥³¥µ¥¤¥óÊÑ´¹¡ÊDCT¡Ë¡¢ Î¥»¶¥µ¥¤¥óÊÑ´¹¡ÊDST¡Ë¤ª¤è¤ÓÎ¥»¶¥Ï¡¼¥È¥ì¡¼ÊÑ´¹¡ÊDHT¡Ë¤Î4¼ïÎà¤ÎÊÑ´¹¤¬ÍøÍѲÄǽ ¤Ç¤¢¤ë¡£¤³¤Î¥³¡¼¥É¤Ï¡¢Takuya Ooura ¤¬½ñ¤¤¤¿ÈÆÍÑFFT¥Ñ¥Ã¥±¡¼¥¸¤È¡¢Baoshe Zhang¤¬ ½ñ¤¤¤¿Java FFTPack¤«¤éÆÀ¤é¤ì¤¿¤â¤Î¤Ç¤¹¡£
          :
    License
    JTransforms is distributed under the terms of the BSD-2-Clause license.
  • wendykierp/JTransforms - GitHub
    • Documentation | Overview (JTransforms 3.1 API) - wendykierp.github.io
      JTransforms 3.1 API
      Packages
      Package                Description
      org.jtransforms.dct    Discrete Cosine Transforms.
      org.jtransforms.dht    Discrete Hartley Transforms.
      org.jtransforms.dst    Discrete Sine Transforms.
      org.jtransforms.fft    Discrete Fourier Transforms.
      org.jtransforms.utils  Utility classes.
      • Class DoubleFFT_1D
        org.jtransforms.fft
        Class DoubleFFT_1D

        Computes 1D Discrete Fourier Transform (DFT) of complex and real,double precision data. The size of the data can be an arbitrary number.

        ¡ÊGoogle Ìõ¡Ë
        Ê£ÁÇ¿ô¤È¼Â¿ô¤ÎÇÜÀºÅ٥ǡ¼¥¿¤Î°ì¼¡¸µÎ¥»¶¥Õ¡¼¥ê¥¨ÊÑ´¹¡ÊDFT¡Ë¤ò·×»»¤·¤Þ¤¹¡£¥Ç¡¼¥¿¤Î¥µ¥¤¥º¤ÏǤ°Õ¤Î¿ô¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
Á°·Ç¤Î¤è¤¦¤Ë²»À¼¿®¹æ¤Ï°ì¼¡¸µ¥Ç¡¼¥¿¤Ê¤Î¤Ç»È¤¦¤Î¤Ï¤³¤Î DoubleFFT_1D ¥¯¥é¥¹¤Ç¤è¤µ¤½¤¦¤Ç¤¹¤¬ Javadoc ¤Ç¤ÏÍøÍÑÊýË¡¤¬¤µ¤Ã¤Ñ¤ê¤ï¤«¤é¤º»ÈÍÑÎã¤ò¥Í¥Ã¥È¤Çõ¤·¤Þ¤·¤¿¡£
  • JTransforms FFT in Android from PCM data - stackoverflow.com
      System.arraycopy(applyWindow(sampleData), 0, a, 0, sampleData.length);
      fft.realForward(a);

      /* find the peak magnitude and it's index */
      double maxMag = Double.NEGATIVE_INFINITY;
      int maxInd = -1;

      for(int i = 0; i < a.length / 2; ++i) {
        double re  = a[2*i];
        double im  = a[2*i+1];
        double mag = Math.sqrt(re * re + im * im);

        if(mag > maxMag) {
          maxMag = mag;
          maxInd = i;
        }
      }
  • How to get frequency from fft result? - stackoverflow.com
    The complex data is interleaved, with real components at even indices and imaginary components at odd indices, i.e. the real components are at index 2*i, the imaginary components are at index 2*i+1.

    To get the magnitude of the spectrum at index i, you want:

    re = fft[2*i];
    im = fft[2*i+1];
    magnitude[i] = sqrt(re*re+im*im);

    Then you can plot magnitude[i] for i = 0 to N / 2 to get the power spectrum. Depending on the nature of your audio input you should see one or more peaks in the spectrum.

    To get the approximate frequency of any given peak you can convert the index of the peak as follows:

    freq = i * Fs / N;

    where:

    freq = frequency in Hz
    i = index of peak
    Fs = sample rate (e.g. 44100 Hz or whatever you are using)
    N = size of FFT (e.g. 1024 in your case)

¤Ê¤ë¤Û¤É¡¢»È¤¤Êý¤ÏÆñ¤·¤¯¤Ê¤¤¤è¤¦¤Ç¤¹¡£À°Íý¤·¤Æ¤ß¤Þ¤¹¡£

  • ²»À¼¾ðÊó¡Ê¡á¼Â¿ô¤Î¤ß¤Ç¹½À®¤µ¤ì¤ë¡Ë¤ò FFT ¤Ë¤«¤±¤ë¾ì¹ç¤Ï¿®¹æ¥Ç¡¼¥¿¤ÎÇÛÎó¤ò°ú¿ô¤È¤·¤Æ realForward ¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹
  • ¼Â¹Ô·ë²Ì¤ÏÇÛÎó¤ËÊ£ÁÇ¿ô¤Ç¾å½ñ¤­¤µ¤ì¶ö¿ô¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤Ï¼ÂÉô¡¢¤Ò¤È¤Ä¸å¤Î´ñ¿ô¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë¤ÏµõÉô¡¢¤È¤¤¤¦¥Ú¥¢¤¬Â³¤¯
  • ³Æ¼þÇÈ¿ôÀ®Ê¬¤Î¿¶ÉýÃͤÏÅö³ºÊ£ÁÇ¿ô¤ÎÀäÂÐÃÍre2+im2 ¤ÇÆÀ¤é¤ì¤ë
    • Ê£ÁÇÊ¿ÌÌ - KIT¿ô³Ø¥Ê¥Ó¥²¡¼¥·¥ç¥óÍͤΥµ¥¤¥È¤è¤ê
      xy Ê¿Ì̤ˤª¤¤¤Æ¡¤ x ¼´¤Ë¼Â¿ô¡¤ y ¼´¤Ëµõ¿ô¤òÂбþ¤µ¤»¤Æ¡¤Ê£ÁÇ¿ô¤òɽ¤·¤¿¤â¤Î¤òÊ£ÁÇÊ¿Ì̤Ȥ¤¤¦¡¥¤Þ¤¿¤Ï¡¤Ê£ÁÇ¿ôÊ¿ÌÌ¡¤¥¬¥¦¥¹Ê¿Ì̤Ȥ⤤¤¦¡¥

      Ê£ÁÇ¿ô z=a+ⅈb ¤òÊ£ÁÇÊ¿Ì̾å¤Ëɽ¤·¤¿¤â¤Î¤¬¡¤±¦¤Î¿Þ¤Ç¤¢¤ë¡¥

      Ê£ÁÇ¿ôz ¤ÎÀäÂÐÃͤÎÄêµÁ¡§

      | z |=| a+b |= a 2 + b 2 =r

      ¤¹¤Ê¤ï¤Á¡¤Ê£ÁÇÊ¿Ì̾å¤Î¸¶ÅÀO¤«¤é z ¤Þ¤Ç¤Îµ÷Î¥ r ¤È¤Ê¤ë¡¥
  • ¼þÇÈ¿ô¤Ï¡ÖÇÛÎóÍ×ÁǤΥ¤¥ó¥Ç¥Ã¥¯¥¹ * ¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È / ¿®¹æ¥Ç¡¼¥¿¤ÎÍ×ÁÇ¿ô¡Ê¡á¡ÖFFT ¥µ¥¤¥º¡×¡Ë¡×¤Î¼°¤ÇÆÀ¤é¤ì¤ë
  • ¤Ä¤Þ¤ê¡¢¤â¤Ã¤È¤â¿¶Éý¤ÎÂ礭¤¤¼þÇÈ¿ô¡Ê¥Ô¡¼¥¯¼þÇÈ¿ô¡Ë¤òÆÀ¤ë¤Ë¤ÏºÇÂ翶ÉýÃͤò»ý¤ÄÇÛÎóÍ×ÁǤΥ¤¥ó¥Ç¥Ã¥¯¥¹¤ò¾å¤Î¼°¤ËÆͤùþ¤á¤Ð¤è¤¤

»îºî

¾åµ­¤Î JTransforms ¥é¥¤¥Ö¥é¥ê¤òÍøÍѤ·¤Æ½¸²»¥Ç¡¼¥¿Ãæ¤Î¥Ô¡¼¥¯¼þÇÈ¿ô¤ò²èÌ̤Ëɽ¼¨¤¹¤ë¥¢¥×¥ê¤òºîÀ®¡£´üÂԤɤª¤ê¤Î·ë²Ì¤¬ÆÀ¤é¤ì¤Þ¤·¤¿¡£

Æ°ºî¤ÎÍÍ»Ò

Æ°²è¡§1ʬ7Éá¡¡¡¢¨²»ÎÌÃí°Õ¡ª

¥½¡¼¥¹¥³¡¼¥É

sonic04     GitHub

  • MainActivity.java
    
    /**
     *
     * sonic04
     *
     * üËö¤Î¥Þ¥¤¥¯¤«¤é²»À¼¤ò¼õ¿®¤·¥Ô¡¼¥¯¼þÇÈ¿ô¤òɽ¼¨¤¹¤ë
     * FFT ½èÍý¤Ë JTransforms ¥é¥¤¥Ö¥é¥ê¤òÍøÍÑ
     *
     * ¥µ¥ó¥×¥ê¥ó¥°¼þÇÈ¿ô 44.1kHz
     * Î̻Ҳ½¥Ó¥Ã¥È¿ô 16
     * ¥â¥Î¥é¥ë
     *
     */
    
    package jp.klab.sonic04;
    
    
    import org.jtransforms.fft.DoubleFFT_1D;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity
        implements Runnable, View.OnClickListener, Handler.Callback {
      private static final String TAG = "SNC";
    
      private static final int SAMPLE_RATE = 44100;
      private static final short THRESHOLD_AMP = 0x00ff;
    
      private static final int MSG_RECORD_START = 100;
      private static final int MSG_RECORD_END   = 110;
      private static final int MSG_FREQ_PEAK  = 120;
      private static final int MSG_SILENCE    = 130;
    
      private Handler mHandler;
      private AudioRecord mAudioRecord = null;
    
      private Button mButton01;
      private TextView mTextView02;
    
      private boolean mInRecording = false;
      private boolean mStop = false;
      private int mBufferSizeInShort;
    
      private short mRecordBuf[];
      private DoubleFFT_1D mFFT;
      private double mFFTBuffer[];
      private int mFFTSize;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        mHandler = new Handler(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        mButton01 = (Button)findViewById(R.id.button01);
        mButton01.setOnClickListener(this);
        mTextView02 = (TextView)findViewById(R.id.textView02);
    
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
    
        mBufferSizeInShort = bufferSizeInBytes / 2;
        // Ï¿²»ÍѥХåե¡
        mRecordBuf = new short[mBufferSizeInShort];
    
        // FFT ½èÍýÍÑ
        mFFTSize = mBufferSizeInShort;
        mFFT = new DoubleFFT_1D(mFFTSize);
        mFFTBuffer = new double[mFFTSize];
    
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                        SAMPLE_RATE,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes);
      }
    
      @Override
      public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
      }
    
      @Override
      public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
        mStop = true;
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        if (mAudioRecord != null) {
          if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
            Log.d(TAG, "cleanup mAudioRecord");
            mAudioRecord.stop();
          }
          mAudioRecord = null;
        }
      }
    
      @Override
      public void onClick(View v) {
        if (v == (View)mButton01) {
          // ½¸²»³«»Ï or ½ªÎ»
          if (!mInRecording) {
            mInRecording = true;
            new Thread(this).start();
          } else {
            mInRecording = false;
          }
        }
        return;
      }
    
      @Override
      public boolean handleMessage(Message msg) {
        switch (msg.what) {
          case MSG_RECORD_START:
            Log.d(TAG, "MSG_RECORD_START");
            mButton01.setText("STOP");
            break;
          case MSG_RECORD_END:
            Log.d(TAG, "MSG_RECORD_END");
            mButton01.setText("START");
            break;
          case MSG_FREQ_PEAK:
            mTextView02.setText(Integer.toString(msg.arg1) + " Hz");
            break;
          case MSG_SILENCE:
            mTextView02.setText("");
            break;
        }
        return true;
      }
    
      @Override
      public void run() {
        boolean bSilence = false;
        mHandler.sendEmptyMessage(MSG_RECORD_START);
        // ½¸²»³«»Ï
        mAudioRecord.startRecording();
        while (mInRecording && !mStop) {
          mAudioRecord.read(mRecordBuf, 0, mBufferSizeInShort);
          bSilence = true;
          for (int i = 0; i < mBufferSizeInShort; i++) {
            short s = mRecordBuf[i];
            if (s > THRESHOLD_AMP) {
              bSilence = false;
            }
          }
          if (bSilence) { // Àżä
            mHandler.sendEmptyMessage(MSG_SILENCE);
            continue;
          }
          int freq = doFFT(mRecordBuf);
          Message msg = new Message();
          msg.what = MSG_FREQ_PEAK;
          msg.arg1 = freq;
          mHandler.sendMessage(msg);
        }
        // ½¸²»½ªÎ»
        mAudioRecord.stop();
        mHandler.sendEmptyMessage(MSG_RECORD_END);
      }
    
      private int doFFT(short[] data) {
        for (int i = 0; i < mFFTSize; i++) {
          mFFTBuffer[i] = (double)data[i];
        }
        // FFT ¼Â¹Ô
        mFFT.realForward(mFFTBuffer);
    
        // ½èÍý·ë²Ì¤ÎÊ£ÁÇ¿ôÇÛÎ󤫤é³Æ¼þÇÈ¿ôÀ®Ê¬¤Î¿¶ÉýÃͤòµá¤á¥Ô¡¼¥¯Ê¬¤ÎÍ×ÁÇÈÖ¹æ¤òÆÀ¤ë
        double maxAmp = 0;
        int index = 0;
        for (int i = 0; i < mFFTSize/2; i++) {
          double a = mFFTBuffer[i*2]; // ¼ÂÉô
          double b = mFFTBuffer[i*2 + 1]; // µõÉô
          // a+ib ¤ÎÀäÂÐÃÍ ¢å a^2 + b^2 = r ¤¬¿¶ÉýÃÍ
          double r = Math.sqrt(a*a + b*b);
          if (r > maxAmp) {
            maxAmp = r;
            index = i;
          }
        }
        // Í×ÁÇÈֹ桦¥µ¥ó¥×¥ê¥ó¥°¥ì¡¼¥È¡¦FFT ¥µ¥¤¥º¤«¤é¥Ô¡¼¥¯¼þÇÈ¿ô¤òµá¤á¤ë
        return index * SAMPLE_RATE / mFFTSize;
      }
    }
    
    
  • AndroidManifest.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="jp.klab.sonic04">
      <uses-permission android:name="android.permission.RECORD_AUDIO"/>
      <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
          android:name=".MainActivity"
          android:label="@string/app_name"
          android:configChanges="orientation|screenSize"
          android:screenOrientation="unspecified"
          android:theme="@style/AppTheme.NoActionBar">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
        </activity>
        <!-- ATTENTION: This was auto-generated to add Google Play services to your project for
           App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
        <meta-data
          android:name="com.google.android.gms.version"
          android:value="@integer/google_play_services_version" />
      </application>
    </manifest>
    
    

¼¡²ó¤ÎͽÄê

°Ê¾å¤ÎÆâÍƤˤè¤ê Android ¥Ç¥Ð¥¤¥¹¤Ç¡ÖǤ°Õ¤Î¼þÇÈ¿ô¡¦¿¶Éý¤Î²»¤ò½Ð¤¹¤³¤È¡×¤È¡Ö½¦¤Ã¤¿²»¤Ë´Þ¤Þ¤ì¤ë¼þÇÈ¿ô¤ò¸¡ÃΤ¹¤ë¤³¤È¡×¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£²»¤ò»È¤Ã¤Æ¥Ç¥Ð¥¤¥¹´Ö¤ÇÄÌ¿®¤ò¹Ô¤¦¤¿¤á¤ÎÁǺब¤³¤ì¤Ç·¤Ã¤¿¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡²ó¤Ï¤³¤³¤Þ¤Ç¤ÎÅþãÅÀ¤ò±þÍѤ·¤Æ¥Ó¥Ã¥È¥Ç¡¼¥¿¤ÎÁ÷¼õ¿®¤ò»î¤ß¤Þ¤¹¡£


(tanabe)
klab_gijutsu2 at 07:21¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(4)
2017ǯ05·î18Æü

²»¤òÍøÍѤ¹¤ë 1

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

¤Ï¤¸¤á¤Ë

µ»½Ñ¡¦¥¤¥ó¥Õ¥é¤Î¿Ê²½¤È¤È¤â¤Ë¾ðÊóÄÌ¿®¤Î¸úΨ¤¬²Ã®¤ò³¤±¤ë¾õ¶·¤Ë¤¢¤Ã¤Æ¡¢¡Ö²»¡×¤òÍøÍѤ·¤¿±ýǯ¤ÎÄÌ¿®¼êË¡¤¬¶áǯ¤¢¤é¤¿¤á¤ÆÃíÌܤµ¤ì¤Æ¤¤¤Þ¤¹¡£´ØÏ¢¤¹¤ëÏÃÂê¤ò¤¤¤¯¤Ä¤«°Ê²¼¤Ë¥Ô¥Ã¥¯¥¢¥Ã¥×¤·¤Æ¤ß¤Þ¤¹¡£¤³¤ì¤é¤Ï¤¤¤º¤ì¤âºÇ¿·¤Îµ»½Ñ¤äʸ²½¤ËÌ©Ã夷¤¿Í×·ï¤Ç¤Î±þÍѤȤ¤¤¦ÅÀ¤Ç¶¦Ä̤·¤Æ¤ª¤ê¡¢²û¸ÅŪ¤Ê¥â¥Á¡¼¥Õ¤È¤Ï¤Þ¤Ã¤¿¤¯Ìµ±ï¤Ç¤¢¤ë¤³¤È¤¬¶½Ì£¿¼¤¯´¶¤¸¤é¤ì¤Þ¤¹¡£

¡Ê¢¨³Æ°úÍÑʸÃæ¤ÎÀÄ»úɽ¼¨¤ÏÉ®¼Ô¤Ë¤è¤ë¤â¤Î¤Ç¤¹¡Ë

  • ¤ªÇ㤤ʪÂ賤ò¤¢¤¿¤é¤·¤¯
    ¡Ê³ô¼°²ñ¼Ò¥¹¥Ý¥Ã¥È¥é¥¤¥ÈÍÍ¥µ¥¤¥È¤è¤ê¡Ë
    ¥¹¥Ý¥Ã¥È¥é¥¤¥È¤Îµ»½Ñ

    (1) °ÌÃÖ¸¡½Ðµ»½Ñ
    Æȼ«¤ÎĶ²»Çȵ»½Ñ¤Ë¤è¤ê¡¢Andorid/iOSÁÐÊý¤ËÂбþ¤·¤¿¡¢Àµ³Î¤Ç¥»¥­¥å¥¢¤ÊÍèŹ¸¡ÃΤ¬¼Â¸½¤Ç¤­¤Þ¤¹

  • ¡ØSSC¡ÙSmart Sonic Communication Ķ²»ÇÈÄÌ¿®¤Î¤´°ÆÆâ
    ¡Ê¥É¥ê¡¼¥à¥Ë¥å¡¼¥¹ÍÍ¥µ¥¤¥È¤è¤ê¡§ 2012-06-20¡Ë
    SINGAPORE SDI PTE LTD¡ÊËܼҡ§¥·¥ó¥¬¥Ý¡¼¥ë¡Ë¤Ï¡¢Ä¶²»ÇȤòÍøÍѤ·¤¿µ¡´ï´ÖÄÌ¿®µ»½Ñ¤È¤·¤Æ¡ØSSC(Smart Sonic Communication)¡Ù¤ò³«È¯¤¤¤¿¤·¤Þ¤·¤¿¡£ iPhone¡¢Android¤Ê¤É¤Î¥¹¥Þ¡¼¥È¥Õ¥©¥ó¤Ï¤â¤È¤è¤ê¡¢¥Þ¥¤¥¯¤È¥¹¥Ô¡¼¥«¡¼¤òÈ÷¤¨¤Æ¤¤¤ëµ¡´ï¤Ç¤¢¤ì¤ÐÆÃÊ̤ʥϡ¼¥É¥¦¥§¥¢¤òÄɲ乤뤳¤È¤Ê¤¯¡¢¥½¥Õ¥È¥¦¥§¥¢¤ÎƳÆþ¤Î¤ß¤ÇÄÌ¿®¤¬²Äǽ¤Ç¤¹¡£

  • ŹÊޤ˥Á¥§¥Ã¥¯¥¤¥ó¤¹¤ì¤Ð¥Ý¥¤¥ó¥È¤¬Ãù¤Þ¤ë¡Ö³ÚÅ·¥Á¥§¥Ã¥¯¡×¤ÏO2O¤ÎËÜÌ¿¤È¤Ê¤ë¤«
    ¡ÊTechCrunch Japan ÍÍ¥µ¥¤¥È¤è¤ê¡§ 2014-04-02¡Ë
    Ķ²»ÇȤòÍøÍѤ·¤¿ÍèŹ¸¡ÃΥݥ¤¥ó¥È¥¢¥×¥ê¡Ö¥¹¥Þ¥Ý¡×¤òÄ󶡤¹¤ë¥¹¥Ý¥Ã¥È¥é¥¤¥È¡£ 2013ǯ10·î¤Ë³ÚÅ·¤¬Çã¼ý¤·¤Æ´°Á´»Ò²ñ¼Ò¤È¤Ê¤Ã¤¿Æ±¼Ò¤¬¡¢4·î2Æü¤è¤ê³ÚÅ·¤ÈÏ¢·È¤·¤¿ÍèŹ¥Ý¥¤¥ó¥È¥¢¥×¥ê¡Ö³ÚÅ·¥Á¥§¥Ã¥¯¡×¤ÎÄ󶡤ò³«»Ï¤·¤¿¡£

  • ³ÚÅ·¥Á¥§¥Ã¥¯ - ÍèŹ¤Ç¥Ý¥¤¥ó¥È¤¬Ãù¤Þ¤ë¡ª¤ªÆÀ¤Ê̵ÎÁ¥¢¥×¥ê¡ª
    ¡ÊGoogle Play ¥¹¥È¥¢¾å¤Î³ô¼°²ñ¼Ò¥¹¥Ý¥Ã¥È¥é¥¤¥ÈÍͤˤè¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥óÀâÌÀ¤è¤ê¡§ Åöµ­»ö»þÅÀ¤Ç¤Î¹¹¿·ÆüÉÕɽ¼¨¤Ï 2017-04-23¡Ë
    1.³ÚÅ·¥Á¥§¥Ã¥¯¤Ç¥Ý¥¤¥ó¥È¤¬Ãù¤Þ¤ë¤ªÅ¹¤òõ¤¹
    2.¹¥¤­¤Ê¤ªÅ¹¤äµ¤¤Ë¤Ê¤Ã¤¿¤ªÅ¹¤Ë¹Ô¤¯
    3.¤ªÅ¹¤ËÃ夤¤¿¤é¥¢¥×¥ê¤Ëµ­ºÜ¤µ¤ì¤¿»ØÄê¤Î¥¨¥ê¥¢¤Ç¥Ü¥¿¥ó¤ò¥¿¥Ã¥×¤¹¤ë¤À¤±¡ª

  • LINE¤Î¡Öͧ¤À¤ÁÄɲáפÇĶ²»ÇȤ¬»ÈÍѲÄǽ¤Ë¡ª¥Í¥¿¤«¤È»×¤Ã¤¿¤é¤Û¤ó¤È¤Ë½ÐÍ褿¡ª
    ¡Ê¡Ö¥Ç¥¸¤µ¤ë¡×ÍÍ¥µ¥¤¥È¤è¤ê¡§ 2015-09-06¡Ë
    LINE¤òµ¯Æ°¤·¤Æº¸²¼¤Î¡Ö¤½¤Î¾¡×¤«¤é¡Öͧ¤À¤ÁÄɲáפò¥¿¥Ã¥×¤·¤Þ¤¹¡£
    ¡ÖQR¥³¡¼¥É¡×¤ò¥¿¥Ã¥×¤·¤Þ¤¹¡£
    ¤¹¤ë¤ÈQR¥³¡¼¥É¥ê¡¼¥À¡¼¤¬µ¯Æ°¤·¤Þ¤¹¡£Í§¤À¤ÁÄɲäò¤¹¤ë°ìÊý¤Ï¤³¤Î¾õÂÖ¤ÇÂÔµ¡¤·¤Þ¤¹¡£
    ¤â¤¦°ìÊý¤Ï¡¢¡Ö¼«Ê¬¤ÎQR¥³¡¼¥É¤òɽ¼¨¡×¤ò¥¿¥Ã¥×¤·¤ÆQR¥³¡¼¥É¤ò²èÌ̤˽Ф·¤Þ¤¹¡£
    ¤¹¤ë¤È²»Î̤¬¤³¤Î»þ¤À¤±Â礭¤¯¤Ê¤ê¤Þ¤¹¡£¿Í´Ö¤Î¼ª¤Ë¤Ïʹ¤³¤¨¤Þ¤»¤ó¤¬¤³¤Î»þ´û¤ËĶ²»ÇȤ¬½Ð¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¡£

  • Radon - Share using Ultrasound
    ¡ÊGoogle Play ¥¹¥È¥¢¾å¤Î Nam Nghiem Íͤˤè¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥óÀâÌÀ¤è¤ê¡§ Åöµ­»ö»þÅÀ¤Ç¤Î¹¹¿·ÆüÉÕɽ¼¨¤Ï 2016-03-29¡Ë
    NO NFC? NO PROBLEM.
    Radon uses sensors you already have, and everyone else has including Wi-Fi, Bluetooth and Ultrasound. It does everything automatically, so all you have to do is tap share.

  • ¿·¤·¤¤ Amazon Dash Button ¤Ë¥Þ¥¤¥¯¤¬»Ä¤µ¤ì¤Æ¤¤¤ëÍýͳ
    ¡ÊÅö¥Ö¥í¥°¤Îµ­»ö¤è¤ê¡§ 2016-12-22¡Ë
    µì Button ¤¬ iOS üËö¤Ç¤Î¥»¥Ã¥È¥¢¥Ã¥×»þ¤Ë²»À¼¿®¹æ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¥Þ¥¤¥¯¥í¥Õ¥©¥ó¤òÆ⢤·¤Æ¤¤¤¿¤³¤È¤ÏÍý²ò¤Ç¤­¤Þ¤¹¡£¤Ç¤Ï¡¢¤Ê¤¼ BLE ÄÌ¿®¤òÍøÍѤ¹¤ë¿· Button ¤Ë¤â¥Þ¥¤¥¯¤¬»Ä¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¤·¤ç¤¦¡©
    »È¤ï¤Ê¤¤ÉôÉʤǤ¢¤ì¤ÐÀ½Â¤¥³¥¹¥Èºï¸º¤Î¤¿¤á¤Ë¤âűµî¤¹¤ë¤Û¤¦¤¬¹çÍýŪ¤Ê¤Ï¤º¤Ç¤¹¡£¤Þ¤µ¤« Amazon ¤¬²¿¤«Îɤ«¤é¤Ì¤³¤È¤ò´ë¤ó¤Ç¤¤¤ë¤Î¤Ç¤·¤ç¤¦¤«¡©

      ¡¦ Amazon Dash¤«¤é¥Þ¥¤¥¯¤¬¸«¤Ä¤«¤ë¡¢¤³¤ìÅðÄ°´ï¤À¤í - jisaka.blog.jp

  • ¿·ThinkPad¤Ç¤Ï¥¨¥é¡¼¥Ó¡¼¥×²»¤òAndroid¥¢¥×¥ê¤Ëʹ¤«¤»¤ë¤È¥¨¥é¡¼ÆâÍƤÎÆÃÄ꤬²Äǽ
    ¡ÊPC Watch ÍÍ¥µ¥¤¥È¤è¤ê¡§ 2017-02-09¡Ë
    2017ǯ¥â¥Ç¥ë¤Î¿·µ¡Ç½¤Î1¤Ä¤È¤·¤Æ¡¢¥¨¥é¡¼¥Ó¡¼¥×²»¤Î¿Ê²½¤¬µó¤²¤é¤ì¤ë¡£ ¤³¤ì¤Þ¤Ç¤ÎPC¤Î¥¨¥é¡¼¥Ó¡¼¥×²»¤È¸À¤¨¤Ð¡¢Ä¹¤¤²»¤Èû¤¤²»¤òÁȤ߹ç¤ï¤»¤¿¥â¡¼¥ë¥¹¿®¹æ¤Î¤è¤¦¤Ê¤â¤Î¤Ç¡¢¥æ¡¼¥¶¡¼¤Ï¤½¤Î²»¤òʹ¤¤¤Æ¡¢¥Þ¥Ë¥å¥¢¥ë¤È¾È¤é¤·¹ç¤ï¤»¤Æ¥¨¥é¡¼¤òÆÃÄꤹ¤ë¤È¤¤¤Ã¤¿ÈÑ»¨¤Êºî¶È¤¬É¬ÍפÀ¤Ã¤¿¡£

    °ìÊý¡¢2017ǯ¥â¥Ç¥ë¤Ç¤Ï¡¢¸ÄÊ̤β»³¬¤ò»ý¤Ã¤¿¥¨¥é¡¼²»¤Ç¥¨¥é¡¼¥³¡¼¥É¤òȯ¿®¤·¡¢¥¹¥Þ¡¼¥È¥Õ¥©¥óÂбþ¤Î¡ÖLenovo PC Diagnostics¡×(¥ê¥ó¥¯Àè¤Ï AndroidÈÇ)¤È¤¤¤¦¥¢¥×¥ê¤Ëʹ¤«¤»¤ë¤È¡¢¥¨¥é¡¼¥³¡¼¥É¤È¤È¤â¤Ë¡¢µ¡¼ï̾¡¢¥¨¥é¡¼¤Î¸¶°ø¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¡¢¤½¤·¤Æ¥â¥Ç¥ë̾¤ä¥·¥ê¥¢¥ë¥Ê¥ó¥Ð¡¼¤Ë»ê¤ë¤Þ¤Ç¤òÆÃÄê¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£¤³¤ì¤Ë¤è¤Ã¤Æ´ÉÍý¤ÎÍøÊØÀ­¤òÂçÉý¤Ë ¸þ¾å¤µ¤»¤¿¡£

»öÎã¤Ç¤Ï¿Í´Ö¤Î²ÄÄ°°è¤òÎ¥¤ì¤¿Ä¶²»ÇȤòÍøÍѤ¹¤ë¥±¡¼¥¹¤¬¤·¤Ð¤·¤Ð¸«¼õ¤±¤é¤ì¤Þ¤¹¡£¼ÂºÝ¡¢¡ÖĶ²»ÇÈÄÌ¿®¡×¤Ï¿Íµ¤¤Î¤¢¤ë¥­¡¼¥ï¡¼¥É¤Ç¤¹¤Í¡£¤â¤Ã¤È¤â¡¢¤«¤Ä¤ÆÅÅÏòóÀþ¤´¤·¤Î²»¶Á¥«¥×¥é¤äµìÀ¤Âå¤Î¥Õ¥¡¥¯¥·¥ß¥ê¤Ç¤Î±þ½·¤Ë²ÄÄ°²»¤¬ÍѤ¤¤é¤ì¤Æ¤­¤¿¤è¤¦¤Ë¡¢»ÈÍѤ¹¤ë²»°è¤ò·èÄê¤Å¤±¤ë¤Î¤ÏÍøÍѴĶ­Åù¤Î¾ò·ï¤ÎÁȤ߹ç¤ï¤»¤Ë¤¹¤®¤Þ¤»¤ó¤«¤é¡¢µ»½Ñ¼Ô¤Ë¤È¤Ã¤Æ°ìÈ֤δؿ´»ö¤Ï¤¢¤¯¤Þ¤Ç¤â¡Ö²»¤òÇÞÂΤȤ·¤Æ¤É¤Î¤è¤¦¤Ë¾ðÊó¤ò¤ä¤ê¤È¤ê¤¹¤ë¤«¡×¤È¤¤¤¦ËܼÁŪ¤ÊÏÃÂê¤Ç¤·¤ç¤¦¡£

Åż§ÇȤËÈæ¤Ù²»ÇȤˤÏÅÁÁ÷¾å¤Îµ÷Î¥¤ä¸úΨ¤Ë¤è¤ê¿¤¯¤ÎÀ©Ì󤬤¢¤ê¤Þ¤¹¡£¤½¤Î°ìÊý¤Ç¡¢Ë¡µ¬À©¤Î±Æ¶Á¤¬¤Û¤Ü³§Ìµ¤Ç¤¢¤ë¤³¤È¤Ë²Ã¤¨¡¢µ¡´ï¤ËɬÍ×¤Ê I/F ¤Ï²»À¼Æþ½ÐÎÏ¡ÊÌò³ä¤Ë¤è¤Ã¤Æ¤ÏÊÒÊý¤Ç¤è¤¤¡Ë¤Î¤ß¤Ç¤¢¤ê¼«Í³ÅÙ¤¬¹â¤¤¤È¤¤¤¦Â礭¤ÊÆÃŤ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê»ö¾ð¤Ë´Ø¿´¤ò»ý¤Á¡¢¶áµ÷Î¥ÄÌ¿®¼êÃʤÎÁªÂò»è¤Î¤Ò¤È¤Ä¤È¤·¤Æ¡Ö²»¡×¤òÍøÍѤ¹¤ë¥Î¥¦¥Ï¥¦¤Ë¿¨¤ì¤Æ¤ª¤­¤¿¤¤¤È¹Í¤¨¤Þ¤·¤¿¡£

¤½¤ó¤Ê¤ï¤±¤Ç¤³¤³¤·¤Ð¤é¤¯¼ê¸µ¤Ç¤Ï Android ¥Ç¥Ð¥¤¥¹¤È mbed ¥Þ¥¤¥³¥ó¤ò¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤È¤·¤Æ¤½¤ì¤¾¤ì¤Î´Ä¶­¤Ç²»¡ÊĶ²»ÇȤò´Þ¤à¡Ë¤Ë¤è¤ë¾ðÊóÄÌ¿®¤Î¼Â¸³¤ò¹Ô¤Ã¤Æ¤­¤Þ¤·¤¿¡£¼ÂÁ©Åª¤Ê¾ðÊó¤¬Èæ³ÓŪ˳¤·¤¤¾õ¶·¤âÁê¤Þ¤Ã¤Æ¶½Ì£¿¼¤¤·Ð¸³¤Ç¤·¤¿¤¬¡¢Á´ÂΤΥܥê¥å¡¼¥à¤¬¤ä¤äÂ礭¤¤¤³¤È¤â¤¢¤êº£¸åÃæ¿È¤òÀ°Íý¤·¤Ê¤¬¤é¿ô²ó¤Ëʬ¤±½ç¤òÄɤäƤ³¤Î¥Ö¥í¥°¤Ëµ­»ö¤ò½ñ¤­¤¿¤¤¤È¹Í¤¨¤Æ¤¤¤Þ¤¹¡£

º£²ó¤Ïͽ¹ð¤ò¤«¤Í¤Æ»îºî¤Î°ìÉô¤ò¾Ò²ð¤·¤Þ¤¹¡£°Ê²¼¤ÎÆóËܤÎÆ°²è¤ò¤´Í÷²¼¤µ¤¤¡£

  • Î㣱¡§²»¤Ë¤è¤ëÄÌ¿®¤ÇÆóÂæ¤ÎüËö¤Ë¡Ö¤·¤ê¤È¤ê¡×¤ò¤µ¤»¤ë   

  • Î㣲¡§ÅÅÏäÎÃå¿®²»¤ò¥È¥ê¥¬¡¼¤Ë¥Þ¥¤¥³¥ó¤Ç½êÄê¤Î½èÍý¤ò¼Â¹Ô¤¹¤ë   

    ¼¡²ó¤Ï Android ´Ä¶­¤Ç¤Î¼è¤êÁȤߤȼÂÁõ¤Þ¤ï¤ê¤ÎÏÃÂê¤ò·ÇºÜ¤¹¤ëͽÄê¤Ç¤¹¡£

    »¨µ­¡§ºÇ½é¤ÎºÇ½é¤Ë»î¤·¤¿¤³¤È ¡Á ½êÄê¤Î²»¤ËÈ¿±þ¤¹¤ëµ¡´ï

    2004ǯ¤´¤í¡¢Åìµþ±ØȬ½Å½§Ãϲ¼³¹¤Ë¤Þ¤À¸ºß¤·¤Æ¤¤¤¿¥¢¥¤¥Ç¥£¥¢¥°¥Ã¥º¤ÎŹ¡Ö²¦ÍͤΥ¢¥¤¥Ç¥£¥¢¡×¤Ç¡Ö¥ê¥â¥³¥óȯ¸«´ï¡×¤È¤¤¤¦¥Í¡¼¥ß¥ó¥°¤Î¾¦Éʤò¹ØÆþ¤·¤¿¡£ÉÕ°¤ÎÅ«¤ò¿á¤¯¤È¾®¤µ¤ÊËÜÂΤ¬²»¤È¸÷¤ÇÈ¿±þ¤¹¤ë¤È¤¤¤¦¤â¤Î¡£

    ²¿ÅÙ¤«»È¤Ã¤Æ¤º¤Ã¤È˺¤ì¤Æ¤¤¤¿¤¬º£²ó¤Õ¤È»×¤¤½Ð¤·¥Í¥Ã¥È¤Çõ¤·¤¿¤È¤³¤í¸½ºß¤âÈÎÇ䤵¤ì¤Æ¤¤¤ë¤³¤È¤òÃΤä¿¡£²»¤Ë´Ø¤¹¤ëͽÈ÷Ã챤¬¤Û¤È¤ó¤É¤Ê¤¤¾õÂ֤ʤê¤Ë°ìÏ¢¤Î¼è¤êÁȤߤÎÈéÀÚ¤ê¤È¤·¤Æ¤³¤Î¥Ç¥Ð¥¤¥¹¤ò»È¤Ã¤Æ´Ñ»¡¤ò»î¤ß¤¿¡£

    • ¥ê¥â¥³¥óȯ¸«´ï
      ¡Ê°°Åŵ¡²½À®³ô¼°²ñ¼ÒÍÍ¥µ¥¤¥È¤è¤ê¡Ë
      ¥ê¥â¥³¥ó¤ËÁõÃ夷ūËô¤Ï¸ýÅ«¤ò¿á¤±¤Ð¥Ô¥Ã¥Ô¥Ã¤È²»¤È¸÷¤Ç¥ê¥â¥³¥ó¤¬¤ªÃΤ餻¤·¤Þ¤¹¡£
      ÆÃħ
      ¤è¤¯»È¤¦¥ê¥â¥³¥ó¤Ë¡¢ÉÕ°¥Æ¡¼¥×¤Çȯ¿®µ¡¤ò¥»¥Ã¥È¡£
      Å«Ëô¤Ï¡¢¸ýÅ«¤ò¿á¤±¤Ð¥Ô¥Ã¥Ô¥Ã¤È²»¤È¸÷¤Ç¥ê¥â¥³¥ó¤¬¤ªÃΤ餻¤·¤Þ¤¹¡£
    • ²»¤È¸÷¤Ç¹ÔÊýÉÔÌÀ¤Î¥ê¥â¥³¥ó¤ò¤ªÃΤ餻! ¥¹¥Þ¥¤¥ë¥­¥Ã¥º ¥ê¥â¥³¥óȯ¸«´ï ARS-11 - www.amazon.co.jp¡¡Åöµ­»ö»þÅÀ¤ÎÈÎÇä²Á³Ê¤Ï¡ï378
    • ÀâÌÀ½ñ
      ¡ÖËÜÀ½Éʤϡ¢Ìó1600¡Á2000¥Ø¥ë¥Ä¤Î²»¤ËÈ¿±þ¤¹¤ë¤è¤¦ºî¤é¤ì¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢Å«°Ê³°¤Î²»¤Ç¤â¼þÇÈ¿ô¤¬¹ç¤¨¤ÐÈ¿±þ¤·¤Þ¤¹¡×
    • Ãæ¿È
      ¼Ì¿¿º¸¡§²¼¤Î´Ý¤¤°µÅÅÁǻҤ¬¥¹¥Ô¡¼¥«¡¼¤È¥Þ¥¤¥¯¤ò·ó¤Í¤Æ¤ª¤ê¥á¡¼¥«¡¼¤Ø¿Ò¤Í¤¿¤È¤³¤í¡ÖÆÃÄê¤Î²»°è¤Î¤ß¤Ø¤ÎÈ¿±þ¤Ï¥Õ¥£¥ë¥¿½èÍý¤Ç¤Ï¤Ê¤¯°µÅÅÁǻҤμþÇÈ¿ôÆÃÀ­¤Ë¤è¤ë¤â¤Î¡×¤È¤Î¤³¤È¡£
    • Æ°ºî¤ÎÍÍ»Ò
      ÉÕ°¤ÎÅ«¡¦²»³Ú¥­¡¼¥Ü¡¼¥É¡¦¸ýÅ«¤ò»È¤¤¡¢È¿±þ¤¹¤ë¼þÇÈ¿ôÂÓ¤ò³Îǧ¤·¤Ê¤¬¤é¤³¤Î¥Ç¥Ð¥¤¥¹¤òÁàºî¤·¤¿Íͻҡ£
      Æ°²è¡§1ʬ26Éá¡¡¡¢¨38É䢤¿¤ê¤«¤é¼ª¤Ë¾ã¤ë²»¤¬ÌĤë¤Î¤Ç²»Î̤ËÃí°Õ
      »ÈÍÑ¥¢¥×¥ê¡§ AudioUtil Spectrum Analyzer - play.google.com
        
    • ¤½¤ì¤¾¤ì¤Î²»¤ÎÆÃħ
      °Ê²¼¤ÏÆ°²è»£±Æ¸å¤Ë¤¢¤é¤¿¤á¤ÆºÎ¼è¤·¤¿¾åµ­¥¢¥×¥ê¤Î¥¹¥¯¥ê¡¼¥ó¥·¥ç¥Ã¥È¡£´Ä¶­²»¤â´Þ¤Þ¤ì¤ë¤¬¤â¤Ã¤È¤â¿¶Éý¤ÎÂ礭¤¤¼þÇÈ¿ôÀ®Ê¬¤¬¶á¤¤¤¿¤á»°¼Ô¤ÎÇÈ·Á¤Î¼þ´ü¤ÏÂçÂλ÷¤Æ¤¤¤ë¡£
      1. À½ÉÊÉÕ°¤ÎÅ«
        ÇÈ·Á
        ¥Ô¡¼¥¯¼þÇÈ¿ô¤Ï 2.0kHz ÉÕ¶á
      2. ²»³Ú¥­¡¼¥Ü¡¼¥É¡ÊCASIO À½ SA-5¡§ ²»¿§ "HARMONICA")
        ÇÈ·Á
        ¥Ô¡¼¥¯¼þÇÈ¿ô¤Ï 1.9kHz ÉÕ¶á
      3. ¸ýÅ«
        ÇÈ·Á
        ¥Ô¡¼¥¯¼þÇÈ¿ô¤Ï 1.6kHz ÉÕ¶á

    (tanabe)
  • klab_gijutsu2 at 07:46¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)¨¢TrackBack(0)
    2017ǯ01·î20Æü

    ¤µ¤è¤Ê¤é Parse

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    ¤Ï¤¸¤á¤Ë

    À¤³¦Ãæ¤ÎÍøÍѼԤλØÀè¤È»ëÀþ¤ò¶Å¸Ç¤µ¤»¤¿ÆÍÁ³¤Îȯɽ¤«¤é¤Þ¤â¤Ê¤¯ 1ǯ¡¢Parse.com ¤ÎÁ´¥µ¡¼¥Ó¥¹¤¬ ¤¤¤è¤¤¤è 2017ǯ1·î28Æü¡ÊÅڡˤ˽ªÎ»¤·¤Þ¤¹¡£³ÈÄ¥À­¤¬¹â¤¯¹âµ¡Ç½¤Ç¤¢¤ê¤Ê¤¬¤é»È¤¤¾¡¼ê¤ÎÎɤ¤Í¥¤ì¤¿¥µ¡¼¥Ó¥¹¤À¤Ã¤¿¤Î¤Ç½ªÂ©¤¬Àˤ·¤Þ¤ì¤Þ¤¹¡£

          https://parse.com/

    ¼ê¸µ¤Ç¤Ï 2ǯ¤Û¤ÉÁ°¤Ë IoT ¤Î¼Â¸³¤È¤·¤Æ»îºî¤·¤¿°Ê²¼¤Î¤·¤¯¤ß¡ÖAnpi¡×¤Ç Parse.com ¤òºÎ¤êÆþ¤ì¤Þ¤·¤¿¡£

    • mbed ¤È Parse ¤Çºî¤ë¹âÎð¼ÔÀ¤ÂÓ°ÂÈݳÎǧ¥·¥¹¥Æ¥à - Åö¥Ö¥í¥°
      °ìÈÌ¤Ë BaaS ¤Î¼ç¤ÊÌÜŪ¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÂиþ¥µ¡¼¥Ð¦µ¡Ç½¤òÂåÂØ¡¦Êä´°¤¹¤ë¤³¤È¤Ë¤¢¤ê¡¢¥µ¡¼¥Ð¤Î´ÉÍý±¿ÍѤ䥵¡¼¥Ð¦¥³¡¼¥É³«È¯¤ËƧ¤ß¹þ¤à¥³¥¹¥È¤òÍÞÀ©¤·¥¢¥×¥êËÜÂΤγ«È¯¤ËÃíÎϲÄǽ¤È¤Ê¤ë¤³¤È¤¬ÍøÍѼԤˤȤäƤΥá¥ê¥Ã¥È¤Ç¤¹¤¬¡¢Parse ¤Ë¤Ï¥µ¡¼¥Ð¾å¤Ç¥æ¡¼¥¶¥³¡¼¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Î¤Ç¤­¤ë¡ÖCloud Code¡×¤È¤¤¤¦¤·¤¯¤ß¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¡ÊÃæά¡Ëº£²óºî¤Ã¤¿ÁõÃÖ¤Ï Parse ¥µ¡¼¥Ð¾å¤ËÀßÃÖ¤·¤¿¼«ºî¥³¡¼¥É¤ò¤½¤Î¤Þ¤Þ¸Æ¤Ó½Ð¤·¤ÆɬÍפʽèÍý¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤ËÌÜŪ¤Ë±þ¤¸¤Æ½ÀÆð¤ËÍøÍѤǤ­¤ë¤³¤È¤¬ Parse ¤ÎÌ¥ÎϤΤҤȤĤȸÀ¤Ã¤Æ¤è¤¤¤Ç¤·¤ç¤¦¡£
    ¤³¤Î¡ÖAnpi¡×¤Ï¥·¥ó¥×¥ë¤Ê¤¬¤é¼ÂÍÑÀ­¤¬¹â¤¯¸½ºß¤â¥×¥é¥¤¥Ù¡¼¥È¤ÇÂ礤¤ËÌòΩ¤Ã¤Æ¤¤¤Þ¤¹¡£¤½¤Î¤¿¤á¤¹¤Ç¤Ë Parse.com ¤«¤é¤Î¾è¤ê´¹¤¨¤ò´°Î»¤·¤Æ¤¤¤Þ¤¹¤¬¡¢°Ü¹Ô¤Î²áÄø¤ÇÊ£¿ô¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤òÂоݤȤ·¤ÆºÆ¼ÂÁõ¤ò²£ÃÇŪ¤Ë»î¤·¤Æ¤ß¤Þ¤·¤¿¡£º£¸åɬÍפȤʤ俺ݤ˥¹¥à¡¼¥¹¤ËÁÛµ¯¤Ç¤­¤ëÆ»¶ñΩ¤Æ¤ÎÁªÂò»è¤Ï¿¤¤¤Û¤¦¤¬¹¥¤Þ¤·¤¯¡¢º£²ó¤Î¤è¤¦¤Ë¶ñÂÎŪ¤ÊÍ׷郎¤¢¤ì¤Ð¤½¤Î¼ÂÁõ¤òÄ̤¸¤Æ̤Âθ³¤Î¥µ¡¼¥Ó¥¹¤ÎÆÃħ¤ä¸ÄÀ­¤ò¸«Äê¤á¤ä¤¹¤¤¤È¹Í¤¨¤¿¤¿¤á¤Ç¤¹¡£¤³¤Îµ­»ö¤Ï¤½¤¦¤¤¤Ã¤¿»î¤ß¤Îµ­Ï¿¤Ç¡¢ÆüËܹñÆâ¤Ç¤Ï¤Þ¤ÀÃÎ̾ÅÙ¤ÎÄ㤤¤â¤Î¤Ë¤â¿¨¤ì¤Æ¤¤¤Þ¤¹¡£¶½Ì£¤Î¤¢¤ëÊý¤Ï¤´Í÷²¼¤µ¤¤¡£

    ¢¨Ê¸Ãæ¤Îµ­½Ò¤Ï¤¤¤º¤ì¤â 2016ǯ11·î¤«¤é12·î¤Î»þÅÀ¤Î¾õ¶·¤Ë´ð¤Å¤¯¤â¤Î¤Ç¤¢¤ê¸½ºß¤Î»ö¾ð¤È¤Ï°Û¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤¢¤é¤«¤¸¤á¤´Î»¾µ²¼¤µ¤¤¡£

    ¼ê¸µ¤ÎÍ×·ï¤È°Ü¹ÔÀèÁªÄê´ð½à

    ¡ÖAnpi¡×¤Ë¤ª¤¤¤Æ Parse.com ¥µ¥¤¥É¤Ç¹Ô¤Ã¤Æ¤¤¤¿½èÍý¤Ï°Ê²¼¤ÎÆâÍƤǤ¹¡£

    • ²°Æâ¤ËÀßÃÖ¤º¤ß¤ÎÁõÃÖ¤¬¿Í´¶¥»¥ó¥µÈ¿±þ»þ¤ËºÇû 30 ʬ´Ö³Ö¤ÇÁ÷¿®¤·¤Æ¤¯¤ë¾ðÊó¤ò¥Ç¡¼¥¿¥¹¥È¥¢¤ØÊݸ
    • Äê¹ï¤Ëľ¶á 60 ¥ì¥³¡¼¥Éʬ¤ò¥ì¥Ý¡¼¥È¤È¤·¤Æ½êÄê¤Î¥¢¥É¥ì¥¹¤Ø¥á¡¼¥ëÁ÷¿®
    • ÁõÃ֤ˤĤʤ¤¤À¥Ü¥¿¥ó¤¬Ä¹²¡¤·¤µ¤ì¤¿¤é½êÄê¤Î¥¢¥É¥ì¥¹¤Ø¥á¡¼¥ë¤ÇÄÌÃΡʶ۵ޥ᡼¥ë¡Ë
    • ¥á¡¼¥ëÇÛ¿®¤Ë¤Ï Parse.com ¤¬ ¸ø¼° API ¤ÇÏ¢·È¤·¤Æ¤¤¤ë Mailgun ¥µ¡¼¥Ó¥¹¤òÍøÍÑ

    Í×·ï¤ËÆäËÈÑ»¨¤Ê¤â¤Î¤Ï¤Ê¤¯¤³¤ì¤é¤òµÛ¼ý²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Ï¤¤¤¯¤Ä¤â¸ºß¤¹¤ë¤Ç¤·¤ç¤¦¡£¤½¤Î¾å¤Ç¡¢º£²ó¤Ï¼¡¤Î»°ÅÀ¤ò°Ü¹ÔÀèÁªÄê¤Î´ð½à¤È¤¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

    • ±¿ÍѤ˼꤬¤«¤«¤é¤Ê¤¤¤³¤È
    • ½ÀÆðÀ­¤¬¤¢¤ë¤³¤È
    • ÈñÍѤ¬¤«¤«¤é¤Ê¤¤¤³¤È
    ³¨¤ËÉÁ¤¤¤¿¤è¤¦¤Ê¥æ¡¼¥¶¥¨¥´¤Ç¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢Åö»þ Parse.com ¤òÁª¤ó¤ÀÍýͳ¤Ï¤³¤ì¤é¤Î¤¹¤Ù¤Æ¤òËþ¤¿¤·¤Æ¤¤¤¿¤¿¤á¤Ç¤â¤¢¤ê¤Þ¤¹¡£Í½È÷Ä´ºº¤ò·Ð¤Æ¼¡¤Î¥µ¡¼¥Ó¥¹¡¦¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¸¡Æ¤¤ÎÂоݤȤ·¤Þ¤·¤¿¡£

    1. IFTTT + Google Drive + Google Apps Script
    2. Kii Cloud
    3. back4app¡Ê+ AWS Lambda¡Ë
    4. Backand

    ¤Ê¤ª¡¢Í×·ï¤Î¤¦¤Á¡Ö¶ÛµÞ¥á¡¼¥ë¡×¤Îȯ¿®¤Ë¤Ä¤¤¤Æ¤Ï°ÊÁ°¡Öº£¡¢¥ï¥ó¥Ü¥¿¥ó¤Î IoT ¥Ç¥Ð¥¤¥¹¤¬ÌÌÇò¤¤¡×¤Ç¤âÍøÍѤ·¤¿ SendGrid ¥µ¡¼¥Ó¥¹¤Î API ¤òÁõÃÖ¦¤Î¥³¡¼¥É¤«¤éľÀÜ᤯¤³¤È¤Ë¤·¤Þ¤·¤¿¡£¥á¡¼¥ë¤ÎÆâÍƤϷè¤áÂǤÁ¤Ê¤Î¤Ç³Æ¥µ¡¼¥Ó¥¹¤ËÃç²ð¤µ¤»¤ë¤è¤ê¤â¤½¤Î¤Û¤¦¤¬¹çÍýŪ¤È¹Í¤¨¤¿¤¿¤á¤Ç¤¹¡£

    °Ê²¼¡¢¾å¤Î¤è¤Ã¤Ä¤ò½çÈ֤˥ԥ寥¢¥Ã¥×¤·¤Æ¤ß¤Þ¤¹¡£

    °Ü¹ÔÀè¸õÊä 1¡§ IFTTT + Google Drive + Google Apps Script

    ¤â¤Ã¤È¤â¥·¥ó¥×¥ë¤ËÍ×·ï¤òËþ¤¿¤¹Æ»¶ñΩ¤Æ¤È¤·¤Æ¤Þ¤º IFTTT ¤È Google ¥µ¡¼¥Ó¥¹¤ÎÁȤ߹ç¤ï¤»¤ò¹Í¤¨¤Þ¤·¤¿¡£IFTTT ·Ðͳ¤Ç Google Drive ¾å¤Î Spreadsheet ¤ò¥Ç¡¼¥¿¥¹¥È¥¢¤È¤·¤ÆÍøÍѤ· Google Apps Script ¤Ç¥µ¡¼¥Ð¥µ¥¤¥É¤Î½èÍý¤ò¼Â¹Ô¤¹¤ëÆâÍƤǤ¹¡£

    ²¾°Ü¹Ô¤òÄ̤¸¤Æ¤Î * ¸Ä¿ÍŪ¤Ê * °õ¾Ý

    GOOD !

    • ¥·¥ó¥×¥ë¤«¤Ä½ÀÆð
    • Google, IFTTT ¤È¤â¤Ëº£¸å²Ý¶â¤ÎȯÀ¸¤¹¤ë²ÄǽÀ­¤¬¤­¤ï¤á¤ÆÄ㤤
    • Google, IFTTT ¤È¤â¤Ëº£¸å¥µ¡¼¥Ó¥¹¤¬½ªÂ©¤¹¤ë²ÄǽÀ­¤¬¤­¤ï¤á¤ÆÄ㤤
    • ¥³¡¼¥É¤ò´Þ¤á¤¹¤Ù¤Æ¤ò¥Ö¥é¥¦¥¶¾å¤ÇÁàºî¤Ç¤­¤ë¤¿¤á±¿ÍѾå¤Î¼«Í³ÅÙ¤¬¹â¤¤
    ! GOOD ¡©

    • º£²ó¤ÎÍ×·ï¤Ë¤Ï½½Ê¬¤À¤¬µ¬ÌϤÎÂ礭¤¤¥Ç¡¼¥¿¤ò°·¤¦¤Ë¤ÏÉÔ¸þ¤­
    • ¤¢¤¯¤Þ¤Ç¤â SaaS ¤È¥Ï¥Ö¥µ¡¼¥Ó¥¹¤ÎÁȤ߹ç¤ï¤»¤Ç¤¢¤ë¤¿¤áÅöÁ³¤Ê¤¬¤é¥×¥Ã¥·¥åÄÌÃΤʤɰìÈÌŪ¤Ê IoT ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ÎÄ󶡤¹¤ëµ¡Ç½¤ÏÂåÂؤǤ­¤Ê¤¤

    °Ü¹ÔÀè¸õÊä 2¡§ Kii Cloud

    Kii Cloud ¤Ï Kii ³ô¼°²ñ¼ÒÍͤÎÄ󶡤¹¤ëÆüËÜȯ¤Î BaaS ¤Ç¤¹¡£

    ²¾°Ü¹Ô¤òÄ̤¸¤Æ¤Î * ¸Ä¿ÍŪ¤Ê * °õ¾Ý

    GOOD !

    • ¿µ¡Ç½¤«¤Ä̵ÎÁÏȤ¬¹­¤¤
    • Parse.com ¤ÈƱÍÍ¤Ë BaaS ¤Ç¤¢¤ê¤Ê¤¬¤é¥µ¡¼¥Ðµ¡Ç½³ÈÄ¥¤¬²Äǽ
    • ¥µ¡¼¥Ð¤Î¥ê¡¼¥¸¥ç¥ó¤ò¼«Í³¤ËÁªÂò²Äǽ¤Ç¤¢¤êÆäËÃæ¹ñ¥ê¡¼¥¸¥ç¥ó¤Î¸ºß¤ÏÂ礭¤¤
    • ¥­¡¼¥Ð¥ê¥å¡¼·Á¼°¤Î¥Ç¡¼¥¿¤Ï»ÈÍÑÍÆÎ̤˥«¥¦¥ó¥È¤µ¤ì¤Ê¤¤¤¿¤á¾¤Î¥µ¡¼¥Ó¥¹¤È¤ÎÊ»ÍѤˤ⹥Ŭ¤«
    • ¥¢¥¯¥»¥¹À©¸æµ¡Ç½¤¬½¼¼Â
    • ÆüËܸì¤Î¥ê¥½¡¼¥¹¤¬½¼¼Â¤·¤Æ¤¤¤ë

    ! GOOD ¡©

    • ¥É¥­¥å¥á¥ó¥È¤Î¾ðÊóÎ̤ÏË­¤«¤À¤¬ÄÌÆÉÀ­¤¬¤â¤¦¤Ò¤È¤Ä¡©¥ê¥ó¥¯¤ÎÄ¥¤êÊý¤Ë¤â²þÁ±¤Î;ÃϤ¬¤¢¤ê¤½¤¦¤Ê°õ¾Ý¡Ê¤³¤Î¤¢¤¿¤ê¤¬²þÁ±¤µ¤ì¤ì¤Ð¤è¤êÍøÍѤ·¤ä¤¹¤¯¤Ê¤ë¤«¤â¡Ë
    • ³«È¯¼Ô¥Ý¡¼¥¿¥ë¤Ï UI¡¦µ¡Ç½¤È¤â¤Ëº£¸å¤Î¿Ê²½¤¬´üÂÔ¤µ¤ì¤ë
    • ³«È¯ÍѤΥ³¥Þ¥ó¥É¥é¥¤¥ó¥Ä¡¼¥ë¤¬ Node.js ¥Ù¡¼¥¹¤Ê¤Î¤ÏÍøÅÀ¤È·çÅÀ¤¬È¾¡¹¤¯¤é¤¤¡© ¥Ð¥Ã¥Á¥¸¥ç¥Ö¤Î¥¹¥±¥¸¥å¡¼¥ëÊѹ¹¤È¤¤¤Ã¤¿Áàºî¤Ï¥Ö¥é¥¦¥¶¾å¤Ç¤Ç¤­¤ë¤È´ò¤·¤¤¡¦¡¦

    °Ü¹ÔÀè¸õÊä 3¡§ back4app¡Ê+ AWS Lambda¡Ë

    back4app ¤Ï BACK4APP SERVICOS DIGITAIS LTDA¡ÊËÜ¼Ò ÊÆ¥«¥ê¥Õ¥©¥ë¥Ë¥¢¡Ë¤ÎÄ󶡤¹¤ë BaaS ¤Ç¤¹¡£

    ²¾°Ü¹Ô¤òÄ̤¸¤Æ¤Î * ¸Ä¿ÍŪ¤Ê * °õ¾Ý

    GOOD !

    • ̵ÎÁÏȤ¬¹­¤¤
    • ºÇ½é¤«¤é Parse.com ¤ÎÂåÂØÍѤȤ·¤Æµ¯¤Á¾å¤²¤é¤ì¤¿½ãÅ٤ι⤤ Parse Alternative ¤Ç¤¢¤ë¤¿¤á Parse.com ¤È¤Î¿ÆÏÂÀ­¤¬¹â¤¯°Ü¹Ô¤¬ÁêÂÐŪ¤ËÍÆ°×
    • UI, ¥É¥­¥å¥á¥ó¥È¤¬¤ï¤«¤ê¤ä¤¹¤¤

    ! GOOD ¡©

    • µ­»öÃæ¤Î¥¸¥ç¥ÖÀßÄê¤ÎÌäÂê¤Ê¤É¸½»þÅÀ¤Ç¤Ï¹Óºï¤ê¤Ê¦Ì̤⸫¤é¤ì¤ë
    • Parse.com ¤ò·Ñ¾µ¤¹¤ë¥µ¡¼¥Ó¥¹¤È¤·¤Æ¤ÏÎɹ¥¤À¤¬¡¢µÕ¤Ë¤½¤Î¤³¤È¤¬ÆÈΩ¤·¤¿ BaaS ¤È¤·¤Æ¤Î¿·Á¯Ì£¤ä¸ÄÀ­¤ÎȯϪ¤òºï¤¤¤Ç¤¤¤ë°õ¾Ý¤â¡©

    °Ü¹ÔÀè¸õÊä 4¡§ Backand

    Backand ¤Ï ModuBiz Ltd¡ÊËܼҥ¤¥¹¥é¥¨¥ë Tel Aviv¡Ë¤ÎÄ󶡤¹¤ë BaaS ¤Ç¤¹¡£

    ²¾°Ü¹Ô¤òÄ̤¸¤Æ¤Î * ¸Ä¿ÍŪ¤Ê * °õ¾Ý

    GOOD !

    • ¿µ¡Ç½¤«¤Ä³ÈÄ¥À­¤ËÍ¥¤ì¤Æ¤¤¤ë¾å¤ËÈó¾ï¤Ë»È¤¤¤ä¤¹¤¤
    • ¥Æ¥¹¥È¡¦¥Ç¥Ð¥Ã¥°µ¡Ç½¤â½¼¼Â¤·¤Æ¤ª¤ê UI ¤â¤ï¤«¤ê°×¤¤
    • ¥Õ¥¡¥¤¥ë¥Û¥¹¥Æ¥£¥ó¥°¤Þ¤ï¤ê¤ÎÁàºî°Ê³°¤Ï¤¹¤Ù¤Æ¥Ö¥é¥¦¥¶¾å¤Ç´°·ë¤Ç¤­¤ë¤¿¤áµ¡Æ°À­¤¬¹â¤¤
    • ¥æ¡¼¥¶¥Ó¥ê¥Æ¥£¤Ïº£²ó¤ÎÃæ¤Ç°ìÈÖ¡£¤¢¤È¤Ï²ÄÍÑÀ­¤È¥¹¥±¡¼¥é¥Ó¥ê¥Æ¥£¼¡Â褫

    ! GOOD ¡©

    • ̵ÎÁÏȤζ¹¤µ¤¬»ÄÇ°¡£¤Þ¤¿¡¢Prototype Plan $0 -> Hobby Plan $19/·î -> Work Plan $49/·î ... ¤È¤¤¤Ã¤¿Â礭¤á¤ÎÎÁ¶âº¹¤ËÈ椷¤ÆÂÔ¶øº¹¤¬¾®¤µ¤á
    • ±¿±Ä¦¤ÎÆâÉôŪ¤Ê»Øɸ¤Ç¤¢¤ë¡ÖCache Memory¡×¡ÖCompute Units¡×¤Î¤è¤¦¤ËÍøÍѼԤ¬¼çÂÎŪ¤Ë¥³¥ó¥È¥í¡¼¥ë¤¹¤ë¤³¤È¤ÎÆñ¤·¤¤»Øɸ¤¬¥×¥é¥ó¤Î´ð½à¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¤¿¤áÍøÍÑÌܽè¤òΩ¤Æ¤Ë¤¯¤¤¡Ê¤à¤·¤í¡¢ÍøÍѤ¹¤ë¤Ê¤é¤Ï¤¸¤á¤«¤é UNLIMITED ¤ÊÎÁ¶â¥×¥é¥ó¤òÁª¤Ö¤Ù¤­¡Ë
    • ÆüËܤΤߤʤ餺¹ñ³°¤Ç¤â¤Þ¤À¤¢¤Þ¤ê¥á¥¸¥ã¡¼¤Ç¤Ï¤Ê¤¯¾ðÊ󤬤ȤƤ⾯¤Ê¤¤¡£Í¥¤ì¤¿¥µ¡¼¥Ó¥¹¤Ç¤¢¤ë¤Ë¤â¤«¤«¤ï¤é¤ºÀ¤´Ö¤Ø¤Î¿»Æ©°µ¤¬Ä㤤°ì°ø¤Ï¾å¤ÎÎÁ¶âÂηϤˤ⤢¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¡©

    ¡Ê2018-01-19 Äɵ­¡Ë
    2018ǯ1·î18Æü¡¢Backand ¤è¤ê 2·î28Æü¤Ë¥µ¡¼¥Ó¥¹¤ò½ªÎ»¤¹¤ë»Ý¤Î¥á¡¼¥ë¤¬ÆϤ­¤Þ¤·¤¿¡£¤½¤Î¸å¼ê¸µ¤Ç¤ÏÍøÍѤ·¤Æ¤¤¤Þ¤»¤ó¤Ç¤·¤¿¤¬¡¢ÉʼÁ¤Î¹â¤¤¥µ¡¼¥Ó¥¹¤Ç¤¢¤Ã¤¿¤À¤±¤Ë»ÄÇ°¤Ç¤¹¡£

    ¤ª¤ï¤ê¤Ë

    ¼ê¸µÍ×·ï¤Î Parse.com ¤«¤é¤Î°Ü¹Ô¤Ë¤¢¤¿¤ê°Ê¾å¤è¤Ã¤Ä¤Î´Ä¶­¤ò»î¤·¤Æ¤ß¤Þ¤·¤¿¡£ºÇ½ªÅª¤Ë¤³¤ÎÃæ¤Î¤Ò¤È¤Ä¤ò¡ÖAnpi¡×¤Î¾è¤ê´¹¤¨Àè¤Ë·èÄꤷ¤Æ¸½ºß¤Ë»ê¤ê¤Þ¤¹¡£Åö½é¤Ï¤É¤ì¤òÁª¤ó¤À¤Î¤«¤ò½ñ¤¯¤Ä¤â¤ê¤Ç¤·¤¿¤¬Ìµ¿è¤Ë¤â»×¤¤¤ä¤á¤Æ¤ª¤¯¤³¤È¤Ë¤·¤Þ¤·¤¿¡£¤¤¤º¤ì¤â¼Á¤Î¹â¤¤¥µ¡¼¥Ó¥¹¤Ç¤½¤ì¤¾¤ì¤Ë½½Ê¬¤Ê¥á¥ê¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£

    ¤Û¤ó¤Î10ǯ¤Û¤ÉÁ°¤Ë¤Ï±Æ¤â¤Ê¤«¤Ã¤¿¤â¤Î¤¬Æü¿Ê·îÊâ¤Ç¿Ê²½¤·¤Æ¤¤¤¯¾õ¶·¤Ë¥ê¥¢¥ë¥¿¥¤¥à¤Ç¸þ¤­¹ç¤Ã¤Æ¤¤¤ë¤È10ǯ¸å¤ÎÀ¤³¦¤Ø¤ÎÁÛÁü¤¬ËĤé¤ß¤Þ¤¹¡£¤³¤Î»þÂå¤Î˵¤é¤òµî¤Ã¤Æ¤¤¤¯ Parse.com ¤ò¥æ¡¼¥¶¤Î¤Ò¤È¤ê¤È¤·¤Æ·É°Õ¤È´¶¼Õ¤ÎÇ°¤ò¤â¤Ã¤Æ¸«Á÷¤ê¤¿¤¤¤È»×¤¤¤Þ¤¹¡£


    (tanabe)
    klab_gijutsu2 at 14:26¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
    2016ǯ12·î22Æü

    ¿·¤·¤¤ Amazon Dash Button ¤Ë¡Ö¥Þ¥¤¥¯¡×¤¬»Ä¤µ¤ì¤Æ¤¤¤ëÍýͳ

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    ºòǯ°Ê²¼¤Îµ­»ö¤Ç¥Ô¥Ã¥¯¥¢¥Ã¥×¤·¤¿¡ÖAmazon Dash Button¡×¤¬ 2016ǯ12·î5Æü¤ËÆüËܹñÆâ¤Ç¤â¥ê¥ê¡¼¥¹¤µ¤ìÏÃÂê¤ò½¸¤á¤Æ¤¤¤Þ¤¹¡£

    Amazon.co.jp ¤Ç¤ÎÈÎÇ䳫»Ï¤«¤é¤Û¤É¤Ê¤¯ Button ¤Î¿¤¯¤¬ÉÊÀÚ¤ì¤È¤Ê¤ê 12·î22Æü¸½ºß¤âÆþ²ÙÂÔ¤Á¤Î¾õÂÖ¤¬Â³¤¤¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î¥Ç¥Ð¥¤¥¹¤ò¼Â¼Á̵ÎÁ¤ÇÇÛÉÛ¤¹¤ëµðÂ翹ñÀÒ´ë¶È Amazon ¤Î¥Ñ¥ï¡¼¤ÏÀ¨¤Þ¤¸¤¤¤Ç¤¹¤Í¡£

    ¿·µì Dash Button ¤Î°ã¤¤

    ¸½ºßÄ󶡤µ¤ì¤Æ¤¤¤ë Dash Button ¤Ï 2015ǯ¤ËÊƹñ¤Ç¥Ç¥Ó¥å¡¼¤·¤¿¥ª¥ê¥¸¥Ê¥ë¤È¤Ï°Û¤Ê¤ë¤â¤Î¤Ç¤¹¡£¾å¤Î¥Ö¥í¥°µ­»ö¤Ç¤â¿¨¤ì¤¿ Matthew Petroff »á¤Î¥µ¥¤¥È¤Ë¤Ï¿·µì Button ¤½¤ì¤¾¤ì¤Ë¤Ä¤¤¤Æ¾ÜºÙ¤«¤ÄÌÖÍåŪ¤Ê¶½Ì£¤Ö¤«¤¤µ­»ö¤¬·ÇºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    The Amazon Dash Button it an Internet connected button that allows ordering a single product from Amazon.
    ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡:
    Others have already posted about disassembling it, so I¡Çll focus mostly on the electronics, since the aforementioned blog posts are missing high-resolution images of thecircuit board and don¡Çt quite get some details correct.
    Amazon updated the Dash Button¡Çs hardware to revision two earlier this year, so I decided it was time for a new teardown (here¡Çs last year¡Çs teardown). The new product number is JK29LP; the old product number is JK76PL. While the form factor and case remained much the same, the internals changed substantially. The major highlights are a switch from Broadcom to Atmel chips, a switch from an Energizer lithium battery to a Duracell alkaline battery, and the addition of Bluetooth Low Energy.
    ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡:

    Overall, the new Dash Button appears to be a revision designed to reduce production cost, centered around a reduction in energy usage, which allows for use of a considerably cheaper, alkaline battery.
    Ʊ»á¤Îµ­»ö¤ò»²¹Í¤Ë¤·¤Ê¤¬¤é¤Þ¤º¿·µì Button ¤Î¼ç¤Ê°ã¤¤¤òÀ°Íý¤·¤Æ¤ß¤Þ¤¹¡£
    ¡Ê¢¨Í¾Ã̤ʤ¬¤é¡¢Æ±¤¸µ­»ö¤ËÃíÌܤ·¤¿¿ôÆüÁ°¤Î GIGAZINE ¤µ¤ó¤Îµ­»ö¤ËÀè¤Û¤Éµ¤¤¬¤Ä¤­¤Þ¤·¤¿¤¬¡¢Æäˤ֤Ĥ«¤ë¤â¤Î¤Ç¤â¤Ê¤¤¤¿¤áÁð¹Æ¤ÎÆâÍƤΤޤ޽ñ¤¯¤³¤È¤Ë¤·¤Þ¤¹¡Ë

    ÅŸ»¤¬¥ê¥Á¥¦¥à°ì¼¡´¥ÅÅÃÓ¤«¤é¥¢¥ë¥«¥ê´¥ÅÅÃÓ¤Ë

    µì Dash Button ¤Ë¤Ïñ»Í·¿¥ê¥Á¥¦¥à°ì¼¡´¥ÅÅÃÓ¤¬Æ⢤µ¤ì¤Æ¤¤¤Þ¤·¤¿¡£

    http://dsas.blog.klab.org/archives/52233150.html

    ¤Á¤Ê¤ß¤Ë Amazon Dash Button ¤Ï ÊÆ¥¨¥Ê¥¸¥ã¥¤¥¶¡¼¼Ò¤Î Ultimate Lithium ´¥ÅÅÃÓ Ã±4·Á ¡ÊÆó¼¡ÅÅÃӤǤϤʤ¤¡Ë1ËܤòÆ⢤·¤Æ¤¤¤ë¡£¥¢¥ë¥«¥êÅÅÃÓ¤ËÈæ¤Ù¡ÖºÇÂç 9ÇÜĹ»ý¤Á¡×¤ò¼æ¶ç¤È¤¹¤ë ¸½»þÅÀ¤Ç¤ª¤½¤é¤¯ºÇ¶¯¤Î´¥ÅÅÃÓ¡£

    ¥Ç¡¼¥¿¥·¡¼¥È¤Ë¤è¤ë¤È Ultimate Lithium AAA ¤Ï¡ÖMax Discharge: 1.5 Amps Continuous, 2.0Amps Pulse (2 sec on / 8 sec off)¡×¤È¹âÍÆÎÌ

    ¸½ºß¤Î Dash Button ¤Ç¤Ï¤³¤Î¹â²Á¤ÊÅÅÃÓ¤ËÂ夨¤ÆÊƥǥå¥é¥»¥ë¼Ò¤Îñ»Í·¿¥¢¥ë¥«¥ê´¥ÅÅÃÓ¤¬»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹¡£
    µì¡§Energizer Ultimate Lithium AAA Battery
    ¿·¡§Duracell Ultra AAA Alkaline Battery
    https://mpetroff.net/
    ¡Ê2016-12-14 »þÅÀ¤Ç¤Îξ¼Ô¤Î¾®Çä²Á³Ê¤ÎÎã¡Ë ÅÅÃÓ¸ò´¹¤Ï¿· Button ¤Ë¤ª¤¤¤Æ¤âÉԲĤǤ¢¤ë¤¿¤á¾åµ­¤ÎÊѹ¹¤¬»ÈÍѼ÷Ì¿¤ËµÚ¤Ü¤¹±Æ¶Á¤¬µ¤¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢Petroff »á¤Ë¤è¤ë¿·µìξ Button ¤Î¾ÃÈñÅÅή¼Â¬·ë²Ì¡Ê²¼¥°¥é¥Õ¡§ÌÜÀ¹Éý¤Î°ã¤¤¤ËÃí°Õ¡Ë¤Ë¤è¤ì¤Ð¥¹¥ê¡¼¥×¾õÂ֤ǤϿ· Button ¤¬ 2.0¦ÌA°Ê²¼¡¢µì Button ¤¬ 2.3¦ÌA°Ê²¼¤ÈÁ°¼Ô¤Î¤Û¤¦¤¬Îɹ¥¤Ç¤¢¤ê¡¢¤Þ¤¿¡¢¥Ü¥¿¥ó²¡²¼¸å¤Î¥¢¥¯¥Æ¥£¥Ö¾õÂ֤ˤª¤¤¤Æ¤Ï¿· Button ¤Î¤Û¤¦¤¬¤ª¤ª¤à¤Í 10%Á°¸å¥ì¥Ù¥ë¤¬¹â¤¤¤â¤Î¤Î½èÍý¤ò´°Î»¤·ºÆÅÙ¥¹¥ê¡¼¥×¤¹¤ë¤Þ¤Ç¤Î½êÍ×»þ´Ö¤Ïµì Button ¤ÎȾʬ°Ê²¼¤È¡¢ÅŸ»»ÅÍͤÎÊѹ¹¤Ëȼ¤¤ÅÅÎϾÃÈñ¤òÍÞÀ©¤¹¤ëºî¤ê¤ËÊѹ¹¤µ¤ì¤Æ¤¤¤ëÍͻҤ¬±®¤¨¤Þ¤¹¡£
    µì
    ¿·
    https://mpetroff.net/

    ¥Þ¥¤¥¯¥í¥³¥ó¥È¥í¡¼¥é / Wi-Fi ¥Á¥Ã¥×¤ÎÊѹ¹, BLE ¥Á¥Ã¥×ÄɲÃ, Flash ¥á¥â¥êÍÆÎÌÁý²Ã

    ¿· Button ¤Ç¤Ï¡¢°ÊÁ°¤Î ST ¥Þ¥¤¥¯¥í¥¨¥ì¥¯¥È¥í¥Ë¥¯¥¹¼ÒÀ½¥Þ¥¤¥¯¥í¥³¥ó¥È¥í¡¼¥é STM32F205 ¤¬ Atmel ¼Ò¡Ê2016ǯ4·î¤è¤ê Microchip Technology »±²¼¡ËÀ½ ATSAMG55J19A-MU ¤Ë¡¢Broadcom ¼ÒÀ½¤Î Wi-Fi ¥â¥¸¥å¡¼¥ë BCM943362WCD4 WICED ¤¬ Atmel ¼ÒÀ½ ATWINC1500B ¤ËÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹¡£°ìÊý¤Ç ¿· Button ¤Î Flash ¥á¥â¥ê¤ÏÇÜÍÆÎ̤Π32M¥Ó¥Ã¥È¤ËÁý¶¯¤µ¤ì¤Æ¤ª¤ê¡¢¤Þ¤¿¡¢µì Button ¤Ë¤Ï¸ºß¤·¤Ê¤«¤Ã¤¿ BLE ¥Á¥Ã¥×¤¬¥»¥Ã¥È¥¢¥Ã¥×ÍѤËÄɲ䵤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤é°ìÏ¢¤Î¹½À®Í×ÁǤÎÊѹ¹¤ÏÀ­Ç½¶¯²½¤È¥³¥¹¥È¥À¥¦¥ó¤ÎξΩ¤òÌÜŪ¤È¤·¤¿È½ÃǤηë²Ì¤È¹Í¤¨¤é¤ì¤Þ¤¹¡£
    µì


    U5) ¥Þ¥¤¥¯¥í¥³¥ó¥È¥í¡¼¥é¡§ST STM32F205
    U9) Wi-Fi ¥â¥¸¥å¡¼¥ë¡§
    Broadcom BCM943362WCD4 WICED
    U6) ¥Õ¥é¥Ã¥·¥å¥á¥â¥ê: Micron M25P16 (16Mbit)
    ¥Þ¥¤¥¯¤¢¤ê
    ¿·


    U1) ¥Þ¥¤¥¯¥í¥³¥ó¥È¥í¡¼¥é¡§Atmel ATSAMG55J19A-MU
    U19) Wi-Fi ¥Á¥Ã¥×¡§Atmel ATWINC1500B
    U22) BLE ¥Á¥Ã¥×¡§Cypress CYBL10563-68FNXI
    U15) ¥Õ¥é¥Ã¥·¥å¥á¥â¥ê: Micron N25Q032 (32Mbit)
    ¥Þ¥¤¥¯¤¢¤ê
    https://mpetroff.net/

    ¥»¥Ã¥È¥¢¥Ã¥×ÊýË¡¤ÎÊѹ¹

    ¿·µì Button ¤Ï¥»¥Ã¥È¥¢¥Ã¥×¤ÎÊýË¡¤¬°Û¤Ê¤ê¤Þ¤¹¡£Android ¤Þ¤¿¤Ï iOS üËö¤È¸ø¼°¥·¥ç¥Ã¥Ô¥ó¥°¥¢¥×¥ê¤òÍøÍѤ¹¤ëÅÀ¤Ï¶¦Ä̤Ǥ¹¤¬¡¢¿·ÈǤ¬Æ±¥¢¥×¥ê¤È Button ¤È¤Î±þ½·¤Ë BLE ÄÌ¿®¤ò»È¤¦ÆâÍƤǤ¢¤ë¤Î¤ËÂФ·¡¢µìÈÇ¤Ç¤Ï Android ´Ä¶­¤Ç¤Ï Wi-Fi ÄÌ¿®¡¢iOS ´Ä¶­¤Ç¤ÏĶ²»ÇÈÄÌ¿®¤òÍøÍѤ¹¤ë»ÅÍͤǤ·¤¿¡£¤Á¤Ê¤ß¤Ë¡¢µìÈÇ¤Ç¤Ï Fire Phone ¤â¥»¥Ã¥È¥¢¥Ã¥×¤ËÍøÍѤ¹¤ë¤³¤È¤¬²Äǽ¤Ç¤·¤¿¡£

    µì Dash Button ¤Î¥»¥Ã¥È¥¢¥Ã¥×

    web.archive.org ¤Ëµì Button ¤Î¥»¥Ã¥È¥¢¥Ã¥×¼ê½çÀâÌÀ¥Ú¡¼¥¸¤Î¥­¥ã¥Ã¥·¥å¤¬»Ä¤Ã¤Æ¤¤¤Þ¤¹¡£ ¤³¤ÎÆâÍƤ«¤é¡¢¥Ü¥¿¥óĹ²¡¤·¤Ë¤è¤ê°Ü¹Ô¤¹¤ë¥»¥Ã¥È¥¢¥Ã¥×¥â¡¼¥É¤Ë¤ª¤¤¤Æµì Button ¤¬¥À¥ß¡¼ Wi-Fi ¥¢¥¯¥»¥¹¥Ý¥¤¥ó¥È ·ó ²»À¼¾ðÊó¤Î¥ê¥¹¥Ê¡¼¤È¤·¤Æ¿¶¤ëÉñ¤Ã¤Æ¤¤¤¿¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£

    ¢¨²¼¤Î¿Þ¤Ï¾åµ­¥­¥ã¥Ã¥·¥å¤Î iOS üËö¸þ¤±¤ÎÀâÌÀ²Õ½ê¤«¤é¤ÎÈ´¿è
    ¢¨Æ°²è¤ÏµìÈǤΥ»¥Ã¥È¥¢¥Ã¥×¤ÎÍͻҡÊYoutube 2015Ž°08-06 Åê¹Æ, iPhone¡Ë3ʬ20É䢤¿¤ê¤«¤é


    http://www.amazon.com/
    https://youtu.be/NSrdo5oNzsI?t=203
    Android üËö¤ò»È¤Ã¤¿¥»¥Ã¥È¥¢¥Ã¥×¤Ë Dash Button ¤Î¥À¥ß¡¼ Wi-Fi ¥¢¥¯¥»¥¹¥Ý¥¤¥ó¥È¤Ø¤Î°ì»þŪ¤ÊÀÚ¤êÂؤ¨¤¬ÍøÍѤµ¤ì¤Æ¤¤¤ë°ìÊý¤Ç iOS üËö¤Ç¤Î¥»¥Ã¥È¥¢¥Ã¥×¤Ë²»À¼¿®¹æ¤¬ºÎÍѤµ¤ì¤¿¤Î¤Ï JailBreak ¤·¤Ê¤¤¸Â¤êÀܳÀè¤Î Wi-Fi ¥¢¥¯¥»¥¹¥Ý¥¤¥ó¥È¤ò¥×¥í¥°¥é¥à¤«¤éÊѹ¹ÉԲĤǤ¢¤ë¤³¤È¤Ëµ¯°ø¤¹¤ë¤â¤Î¤Î¤è¤¦¤Ç¤¹¡£

    ¿· Dash Button ¤Î¥»¥Ã¥È¥¢¥Ã¥×

    BLE ¥Á¥Ã¥×¤¬ÅëºÜ¤µ¤ì¤¿¿· Button ¤Ç¤Ï¥»¥Ã¥È¥¢¥Ã¥×»þ¤Î¸ø¼°¥¢¥×¥ê¤È¤Î±þ½·¤Ë BLE ÄÌ¿®¤¬ÍøÍѤµ¤ì¤Æ¤¤¤Þ¤¹¡£

    ¤³¤ÎÊѹ¹¤Ë¤è¤Ã¤Æ Android / iOS ¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Î¼ê½ç¤¬Åý°ì¤µ¤ì¥·¥ó¥×¥ë¤Ç¥¹¥Þ¡¼¥È¤Ë¤Ê¤Ã¤¿È¿ÌÌ¡¢µìÈǤǤÏÆä˸ÀµÚ¤µ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿ÂÐ¾Ý OS ¥Ð¡¼¥¸¥ç¥ó¤¬¡ÖiOS 8.3 or higher, Android 4.1 or higher¡×¤Ë¸ÂÄꤵ¤ì¤ë·Á¤È¤Ê¤ê¤Þ¤·¤¿¡£¤Þ¤¿¡¢BLE ÈóÂбþ¤Î Fire Phone¡Ê2015ǯ²¼´üÈÎÇ佪λ¡Ë¤â¼ê½çÀâÌÀ¤«¤é¾Ã¤¨¤Æ¤¤¤Þ¤¹¡£

    ¸½ºß¤Î Dash Button ¥»¥Ã¥È¥¢¥Ã¥×¼ê½çÀâÌÀ¥Ú¡¼¥¸

    ²èÌÌÁ«°Ü

    1
    2
    3
    4
    5
    6
    7
    8
    9

    ¿· Dash Button ¤Ë¥Þ¥¤¥¯¤¬»Ä¤µ¤ì¤Æ¤¤¤ëÍýͳ

    µì Button ¤¬ iOS üËö¤Ç¤Î¥»¥Ã¥È¥¢¥Ã¥×»þ¤Ë²»À¼¿®¹æ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¥Þ¥¤¥¯¥í¥Õ¥©¥ó¤òÆ⢤·¤Æ¤¤¤¿¤³¤È¤ÏÍý²ò¤Ç¤­¤Þ¤¹¡£¤Ç¤Ï¡¢¤Ê¤¼ BLE ÄÌ¿®¤òÍøÍѤ¹¤ë¿· Button ¤Ë¤â¥Þ¥¤¥¯¤¬»Ä¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¤·¤ç¤¦¡©»È¤ï¤Ê¤¤ÉôÉʤǤ¢¤ì¤ÐÀ½Â¤¥³¥¹¥Èºï¸º¤Î¤¿¤á¤Ë¤âűµî¤¹¤ë¤Û¤¦¤¬¹çÍýŪ¤Ê¤Ï¤º¤Ç¤¹¡£¤Þ¤µ¤« Amazon ¤¬²¿¤«Îɤ«¤é¤Ì¤³¤È¤ò´ë¤ó¤Ç¤¤¤ë¤Î¤Ç¤·¤ç¤¦¤«¡©

    Á°·Ç¤Î¼ê½çÀâÌÀ¥Ú¡¼¥¸¤òÆɤó¤Ç¤¤¤ë¤¦¤Á¤Ë¤Õ¤È°Ê²¼¤Îµ­½Ò¤¬µ¤¤Ë¤Ê¤ê¤Þ¤·¤¿¡£

    Note: Some Dash Buttons and phones do not support Bluetooth connections. If your phone does not connect to your button, select Skip Bluetooth Setup. Then, follow the instructions in the app. Your phone then uses other connection options.
    Ãí: ¥¹¥Þ¡¼¥È¥Õ¥©¥ó¤ÈDash Button¤¬Àܳ¤µ¤ì¤Ê¤¤¾ì¹ç¤Ï¡¢ Bluetooth¤ò¥¹¥­¥Ã¥×¤òÁªÂò¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥¢¥×¥ê¤Î²èÌÌ¤Ë É½¼¨¤µ¤ì¤ë¼ê½ç¤Ë½¾¤¤¤Þ¤¹¡£

    ¸ø¼°¥¢¥×¥ê¤¬ Button ¤È BLE Àܳ¤ò³ÎΩ¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¤É¤Î¤è¤¦¤Ê½êºî¤È¤Ê¤ë¤Î¤Ç¤·¤ç¤¦¡©¶½Ì£¤ò´¶¤¸»î¤·¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

    BLE ÀܳÉԲĤξõ¶·¤òºÆ¸½¤¹¤ë¤â¤Ã¤È¤â´Êñ¤ÊÊýË¡¤Ï¡ÖButton ¤«¤é¤Î BLE ¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¤òȯÀ¸¤µ¤»¤Ê¤¤¡×¤³¤È¤Ç¤¹¡£¤Ä¤Þ¤ê¡¢¥¢¥×¥ê¤Ëµá¤á¤é¤ì¤¿¥¿¥¤¥ß¥ó¥°¤Ç¤ï¤¶¤È Button ¤Î¥»¥Ã¥È¥¢¥Ã¥×¥â¡¼¥É¤òµ¯Æ°¤»¤º¤½¤Î¤Þ¤ÞÊüÃÖ¤·¤Æ¤ª¤±¤Ð¤è¤¤¤Ç¤·¤ç¤¦¡£

    ·ëÏÀ¤È¤·¤Æ¡¢¥¢¥×¥ê¤Ï BLE Àܳ¤ò¤·¤Ð¤é¤¯»î¹Ô¤·¤¿¸å¤Ë¼«Æ°Åª¤Ëµì Button ¤Ç¤Î¥»¥Ã¥È¥¢¥Ã¥×¥·¡¼¥±¥ó¥¹¤Ø°Ü¹Ô¤¹¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤·¤¿¡£ BLE Àܳ¤òÄü¤á¤ë¤È¡¢Android ÈÇ¥¢¥×¥ê¤Ï Button ¤Î¥À¥ß¡¼ AP ¤Ø Wi-Fi Àܳ¤ÎÀÚ¤êÂؤ¨¤ò»î¤ß¡¢iOS ÈÇ¥¢¥×¥ê¤ÏüËö¤Î¥¹¥Ô¡¼¥«¡¼¤Ø Button ¤òÀܶᤵ¤»¤ë¤³¤È¤òÍøÍѼԤØÂ¥¤·¤Þ¤¹¡£¤½¤Î¥¿¥¤¥ß¥ó¥°¤Ç¿· Button ¤ò¥»¥Ã¥È¥¢¥Ã¥×¥â¡¼¥É¤Çµ¯Æ°¤¹¤ë¤Èµì¥¹¥¿¥¤¥ë¤Ç¤Î¥»¥Ã¥È¥¢¥Ã¥×½èÍý¤¬ÂÚ¤ê¤Ê¤¯¹Ô¤ï¤ì¤Þ¤¹¡£

    ¤Ä¤Þ¤ê¡¢¿· Button ¤Î¥»¥Ã¥È¥¢¥Ã¥×¥â¡¼¥É¤Ïµì Button ¤Ç¤Î¤½¤ì¤ÈƱ°ì¤Î I/F ¤òÈ÷¤¨¤Æ¤¤¤Þ¤¹¡£¤³¤Î¼ÂÁõ¤Ï¡¢BLE ¤ÎÍøÊØÀ­¤ò¼è¤êÆþ¤ì¤Ä¤Ä¤â´Ö¸ý¤Î¹­¤¤µìÈǤǤε¡¹½¤ò²¹Â¸¤¹¤ë¤³¤È¤Ë¤è¤ê¥»¥Ã¥È¥¢¥Ã¥×Ãʳ¬¤Ç¤Î¥È¥é¥Ö¥ë¤ò²Äǽ¤Ê¸Â¤êµÛ¼ý¤¹¤ë¤³¤È¤Ë²Ã¤¨¡¢µì Button - ¿·¥¢¥×¥ê´Ö¤Î¸ß´¹À­¤ò¥·¥ó¥×¥ë¤ËÊݤĤ³¤È¤òÌÜŪ¤È¤¹¤ë¤â¤Î¤È¹Í¤¨¤é¤ì¤Þ¤¹¡£

    Android, iOS üËö¤½¤ì¤¾¤ì¤Ç¤³¤ÎÁàºî¤ò¹Ô¤Ã¤¿ÍͻҤÎÆ°²è¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£

    • ¿· Button ¤òµì¥¹¥¿¥¤¥ë¤Ç¥»¥Ã¥È¥¢¥Ã¥× - Android ÈÇ¡Ê2ʬ9ÉᡴĶ­²»¤¢¤ê¡Ë
    • ¿· Button ¤òµì¥¹¥¿¥¤¥ë¤Ç¥»¥Ã¥È¥¢¥Ã¥× - iOS ÈÇ¡Ê1ʬ33ÉᡴĶ­²»¤¢¤ê¡Ë
    ¤Ê¤ª¡¢¥¢¥×¥ê¤Ï¡ÖüËö¤Î Bluetooth µ¡Ç½¤¬ OFF ¤Î¾ì¹ç¡×¤Ë°Ê²¼¤Î¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤³¤Ç Android ÈǤǤϡֵñÈݡס¢iOS ÈǤǤϡÖBluetooth ¤ò¥¹¥­¥Ã¥×¡×¤òÁªÂò¤¹¤ë¤³¤È¤ÇƱÍͤ˵쥹¥¿¥¤¥ë¤Î¥»¥Ã¥È¥¢¥Ã¥×¥·¡¼¥±¥ó¥¹¤Ø°Ü¹Ô¤¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤·¤¿¡£
    Andorid ÈÇ
    iOS ÈÇ

    ¿Þ¤Î¤è¤¦¤Ë iOS ÈǤ˴ؤ·¤Æ¤ÏËܹà¤ÎËÁƬ¤Ë°úÍѤ·¤¿±Ñ¸ìÈǤÎÀâÌÀµ­»ö¤È¤Û¤ÜÀ°¹ç¤·¤Þ¤¹¤¬¡¢ÆüËܸìÈǵ­»ö¤ÏËÝÌõ¤¬½½Ê¬¤Ç¤Ï¤Ê¤¯¡Ê°Õ¿ÞŪ¤Ê¤â¤Î¡©¡Ë¡¢¤Þ¤¿¡¢Android ¥æ¡¼¥¶¤¬µ­»öÃæ¤Î¥á¥Ã¥»¡¼¥¸¤òÌܤˤ¹¤ëµ¡²ñ¤Ï¤¢¤ê¤Þ¤»¤ó¡£

    ÊƹñÆâ¤Ë¤Î¤ß¸ºß¤¹¤ëµì Button ¤ÏÅÅÃÓ¼÷Ì¿¤Ç½ù¡¹¤Ë¾Ã¤¨¤Æ¤¤¤¯²áÄø¤Ë¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢BLE ÈóÂбþ¤ÎüËö¤â¼¡Âè¤ËÀ¤´Ö¤«¤é»Ñ¤ò¾Ã¤·¤Æ¤¤¤¯¤³¤È¤Ç¤·¤ç¤¦¡£¾å¤Ë·Ç¤²¤¿¸½ Dash Button ¤ÎÆóÃʹ½¤¨¤Î¥»¥Ã¥È¥¢¥Ã¥× I/F ¤Ï¤¢¤ë¤¤¤Ï²áÅÏŪ¤Ê¤â¤Î¤«¤â¤·¤ì¤Þ¤»¤ó¡£


    (tanabe)
    klab_gijutsu2 at 14:41¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)¨¢TrackBack(0)
    2016ǯ08·î30Æü

    ´ûÀ®¤Î BLE ¥Ç¥Ð¥¤¥¹¤ò¼«ºî¥×¥í¥°¥é¥à¤«¤éÍøÍѤ¹¤ë»î¤ß

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    Á°²ó¤Îµ­»ö¡§
    • BLE ¥Ç¥Ð¥¤¥¹´Ö¤ÎÄÌ¿®ÆâÍƤò¥Ñ¥±¥Ã¥È¥ì¥Ù¥ë¤ÇÆɤ߲ò¤¤¤Æ¤ß¤ë
      Âêºà¤Ë¤ÏÄã²Á³Ê¤Ç½Ð²ó¤Ã¤Æ¤¤¤ë¤¢¤ê¤Õ¤ì¤¿ Anti-Lost ·Ï BLE ¥Ç¥Ð¥¤¥¹ A ¤òÁª¤Ó¤Þ¤·¤¿¡£¤³¤Î¾®¤µ¤Ê¥Ç¥Ð¥¤¥¹¤Ë¤Ï LED¡¦¥Ö¥¶¡¼¤È²¡¤·¥Ü¥¿¥ó¥¹¥¤¥Ã¥Á¤¬ ¼ÂÁõ¤µ¤ì¤Æ¤ª¤ê¡¢Âиþ¥¹¥Þ¥Û¥¢¥×¥ê¤È¤Î´Ö¤ÇÁÐÊý¸þ¤Î¤ä¤ê¤È¤ê¤¬²Äǽ¤Ê¤Ä¤¯¤ê¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£


      ¥Ç¥Ð¥¤¥¹ A ¤Î UI
    Á°²ó¤Ï BLE ¥Ñ¥±¥Ã¥È¥¹¥Ë¥Õ¥¡¤ò»È¤Ã¤Æ´ûÀ®¤Î BLE ¥Ç¥Ð¥¤¥¹¡ÖA¡×¤ÈÂиþ¥¢¥×¥ê´Ö¤ÎÄÌ¿®ÆâÍƤòµ­Ï¿¤·¤½¤ÎÀººº¤ò»î¤ß¤Þ¤·¤¿¡£¤½¤³¤ÇÆÀ¤é¤ì¤¿¾ðÊó¤ò¤â¤È¤Ë¡¢º£²ó¤Ï¼Â¸³¤Î°ì´Ä¤È¤·¤Æ¥Ç¥Ð¥¤¥¹ A ¤ÈÏ¢·È¤¹¤ë Android ¥¢¥×¥ê¤Î»îºî¤ò¹Ô¤¤¤Þ¤¹¡£¥Ñ¥±¥Ã¥È¥í¥°¤«¤é±®¤¨¤ë BLE ¥»¥ó¥È¥é¥ë¦¤Î½êºî¤ò¼«ºî¥×¥í¥°¥é¥à¤ÇºÆ¸½¤¹¤ë¤³¤È¤ÏÏÀÍýŪ¤Ë²Äǽ¤Ç¤·¤ç¤¦¡£

    ¥Ç¥Ð¥¤¥¹ A ¤È¥¢¥×¥ê¤ÎÏ¢·È¤ËɬÍפʽèÍý

    Á°²ó¤Îµ­»ö¤«¤é¡¢¥Ç¥Ð¥¤¥¹ A ¤È¥¢¥×¥ê¤ÎÏ¢·È¤Ë´Ø¤¹¤ëÍ×ÁǤò¥Ô¥Ã¥¯¥¢¥Ã¥×¤·¤Æ¤ß¤Þ¤¹¡£

    • ¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹ A ¤Î LED¡¦¥Ö¥¶¡¼¤ò¥³¥ó¥È¥í¡¼¥ë

      • ¡ÖScene 6: ¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹ A ¤Î LED¡¦¥Ö¥¶¡¼¤òÁàºî¡×
        Frame 616

        Âиþ¥¢¥×¥ê¾å¤Î½êÄê¤Î¥Ü¥¿¥ó¤ò²¡²¼¤¹¤ë¤È¡¢Frame 345, Frame 238 ¤Î¼¨¤¹¡¢ "¡ÖImmediate Alert¡×¥µ¡¼¥Ó¥¹ÇÛ²¼¤Î¡ÖAlert Level¡×¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯" ¤Î Value Handle 0x0025 ¤ËÃÍ¡Ö2¡ÊHigh Alert¡Ë¡×¤¬½ñ¤­¹þ¤Þ¤ì¤ë

        ¥Ç¥Ð¥¤¥¹ A ¤Î LED¡¦¥Ö¥¶¡¼¤Ï¥Õ¥¡¡¼¥à¥¦¥§¥¢¥ì¥Ù¥ë¤Ç¤³¤Î Alert Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ëɳ¤Å¤±¤é¤ì¤Æ¤¤¤ëÌÏÍÍ¡£High Alert Ãͤ¬½ñ¤­¹þ¤Þ¤ì¤ë¤È¤½¤ì¤ËÈ¿±þ¤·¤Æû»þ´Ö LED ¤È¥Ö¥¶¡¼¤¬ ON ¤Ë¤Ê¤ë

      ¡¼> ¥Ç¥Ð¥¤¥¹ A ¤ÎÄ󶡤¹¤ë Immediate Alert ¥µ¡¼¥Ó¥¹ÇÛ²¼¤Î Alert Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ë¥¢¥×¥ê¤«¤éÃÍ 2 ¤ò½ñ¤­¹þ¤á¤Ð¥Ç¥Ð¥¤¥¹ A ¤Î LED¡¦¥Ö¥¶¡¼¤¬ ON ¤Ë¤Ê¤ê¡¢ÃÍ 0 ¤ò½ñ¤­¹þ¤á¤Ð OFF ¤Ë¤Ê¤ë

    • ¥Ç¥Ð¥¤¥¹ A ¤Î¥Ü¥¿¥ó²¡²¼¤ò¥¢¥×¥ê¤ØÄÌÃÎ

      • ¡ÖScene 5: ¥Ç¥Ð¥¤¥¹ A ¥Ü¥¿¥ó²¡²¼»þ¤Î¥¢¥×¥ê¤Ø¤ÎÄÌÃΤòÀßÄê¡×
        Frame 491

        Frame 453¡¢Frame 439¡¢Frame 453 ¤Î¼¨¤¹Ä̤ꡢ¥Ï¥ó¥É¥ë 0x0036 ¤Ï¡¢ "¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1¡ÊUUID = 0xFFE0¡ËÇÛ²¼¤Î¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡ËÇÛ²¼¤Î Client Characteristic Configuration Descriptor (CCCD)" ¤Ç¤¢¤ë

        Åö³º¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡Ë¤Î¥×¥í¥Ñ¥Æ¥£¤Ë¤Ï Notify ¤¬ÀßÄꤵ¤ì¤Æ¤ª¤ê¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ç¤¢¤ëÂиþ¥¢¥×¥ê¤«¤é CCCD 0x0036 ¤Ë Notification bit (0x0001) ¤ò½ñ¤­¹þ¤ó¤Ç¤ª¤¯¤³¤È¤Ç¡¢¤³¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ÎÃͤ¬¹¹¿·¤µ¤ì¤¿»þ¤Ë Value Handle ¤Ç¤¢¤ë 0x0035 ·Ðͳ¤Ç¥¢¥×¥ê¦¤ØÄÌÃΡÊNotification¡Ë¤¬¹Ô¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤ë

      • ¡ÖScene 7: ¥Ç¥Ð¥¤¥¹ A ¤Î¥Ü¥¿¥ó¤ò²¡¤¹¤È¥¢¥×¥ê¤ØÄÌÃΡ×
        Frame 711

        ¥Ç¥Ð¥¤¥¹ A ¤ÎʪÍý¥Ü¥¿¥ó¤Ï¥Õ¥¡¡¼¥à¥¦¥§¥¢¥ì¥Ù¥ë¤Ç Frame 439 ¤Î¼¨¤¹ "¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1¡ÊUUID = 0xFFE0¡ËÇÛ²¼¤Î¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡Ë" ¤Ëɳ¤Å¤±¤é¤ì¤Æ¤¤¤ëÌÏÍÍ¡£¤³¤Î¥Ü¥¿¥ó¤ò²¡¤¹¤ÈÅö³º¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ÎÃͤ¬¥Ç¥Ð¥¤¥¹ÆâÉô¤Ç¹¹¿·¤µ¤ì Frame 491 ¤Ç¤Î»Å¹þ¤ß¤Ë´ð¤Å¤­¥¢¥×¥ê¦¤ØÄÌÃΤ¬¹Ô¤ï¤ì¤ë

      ¡¼> ½é´ü½èÍý¤È¤·¤Æ¡¢¥Ç¥Ð¥¤¥¹ A ¤ÎÄ󶡤¹¤ë¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1¡ÊUUID = 0xFFE0¡ËÇÛ²¼¤Î¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡Ë¤Î»ý¤Ä Client Characteristic Configuration Descriptor ¡Ê¾ÜºÙ¡§1, 2¡Ë ¤Ë¥¢¥×¥ê¤«¤éÃÍ 0x0001¤ò½ñ¤­¹þ¤ó¤Ç¤ª¤¯¡£¤½¤ì°Ê¹ß¤Ë¥Ç¥Ð¥¤¥¹ A ¤Î¥Ü¥¿¥ó¤¬²¡²¼¤µ¤ì¤ë¤ÈÅö³º¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯·Ðͳ¤Ç¥Ç¥Ð¥¤¥¹ A ¤«¤é¥¢¥×¥ê¤ØÄÌÃΤ¬¹Ô¤ï¤ì¤ë
    ½èÍý¤½¤Î¤â¤Î¤Ë¤ÏÆäËÆñ¤·¤½¤¦¤ÊÍ×ÁǤâ¤Ê¤¯¡¢¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹ A ¤Ø¤ÎÀܳ¸å¤Ë½êÄê¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡¦¥Ç¥¹¥¯¥ê¥×¥¿¤ÎÁàºî¤òŬÀڤ˹Ԥ¦¤³¤È¤¬¥Ý¥¤¥ó¥È¤È¤Ê¤ê¤½¤¦¤Ç¤¹¡£

    ¥µ¡¼¥Ó¥¹¡¦¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡¦¥Ç¥¹¥¯¥ê¥×¥¿¤Î UUID ¤Ë¤Ä¤¤¤Æ

    BLE ¥Í¥¤¥Æ¥£¥Ö¤ÎÀ¤³¦¤Ç¤Ï½êÄê¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ä¥Ç¥¹¥¯¥ê¥×¥¿¤Î I/O ¤Ë¤Ï³Æ¥¨¥ó¥È¥ê¤Ëɳ¤Å¤±¤é¤ì¤¿¥Ï¥ó¥É¥ë¤¬»ÈÍѤµ¤ì¤Þ¤¹¤¬¡¢Ãê¾Ý²½¤µ¤ì¤¿ Android API ¤Ç¤Î½èÍýÂоݤϥª¥Ö¥¸¥§¥¯¥È¤Ç¤¹¡£½êÄê¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ä¥Ç¥¹¥¯¥ê¥×¥¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¼èÆÀ¤Ë¤Ï¤½¤ì¤¾¤ì¤Î UUID ¤¬É¬ÍפǤ¢¤ë¤¿¤á¡¢¥×¥í¥°¥é¥à¤Îµ­½Ò¤ËºÝ¤·¤Æ¤Ï¡¢¥Ñ¥±¥Ã¥È¥í¥°¾å¤Ëµ­Ï¿¤µ¤ì¤¿½êÄê¤Î¥Ï¥ó¥É¥ë¤¬¤É¤Î UUID ¤Î¥¨¥ó¥È¥ê¤Î¤â¤Î¤Ç¤¢¤ë¤«¤òÀµ³Î¤ËÇÄ°®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
    ¤Þ¤¿¡¢¥µ¡¼¥Ó¥¹ - ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ - ¥Ç¥¹¥¯¥ê¥×¥¿¤Ï³¬Áشط¸¤Ë¤¢¤ë¤¿¤á¡¢½êÄê¤Î¥¨¥ó¥È¥ê¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ¤¹¤ë¼ê³¤­¤ÏºÇ¾å°Ì¤Ë¤¢¤ë¥µ¡¼¥Ó¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬¾ï¤Ëµ¯ÅÀ¤È¤Ê¤ê¤Þ¤¹¡£

    °Ê²¼¤Ë¡¢¥Ñ¥±¥Ã¥È¥í¥°¤«¤é½êÄê¤Î¥µ¡¼¥Ó¥¹°Ê²¼¤Î³Æ¥¨¥ó¥È¥ê¤Î UUID ¤ò¸«¤Ä¤±¤ëÊýË¡¤È¡¢³Æ UUID ¤«¤é¤½¤ì¤¾¤ì¤Î¥¨¥ó¥È¥ê¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ¤¹¤ë Android ¥³¡¼¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£

    ¥Ñ¥±¥Ã¥È¥í¥°¤«¤é½êÄê¤Î¥µ¡¼¥Ó¥¹°Ê²¼¤Î³Æ¥¨¥ó¥È¥ê¤Î UUID ¤ò½¦¤¦

    • Á°²óµ­»öÃæ¤Î¥Ñ¥±¥Ã¥È¥í¥° Frame 229 ¤Ç¤Ï 0x0001 - 0xffff ¤Î¥Ï¥ó¥É¥ë¶õ´Ö¤òÂÐ¾Ý¤Ë Read By Group Type Request ¤Ç GATT Primary Service Declaration ¤ò¾È²ñ¡¢¤½¤Î¥ì¥¹¥Ý¥ó¥¹¤¬ Frame 231 ¤Ç¤¹

             ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

      ¤³¤³¤Ç¤Ï¥ì¥¹¥Ý¥ó¥¹¤Ë´Þ¤Þ¤ì¤ë 3·ï¤Î¥ì¥³¡¼¥É¤Î¤¦¤Á 2·ï¤á¤ËÃíÌܤ·¤Æ¤ß¤Þ¤¹

      Opcode: Read By Group Type Response (0x11)
               :
      
      Attribute Data, Handle: 0x000c, Group End Handle: 0x000f
        Handle: 0x000c
        Group End Handle: 0x000f
        Value: 0118
               :
      
      • Primary Service Declaration ¤Î¾È²ñ¤ËÂФ¹¤ë Read By Group Type Response ¤Î¡ÖValue¡×¤Ë¤ÏÅö³º¥µ¡¼¥Ó¥¹¤Î UUID ¤¬³ÊǼ¤µ¤ì¤ë
      • ¤³¤ÎÎã¤Ç¤Ï 16¥Ó¥Ã¥È UUID = 0x1801 ¤Ç¤¢¤ê¡¢¤³¤ì¤Ï¡¢BLE ´ûÄê¤Î Generic Attribute ¥µ¡¼¥Ó¥¹¤ò¼¨¤¹
      • Åö³º¥µ¡¼¥Ó¥¹¤Ï¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x000c - 0x000f ¤òÀêÍ­¤¹¤ë
    • Frame 287 ¤Ç¤Ï¾åµ­¤Î¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x000c - 0x000f ¤òÂÐ¾Ý¤Ë Read By Type Request ¤Ç GATT Characteristic Declaration ¤ò¾È²ñ¡¢¤½¤Î¥ì¥¹¥Ý¥ó¥¹¤¬ Frame 289 ¤Ç¤¹

             ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

      ¥ì¥¹¥Ý¥ó¥¹¤ËÃíÌܤ·¤Þ¤¹

      Opcode: Read By Type Response (0x09)
               :
      
      Attribute Data, Handle: 0x000d
        Handle: 0x000d
        Value: 200e00052a
      
      • Characteristic Declaration ¤Î¾È²ñ¤ËÂФ¹¤ë Read By Type Response ¤Î¡ÖValue¡×¤Ë¤ÏÅö³º¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¥×¥í¥Ñ¥Æ¥£¡¦Value Handle¡¦UUID ¤¬³ÊǼ¤µ¤ì¤ë¡Ê¾ÜºÙ¡§1a, 2a, 1b¡Ë

        ¡Ê¢¨É½¤Ï BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Part G] page 532 ¤è¤ê¡Ë
      • ¤³¤³¤Ç¤Ï¡Övalue: 200e00052a¡×¤Ë¤Ä¤­¡¢¥×¥í¥Ñ¥Æ¥£ = 0x20 (Indicate), Characteristic Value Handle = 0x000e, 16¥Ó¥Ã¥È UUID = 0x2A52
      • 16¥Ó¥Ã¥È UUID = 0x2A52 ¤Ï¡¢BLE ´ûÄê¤Î Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¼¨¤¹
    • Frame 302 ¤Ç¤Ï»Ä¤ê¤Î¥Ï¥ó¥É¥ë 0x000f ¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤ò GATT ¤Ø Find Information Request ¤Ç¾È²ñ¡¢¤½¤Î¥ì¥¹¥Ý¥ó¥¹¤¬ Frame 305 ¤Ç¤¹

             ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

      ¥ì¥¹¥Ý¥ó¥¹¤ËÃíÌܤ·¤Þ¤¹

      Opcode: Find Information Response (0x05)
      UUID Format: 16-bit UUIDs (0x01)
      Handle: 0x000f
      UUID: Client Characteristic Configuration (0x2902)
      
      • ¥Ï¥ó¥É¥ë 0x000f ¤Ï Client Characteristic Configuration Descriptor (CCCD) ¤Ç¤¢¤ê¡¢¤³¤Î CCCD ¤ÏľÁ°¤Î Indicate ¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ë°¤¹¤ë
        ¡Ê¢¨CCCD ¤Î 16¥Ó¥Ã¥È UUID ¤Ï 0x2902 ¸ÇÄê¡Ë

    °Ê¾å¤Î¤³¤È¤«¤é¡¢¥Ç¥Ð¥¤¥¹ A ¾å¤Î Generic Attribute ¥µ¡¼¥Ó¥¹¤Î¹½À®¤Ï°Ê²¼¤ÎÆâÍƤǤ¢¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£

    Generic Attribute ¥µ¡¼¥Ó¥¹¡ÊUUID = 0x1801¡Ë
      |  Handle Group = 0x000c - 0x000f
    ¡¡|
      +-- Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0x2A52¡Ë
            |   Handle = 0x000d, Value Handle = 0x000e
            |
            +-- Client Characteristic Configuration Descriptor (UUID = 0x2902¡Ë
                  Handle = 0x000f
    

    ½êÄê¤Î UUID ¤Î¥¨¥ó¥È¥ê¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ¤¹¤ë

    ¤³¤³¤Þ¤Ç¤ËÅо줷¤¿ UUID ¤Ï¤¹¤Ù¤Æ 16¥Ó¥Ã¥ÈÃͤǤ·¤¿¤¬¡¢16 ¥Ó¥Ã¥È UUID ¤Ï Bluetooth ÍѤ˥¢¥µ¥¤¥ó¤µ¤ì¤Æ¤¤¤ëËÜÍè¤Î 128¥Ó¥Ã¥È UUID ¤Î¸ÇÄêÉôʬ¡ÊBASE_UUID¡Ë¤ò¾Êά¤·¤¿É½¸½¤Ç¤¹¡£

    • BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Part B] page 227
      2.5 SEARCHING FOR SERVICES
             :
      2.5.1 UUID
             :
      To reduce the burden of storing and transferring 128-bit UUID values, 
      a range of UUID values has been pre-allocated for assignment to 
      often-used, registered purposes. The first UUID in this pre-allocated
      range is known as the Bluetooth Base UUID and has the value 
      00000000-0000-1000-8000-00805F9B34FB,
             :
      
    ¤Ä¤Þ¤ê¡¢Generic Attribute ¥µ¡¼¥Ó¥¹¤Î 16¥Ó¥Ã¥È UUID¡Ö0x1801¡×¤Ï¡¢128¥Ó¥Ã¥È UUID¡Ö00001801-0000-1000-8000-00805F9B34FB¡×¤Ç¤¹¡£

    Android API ¤òÍѤ¤¤ÆÁ°½Ð¤Î Generic Attribute ¥µ¡¼¥Ó¥¹¤È Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡¢¤ª¤è¤Ó¤½¤ÎÇÛ²¼¤Î Client Characteristic Configuration Descriptor ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ¤¹¤ë¥³¡¼¥É¤Î¥¤¥á¡¼¥¸¤ò¼¨¤·¤Þ¤¹¡£

    private BluetoothGatt mBtGatt;
    
    private BluetoothGattCharacteristic mChServiceChanged;
    private BluetoothGattDescriptor mCCCD;
    
    // Generic Attribute ¥µ¡¼¥Ó¥¹ ¤Î UUID
    private UUID mUuidSvcGenericAttribute = UUID.fromString("00001801-0000-1000-8000-00805f9b34fb");
    // Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î UUID 
    private UUID mUuidChServiceChanged    = UUID.fromString("00002a52-0000-1000-8000-00805f9b34fb");
    // Client Characteristic Configuration Descriptor ¤Î UUID ¡Ê¸ÇÄêÃÍ¡Ë
    private UUID mUuidCCCD                = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
                     :
    
    private BluetoothGattCallback mGattCallback = new bleGattCallback();
                     :
    
    // ¥Ç¥Ð¥¤¥¹ A ¤ØÀܳ¸å¡¢GATT ¤ÎÄ󶡤¹¤ë³Æ¥µ¡¼¥Ó¥¹°Ê²¼¤Î°ìÍ÷¤ò¼èÆÀ
    mBtGatt.discoverServices();(mCtx, false, mGattCallback);
                     :
    
    // GATT ¥¤¥Ù¥ó¥È¥Ï¥ó¥É¥é
    private class bleGattCallback extends BluetoothGattCallback {
      @Override
      // GATT ¥µ¡¼¥Ó¥¹°ìÍ÷¼èÆÀ´°Î»
      public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        super.onServicesDiscovered(gatt, status);
    
        // ¥Ç¥Ð¥¤¥¹ A ¤Î Generic Attribute ¥µ¡¼¥Ó¥¹¤Î
        // Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ
        BluetoothGattService svc = gatt.getService(mUuidSvcGenericAttribute);
        mChServiceChanged = svc.getCharacteristic(mUuidChServiceChanged);
    
        // Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î
        // Client Characteristic Configulation Descriptor ¤ò¼èÆÀ
        mCCCD = mChServiceChanged.getDescriptor(mUuidCCCD);
                     :
      }
    

    ¤Á¤Ê¤ß¤Ë¡¢¥¢¥×¥ê³«È¯¤Î½é´ü¤Ë BluetoothGattCallback ¤Î onServicesDiscovered() ¤Ë¼¡¤ÎÍ×ÎΤΥ³¡¼¥É¤òÁÞÆþ¤·¤Æ ³Æ GATT ¥µ¡¼¥Ó¥¹ÇÛ²¼¤ÎÁ´¥¨¥ó¥È¥ê¤Î UUID ¤ò³¬ÁØŪ¤Ë½ÐÎϤ·Êݸ¤·¤Æ¤ª¤¯¤È²¿¤«¤ÈÊØÍø¤Ç¤¹¡£

    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
      super.onServicesDiscovered(gatt, status);
    
      List<BluetoothGattService> serviceList = gatt.getServices();
    
      Log.d(TAG, "onServicesDiscovered: serviceList.size=" + serviceList.size());
    
      for (BluetoothGattService s : serviceList) {
        Log.d(TAG, "onServicesDiscovered: svc uuid=" + s.getUuid().toString());
        List<BluetoothGattCharacteristic> chlist = s.getCharacteristics();
        Log.d(TAG, "onServicesDiscovered: chrlist.size=" + chlist.size());
    
        for (BluetoothGattCharacteristic c : chlist) {
          UUID uuid = c.getUuid();
          Log.d(TAG, "onServicesDiscovered:  chr uuid=" + uuid.toString());
          List<BluetoothGattDescriptor> dlist = c.getDescriptors();
    
          Log.d(TAG, "onServicesDiscovered:  desclist.size=" + dlist.size());
          for (BluetoothGattDescriptor d : dlist) {
            Log.d(TAG, "onServicesDiscovered:   desc uuid=" + d.getUuid());
          }
        }
      }
    

    ¥Ç¥Ð¥¤¥¹ A ¤Ø¤ÎÀܳ¸å¤Ë¾å¤Î¥³¡¼¥É¤ò¼Â¹Ô¤·¤¿ºÝ¤Î¥í¥°¤Ç¤¹¡£¡Ê¢¨¸«¤ä¤¹¤µ¤Î¤¿¤á¤Ë¥µ¡¼¥Ó¥¹¤´¤È¤Ë²þ¹Ô¤òÁÞÆþ¡Ë

    ÅöÁ³¤Ê¤¬¤é¡¢¤³¤ÎÆâÍƤÏÁ°²óºÎ¼è¤·¤¿¥Ñ¥±¥Ã¥È¥í¥°Æâ¤Î³Æ¥¨¥ó¥È¥ê¤Î¾ðÊó¤ÈÉä¹ç¤·¤Æ¤¤¤Þ¤¹¡£

    ºîÀ®¤·¤¿¥¢¥×¥ê

    °Ê¾å¤ÎÆâÍƤˤâ¤È¤Å¤¤¤Æ¥¢¥×¥ê¤òºîÀ®¤·¤Þ¤·¤¿¡£¤´¤¯¥·¥ó¥×¥ë¤Ê¤â¤Î¤Ç¤¹¤¬´üÂÔÄ̤ê¤ËÆ°¤¤¤Æ¤¤¤Þ¤¹¡£

    ¥½¡¼¥¹¥³¡¼¥É°ì¼°

    Æ°²è¡§Æ°ºî¤ÎÍÍ»Ò

    ºîÀ®¤·¤¿ Android ¥¢¥×¥ê¤È¥Ç¥Ð¥¤¥¹ A ¤ÎÏ¢·È¤ÎÍͻҤò¼ý¤á¤¿Æ°²è¤Ç¤¹¡£¥Ç¥Ð¥¤¥¹ A ¤Ï UI Éôʬ¤Î¤ß¤òϪ½Ð¤·¤Æ¤¤¤Þ¤¹¡£
    ¡Ê34Éà ¥¢¥é¡¼¥à²»¤¢¤ê ²»ÎÌÃí°Õ¡Ë
        

    ¥á¥â¡§¼ÂÁõ¼ê½ç¤Ê¤É

    private BluetoothAdapter mBtAdapter;
    private BluetoothLeScanner mBtScanner;
    private BluetoothDevice mBtDevice;
    private BluetoothGatt mBtGatt;
    

    1. BluetoothAdapter ¡Á BluetoothLeScanner ¤ò¼èÆÀ

    • BluetoothAdapter - developer.android.com
      Represents the local device Bluetooth adapter. The BluetoothAdapter lets you
      perform fundamental Bluetooth tasks, such as initiate device discovery, query
      a list of bonded (paired) devices, instantiate a BluetoothDevice using a known
      MAC address, and create a BluetoothServerSocket to listen for connection
      requests from other devices, and start a scan for Bluetooth LE devices.
                        :
      
      static BluetoothAdapter	getDefaultAdapter()
      
      Get a handle to the default local Bluetooth adapter. 
      
    • BluetoothAdapter - getBluetoothLeScanner - developer.android.com
      BluetoothLeScanner getBluetoothLeScanner ()
      
      Returns a BluetoothLeScanner object for Bluetooth LE scan operations. 
      
      • BluetoothLeScanner - developer.android.com
        BluetoothLeScanner
        
        This class provides methods to perform scan related operations for Bluetooth
        LE devices. An application can scan for a particular type of Bluetooth LE
        devices using ScanFilter. It can also request different types of callbacks
        for delivering the result. 
        
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    mBtScanner = mBtAdapter.getBluetoothLeScanner();
    

    2. ¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¥Ñ¥±¥Ã¥È¤Î¥¹¥­¥ã¥ó ¡Á ÂоݤȤ¹¤ë BluetoothDevice ¤ò¼èÆÀ

    private ScanCallback mScanCallback = new bleScanCallback();
                     :
    
    mBtScanner.startScan(mScanCallback);
                     :
    
    private class bleScanCallback extends ScanCallback {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            if (.......) {
              mBtDevice = result.getDevice();
            }
        }
        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);
            Log.e(TAG, "onScanFailed: err=" + errorCode);
        }
    }
    

    3. ¥Ç¥Ð¥¤¥¹¤Ø¤ÎÀܳ

    • BluetoothDevice - connectGatt - developer.android.com
      BluetoothGatt connectGatt (Context context, 
                      boolean autoConnect, 
                      BluetoothGattCallback callback)
      
      Connect to GATT Server hosted by this device. Caller acts as GATT client. 
      The callback is used to deliver results to Caller, such as connection status
      as well as any further GATT client operations. The method returns a
      BluetoothGatt instance. You can use BluetoothGatt to conduct GATT client
      operations.
                        :
      callback 	BluetoothGattCallback: GATT callback handler that will
      receive asynchronous callbacks.
                        :
      
    • BluetoothGattCallback - developer.android.com
      •  onConnectionStateChange - developer.android.com
        void onConnectionStateChange (BluetoothGatt gatt, 
                        int status, 
                        int newState)
        
        Callback indicating when GATT client has connected/disconnected to/from
        a remote GATT server.
                          :
        newState 	int:¡¡Returns the new connection state. Can be one of
        STATE_DISCONNECTED or STATE_CONNECTED
                          :
        
    private BluetoothGattCallback mGattCallback = new bleGattCallback();
                     :
    
    mBtGatt = mBtDevice.connectGatt(mCtx, false, mGattCallback);
                     :
    
    private class bleGattCallback extends BluetoothGattCallback {
      @Override
      public void onConnectionStateChange(BluetoothGatt gatt, int status,
                                          int newState) {
        super.onConnectionStateChange(gatt, status, newState);
        if (newState == BluetoothProfile.STATE_CONNECTED) {
          // Àܳ³ÎΩ - ¥Ç¥Ð¥¤¥¹¤Î GATT ¥µ¡¼¥Ó¥¹°ìÍ÷¤Î¼èÆÀ¤Ø
        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
          // ÀÚÃÇ´°Î»¤Î½èÍý
        }
      }
                     :
    
    

    4. GATT ¥µ¡¼¥Ó¥¹ - ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ - ¥Ç¥¹¥¯¥ê¥×¥¿¤òõº÷ ¡Á ɬÍפʥª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ

    • BluetoothGatt - discoverServices - developer.android.com
      boolean discoverServices ()
      
      Discovers services offered by a remote device as well as their
      characteristics and descriptors.
      
      This is an asynchronous operation. Once service discovery is completed, 
      the onServicesDiscovered(BluetoothGatt, int) callback is triggered. 
      If the discovery was successful, the remote services can be retrieved
      using the getServices() function. 
                        :
      
    • BluetoothGattCallback - onServicesDiscovered - developer.android.com
      void onServicesDiscovered (BluetoothGatt gatt, 
                      int status)
      
      Callback invoked when the list of remote services, characteristics
      and descriptors for the remote device have been updated, ie new services
      have been discovered.
                        :
      
    • BluetoothGatt - getService - developer.android.com
      getService
      
      BluetoothGattService getService (UUID uuid)
      
      Returns a BluetoothGattService, if the requested UUID is supported by
      the remote device.
      
      This function requires that service discovery has been completed for
      the given device.
      
      If multiple instances of the same service (as identified by UUID) exist,
      the first instance of the service is returned.
      
      Requires BLUETOOTH permission.
      
      Parameters
      uuid 	UUID: UUID of the requested service
      Returns
      BluetoothGattService 	BluetoothGattService if supported, or null if the
                              requested service is not offered by the remote device. 
      
      • BluetoothGattService - getCharacteristic - developer.android.com
        getCharacteristic
        
        BluetoothGattCharacteristic getCharacteristic (UUID uuid)
        
        Returns a characteristic with a given UUID out of the list of
        characteristics offered by this service.
        
        This is a convenience function to allow access to a given characteristic
        without enumerating over the list returned by getCharacteristics()
        manually.
        
        If a remote service offers multiple characteristics with the same UUID,
        the first instance of a characteristic with the given UUID is returned.
        
        Parameters
        uuid 	UUID
        Returns
        BluetoothGattCharacteristic  GATT characteristic object or null if no
                                     characteristic with the given UUID was found. 
        
        
        • BluetoothGattCharacteristic - getDescriptor - developer.android.com
          getDescriptor
          
          BluetoothGattDescriptor getDescriptor (UUID uuid)
          
          Returns a descriptor with a given UUID out of the list of descriptors
          for this characteristic.
          
          Parameters
          uuid  UUID
          Returns
          BluetoothGattDescriptor  GATT descriptor object or null if no
                                   descriptor with the given UUID was found. 
          
    private BluetoothGattCharacteristic mChAlertLevel = null;
    private BluetoothGattCharacteristic mChUser1 = null;
    private BluetoothGattDescriptor mDescUser1 = null;
    
    // ¥Ç¥Ð¥¤¥¹ A ¤ÎÄ󶡤¹¤ë¥µ¡¼¥Ó¥¹¡¦¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯·²¤Î UUID ¤è¤ê
    private UUID mUuidSvcImAlert   = UUID.fromString("00001802-0000-1000-8000-00805f9b34fb");
    private UUID mUuidChAlertLevel = UUID.fromString("00002a06-0000-1000-8000-00805f9b34fb");
    private UUID mUuidSvcUser1     = UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb");
    private UUID mUuidChUser1      = UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb");
    // UUID for Client Characteristic Configuration Descriptor
    // - BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Part G] page 537
    private UUID mUuidCCCD         = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
                     :
    
    private BluetoothGattCallback mGattCallback = new bleGattCallback();
                     :
    
    mBtGatt.discoverServices();(mCtx, false, mGattCallback);
                     :
    
    private class bleGattCallback extends BluetoothGattCallback {
      @Override
      // GATT ¥µ¡¼¥Ó¥¹°ìÍ÷¼èÆÀ´°Î»
      public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        super.onServicesDiscovered(gatt, status);
    
        // ¥Ç¥Ð¥¤¥¹ A ¤Î Immediate Alert ¥µ¡¼¥Ó¥¹¤Î
        // Alert Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ
        BluetoothGattService svc = gatt.getService(mUuidSvcImAlert);
        mChAlertLevel = svc.getCharacteristic(mUuidChAlertLevel);
    
        // ¥Ç¥Ð¥¤¥¹ A ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1 ¤Î ¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î
        // Client ​Characteristic Configulation Descriptor ¤ò¼èÆÀ
        svc = gatt.getService(mUuidSvcUser1);
        mChUser1 = svc.getCharacteristic(mUuidChUser1);
        mDescUser1 = mChUser1.getDescriptor(mUuidCCCD);
                     :
      }
    

    5. ½êÄê¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤«¤é¤ÎÄÌÃΤòÍ­¸ú¤Ë

    // ¥Ç¥Ð¥¤¥¹ A ¤Ø¤Î Alert »Ø¼¨ÍÑ
    private byte[] mCmdAlertOff = new byte[] {(byte)0x00}; // OFF (No Alert)
    private byte[] mCmdAlertOn  = new byte[] {(byte)0x02}; // ON (High Alert)
                     :
    
      // ¥Ç¥Ð¥¤¥¹ A ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1 ¤Î ¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î
      // Client ​Characteristic Configulation Descriptor ¤ò¼èÆÀ
      svc = gatt.getService(mUuidSvcUser1);
      mChUser1 = svc.getCharacteristic(mUuidChUser1);
      mDescUser1 = mChUser1.getDescriptor(mUuidCCCD);
    
      // Ʊ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ÎÃÍÊѹ¹»þ¤ÎÄÌÃΤòÍ­¸ù¤Ë¤·¤Æ
      // Ʊ CCCD ¤Ø ENABLE_NOTIFICATION_VALUE ¤ò½ñ¤­¹þ¤ó¤ÇÄÌÃΤØÂÔµ¡
      mBtGatt.setCharacteristicNotification(mChUser1, true);
      byte[] val = new byte[] {(byte)0x01, (byte)0x00};
      mDescUser1.setValue(val);
      mBtGatt.writeDescriptor(mDescUser1);
                     :
    
    private class bleGattCallback extends BluetoothGattCallback {
      @Override
      public void onCharacteristicChanged (BluetoothGatt gatt,
                                           BluetoothGattCharacteristic ch) {
        Log.d(TAG, "onCharacteristicChanged");
        // ¥Ç¥Ð¥¤¥¹ A ¤Î¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ 1 ¤«¤é¤ÎÄÌÃΤò¼õ¿®
        if (ch == mChUser1) {
            Toast.makeText(mCtx, "* P U S H E D *", Toast.LENGTH_SHORT).show();
        }
      }
      @Override
      public void onDescriptorWrite (BluetoothGatt gatt,
                                    BluetoothGattDescriptor desc,
                                    int status) { // writeDescriptor() ·ë²Ì
        super.onDescriptorWrite(gatt, desc, status);
        Log.d(TAG, "onDescriptorWrite: sts=" + status);
        if (desc == mDescUser1) {
          // ¥Ç¥Ð¥¤¥¹ A ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1 ¤Î ¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î
          // Client ​Characteristic Configulation Descriptor ¤Ø¤Î½ñ¤­¹þ¤ß¤¬´°Î»
        }
      }
                     :
    

    6. ½êÄê¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ø¤Î½ñ¤­¹þ¤ß

    // ¥Ç¥Ð¥¤¥¹ A ¤Ø¤Î Alert »Ø¼¨ÍÑ
    private byte[] mCmdAlertOff = new byte[] {(byte)0x00}; // OFF (No Alert)
    private byte[] mCmdAlertOn  = new byte[] {(byte)0x02}; // ON (High Alert)
                     :
    
      mChAlertLevel.setValue(mCmdAlertOn);
      mBtGatt.writeCharacteristic(mChAlertLevel);
                     :
    
    private class bleGattCallback extends BluetoothGattCallback {
      @Override
      public void onCharacteristicWrite(BluetoothGatt gatt,
                                        BluetoothGattCharacteristic ch,
                                        int status) { // writeCharacteristic ·ë²Ì
        super.onCharacteristicWrite(gatt, ch, status);
        if (ch == mChAlertLevel) { 
          Log.d(TAG, "mChAlertLevel: onCharacteristicWrite: sts=" + status);
        }
      }
                     :
    

    (tanabe)
    klab_gijutsu2 at 14:28¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
    2016ǯ08·î24Æü

    BLE ¥Ç¥Ð¥¤¥¹´Ö¤ÎÄÌ¿®ÆâÍƤò¥Ñ¥±¥Ã¥È¥ì¥Ù¥ë¤ÇÆɤ߲ò¤¤¤Æ¤ß¤ë

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    Á°²ó¤Îµ­»ö¡§
    ¥Ñ¥±¥Ã¥È¥¹¥Ë¥Õ¥¡¤ò»È¤Ã¤Æ¼ÂºÝ¤Ë BLE µ¡´ï´Ö¤Î±þ½·¤òÄɤäƤߤޤ·¤¿¡£È÷˺¤ò¤«¤Í¤Æ°Ê²¼¤Ë¾ðÊó¤ò¹µ¤¨¤Þ¤¹¡£Âêºà¤Ë¤ÏÄã²Á³Ê¤Ç½Ð²ó¤Ã¤Æ¤¤¤ë¤¢¤ê¤Õ¤ì¤¿ Anti-Lost ·Ï BLE ¥Ç¥Ð¥¤¥¹ A ¤òÁª¤Ó¤Þ¤·¤¿¡£¤³¤Î¾®¤µ¤Ê¥Ç¥Ð¥¤¥¹¤Ë¤Ï LED¡¦¥Ö¥¶¡¼¤È²¡¤·¥Ü¥¿¥ó¥¹¥¤¥Ã¥Á¤¬¼ÂÁõ¤µ¤ì¤Æ¤ª¤ê¡¢Âиþ¥¹¥Þ¥Û¥¢¥×¥ê¤È¤Î´Ö¤ÇÁÐÊý¸þ¤Î¤ä¤ê¤È¤ê¤¬²Äǽ¤Ê¤Ä¤¯¤ê¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£


    ¥Ç¥Ð¥¤¥¹ A ¤Î UI

    ÁàºîÆâÍÆ

    ¥Ç¥Ð¥¤¥¹ A ¤È Android üËö¤ò»È¤Ã¤Æ°Ê²¼¤ÎÁàºî¤ò¹Ô¤¤¥¹¥Ë¥Õ¥¡¤Ç BLE ¥Ñ¥±¥Ã¥È¤Î¥í¥°¤òºÎ¼è¤·¤Þ¤·¤¿¡£

    1. ¥Ç¥Ð¥¤¥¹ A ¤ÎÅŸ»¤òÆþ¤ì¤ë
    2. Android üËö¾å¤ÎÂиþ¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹¤òõº÷¤·¥Ç¥Ð¥¤¥¹ A ¤È¤ÎÀܳ¤ò³ÎΩ
    3. ¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹ A ¤Î LED¡Ü¥Ö¥¶¡¼¤ò ON ¤Ë¤¹¤ë
    4. ¥Ç¥Ð¥¤¥¹ A ¤Î¥Ü¥¿¥ó¤ò²¡¤·¥¢¥×¥ê¤ØÄÌÃΤòÁ÷¤ë
    5. ¥¢¥×¥ê¾å¤Ç¥Ç¥Ð¥¤¥¹ A ¤È¤ÎÀܳ¤òÀÚÃÇ

    ±þ½·¤ÎÁ´ÂÎÁü

    ¥¹¥Ë¥Õ¥¡¤Î Wireshark ¥í¥°¤è¤ê

    ¾å¤ÎÁàºî»þ¤Ë¼ý½¸¤·¤¿¥Ñ¥±¥Ã¥È¥í¥°¤ÎÁ´ÂοޤǤ¹¡£   ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

        

    Í×Ìó

    ¥Ñ¥±¥Ã¥È¥í¥°¤ÎÆâÍƤÎÍ×Ìó¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£   ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

    1. ¥Ç¥Ð¥¤¥¹ A ¤ÎÅŸ»¤òÆþ¤ì¤ë
      • ¥Ç¥Ð¥¤¥¹ A ¤¬¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¤ò³«»Ï (ADV_IND)
    2. ¥¹¥Þ¥Û¾å¤ÎÂиþ¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹¤òõº÷¤·¥Ç¥Ð¥¤¥¹ A ¤È¤ÎÀܳ¤ò³ÎΩ
      • ¥Ç¥Ð¥¤¥¹¤Î¥¹¥­¥ã¥ó (SCAN_REQ / SCAN_RSP) ¤ò·Ð¤ÆÀܳÍ×µá (CONNECT_REQ) ¡ÁÀܳ¤¬³ÎΩ¤¹¤ë¤È¥Ç¥Ð¥¤¥¹ A ¤Ï¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¤òÄä»ß
      • µ¡Ç½¾ðÊó¤ò¸ò´¹ (LL_FEATURE_REQ / LL_FEATURE_RSP)
      • ¥Ç¥Ð¥¤¥¹ A ¤ÎÄ󶡤¹¤ë GATT ¥×¥é¥¤¥Þ¥ê¥µ¡¼¥Ó¥¹°ìÍ÷¤ò¼èÆÀ
      • ³Æ¥µ¡¼¥Ó¥¹ÇÛ²¼¤Î¥¨¥ó¥È¥ê¡ÊIncluded Service, ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡Ë°ìÍ÷¤ò¼èÆÀ
      • ³Æ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ÇÛ²¼¤Î¥Ç¥¹¥¯¥ê¥×¥¿¤ò¼èÆÀ
      • ¥Ç¥Ð¥¤¥¹ A ¤Î¥Ü¥¿¥ó¤¬²¡¤µ¤ì¤¿»þ¤ËÄÌÃΤµ¤ì¤ë¤è¤¦½êÄê¤Î Client Characteristic Configuration descriptor ¤Ø¥¢¥×¥ê¤«¤é Notification Bit 0x0001 ¤ò½ñ¤­¹þ¤à
    3. ¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹ A ¤Î LED¡Ü¥Ö¥¶¡¼¤ò ON ¤Ë¤¹¤ë
      • ¥¢¥×¥ê¾å¤Î½êÄê¤Î¥Ü¥¿¥ó¤¬²¡¤µ¤ì¤¿¥¿¥¤¥ß¥ó¥°¤Ç¥¢¥×¥ê¤Ï¥Ç¥Ð¥¤¥¹ A ¤Î Immediate Alert ¥µ¡¼¥Ó¥¹ÇÛ²¼¤Î Alert Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ØÃÍ 2 (High Alert)¤ò½ñ¤­¹þ¤à¡£¤³¤ì¤Ë¤è¤ê°ìÄê»þ´Ö A ¤Î LED ¤È¥Ö¥¶¡¼¤¬ ON ¤Ë¤Ê¤ë
    4. ¥Ç¥Ð¥¤¥¹ A ¤Î¥Ü¥¿¥ó¤ò²¡¤·¥¢¥×¥ê¤ØÄÌÃΤòÁ÷¤ë
      • ¥Ç¥Ð¥¤¥¹ A ¤Î¥Ü¥¿¥ó¤¬²¡¤µ¤ì¤¿¥¿¥¤¥ß¥ó¥°¤Ç¥Ç¥Ð¥¤¥¹ A ¤Ï¼«µ¡¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1 (UUID=0xFFE0) ÇÛ²¼¤Î¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ (UUID=0xFFE1) ¤ØÃÍ 1 ¤ò½ñ¤­¹þ¤à¡£Åö³º¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ÇÛ²¼¤Î Client Characteristic Configuration descriptor ¤Ë¤Ï¥¢¥×¥ê¦¤«¤éͽ¤á Notification Bit ¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤ë¤¿¤á¥¢¥×¥ê¤ØÄÌÃΤµ¤ì¤ë
    5. ¥¢¥×¥ê¾å¤Ç¥Ç¥Ð¥¤¥¹ A ¤È¤ÎÀܳ¤òÀÚÃÇ
      • ¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹ A ¤Ø LL_TERMINATE_IND ¤òÁ÷¤ë

    ±þ½·¤Î¾ÜºÙ

    Á´ÂΤÎή¤ì¤ò¸«ÅϤ·¤¿¤È¤³¤í¤Ç¼¡¤Ë¸Ä¡¹¤Î¥Ñ¥±¥Ã¥È¥Ç¡¼¥¿¤òÆɤ߿ʤá¤Æ¤¤¤­¤Þ¤¹¡£

    • °Ê²¼¤Îµ­»ö¤Ë¤Ï Wireshark ¤Î¥¹¥¯¥ê¡¼¥ó¥·¥ç¥Ã¥È¤ò¥í¥°¤È¤·¤Æź¤¨¤Æ¤¤¤Þ¤¹  ¡Ê¤½¤ì¤¾¤ì¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë
    • ¥í¥°¤Ë¤Ï BLE ¥Ñ¥±¥Ã¥È¥Ç¡¼¥¿ËÜÂΤ˲ä¨ nRF Sniffer ¤¬²òÀϤÎÊص¹¤Î¤¿¤á¤Ë¥í¥°¤Ø½ÐÎϤ¹¤ë¡ÖNordic BLE sniffer meta¡×¥Ø¥Ã¥À¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹
      • nRF Sniffer User Guide v1.1 (PDF) - www.nordicsemi.com Page 8 ¤è¤ê
        4   Using Wireshark
        
        All BLE packets detected by the Sniffer are passed to Wireshark and are
        wrapped in a header which contains useful meta-information not present
        in the BLE packet itself. Wireshark dissects the packets and separates
        the actual packet from the meta-information.
                     :
        
    • µ­»ö¤Ë¤Ï²¼µ­»ñÎÁ¤«¤é¤ÎÈ´¿è¤Ø¤Î¥ê¥ó¥¯¤ò»²¾ÈÍѤËŬµ¹ÁÞÆþ¤·¤Æ¤¤¤Þ¤¹
    • ¿ï½ê¤Ë¡Öhttps://developer.bluetooth.org/gatt/¡×²¼¤Î¥µ¡¼¥Ó¥¹¡¦¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Îµ­»ö¤Ø¤Î¥ê¥ó¥¯¤òÄ¥¤Ã¤Æ¤¤¤Þ¤¹¤¬¡¢2016ǯ7·îº¢¤Þ¤Ç¤Ï»²¾È²Äǽ¤À¤Ã¤¿³Æµ­»ö¤¬¸½ºß¤Ï¥ê¥ó¥¯ÀÚ¤ì¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡ÊºÆ¹½À®Ãæ¡©¡Ë¡¢¤µ¤é¤Ë¸½»þÅÀ¤Ç¤ÏÂåÂØ¥Ú¡¼¥¸¤¬¸«Åö¤¿¤é¤Ê¤¤¤¿¤á¥ê¥ó¥¯Àè¤Ï¤ä¤à¤Ê¤¯ http://web.archive.org/ ¾å¤Î¥­¥ã¥Ã¥·¥å¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤À¤· web.archive.org ¾å¤Ë¤âÊݸÍúÎò¤Î¤Ê¤¤µ­»ö¤Ë¤Ä¤¤¤Æ¤Ï°ì³¬Áؾå¤Î¥Ú¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤òÄ¥¤Ã¤Æ¤¤¤Þ¤¹
      Î㡧¡ÖLink Loss¡×¥µ¡¼¥Ó¥¹¤ÎñÆÈ¥Ú¡¼¥¸¤Î¥­¥ã¥Ã¥·¥å¤Ï web.archive.org ¤Ë¤â¸«Åö¤¿¤é¤Ê¤¤¤¿¤á¡¢¾å°Ì¤Î¥µ¡¼¥Ó¥¹°ìÍ÷¥Ú¡¼¥¸¤Î¥­¥ã¥Ã¥·¥å¤ò¥¿¡¼¥²¥Ã¥È¤Ë

    ¶ÉÌÌ

    Scene 1: ¥Ç¥Ð¥¤¥¹ A ¤Î¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¤È SCAN_REQ / SCAN_RSP

    Frame 124 - 126 ¤Ï¥Ç¥Ð¥¤¥¹ A ȯ¤Î¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¥Ñ¥±¥Ã¥È

    • Á´ 40 ¥Á¥ã¥Í¥ë¤Î¤¦¤Á¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¥Ñ¥±¥Ã¥ÈÍѤΠ37, 38, 39 ¤Î 3 ¥Á¥ã¥Í¥ë¤¬½ç¼¡»ÈÍѤµ¤ì¤Æ¤¤¤ë¤³¤È¤¬¸«¤Æ¤È¤ì¤ë
    • ¡Ö0x8e89bed6¡×¤Î Access Address ¤Ï¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¥Á¥ã¥Í¥ë¥Ñ¥±¥Ã¥È¤Ç»ÈÍѤµ¤ì¤ë¸ÇÄêÃÍ
    • ¥Ç¥Ð¥¤¥¹ A ¤Î¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°¤Î¥¿¥¤¥×¤Ï Connectable Undirected¡Ê¾ÜºÙ¡§ 1, 2, 3, 4¡Ë ¤Ç¤¢¤ë¤³¤È¤ò¼¨¤¹°ìÈÌŪ¤Ê¡ÖADV_IND¡×¤Ç¤¢¤ë
    • ¡ÖAdvertising Data: 020106020a000702031802180418¡×¤Ë´Þ¤Þ¤ì¤ëÉÔ´°Á´ 16¥Ó¥Ã¥È¥µ¡¼¥Ó¥¹¥¯¥é¥¹ UUID ¤Ï¼¡¤ÎÆâÍÆ
      • 16 bit uuid: 0x1803 --> ´ûÄê¤Î¡ÖLink Loss¡×¥µ¡¼¥Ó¥¹
      • 16 bit uuid: 0x1802 --> ´ûÄê¤Î¡ÖImmediate Alert¡×¥µ¡¼¥Ó¥¹
      • 16 bit uuid: 0x1804 --> ´ûÄê¤Î¡ÖTx Power¡×¥µ¡¼¥Ó¥¹
    Frame 124

        

    Frame 125

        

    Frame 126

        

    Frame 127

    Àܳ¤ËºÝ¤·Âиþ¥¢¥×¥ê¤¬¥Ç¥Ð¥¤¥¹ A ¤ËÂФ·¤Æ SCAN_REQ ¤òȯ¹Ô

        

    Frame 128

    ¥Ç¥Ð¥¤¥¹ A ¤¬Âиþ¥¢¥×¥ê¤«¤é¤Î SCAN_REQ ¤ËÂФ· SCAN_RSP ¤òÊÖ¿®¡£¤³¤³¤Ç¤Ï ScanRspData ¤È¤·¤Æ¥Ç¥Ð¥¤¥¹¤Î¥í¡¼¥«¥ë¥Í¡¼¥à¤¬ÅϤµ¤ì¤Æ¤¤¤ë

        

    Scene 2: Àܳ¤Î³ÎΩ¤È¾ðÊó¸ò´¹

    Frame 217

    Âиþ¥¢¥×¥ê¤¬¥Ç¥Ð¥¤¥¹ A ¤ËÂФ·¤Æ CONNECT_REQ¡Ê¾ÜºÙ¡§1a, 2a, 1b, 2b¡Ë¤òȯ¹Ô¤·¤ÆÀܳ¤ò»î¤ß¤ë

    • ¡ÖConnection Request¡×Ãæ¤Î¡ÖConnection Access Address¡×¤Ë¤Ï¡¢Àܳ³ÎΩ¸å¤Î¥Ç¡¼¥¿ÄÌ¿®¤Ë¤ª¤¤¤Æ Access Address ¤È¤·¤ÆÁÐÊý¤¬°ì°Õ¤Ë»ÈÍѤ¹¤ëǤ°Õ¤Î¥¢¥É¥ì¥¹¤¬´Þ¤Þ¤ì¤ë¡£¤³¤³¤Ç¤Ï¡Ö0xa6a188c8¡×
    • ¡ÖConnection Request¡×Ãæ¤Î¡ÖChannel map¡×¤Ë¤ÏÀܳ³ÎΩ¸å¤Î¥Ç¡¼¥¿ÄÌ¿®¤Ç»ÈÍѤ¹¤ë¥Á¥ã¥Í¥ëÈÖ¹æ¤Î¥ê¥¹¥È¤¬Ä󼨤µ¤ì¤ë¡£¤³¤³¤Ç¤Ï 0 - 36 ¤ÎÁ´¥Ç¡¼¥¿¥Á¥ã¥Í¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë
    • ¤½¤Î¾¤Î¥Ñ¥é¥á¡¼¥¿¤Ë¤Ä¤¤¤Æ¤Ï¾å¤Î¥ê¥ó¥¯¤Î»ñÎÁ¤ò»²¾È¤Î¤³¤È
    • CONNECT_REQ ¤ËÂФ¹¤ëľÀܤΥ쥹¥Ý¥ó¥¹¤ÏȯÀ¸¤·¤Ê¤¤¡£Àܳ¤¬³ÎΩ¤¹¤ë¤È¥Ç¡¼¥¿ÄÌ¿®¥¢¥¤¥É¥ë»þ¤Ë¥¹¥ì¡¼¥Ö - ¥Þ¥¹¥¿´Ö¤Ç¶õ¥Ñ¥±¥Ã¥È¡ÊEmpty PDU¡Ë¤Î±þ½·¤¬»Ï¤Þ¤ë¤¿¤á¤³¤ì¤¬ÀܳÀ®ÈݤÎȽÄê¤ËÍѤ¤¤é¤ì¤ë

        

    Frame 218, 224 ¤ÏÀܳ³ÎΩ¸å¤ÎºÇ½é¤Î±þ½·¡£Àܳ¤¬³ÎΩ¤¹¤ë¤ÈÂиþ¥¢¥×¥ê¤Ï¥Þ¥¹¥¿¡¢¥Ç¥Ð¥¤¥¹ A ¤Ï¥¹¥ì¡¼¥Ö¤Î°ÌÃ֤Ť±¤È¤Ê¤ë¡£¤³¤³¤Ç¤Ï ¥ê¥ó¥¯ÁØÀ©¸æ PDU ¤Î LL_FEATURE_REQ ¤ª¤è¤Ó LL_FEATURE_RSP ¤Ë¤è¤ê¥Þ¥¹¥¿ - ¥¹¥ì¡¼¥Ö´Ö¤Ç Feature Exchange ¤ò¹Ô¤Ã¤Æ¤¤¤ë¡£¤³¤³¤Ç¤ÏÁÐÊý¤È¤â¡ÖSupported feature: LE Encryption (0)¡×¤Î¤ß¤òÄ󼨡ʤ¿¤À¤·¤³¤³¤Ç¤Ï°Ê¹ß¤ÎÄÌ¿®¤Ë¤ª¤¤¤Æ°Å¹æ²½¤Ï¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¡Ë
    Frame 218

        

    Frame 224

        

    Frame 222 ¤Ç¤Ï¥¢¥×¥ê¦¤¬¡ÖDevice Name¡×¤òÍ׵ᤷ Frame 226 ¤Ç¥Ç¥Ð¥¤¥¹ A ¦¤¬¤½¤ì¤Ë±þ¤¨¤Æ¤¤¤ë¡£
    ¡ÖDevice Name¡×¤Ï¡¢´ûÄê¤Î Generic Access¡ÊGAP¡Ë¥µ¡¼¥Ó¥¹ÇÛ²¼¤Î´ûÄê¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0x2A00¡Ë¤Ç¤¢¤ê¡¢GATT ¥µ¡¼¥Ð¤Ïɬ¤º GAP ¥µ¡¼¥Ó¥¹¤ò´Þ¤ó¤Ç¤¤¤ë¡Ê¾ÜºÙ¡§1, 2¡Ë
    Frame 222

      Opcode: Read By Type Request (0x08)
      Starting Handle: 0x0001
      Ending Handle: 0xffff
      UUID: Device Name (0x2a00)

        

    Frame 226

      Opcode: Read By Type Response (0x09)
      Length: 6
      Attribute Data, Handle: 0x0003
          Handle: 0x0003
          Value: ********

        

    ¡ÊGAP ¥µ¡¼¥Ó¥¹¤ª¤è¤Ó Device Name ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ï¸å³¤Î Frame 231, Frame 266 ¤Ç¤¢¤é¤¿¤á¤Æɽ¤Ë¸½¤ì¤ë¡Ë

    Scene 3: ¥Ç¥Ð¥¤¥¹ A ¤Î GATT ¥µ¡¼¥Ó¥¹·²¤Î¼èÆÀ

    ¡ÊScene 3, Scene 4 ¶¦Ä̤δðÁÃÃμ±¡Ë
    BLUETOOTH SPECIFICATION Version 4.2(PDF) [Vol 3, Part G] ¤è¤ê
        2.6 GATT PROFILE HIERARCHY
           2.6.1 Overview, 2.6.2 Service, 2.6.3 Included Services, 2.6.4 Characteristic
      3 SERVICE INTEROPERABILITY REQUIREMENTS
         3.1 SERVICE DEFINITION, 3.2 INCLUDE DEFINITION, 3.3 CHARACTERISTIC DEFINITION
           3.3.1 Characteristic Declaration
             3.3.1.1 Characteristic Properties, 3.3.1.2 Characteristic Value Attribute Handle, 3.3.1.3 Characteristic UUID
           3.3.2 Characteristic Value Declaration

    ½é´ü½èÍý¤È¤·¤Æ¡¢¥Þ¥¹¥¿¤Ï¥¹¥ì¡¼¥Ö¤ÎÄ󶡤¹¤ë¥µ¡¼¥Ó¥¹°ìÍ÷¤ò¼èÆÀ¤¹¤ë¡¡¡Ê¾ÜºÙ¡§1, 2, 3¡Ë

    • ¥¢¥×¥ê¦¤¬¡¢¥Ç¥Ð¥¤¥¹ A ¤Î GATT ¥µ¡¼¥Ð¤ÎÄ󶡤¹¤ë¸ø³«¥µ¡¼¥Ó¥¹¡Ê¥×¥é¥¤¥Þ¥ê¥µ¡¼¥Ó¥¹¡Ë¤ÎÌä¹ç¤»¤ò³«»Ï¡£ °Ê¹ß¡¢GATT ¥µ¡¼¥Ð¾å¤Î½êÄê¤Î¥µ¡¼¥Ó¥¹¤Ø¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤Î¥Ï¥ó¥É¥ë¤Î¥¢¥É¥ì¥¹¤ÈÅö³º¥µ¡¼¥Ó¥¹¤Î¼ïÎà¤ò¼±Ê̤¹¤ë UUID ¤ò½ç¼¡¼èÆÀ¤¹¤ë
    • ¥Ï¥ó¥É¥ë¤Î¥¢¥É¥ì¥¹¶õ´Ö¤Ï 0x0000 - 0xFFFF ¤Ç¤¢¤ê GATT ¥µ¡¼¥Ð¦¤Î±þÅú¤Ë±þ¤¸¤Æ¾È²ñÈϰϤò¹Ê¤Ã¤Æ¤¤¤¯


        ¡Ê¿Þ¤Ï ¡ÖBLUETOOTH SPECIFICATION Version 4.2¡× ¤è¤ê°úÍÑ¡Ë

    Frame 229

    ¤Þ¤º¥Ï¥ó¥É¥ë 0x0001 - 0xffff Á´ÈϰϤˤĤ¤¤Æ¥×¥é¥¤¥Þ¥ê¥µ¡¼¥Ó¥¹¤ò¾È²ñ

        Opcode: Read By Group Type Request (0x10)
        Starting Handle: 0x0001
        Ending Handle: 0xffff
        UUID: GATT Primary Service Declaration (0x2800)

        

    Frame 231

    °Ê²¼¤Î¤ß¤Ã¤Ä¤Î¥µ¡¼¥Ó¥¹¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0001 - 0x000b¡§´ûÄê¤Î¡ÖGeneric Access¡×¥µ¡¼¥Ó¥¹¡ÊUUID = 0x1800¡Ë¤¬»ÈÍÑ
    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x000c - 0x000f¡§´ûÄê¤Î¡ÖGeneric Attribute¡×¥µ¡¼¥Ó¥¹¡ÊUUID = 0x1801¡Ë¤¬»ÈÍÑ
    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0010 - 0x0022¡§´ûÄê¤Î¡ÖDevice Information¡×¥µ¡¼¥Ó¥¹¡ÊUUID = 0x180A¡Ë¤¬»ÈÍÑ

        Opcode: Read By Group Type Response (0x11)
        Length: 6
        Attribute Data, Handle: 0x0001, Group End Handle: 0x000b
            Handle: 0x0001
            Group End Handle: 0x000b
            Value: 0018
        Attribute Data, Handle: 0x000c, Group End Handle: 0x000f
            Handle: 0x000c
            Group End Handle: 0x000f
            Value: 0118
        Attribute Data, Handle: 0x0010, Group End Handle: 0x0022
            Handle: 0x0010
            Group End Handle: 0x0022
            Value: 0a18

        

    Frame 235

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x0023 - 0xffff ÈϰϤΥץ饤¥Þ¥ê¥µ¡¼¥Ó¥¹¤ò¾È²ñ

        

    Frame 238

    °Ê²¼¤Î¤ß¤Ã¤Ä¤Î¥µ¡¼¥Ó¥¹¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0023 - 0x0025¡§´ûÄê¤Î¡ÖImmediate Alert¡×¥µ¡¼¥Ó¥¹¡ÊUUID = 0x1802¡Ë¤¬»ÈÍÑ
    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0026 - 0x002a¡§´ûÄê¤Î¡ÖTx Power¡×¥µ¡¼¥Ó¥¹¡ÊUUID = 0x1804¡Ë¤¬»ÈÍÑ
    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x002b - 0x002d¡§´ûÄê¤Î¡ÖLink Loss¡×¥µ¡¼¥Ó¥¹¡ÊUUID = 0x1803¡Ë¤¬»ÈÍÑ

        

    Frame 242

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x002e - 0xffff ÈϰϤΥץ饤¥Þ¥ê¥µ¡¼¥Ó¥¹¤ò¾È²ñ

        

    Frame 247

    °Ê²¼¤Î¤ß¤Ã¤Ä¤Î¥µ¡¼¥Ó¥¹¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x002e - 0x0032¡§´ûÄê¤Î¡ÖBattery Service¡×¥µ¡¼¥Ó¥¹¡ÊUUID = 0x180F¡Ë¤¬»ÈÍÑ
    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0033 - 0x0037¡§¥æ¡¼¥¶ÄêµÁ¤Î¥µ¡¼¥Ó¥¹ 1¡ÊUUID = 0xFFE0¡Ë¤¬»ÈÍÑ
    • ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0038 - 0x003a¡§¥æ¡¼¥¶ÄêµÁ¤Î¥µ¡¼¥Ó¥¹ 2¡ÊUUID = 0xFFF0¡Ë¤¬»ÈÍÑ

        

    Frame 250

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x003b - 0xffff ÈϰϤΥץ饤¥Þ¥ê¥µ¡¼¥Ó¥¹¤ò¾È²ñ

        

    Frame 253

    ¡ÖAttribute Not Found (0x0a)¡×¤Î¥¨¥é¡¼¤¬Ê֤롣¤³¤ì°Ê¾å¥×¥é¥¤¥Þ¥ê¥µ¡¼¥Ó¥¹¤¬Â¸ºß¤·¤Ê¤¤¤³¤È¤ò°ÕÌ£¤¹¤ë¡£¥µ¡¼¥Ó¥¹¤Î¾È²ñ¤Ï¤³¤³¤Þ¤Ç

        Opcode: Error Response (0x01)
        Request Opcode in Error: Read By Group Type Request (0x10)
        Handle in Error: 0x003b
        Error Code: Attribute Not Found (0x0a)

        

    Scene 4: ¥Ç¥Ð¥¤¥¹ A ³Æ¥µ¡¼¥Ó¥¹ÇÛ²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ - ¥Ç¥¹¥¯¥ê¥×¥¿¤Î¼èÆÀ

    ¡ÊScene 3, Scene 4 ¶¦Ä̤δðÁÃÃμ±¡Ë
    BLUETOOTH SPECIFICATION Version 4.2(PDF) [Vol 3, Part G] ¤è¤ê
        2.6 GATT PROFILE HIERARCHY
           2.6.1 Overview, 2.6.2 Service, 2.6.3 Included Services, 2.6.4 Characteristic
      3 SERVICE INTEROPERABILITY REQUIREMENTS
         3.1 SERVICE DEFINITION, 3.2 INCLUDE DEFINITION, 3.3 CHARACTERISTIC DEFINITION
           3.3.1 Characteristic Declaration
             3.3.1.1 Characteristic Properties, 3.3.1.2 Characteristic Value Attribute Handle, 3.3.1.3 Characteristic UUID
           3.3.2 Characteristic Value Declaration

    ¼¡¤Ë¡¢¼ý½¸¤º¤ß¤Î³Æ¥×¥é¥¤¥Þ¥ê¥µ¡¼¥Ó¥¹¤Î¥Ï¥ó¥É¥ë¥°¥ë¡¼¥×¤´¤È¤Ë°Ê²¼¤ò¹Ô¤¦¡¡¡Ê¾ÜºÙ¡§1, 2, 3, 4, 5, 6¡Ë

    • ½êÄê¤Î¥µ¡¼¥Ó¥¹¤Ë´Þ¤Þ¤ì¤ë Included Service ¤Î¾È²ñ


        ¡Ê¿Þ¤Ï ¡ÖBLUETOOTH SPECIFICATION Version 4.2¡× ¤è¤ê°úÍÑ¡Ë

    • ½êÄê¤Î¥µ¡¼¥Ó¥¹¤Ë´Þ¤Þ¤ì¤ë¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾È²ñ


        ¡Ê¿Þ¤Ï ¡ÖBLUETOOTH SPECIFICATION Version 4.2¡× ¤è¤ê°úÍÑ¡Ë

      • ½êÄê¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ë´Þ¤Þ¤ì¤ë¥Ç¥¹¥¯¥ê¥×¥¿¤Î¾È²ñ


          ¡Ê¿Þ¤Ï ¡ÖBLUETOOTH SPECIFICATION Version 4.2¡× ¤è¤ê°úÍÑ¡Ë

    Frame 255

    Á°·Ç¤Î Frame 231 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0001 - 0x000b ¤Î¡ÖGeneric Access¡×¥µ¡¼¥Ó¥¹Æâ¤Î Included Service ¤ò¾È²ñ

        Opcode: Read By Type Request (0x08)
        Starting Handle: 0x0001
        Ending Handle: 0x000b
        UUID: GATT Include Declaration (0x2802)

        

    Frame 259

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë Included Service ¤Ï¸ºß¤·¤Ê¤¤¡ÊÃí¡§¿Þ¤Î¥í¥°¤Ç¤Ï¥¹¥Ë¥Õ¥¡¤¬¥Ñ¥±¥Ã¥È¥Ç¡¼¥¿¤ò¼è¤ê¤³¤Ü¤·¤Æ¤¤¤ë¡Ë

        

    Frame 262

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0001 - 0x000b ¤Î¡ÖGeneric Access¡×¥µ¡¼¥Ó¥¹Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        Opcode: Read By Type Request (0x08)
        Starting Handle: 0x0001
        Ending Handle: 0x000b
        UUID: GATT Characteristic Declaration (0x2803)

        

    Frame 266

    °Ê²¼¤Î¤ß¤Ã¤Ä¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    ¡Ê¢¨¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯ ¤Î Value ¥Õ¥£¡¼¥ë¥É¤Î¹½À®¤ÏÁ°·Ç¤Î¡ÖBLUETOOTH SPECIFICATION Version 4.2] - [Vol 3, Part G] p.532 ¡Ö3.3.1 Characteristic Declaration¡× ¤Ë¡¢¥×¥í¥Ñ¥Æ¥£ÃͤΰÕÌ£¤ÏƱ¤¸¤¯ p.533 ¡Ö3.3.1.1 Characteristic Properties¡× ¤ËÀâÌÀ¤¢¤ê¡Ë

    • ¥Ï¥ó¥É¥ë¡§0x0002
      ¡Övalue: 080300002a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x08 (Write), Characteristic Value Handle = 0x0003
      UUID = 0x2A00 = ´ûÄê¤Î¡ÖDevice Name¡×
    • ¥Ï¥ó¥É¥ë¡§0x0004
      ¡Övalue: 020500012a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0005
      UUID = 0x2A01 = ´ûÄê¤Î¡ÖAppearance¡×
    • ¥Ï¥ó¥É¥ë¡§0x0006
      ¡Övalue: 020700042a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0007
      UUID = 0x2A04 = ´ûÄê¤Î¡ÖPeripheral Preferred Connection Parameters¡×

        Opcode: Read By Type Response (0x09)
        Length: 7
        Attribute Data, Handle: 0x0002
          Handle: 0x0002
          Value: 080300002a
        Attribute Data, Handle: 0x0004
          Handle: 0x0004
          Value: 020500012a
        Attribute Data, Handle: 0x0006
          Handle: 0x0006
          Value: 020700042a

        

    Frame 270

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x0007 - 0x000b ÈϰϤΥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 275

    °Ê²¼¤Î¤Õ¤¿¤Ä¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x0008
      ¡Övalue: 020900022a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0009
      UUID = 0x2A02 = ´ûÄê¤Î¡ÖPeripheral Privacy Flag¡×
    • ¥Ï¥ó¥É¥ë¡§0x000a
      ¡Övalue: 020b00032a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x000b
      UUID = 0x2A03 = ´ûÄê¤Î¡ÖReconnection Address¡×

        

    Frame 279

    Á°·Ç¤Î Frame 231 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x000c - 0x000f ¤Î¡ÖGeneric Attribute¡×¥µ¡¼¥Ó¥¹Æâ¤Î Included Service ¤ò¾È²ñ

        

    Frame 284

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë Included Service ¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 287

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x000c - 0x000f ¤Î¡ÖGeneric Attribute¡×¥µ¡¼¥Ó¥¹Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 289

    °Ê²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x000d
      ¡Övalue: 200e00052a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x20 (Indicate), Characteristic Value Handle = 0x000e
      UUID = 0x2A52 = ´ûÄê¤Î¡ÖService Changed¡×

        

    Frame 293

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x000e - 0x000f ÈϰϤΥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 298

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë¤Ï¤³¤ì°Ê¾å¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 302

    Frame 289 ¤Î¼¨¤¹Ä̤ê 0x0000e ¤Ï Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î Value Handle ¤Ç¤¢¤ê¡¢»Ä¤ë0x000f ¤Ë´Ø¤¹¤ë¾ðÊó¤ò GATT ¤ËÌ䤤¹ç¤ï¤»¤Æ¤ß¤ë ¡Ê¾ÜºÙ¡§1, 2¡Ë

        Opcode: Find Information Request (0x04)
        Starting Handle: 0x000f
        Ending Handle: 0x000f

        

    Frame 305

    0x000f ¤Ï Service Changed ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î Client Characteristic Configuration Descriptor (UUID = 0x2902¡Ë ¡Ê¾ÜºÙ¡§1, 2¡Ë ¤Ç¤¢¤ë»Ý¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

        Opcode: Find Information Response (0x05)
        UUID Format: 16-bit UUIDs (0x01)
        Handle: 0x000f
        UUID: Client Characteristic Configuration (0x2902)

        

    Frame 308

    Á°·Ç¤Î Frame 231 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0010 - 0x0022 ¤Î¡ÖDevice Information¡×¥µ¡¼¥Ó¥¹Æâ¤Î Included Service ¤ò¾È²ñ

        

    Frame 312

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë Included Service ¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 315

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0010 - 0x0022 ¤Î¡ÖDevice Information¡×¥µ¡¼¥Ó¥¹Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 319

    °Ê²¼¤Î¤ß¤Ã¤Ä¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x00011
      ¡Övalue: 021200292a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0012
      UUID = 0x2A29 = ´ûÄê¤Î¡ÖManufacturer Name String¡×
    • ¥Ï¥ó¥É¥ë¡§0x00013
      ¡Övalue: 021400242a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0014
      UUID = 0x2A24 = ´ûÄê¤Î¡ÖModel Number String¡×
    • ¥Ï¥ó¥É¥ë¡§0x00015
      ¡Övalue: 021600252a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0014
      UUID = 0x2A25 = ´ûÄê¤Î¡ÖSerial Number String¡×

        

    Frame 323

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x0016 - 0x0022 ÈϰϤΥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 326

    °Ê²¼¤Î¤ß¤Ã¤Ä¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x00017
      ¡Övalue: 021800262a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0018
      UUID = 0x2A26 = ´ûÄê¤Î¡ÖFirmware Revision String¡×
    • ¥Ï¥ó¥É¥ë¡§0x00019
      ¡Övalue: 021a00272a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x001a
      UUID = 0x2A27 = ´ûÄê¤Î¡ÖHardware Revision String¡×
    • ¥Ï¥ó¥É¥ë¡§0x0001b
      ¡Övalue: 021c00282a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x001c
      UUID = 0x2A28 = ´ûÄê¤Î¡ÖSoftware Revision String¡×

        

    Frame 330

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x001c - 0x0022 ÈϰϤΥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 333

    °Ê²¼¤Î¤ß¤Ã¤Ä¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x0001d
      ¡Övalue: 021e00232a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x001e
      UUID = 0x2A23 = ´ûÄê¤Î¡ÖSystem ID¡×
    • ¥Ï¥ó¥É¥ë¡§0x0001f
      ¡Övalue: 0220002a2a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0020
      UUID = 0x2A2A = ´ûÄê¤Î¡ÖIEEE 11073-20601 Regulatory Certification Data List¡×
    • ¥Ï¥ó¥É¥ë¡§0x00021
      ¡Övalue: 022200502a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x02 (Read), Characteristic Value Handle = 0x0022
      UUID = 0x2A50 = ´ûÄê¤Î¡ÖPnP ID¡×

        

    Frame 337

    Á°·Ç¤Î Frame 238 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0023 - 0x0025 ¤Î¡ÖImmediate Alert¡×¥µ¡¼¥Ó¥¹Æâ¤Î Included Service ¤ò¾È²ñ
    ¡ÊÃí¡§¤³¤Î¥ê¥¯¥¨¥¹¥È¤ËÂФ¹¤ëÀµ¤·¤¤¥ì¥¹¥Ý¥ó¥¹¤Ï¡ÖAttribute Not Found (0x0a)¡×¤À¤¬¡¢¥¹¥Ë¥Õ¥¡¼è¤ê¤³¤Ü¤·¤Î¤¿¤á¥í¥°¤¬·çÍ¤Æ¤¤¤ë¡Ë

        

    Frame 341

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0023 - 0x0025 ¤Î¡ÖImmediate Alert¡×¥µ¡¼¥Ó¥¹Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 345

    °Ê²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x0024
      ¡Övalue: 042500062a¡×¤è¤ê¡¢
      ¥×¥í¥Ñ¥Æ¥£ = 0x04 (Write without Response),
      Characteristic Value Handle = 0x0025
      UUID = 0x2A06 = ´ûÄê¤Î¡ÖAlert Level¡×

        

    Frame 349

    Á°·Ç¤Î Frame 238 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0026 - 0x002a ¤Î¡ÖTx Power¡×¥µ¡¼¥Ó¥¹Æâ¤Î Included Service ¤ò¾È²ñ
    ¡ÊÃí¡§¤³¤Î¥ê¥¯¥¨¥¹¥È¤ËÂФ¹¤ëÀµ¤·¤¤¥ì¥¹¥Ý¥ó¥¹¤Ï¡ÖAttribute Not Found (0x0a)¡×¤À¤¬¡¢¥¹¥Ë¥Õ¥¡¼è¤ê¤³¤Ü¤·¤Î¤¿¤á¥í¥°¤¬·çÍ¤Æ¤¤¤ë¡Ë

        

    Frame 355

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0026 - 0x002a ¤Î¡ÖTx Power¡×¥µ¡¼¥Ó¥¹Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 359

    °Ê²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x0027
      ¡Övalue: 122800072a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x12 (Read | Notify), Characteristic Value Handle = 0x0028
      UUID = 0x2A07 = ´ûÄê¤Î¡ÖTx Power Level¡×

        

    Frame 362

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x0028 - 0x002a ÈϰϤΥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 366

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë¤Ï¤³¤ì°Ê¾å¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 369

    Frame 359 ¤Î¼¨¤¹Ä̤ê 0x00028 ¤Ï Tx Power Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î Value Handle ¤Ç¤¢¤ê¸å³¤Î 0x0029 - 0x002a ¤Ë´Ø¤¹¤ë¾ðÊó¤ò GATT ¤ËÌ䤤¹ç¤ï¤»¤Æ¤ß¤ë ¡Ê¾ÜºÙ¡§1, 2¡Ë

        

    Frame 373

    0x0029 ¤Ï Tx Power Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î Client Characteristic Configuration Descriptor (UUID = 0x2902¡Ë ¡Ê¾ÜºÙ¡§1, 2¡Ë ¤Ç¤¢¤ë»Ý¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

        

    Frame 376

    »Ä¤ë0x002a ¤Ë´Ø¤¹¤ë¾ðÊó¤ò GATT ¤ËÌ䤤¹ç¤ï¤»¤Æ¤ß¤ë ¡Ê¾ÜºÙ¡§1, 2¡Ë

        

    Frame 380

    0x002a ¤Ï Tx Power Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î Characteristic Presentation Format Descriptor (UUID = 0x2904¡Ë ¡Ê¾ÜºÙ¡§1, 2, 3, 4¡Ë ¤Ç¤¢¤ë»Ý¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

        Opcode: Find Information Response (0x05)
        UUID Format: 16-bit UUIDs (0x01)
        Handle: 0x002a
        UUID: Characteristic Presentation Format (0x2904)

        

    Frame 384

    Á°·Ç¤Î Frame 238 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x002b - 0x002d ¤Î¡ÖLink Loss¡×¥µ¡¼¥Ó¥¹Æâ¤Î Included Service ¤ò¾È²ñ
    ¡ÊÃí¡§¤³¤Î¥ê¥¯¥¨¥¹¥È¤ËÂФ¹¤ëÀµ¤·¤¤¥ì¥¹¥Ý¥ó¥¹¤Ï¡ÖAttribute Not Found (0x0a)¡×¤À¤¬¡¢¥¹¥Ë¥Õ¥¡¼è¤ê¤³¤Ü¤·¤Î¤¿¤á¥í¥°¤¬·çÍ¤Æ¤¤¤ë¡Ë

        

    Frame 390

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x002b - 0x002d ¤Î¡ÖLink Loss¡×¥µ¡¼¥Ó¥¹Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 392

    °Ê²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x002c
      ¡Övalue: 0a2d00062a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x0a (Read | Write), Characteristic Value Handle = 0x002d
      UUID = 0x2A06 = ´ûÄê¤Î¡ÖAlert Level¡×

        

    Frame 395

    Á°·Ç¤Î Frame 247 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x002e - 0x0032 ¤Î¡ÖBattery Service¡×¥µ¡¼¥Ó¥¹Æâ¤Î Included Service ¤ò¾È²ñ

        

    Frame 397

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë Included Service ¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 401

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x002e - 0x0032 ¤Î¡ÖBattery Service¡×¥µ¡¼¥Ó¥¹Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 404

    °Ê²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x002f
      ¡Övalue: 123000192a¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x12 (Read | Notify), Characteristic Value Handle = 0x0030
      UUID = 0x2A19 = ´ûÄê¤Î¡ÖBattery Level¡×

        

    Frame 407

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x0030 - 0x0032 ÈϰϤΥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 411

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë¤³¤ì°Ê¾å¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 415

    Frame 404 ¤Î¼¨¤¹Ä̤ê 0x00030 ¤Ï Battery Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î Value Handle ¤Ç¤¢¤ê¸å³¤Î 0x0031 - 0x0032 ¤Ë´Ø¤¹¤ë¾ðÊó¤ò GATT ¤ËÌ䤤¹ç¤ï¤»¤Æ¤ß¤ë ¡Ê¾ÜºÙ¡§1, 2¡Ë

        

    Frame 420

    0x0031 ¤Ï Battery Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î Client Characteristic Configuration Descriptor (UUID = 0x2902¡Ë ¡Ê¾ÜºÙ¡§1, 2¡Ë ¤Ç¤¢¤ë»Ý¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

        

    Frame 423

    »Ä¤ë0x0032 ¤Ë´Ø¤¹¤ë¾ðÊó¤ò GATT ¤ËÌ䤤¹ç¤ï¤»¤Æ¤ß¤ë ¡Ê¾ÜºÙ¡§1, 2¡Ë

        

    Frame 427

    0x0032 ¤Ï Battery Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î Characteristic Presentation Format Descriptor (UUID = 0x2904¡Ë ¡Ê¾ÜºÙ¡§1, 2, 3, 4¡Ë ¤Ç¤¢¤ë»Ý¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

        

    Frame 431

    Á°·Ç¤Î Frame 247 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0033 - 0x0037 ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1¡ÊUUID = 0xFFE0¡ËÆâ¤Î Included Service ¤ò¾È²ñ

        

    Frame 434

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë Included Service ¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 437

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0033 - 0x0037 ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1 Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 439

    °Ê²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x0034
      ¡Övalue: 103500e1ff¡×¤è¤ê¡¢
      ¥×¥í¥Ñ¥Æ¥£ = 0x10 (Notify),
      Characteristic Value Handle = 0x0035
      UUID = 0xFFE1 : ¥æ¡¼¥¶ÄêµÁ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯

        

    Frame 442

    ³¤±¤Æ¥Ï¥ó¥É¥ë 0x0035 - 0x0037 ÈϰϤΥ­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 446

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë¤³¤ì°Ê¾å¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 450

    Frame 439 ¤Î¼¨¤¹Ä̤ê 0x00035 ¤Ï¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡Ë¤Î Value Handle ¤Ç¤¢¤ê¸å³¤Î 0x0036 - 0x0037 ¤Ë´Ø¤¹¤ë¾ðÊó¤ò GATT ¤ËÌ䤤¹ç¤ï¤»¤Æ¤ß¤ë ¡Ê¾ÜºÙ¡§1, 2¡Ë

        

    Frame 453

    0x0036 ¤Ï¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡Ë¤Î Client Characteristic Configuration Descriptor (UUID = 0x2902¡Ë ¡Ê¾ÜºÙ¡§1, 2¡Ë ¤Ç¤¢¤ë»Ý¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

        

    Frame 456

    »Ä¤ë0x0037 ¤Ë´Ø¤¹¤ë¾ðÊó¤ò GATT ¤ËÌ䤤¹ç¤ï¤»¤Æ¤ß¤ë ¡Ê¾ÜºÙ¡§1, 2¡Ë

        

    Frame 458

    0x0037 ¤Ï¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡Ë¤Î Characteristic User Description Descriptor (UUID = 0x2901¡Ë¤Ç¤¢¤ë»Ý¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

        

    Frame 462

    Á°·Ç¤Î Frame 247 ¤Î¼¨¤¹¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0038- 0x003a ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 2¡ÊUUID = 0xFFF0¡ËÆâ¤Î Included Service ¤ò¾È²ñ

        

    Frame 465

    Åö³º¥µ¡¼¥Ó¥¹Æâ¤Ë Included Service ¤Ï¸ºß¤·¤Ê¤¤

        

    Frame 468

    ¥Ï¥ó¥É¥ë¥°¥ë¡¼¥× 0x0038 - 0x003a ¤Î¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 2 Æâ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ò¾È²ñ

        

    Frame 470

    °Ê²¼¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¾ðÊó¤¬ÆÀ¤é¤ì¤¿

    • ¥Ï¥ó¥É¥ë¡§0x0039
      ¡Övalue: 043a00f1ff¡×¤è¤ê¡¢¥×¥í¥Ñ¥Æ¥£ = 0x04 (Write without Response), Characteristic Value Handle = 0x003a
      UUID = 0xFFF1 : ¥æ¡¼¥¶ÄêµÁ¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯

        

    Scene 5: ¥Ç¥Ð¥¤¥¹ A ¥Ü¥¿¥ó²¡²¼»þ¤Î¥¢¥×¥ê¤Ø¤ÎÄÌÃΤòÀßÄê

    Frame 491

    Frame 453¡¢Frame 439¡¢Frame 453 ¤Î¼¨¤¹Ä̤ꡢ¥Ï¥ó¥É¥ë 0x0036 ¤Ï¡¢ "¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1¡ÊUUID = 0xFFE0¡ËÇÛ²¼¤Î¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡ËÇÛ²¼¤Î Client Characteristic Configuration Descriptor (CCCD)" ¤Ç¤¢¤ë

    Åö³º¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡Ë¤Î¥×¥í¥Ñ¥Æ¥£¤Ë¤Ï Notify ¤¬ÀßÄꤵ¤ì¤Æ¤ª¤ê¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ç¤¢¤ëÂиþ¥¢¥×¥ê¤«¤é CCCD 0x0036 ¤Ë Notification bit (0x0001) ¤ò½ñ¤­¹þ¤ó¤Ç¤ª¤¯¤³¤È¤Ç¡¢¤³¤Î¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ÎÃͤ¬¹¹¿·¤µ¤ì¤¿»þ¤Ë Value Handle ¤Ç¤¢¤ë 0x0035 ·Ðͳ¤Ç¥¢¥×¥ê¦¤ØÄÌÃΡÊNotification¡Ë¤¬¹Ô¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤ë
    ¡Ê¾ÜºÙ¡§ 1a, 2a, 1b, 2b¡Ë

        Opcode: Write Request (0x12)
        Handle: 0x0026
        Value: 0100

        

    Frame 495

        Opcode: Write Response (0x13)

        

    Scene 6: ¥¢¥×¥ê¤«¤é¥Ç¥Ð¥¤¥¹ A ¤Î LED¡¦¥Ö¥¶¡¼¤òÁàºî

    Frame 616

    Âиþ¥¢¥×¥ê¾å¤Î½êÄê¤Î¥Ü¥¿¥ó¤ò²¡²¼¤¹¤ë¤È¡¢Frame 345, Frame 238 ¤Î¼¨¤¹¡¢ "¡ÖImmediate Alert¡×¥µ¡¼¥Ó¥¹ÇÛ²¼¤Î¡ÖAlert Level¡×¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯" ¤Î Value Handle 0x0025 ¤ËÃÍ¡Ö2¡ÊHigh Alert¡Ë¡×¤¬½ñ¤­¹þ¤Þ¤ì¤ë

    ¥Ç¥Ð¥¤¥¹ A ¤Î LED¡¦¥Ö¥¶¡¼¤Ï¥Õ¥¡¡¼¥à¥¦¥§¥¢¥ì¥Ù¥ë¤Ç¤³¤Î Alert Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Ëɳ¤Å¤±¤é¤ì¤Æ¤¤¤ëÌÏÍÍ¡£High Alert Ãͤ¬½ñ¤­¹þ¤Þ¤ì¤ë¤È¤½¤ì¤ËÈ¿±þ¤·¤Æû»þ´Ö LED ¤È¥Ö¥¶¡¼¤¬ ON ¤Ë¤Ê¤ë

    ¤Ê¤ª¡¢Frame 345 ¤Î¼¨¤¹¤è¤¦¤Ë Alert Level ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤Î¥×¥í¥Ñ¥Æ¥£¤Ë¤Ï¡ÖWrite without Response¡×(0x04) ¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¤¿¤á¡¢¥¢¥×¥ê¤«¤éÃͤò½ñ¤­¹þ¤ó¤Ç¤â¥Ç¥Ð¥¤¥¹ A ¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤ÏȯÀ¸¤·¤Ê¤¤

        Opcode: Write Command (0x52)
        Handle: 0x0025
        Value: 02

        

    Scene 7: ¥Ç¥Ð¥¤¥¹ A ¤Î¥Ü¥¿¥ó¤ò²¡¤¹¤È¥¢¥×¥ê¤ØÄÌÃÎ

    Frame 711

    ¥Ç¥Ð¥¤¥¹ A ¤ÎʪÍý¥Ü¥¿¥ó¤Ï¥Õ¥¡¡¼¥à¥¦¥§¥¢¥ì¥Ù¥ë¤Ç Frame 439 ¤Î¼¨¤¹ "¥æ¡¼¥¶ÄêµÁ¥µ¡¼¥Ó¥¹ 1¡ÊUUID = 0xFFE0¡ËÇÛ²¼¤Î¥æ¡¼¥¶ÄêµÁ¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¡ÊUUID = 0xFFE1¡Ë" ¤Ëɳ¤Å¤±¤é¤ì¤Æ¤¤¤ëÌÏÍÍ¡£¤³¤Î¥Ü¥¿¥ó¤ò²¡¤¹¤ÈÅö³º¥­¥ã¥é¥¯¥¿¥ê¥¹¥Æ¥£¥Ã¥¯¤ÎÃͤ¬¥Ç¥Ð¥¤¥¹ÆâÉô¤Ç¹¹¿·¤µ¤ì Frame 491 ¤Ç¤Î»Å¹þ¤ß¤Ë´ð¤Å¤­¥¢¥×¥ê¦¤ØÄÌÃΤ¬¹Ô¤ï¤ì¤ë

        Opcode: Handle Value Notification (0x1b)
        Handle: 0x0035
        Value: 01

        

    Scene 8: ¥¢¥×¥ê¦¤«¤é¥Ç¥Ð¥¤¥¹ A ¤È¤ÎÀܳ¤òÀÚÃÇ

    Âиþ¥¢¥×¥ê¾å¤Î½êÄê¤Î¥Ü¥¿¥ó¤ò²¡²¼¤¹¤ë¤È¥ê¥ó¥¯ÁØÀ©¸æ PDU ¤Î LL_TERMINATE_IND (0x02) ¤¬¥Ç¥Ð¥¤¥¹ A ¦¤ËÁ÷½Ð¤µ¤ìξ¼Ô´Ö¤ÎÀܳ¤¬½ªÎ»¤¹¤ë¡Ê¾ÜºÙ¡§1, 2¡Ë

    Frame 779

        


    (tanabe)
    klab_gijutsu2 at 19:02¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)¨¢TrackBack(0)
    2016ǯ08·î18Æü

    µ»Å¬¥Þ¡¼¥¯¤Ä¤­ BLE ¥Ñ¥±¥Ã¥È¥¹¥Ë¥Õ¥¡¤òÆþ¼ê¤¹¤ë

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    Bluetooth Low Energy (BLE) ¤ÎÊÙ¶¯¤Î¤¿¤á¤Ë BLE ¥Ñ¥±¥Ã¥È¤òÇÁ¤¤¤Æ¤ß¤¿¤¤¤È»×¤¤¤Þ¤·¤¿¡£BLE ¤ÎÄÌ¿®¥×¥í¥È¥³¥ë¤ÏÊ£»¨¤Ç¤¹¤¬¡¢¥Ñ¥±¥Ã¥È¤ÎÆâÍƤòŬµ¹Àººº¤¹¤ì¤ÐºÂ³ØŪ¤Ê¾ðÊó¤Î¸þ¤³¤¦Â¦¤Ë¤¢¤ë¼ÂÁü¤òª¤¨¤ë¤³¤È¤¬²Äǽ¤È¤Ê¤ë¤Ç¤·¤ç¤¦¡£

    ¹ñÆâ¤Ç¤Ï¼¡¤Î¤è¤¦¤Ê BLE ¥×¥í¥È¥³¥ë¥¢¥Ê¥é¥¤¥¶¤¬ÈÎÇ䤵¤ì¤Æ¤¤¤Þ¤¹¡£¤â¤Ã¤È¤â¤³¤¦¤¤¤Ã¤¿¿ôÉ´Ëü±ß¥ª¡¼¥À¡¼¤ÎÀìÍѵ¡¤Ë¤Ï¤Ê¤«¤Ê¤«¼ê¤ò½Ð¤»¤Þ¤»¤ó¡£

    ¤â¤Ã¤È¼ê·Ú¤ÊÊýË¡¤È¤·¤Æ¡¢BLE ¥Á¥Ã¥×¡¦¥â¥¸¥å¡¼¥ë¥Ù¥ó¥À¤ÎÄ󶡤¹¤ë¥Ñ¥±¥Ã¥È¥¹¥Ë¥Õ¥¡¤òÍøÍѤ¹¤ëÁªÂò¤¬¤¢¤ê¤Þ¤¹¡£ÂåɽŪ¤ÊÀ½Éʤò¥Ô¥Ã¥¯¥¢¥Ã¥×¤·¤Æ¤ß¤Þ¤¹¡£ 2016ǯ8·î»þÅÀ¤Ç¤ÏÆüËܹñÆâ¤ÇÀµµ¬¤ËήÄ̤·¤Æ¤¤¤ë BLE ¥Ñ¥±¥Ã¥È¥¹¥Ë¥Õ¥¡À½Éʤϸ«Åö¤¿¤ê¤Þ¤»¤ó¡£¤â¤Á¤í¤ó¹ñ³°¤«¤éĴ㤹¤ë¤³¤È¤Ï²Äǽ¤Ç¤¹¤¬¡¢ÅÅÇÈË¡¤Ë´ð¤Å¤¯µ»½Ñ´ð½àŬ¹ç¡Êµ»Å¬¡Ë¾ÚÌÀ¤È¤Î¤«¤Í¤¢¤¤¤¬µ¤¤Ë¤Ê¤ë¤È¤³¤í¤Ç¤¹¡£

    ¥Ñ¥±¥Ã¥È¥¹¥Ë¥Õ¥¡¤Èµ»Å¬

    ¤¿¤È¤¨¤Ð¡¢Á°·Ç¤Î Nordic Semiconductor ¼ÒÀ½¡ÖnRF51 Dongle¡×¤Ïµ»Å¬¾ÚÌÀ¤ò¼õ¤±¤Æ¤¤¤Ê¤¤¤¿¤á¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥¿¤¬¼¡¤Î¤è¤¦¤ËÃí°Õ¤òÂ¥¤·¤Æ¤¤¤Þ¤¹¡£

    • nRF51 USB dongle for emulator,firmware - jp.rs-online.com
      ·Ù¹ð
      
      Ëܳ«È¯¥­¥Ã¥È¤Ïµ»½Ñ´ð½àŬ¹ç¾ÚÌÀ¤ò¼õ¤±¤Æ¤ª¤ê¤Þ¤»¤ó¡£ËÜÀ½ÉʤΤ´»ÈÍѤ˺ݤ·¤Æ¤Ï¡¢
      ÅÅÇÈË¡½å¼é¤Î¤¿¤á¡¢°Ê²¼¤Î¤¤¤º¤ì¤«¤ÎÁ¼ÃÖ¤ò¼è¤Ã¤Æ¤¤¤¿¤À¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¤Î¤Ç
      ¤´Ãí°Õ¤¯¤À¤µ¤¤¡£
      
       - ÅÅÇÈË¡»Ü¹Ôµ¬Â§Âè 6 ¾òÂè 1 ¹àÂè 1 ¹æ¤Ë´ð¤Å¤¯Ê¿À® 18 ǯ 3 ·î 28 ÆüÁí̳¾Ê¹ð¼¨
         Âè 173 ¹æ¤ÇÄê¤á¤é¤ì¤¿ÅÅÇȰż¼Åù¤Î»î¸³ÀßÈ÷Æâ¤Ç»ÈÍѤ¹¤ë¡£
       - ¼Â¸³¶É¤ÎÌȵö¤ò¼èÆÀ¤·¤¿¤Î¤Á»ÈÍѤ¹¤ë¡£
       - µ»½Ñ´ð½àŬ¹ç¾ÚÌÀ¤ò¼èÆÀ¤·¤¿¤Î¤Á»ÈÍѤ¹¤ë¡£
      
    ¤¿¤À¡¢ÅÅÇÈË¡¤Ï¼õ¿®¤Î¤ß¤òÌÜŪ¤È¤¹¤ë¤â¤Î¤òµ¬À©Âоݳ°¤È¤·¤Æ¤¤¤Þ¤¹¡£
    • ÅÅÇÈË¡ ¡ÊºÇ½ª²þÀµ¡§Ê¿À®Æó¼·Ç¯¸Þ·îÆóÆóÆüˡΧÂèÆóÏ»¹æ¡Ë - law.e-gov.go.jp
      ¡¡¡¡¡¡Âè°ì¾Ï¡¡Áí§
                :
      ÂèÆó¾ò ¤³¤ÎˡΧµÚ¤Ó¤³¤ÎˡΧ¤Ë´ð¤Å¤¯Ì¿Îá¤Îµ¬Äê¤Î²ò¼á¤Ë´Ø¤·¤Æ¤Ï¡¢¼¡¤ÎÄêµÁ¤Ë
             ½¾¤¦¤â¤Î¤È¤¹¤ë¡£ 
                :
        ¸Þ ¡¡¡Ö̵Àþ¶É¡×¤È¤Ï¡¢ÌµÀþÀßÈ÷µÚ¤Ó̵ÀþÀßÈ÷¤ÎÁàºî¤ò¹Ô¤¦¼Ô¤ÎÁíÂΤò¤¤¤¦¡£
             ⤷¡¢¼õ¿®¤Î¤ß¤òÌÜŪ¤È¤¹¤ë¤â¤Î¤ò´Þ¤Þ¤Ê¤¤¡£ 
                :
      
    µ¡Ç½¤ÎÀ­¼Á¾å¡¢¥Ñ¥±¥Ã¥È¥¹¥Ë¥Õ¥¡¤ÎÄÌ¿®¾å¤ÎÌò³ä¤Ï¼õ¿®¤ËÆò½¤·¤Æ¤¤¤Þ¤¹¡£¤Ç¤Ï¤³¤Î¥Ç¥Ð¥¤¥¹¤òµ¬À©Âоݳ°¤ÈȽÃǤ·°Â¿´¤·¤Æ¹ñÆâ¤Ç»È¤¦¤³¤È¤ÏŬÀڤǤ·¤ç¤¦¤«¡© ¼Â¤Ï¤µ¤é¤Ë¹Íθ¤¹¤Ù¤­ÏÃÂ꤬¤¢¤ê¤Þ¤¹¡£

    ¾å¤Îµ­»ö¤Î¤è¤¦¤Ë¡¢nRF51 Dongle ¤Ï mbed Âбþ¤Î¥×¥í¥°¥é¥Þ¥Ö¥ë¤Ê̵ÀþÄÌ¿®¥Ç¥Ð¥¤¥¹¤Ç¤¹¡£¤Ä¤Þ¤ê¡¢¤³¤Î¡Ö̵ÀþÀßÈ÷¡×¤Ï¸µÍè¡Ö¼õ¿®¤Î¤ß¤òÌÜŪ¤È¤¹¤ë¤â¤Î¡×¤Ç¤Ï¤Ê¤¯¤à¤·¤í¡ÖÁàºî¤ò¹Ô¤¦¼Ô¡×¤Ë¤è¤Ã¤Æ¥×¥í¥°¥é¥à¤ò½ñ¤­´¹¤¨²Äǽ¤Ç¤¢¤ë¤³¤È¤òÆÃĹ¤Î¤Ò¤È¤Ä¤Ë·Ç¤²¤Æ¤¤¤ëÀ½ÉʤǤ¹¡£¾å¤Ëµó¤²¤¿¥¹¥Ë¥Õ¥¡¥Ç¥Ð¥¤¥¹¤Ï¤¤¤º¤ì¤âƱÍͤΦÌ̤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£

    °Ê²¼¤ÎÎã¤Î¤è¤¦¤Ë¡¢µ»Å¬¥Þ¡¼¥¯¤Ä¤­¤ÎÀ½Éʤˤª¤¤¤Æ¤µ¤¨¡Ö¥Õ¥¡¡¼¥à¥¦¥§¥¢¤Î½ñ¤­´¹¤¨¡×¤È¤ÎÀ°¹çÀ­¤ò°ì°Õ¤ËȽÃǤǤ­¤Ê¤¤»ö¾ð¤ò¹Í¤¨¹ç¤ï¤»¤ë¤È¡¢µ»Å¬¥Þ¡¼¥¯¤Ê¤·¤Î¤³¤ì¤é¤Î¥¹¥Ë¥Õ¥¡À½ÉʤÎÆüËܹñÆâ¤Ç¤Î»ÈÍѤÎÀ§Èó¤Ï¤ä¤Ï¤êÈù̯¤«¤â¤·¤ì¤Þ¤»¤ó¡£

    • ESP-WROOM-02¤Î¥Õ¥¡¡¼¥à¥¦¥§¥¢¤ò½ñ¤­´¹¤¨¤¿¾ì¹ç¡¢µ»Å¬¤Ï¤É¤¦¤Ê¤ë¤Î¤« - ¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹
      ¥æ¡¼¥¶¡¼¤Ë¤è¤ë¥Õ¥¡¡¼¥à¥¦¥§¥¢¤Î½ñ¤­´¹¤¨¤¬¡¢ESP-WROOM-02¤Î¹©»öÀß·×ǧ¾Ú¤ò
      ̵¸ú¤Ë¤¹¤ë²ÄǽÀ­¤Ë¤Ä¤¤¤Æ¡¢¥á¡¼¥«¡¼¤ÎEspressif Systems¤Ë³Îǧ¤ò¤·¤Þ¤·¤¿¡£
      Ʊ¼Ò¤ÏÅÐϿǧ¾Úµ¡´Ø¤Ë³Îǧ¤·¤¿¾å¤Ç¡¢Arduino core for ESP8266 WiFi chip
      ¤Þ¤¿¤ÏƱ¼ÒÀ½SDK¤ò»È¤Ã¤Æ¤¤¤ë¸Â¤ê¤Ë¤ª¤¤¤Æ¤Ï¡¢Ç§¾Ú¤Ë¤Ï±Æ¶Á¤òÍ¿¤¨¤Ê¤¤¤È¤¤¤¦
      ²óÅú¤ò²¼¤µ¤¤¤Þ¤·¤¿¡£Â¾¤Î³«È¯´Ä¶­¤Ê¤É¡¢¥Õ¥¡¡¼¥à¥¦¥§¥¢¤ò½ñ¤­´¹¤¨¤ëÉôʬ¤Ë
      ¤è¤Ã¤Æ¤Ï¡¢Ç§¾Ú¤Ë±Æ¶Á¤òµÚ¤Ü¤·ÆÀ¤ë¤È¤Î¤³¤È¤Ç¤¹¤Î¤Ç¡¢¤´Ãí°Õ¤¯¤À¤µ¤¤¡£
      
    • ¥â¥Î¥ï¥¤¥ä¥ì¥¹À½ÉʾðÊó - MONO-WIRELESS.COM - mono-wireless.com
      ÅÅÇÈË¡µ¬¡Êµ»Å¬¡Ë¤Ë¤Ä¤¤¤Æ
               :
      ¹¹¤Ë¥Õ¥¡¡¼¥à¥¦¥¨¥¢¤ò½ñ¤­´¹¤¨¤ë¤Èǧ¾Ú¤ÎÈϰϤò³°¤ì¤Æ¤·¤Þ¤¦ÌµÀþ¥â¥¸¥å¡¼¥ë
      ¤â¸ºß¤·¤Æ¤¤¤Þ¤¹¡£ÊÀ¼ÒÀ½ÉʤÏÁ´¤Æµ»Å¬Ç§¾Ú¤ËŬ¹ç¤·¤¿ÌµÀþ¥â¥¸¥å¡¼¥ë¤Ç¤¹¤Î¤Ç
      ¥³¥ó¥×¥é¥¤¥¢¥ó¥¹¤ËÇؤ¯¤³¤È¤Ê¤¯°Â¿´¤·¤Æ¤´»ÈÍѤ·¤Æ¤¤¤¿¤À¤±¤Þ¤¹¡£Ê»¤»¤Æ
      ¡ÖÅÅÇÈË¡¤Ë¤Ä¤¤¤Æ¤Î¹Íθ»ö¹à¡×¤ò»²¾È¤¯¤À¤µ¤¤¡£
      
    • DD-WRT - wikipedia
      ÅÅÇÈË¡¤Ë¤è¤ëµ¬À©
      
      ÆüËܤˤª¤¤¤Æ¤Ï̵Àþµ¡´ï¤ËÂФ·¤Æ¥á¡¼¥«¡¼Â¦¤¬ÁÛÄꤷ¤Æ¤¤¤Ê¤¤Èó¸ø¼°¥Õ¥¡¡¼¥à
      ¥¦¥§¥¢¤Ø¤Î½ñ¤­´¹¤¨¤ò¹Ô¤Ã¤¿»þÅÀ¤Çµ»Å¬¥Þ¡¼¥¯¤¬Ìµ¸ú¤È¤Ê¤ê¡¢ÌµÀþLAN¤òÍøÍѤ¹¤ë
      ¾ì¹ç¤ÏÅÅÇÈË¡¤Ë°ãÈ¿¤¹¤ë[Í×½Ðŵ]¡£
               :
      

    Adafruit ¼ÒÀ½¡ÖBluefruit LE Sniffer¡×

    ¤½¤ó¤Ê¤ï¤±¤ÇÁ°·Ç¤Î¥¹¥Ë¥Õ¥¡¤ÎƳÆþ¤Ï°ìöÊÝα¤·¤Æ¤¤¤Þ¤·¤¿¤¬¡¢¾ðÊó¤òõ¤·¤Æ¤¤¤ë¤¦¤Á¤Ë¤Õ¤È¤¢¤ëÀ½ÉʤΥ¹¥Ú¥Ã¥¯¤ËÌܤ¬¤È¤Þ¤ê¤Þ¤·¤¿¡£

    MDBT40 ¤Ï¡¢Nordic Semiconductor ¼ÒÀ½¤Î¥á¥¸¥ã¡¼¤Ê nRF51822 ¥Á¥Ã¥×¤òÅëºÜ¤·¤¿ Ãæ¹ñ Raytac ¼Ò¤Î BLE ¥â¥¸¥å¡¼¥ë¤Ç¤¹¡£Á°¤Ë BLE ¤Þ¤ï¤ê¤ÎÀ½ÉÊÄ´ºº¤ò¹Ô¤Ã¤Æ¤¤¤¿Àޤˤ³¤Î MDBT40 ¤¬ÆüËܤε»Å¬¾ÚÌÀ¤ò¼èÆÀ¤º¤ß¤Ç¤¢¤ë¤³¤È¤òÃΤê̾Á°¤¬°õ¾Ý¤Ë»Ä¤Ã¤Æ¤¤¤Þ¤·¤¿¡£

    MDBT40 ¤òºÜ¤»¤¿À½Éʤϲ¼µ­¤ÎÎã¤Î¤è¤¦¤Ë¹ñÆâ¤ÇήÄ̤·¤Æ¤¤¤Þ¤¹¡£

    • Adafruit Feather 32u4 Bluefruit LE - ¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹
      BLE(Bluetooth Low Energy)µ¡Ç½ÉÕ¤­¤Î¾®·¿Arduino¸ß´¹¥Ü¡¼¥É¤Ç¤¹¡£
      Adafruit Bluefruit LE Micro¤Î¸å·ÑÉʤǤ¹¡£
                      :
      Arduino Leonardo¤Ê¤É¤ËÅëºÜ¤µ¤ì¤Æ¤¤¤ëATmega 32u4¤òÅëºÜ¡£
      BLE¥â¥¸¥å¡¼¥ë¤Ç¤¢¤ëMDBT40¤Ï¡¢Áí̳¾Ê¤Î¹©»öÀß·×ǧ¾Ú¡Ê¤¤¤ï¤æ¤ëµ»Å¬¡Ë¤ò
      ¼èÆÀºÑ¤ß¤Ê¤Î¤Ç¡¢ÆüËܹñÆâ¤Ç»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
                      :
      
    Adafruit ¼ÒÀ½¤Î¤³¤Î¡ÖBluefruit LE Sniffer¡×¤ÎÀ½Éʼ̿¿¤ò¤è¤¯¸«¤ë¤È¡¢µ»Å¬¥Þ¡¼¥¯¤Ä¤­¤Î MDBT40 ¤¬ºÜ¤Ã¤Æ¤¤¤ë¤³¤È¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£ ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

    ¤³¤Î¥¹¥Ë¥Õ¥¡¤Ç¤¢¤ì¤Ðµ»Å¬´ØÏ¢¤Î¥¸¥ì¥ó¥Þ¤Ê¤·¤ËÍøÍѤǤ­¤½¤¦¤Ç¤¹¡£ËÜÂβÁ³Ê¤ÏľÈÎ¤Ç $29.95¡£°Ê²¼¡¢Adafruit ¼Ò¸ø¼°¥µ¥¤¥È¤è¤ê¡£

    Bluefruit LE Sniffer ¤Î¥Ý¥¤¥ó¥È¤ò¤¶¤Ã¤¯¤ê¤Þ¤È¤á¤Æ¤ß¤Þ¤¹¡£

    ¤µ¤Ã¤½¤¯ Adafruit ¼Ò¥µ¥¤¥È¤Ç¥ª¡¼¥À¡¼¤·¤Þ¤·¤¿¡£ ÇÛÁ÷ÊýË¡¤Ë¤ÏºÇ¤â°Â²Á¤Ê United States Postal Service ¤Î¡ÖFirst-Class Package International Service™ incl. $1.60 insurance : $16.40¡×¤ò»ØÄê¡¢·× $46.35 ¤ò PayPal ¤Ç·èºÑ¤·°ì½µ´Ö¤Û¤É¤ÇÅþÃ夷¤Þ¤·¤¿¡£

    ȯÁ÷Ï¢Íí¸å¤Ë USPS ¥µ¥¤¥È¤ÇÇÛÁ÷¾õ¶·¤ò³Îǧ¤¹¤ë¤È·ÐͳÃϤˡÖJAMAICA¡×¤Îɽµ­¤¢¤ê¡£¤µ¤Æ¤Ï Japan -> Jamaica ¤Î¥ß¥¹¤«¡© ¤Èµ¿¤¤¤Þ¤·¤¿¤¬¤³¤ì¤Ï¥«¥ê¥Ö³¤°è¤Ë¤¢¤ë¹ñ¤Î̾Á°¤Ç¤Ï¤Ê¤¯ JFK ¶õ¹Á¤½¤Ð¤Î¡ÖJAMAICA, NY 11430¡×¤Ç¤·¤¿¡£ÊªÎ®¤ÎÍ׾פΤ褦¤Ç¤¹¤¬ÃѤº¤«¤·¤Ê¤¬¤é¥Ë¥å¡¼¥è¡¼¥¯¤Ë¥¸¥ã¥Þ¥¤¥«¤È¤¤¤¦ÃÏ̾¤¬¤¢¤ë¤³¤È¤ò½é¤á¤ÆÃΤê¤Þ¤·¤¿¡£Adafruit ¤µ¤óµ¿¤Ã¤Æ¤´¤á¤ó¤Ê¤µ¤¤¡Ê^^¡¨

    »È¤Ã¤Æ¤ß¤ë

    Windows PC ¤Ç Bluefruit LE Sniffer ¤ò»ÈÍѤ¹¤ëºÇû¤Î¼ê½ç¤ò¼¨¤·¤Þ¤¹¡£¾ÜºÙ¤Ï nRF Sniffer ¥¢¡¼¥«¥¤¥ÖÆâ¤Î¡ÖnRF Sniffer User Guide¡×¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    1. FTDI ¼Ò¤Î²¾ÁÛ COM ¥Ý¡¼¥È¥É¥é¥¤¥Ð¤ò̤ƳÆþ¤Ê¤é¥¤¥ó¥¹¥È¡¼¥ë
    2. ºÇ¿·¤Î nRF Sniffer ¤Î zip ¥¢¡¼¥«¥¤¥Ö¤ò¥À¥¦¥ó¥í¡¼¥É¤·Å¬Åö¤Ê¥Õ¥©¥ë¥À A ¤ØŸ³«
    3. Wireshark¡Êv1.10.1 °Ê¹ß¡Ë¤ò̤ƳÆþ¤Ê¤é¥¤¥ó¥¹¥È¡¼¥ë
    4. Bluefruit LE Sniffer ¤ò USB ¥Ý¡¼¥È¤ØÀܳ¤· Sniffing ¤ÎÂоݤȤ¹¤ë¥Ç¥Ð¥¤¥¹¤ò¶áÀܤµ¤»¤Æ¤ª¤¯
      ¿Þ¤Ï¡ÖnRF Sniffer User Guide v1.2¡×¤è¤ê
    5. ¥Õ¥©¥ë¥À A ľ²¼¤Î¡Öble-sniffer_win_<version>_Sniffer.exe¡×¤ò¼Â¹Ô
    6. ¥³¥ó¥½¡¼¥ë¤¬³«¤­¥¢¥É¥Ð¥¿¥¤¥¸¥ó¥°Ãæ¤Î BLE ¥Ç¥Ð¥¤¥¹¤¬°ìÍ÷ɽ¼¨¤µ¤ì¤ë
    7. ¥«¡¼¥½¥ë¥­¡¼¡ÜENTER ¤Þ¤¿¤Ï¡Ö¡ô¡×ÈÖ¹æ¤ÇÂоݤȤ¹¤ë¥Ç¥Ð¥¤¥¹¤òÁªÂò
    8. ¥Ç¥Ð¥¤¥¹¤òÁªÂò¤·¤¿¾õÂ֤ǡÖw¡×¥­¡¼¤ò²¡²¼¤¹¤ë¤È Wireshark ¤¬µ¯Æ°¡£¤¢¤È¤Ï¥Ç¥Ð¥¤¥¹Â¦¤ÇɬÍפÊÁàºî¤ò¹Ô¤¨¤Ð¤è¤¤

    ÉÕµ­¡§¥Ç¥å¥¢¥ë¥æ¡¼¥¹ÉʤÈÍ¢½Ðµ¬À©

    ¤´Â¸ÃΤÎÊý¤â¿¤¤¤È»×¤¤¤Þ¤¹¤¬¡¢Mouser ¤ä RS¡¤Digi-key ¤È¤¤¤Ã¤¿°ìÈ̤Υǥ£¥¹¥È¥ê¥Ó¥å¡¼¥¿¤«¤é½êÄê¤ÎÅÅ»ÒÉôÉʤò¹ØÆþ¤·¤è¤¦¤È¤¹¤ë¤È¡¢¤½¤ÎÀ½ÉʤÎÆâÍƤȺ߸˸µ¡¦½Ð²Ù¸µ¤Î¹ñ¤äÃÏ°è¤Ë¤è¤Ã¤Æ¤Ï·³»öžÍѤβÄǽ¤Ê¡Ö¥Ç¥å¥¢¥ë¥æ¡¼¥¹ÉÊÌܡפȤ·¤ÆÍ¢½Ðµ¬À©¤Ë°ú¤Ã¤«¤«¤ê¡¢½êÄê¤Î½ñÎà°ì¼°¤ÎÄó½Ð¤òµá¤á¤é¤ì¿³ºº¤Î¤¿¤á¤Ë¿ô½µ´ÖÄøÅÙÂÔ¤¿¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£

    º£²ó¡¢Ë¿¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥¿¤Ø½êÄê¤Î¾¦Éʤ¬Í¢½Ðµ¬À©¤ÎÂоݤ¬Èݤ«¤ò»öÁ°¤ËȽÊ̤¹¤ëÊýË¡¤Î̵ͭ¤ò¿Ò¤Í¤¿¤È¤³¤í¡ÖÃíʸ¤ò¼õ¤±¼ÂºÝ¤ËÍ¢½Ð¼ê³¤­¤ò³«»Ï¤·¤Ê¤±¤ì¤Ð¤ï¤«¤é¤Ê¤¤¡×¤È¤Î²óÅú¤Ç¤·¤¿¡£ Í¢½Ðµ¬À©¤Ë´Ø¤¹¤ëÃí°Õ½ñ¤­¤Î̵ͭ¤Ï¤Þ¤Á¤Þ¤Á¤Ç¤¹¤¬¡¢°Ê²¼¤Ë°ìÎã¤ò°úÍѤ·¤Þ¤¹¡£

    • nRF51-Dongle Nordic Semiconductor | Mouser - www.mouser.jp
      This product may require additional documentation to export
      from the United States.
      ¤³¤ÎÀ½Éʤò¥¢¥á¥ê¥«¤«¤éÇÛÁ÷¤¹¤ë¤Ë¤Ï¡¢ÄɲäνñÎबɬÍפˤʤë
      ¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
      
    °ìÊý¡¢Ä¾ÈΤâ¹Ô¤Ã¤Æ¤¤¤ë Adafruit ¤Ï¼«¼ÒÀ½ÉʤÎÍ¢½Ð´ÉÍý¤ò¼çÂÎŪ¤Ë¼Â»Ü¤·¤Æ¤¤¤ë»Ý¤ò¸ø¼°¥µ¥¤¥È¾å¤ÇÀë¸À¤·¤Æ¤¤¤Þ¤¹¡£¤³¤¦¤¤¤¦¾ì¹ç¤Ë¤ÏľÈΤòÍøÍѤ¹¤ë¤Û¤¦¤¬ÌÌÅݤ¬¾¯¤Ê¤¤¤è¤¦¤Ç¤¹¡£


    (tanabe)
    klab_gijutsu2 at 11:35¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(4)¨¢TrackBack(0)
    2016ǯ08·î03Æü

    Tomoru ¤È Pochiru ¤È Linking

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    Tomoru

    Tomoru ¤Ï¡¢ºòǯ¡Ê2015ǯ¡Ë11·î¤è¤ê¹ñÆâ¤Î¥¯¥é¥¦¥É¥Õ¥¡¥ó¥Ç¥£¥ó¥°¥µ¡¼¥Ó¥¹ Makuake ¤Ç»Ù±çÊ罸¤Î¹Ô¤ï¤ì¤¿ Bluetooth Low Energy¡ÊBLE¡Ë¥Ç¥Ð¥¤¥¹¤Ç¤¹¡£¡ÖProject Linking¡×¤ÎΩ¤Á¾å¤²¤È¤È¤â¤ËÅö»þÏÃÂê¤Ë¤Ê¤Ã¤¿¤¿¤á¤´Â¸ÃΤÎÊý¤â¿¤¤¤³¤È¤Ç¤·¤ç¤¦¡£2016ǯ8·î¸½ºß¤ÏÀ½Â¤¸µ¤Ç¤¢¤ë³ô¼°²ñ¼Ò Braveridge ¤Î¸ø¼°¥¹¥È¥¢¤ä Amazon ¤«¤éÆþ¼ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°ÊÁ°¤³¤Î¥Ö¥í¥°¤Ç¡Öblink(1)¡×¤È¤¤¤¦À½Éʤò¥Ô¥Ã¥¯¥¢¥Ã¥×¤·¤¿¤³¤È¤¬¤¢¤ê¤Þ¤¹¤¬¡¢¸Ä¿ÍŪ¤Ë¡Ö¸÷¤ê¤â¤Î¡×¤Ï¹¥Êª¤Ç¡¢¤³¤Î Tomoru ¤â»Ù±çÊ罸¤Ø¤Î±þÊç¤Ë¤è¤Ã¤ÆÆϤ¤¤¿¸ÄÂΤò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£

    Tomoru

    www.products.braveridge.com

    ¸½»þÅÀ¤Ç¤ÏÂбþ¥¢¥×¥ê¤¬Á´ÂÎŪ¤Ë¤ä¤äÂç¿Í¤·¤á¤Ç Linking ¼«ÂΤâËܳÊŪ¤ÊÉáµÚ¤Ï¤³¤ì¤«¤é¤Î¤è¤¦¤Ç¤¹¤¬¡¢¼ê¸µ¤Ç¤Ï BLE ¤ÎÊÙ¶¯¤¬¤Æ¤é¤Ë¤³¤Î²Ä°¦¤¤¥Ç¥Ð¥¤¥¹¤ò³Ú¤·¤ó¤Ç¤¤¤Þ¤¹¡£

    Pochiru

    Braveridge ¼Ò¤Ï¤½¤Î¸å¤â³èȯ¤Ë Linking ÂбþÀ½Éʤò¥ê¥ê¡¼¥¹¤·¤Æ¤¤¤Þ¤¹¡£ºÇ¶áÌܤˤȤޤä¿¡ÖPochiru¡×¤È¤¤¤¦¥Ç¥Ð¥¤¥¹¤òÇã¤Ã¤Æ¤ß¤Þ¤·¤¿¡£Pochiru ¤Ë¤Ï LED ¤Ë²Ã¤¨¥Í¡¼¥ß¥ó¥°¤É¤ª¤ê²¡¤·¥Ü¥¿¥ó¤¬¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤Î¤¿¤áÄÌ¿®Àè¤Îµ¡´ï¤È¤ÎÁÐÊý¸þ¤Î¤ä¤ê¤È¤ê¤¬²Äǽ¤Ç¤¹¡£

    Pochiru

    www.products.braveridge.com
    ¥Ü¥¿¥ó¤â¤Î¤Î BLE ¥Ç¥Ð¥¤¥¹¤Ï¤¤¤í¤¤¤íÈÎÇ䤵¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¥ê¥â¡¼¥È¥·¥ã¥Ã¥¿¡¼¤ä¥á¥Ç¥£¥¢¥×¥ì¥¤¥ä¡¼¤ÎÁàºî¤È¤¤¤Ã¤¿½êÄê¤ÎÌÜŪ¤ËÊĤ¸¤¿¤â¤Î¤¬Â¿¤¯¡¢Î÷²Á¤Ç¤¢¤ê¤Ê¤¬¤é¼«ºî¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÈÈÆÍÑŪ¤ËÏ¢·È²Äǽ¤Ç¤¢¤ë¤³¤È¤¬ Pochiru ¤ÎÌ¥ÎϤǤ¹¡£¤³¤Î²Á³Ê¤Ç¤³¤Î¥µ¥¤¥º¤Î BLE ¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤ò¼«ºî¤¹¤ë¤³¤È¤ÎÆñÅÙ¤ò¹Í¤¨¤ë¤È¥³¥¹¥È¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Î¹â¤¤À½ÉʤȸÀ¤¨¤ë¤Ç¤·¤ç¤¦¡£

    ¥×¥í¥°¥é¥à¤ò½ñ¤¯

    Tomoru ¤ä Pochiru ¤Î¤è¤¦¤Ê Linking Âбþ¥Ç¥Ð¥¤¥¹ÍѤΥ¢¥×¥ê¤Ï Project Linking ¤¬Ìµ½þ¤Ç¸ø³«¤·¤Æ¤¤¤ë SDK ¤òÍøÍѤ·¤ÆºîÀ®¤·¤Þ¤¹¡£BLE ¤Þ¤ï¤ê¤Î¥Ï¥ó¥É¥ê¥ó¥°¤Ï¤¹¤Ù¤Æ Linking ËÜÂΤ¬Ãç²ð¤¹¤ë¤¿¤á¡¢Ãê¾Ý²½¤µ¤ì¤¿ Linking API ¤ò¸Æ¤Ó½Ð¤¹¤À¤±¤Ç¥Ç¥Ð¥¤¥¹¤È¤ÎÏ¢·È¤¬²Äǽ¤Ç¤¹¡£

    Project Linking ¤Î³«È¯¼Ô¸þ¤±¥Ú¡¼¥¸¤ÎÃæ¤Û¤É¤Î¡ÖAPI guide¡×¹à¤ÎÍøÍѵ¬Ìó¤ò³Îǧ¤Î¾å SDK ¤ò¥À¥¦¥ó¥í¡¼¥É¤·¡¢¡ÖAPI »ÅÍͽñ¡×¤Î¡Ö¥Ý¡¼¥Æ¥£¥ó¥°¡×¥Ú¡¼¥¸¤ÎÀâÌÀ¤Ëź¤Ã¤Æ³«È¯´Ä¶­¤ò¥»¥Ã¥È¥¢¥Ã¥×¤·¤Þ¤¹¡£¸å¤Ï¡ÖAPI »ÅÍͽñ¡×¤È SDK ¥¢¡¼¥«¥¤¥Ö¤Ë´Þ¤Þ¤ì¤ë¡ÖLinkingIFDemo¡×¤Î¥³¡¼¥É¤òÆɤ߹ç¤ï¤»¤ì¤ÐÍ×ÎΤòÍý²ò¤·¤ä¤¹¤¤¤Ç¤·¤ç¤¦¡£

    ¼ê¸µ¤Ç¤Ï Android ÈÇ SDK ¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£¾åµ­¤Î¥µ¥ó¥×¥ë¤ò¸µ¤ËºîÀ®¤·¤¿´Êñ¤Ê¥¢¥×¥ê¤Î¥³¡¼¥É¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£¥¢¥×¥ê¤Î¡ÖLED¡×¥Ü¥¿¥ó¤ò²¡¤¹¤ÈÏ¢·È¤º¤ß¥Ç¥Ð¥¤¥¹¤Î LED ¤¬ÅÀÅô¤·¡¢Ï¢·È¤º¤ß¥Ç¥Ð¥¤¥¹Â¦¤Î¥Ü¥¿¥ó²¡²¼Åù¤Î¥¤¥Ù¥ó¥È¤Ë¤è¤Ã¤Æ¥¢¥×¥ê¤¬ÄÌÃΤò¼õ¤±¤ë¤È¤½¤Î»Ý¤ò²èÌ̤Ëɽ¼¨¤¹¤ëÆâÍƤǤ¹¡£

    »îºî¡§Linking01

    MainActivity.java
    /**
     *
     * Linking01
     *
     * - Ï¢·È¤º¤ß Linking ¥Ç¥Ð¥¤¥¹¤Î LED ¤òÅÀÅô¤µ¤»¤ë
     * - Linking ¥Ç¥Ð¥¤¥¹¤«¤é¤ÎÄÌÃΤò¼õ¤±¼è¤ë
     *
     */
    
    package jp.klab.Linking01;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.media.AudioManager;
    import android.media.ToneGenerator;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    import com.nttdocomo.android.sdaiflib.Define;
    import com.nttdocomo.android.sdaiflib.NotifyNotification;
    import com.nttdocomo.android.sdaiflib.SendOther;
    
    public class MainActivity extends AppCompatActivity
            implements View.OnClickListener {
    
        private Context mCtx;
        private Button mButtonLED;
    
        private static final byte LINKING_IF_PATTERN_ID = 0x20; //LED¥Ñ¥¿¡¼¥ó¤ÎÀßÄê¹àÌÜID¡Ê¸ÇÄêÃÍ¡Ë
        private static final byte LINKING_IF_COLOR_ID = 0x30;   //LED¿§¤ÎÀßÄê¹àÌÜID¡Ê¸ÇÄêÃÍ¡Ë
        private static final byte COLOR_ID_RED = 0x01;  // ÅÀÅô¿§
        private static final byte BLINK_PATTERN = 0x22; // ÅÀÅô¥Ñ¥¿¡¼¥ó
    
        private NotifyNotification mNotifyNotification;
        private MyNotificationInterface mMyNotificationInterface;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mCtx = this;
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            mButtonLED = (Button)findViewById(R.id.buttonLED);
            mButtonLED.setOnClickListener(this);
            // Linking ¥Ç¥Ð¥¤¥¹¤«¤é¤ÎÄÌÃμõ¿®ÍÑ
            mMyNotificationInterface = new MyNotificationInterface();
            mNotifyNotification = new NotifyNotification(this, mMyNotificationInterface);
        }
    
        @Override
        public void onClick(View v) {
            // LED ¥Ü¥¿¥ó²¡²¼¤ÇÏ¢·È¤º¤ß¥Ç¥Ð¥¤¥¹¤¢¤Æ¤Ë LED ÅÀÅô»Ø¼¨¤òÁ÷¤ë
            if (v == (View)mButtonLED) {
                SendOther sendOther = new SendOther(this);
                sendOther.setIllumination(
                        new byte[] {
                                LINKING_IF_PATTERN_ID,
                                BLINK_PATTERN,
                                LINKING_IF_COLOR_ID,
                                COLOR_ID_RED
                        });
                sendOther.send();
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mNotifyNotification.release();
        }
    
        private class MyNotificationInterface implements NotifyNotification.NotificationInterface {
            @Override
            public void onNotify() { // ÄÌÃΤò¼õ¿®¤·¤¿
                // Linking ¥Ç¥Ð¥¤¥¹¤«¤é¤ÎÄÌÃÎÆâÍÆ¤Ï SharedPreferences ¤Ëµ­Ï¿¤µ¤ì¤ë
                SharedPreferences preference =
                        getSharedPreferences(Define.NotificationInfo, Context.MODE_PRIVATE);
                int DEVICE_ID = preference.getInt("DEVICE_ID", -1);
                int DEVICE_BUTTON_ID = preference.getInt("DEVICE_BUTTON_ID", -1);
                // Toast ɽ¼¨
                Toast.makeText(mCtx, "onNotify: DEVICE_ID=" + DEVICE_ID +
                        " DEVICE_BUTTON_ID=" + DEVICE_BUTTON_ID, Toast.LENGTH_SHORT).show();
                // ²»¤âÌĤ餹
                ToneGenerator toneGenerator
                               = new ToneGenerator(AudioManager.STREAM_SYSTEM, ToneGenerator.MAX_VOLUME);
                toneGenerator.startTone(ToneGenerator.TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING);
            }
        }
    }
    

    »îºî¤ÎÆ°ºî¤ÎÍÍ»Ò

    ¡ÊÆ°²è¡§36Éà ²»¤Ê¤·¡Ë

    Linking ¤Ç¤Î¥Ç¥Ð¥¤¥¹¡¦¥¢¥×¥ê¤ÎÀßÄê¼ê½ç

    Linking Âбþ¥Ç¥Ð¥¤¥¹¤È Linking ¥¢¥×¥ê¤òÏ¢·È¤µ¤»¤ë¤¿¤á¤Ë¤Ï»öÁ°¤ËÀßÄ꤬ɬÍפǤ¹¡£¼ê½ç¤Ï°Ê²¼¤ÎÍ×ÎΤǤ¹¡£

    1. üËö¤Ë¡ÖLinking¡×¤ò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë¡Ê̤¥¤¥ó¥¹¥È¡¼¥ë¤Î¾ì¹ç¤Î¤ß¡Ë

               Linking¡ÊAndroid ÈÇ¡Ë- play.google.com

    2. Ï¢·È¤µ¤»¤ë¥¢¥×¥ê¡Ê¤³¤³¤Ç¤Ï¼«ºî¤Î¡ÖLinking01¡×¡Ë¤Î¥¤¥ó¥¹¥È¡¼¥ë¤ò¹Ô¤¤ Linking ¤ò¼Â¹Ô¤¹¤ë
        
    3. ¡Ö¥Ç¥Ð¥¤¥¹¤Î¸¡º÷¡×¤ò¹Ô¤¤Ï¢·ÈÂоݤΥǥХ¤¥¹¤ò Linking ¤ËÀܳ¤¹¤ë¡ÊÅö³º¥Ç¥Ð¥¤¥¹¤ò̤ÅÐÏ¿¤Î¾ì¹ç¤Î¤ß¡Ë
              
           
    4. ¥Ç¥Ð¥¤¥¹¤ÎÅÐÏ¿¡¦Àܳ¤¬´°Î»¤·¤¿¤é¡Ö¥Ç¥Ð¥¤¥¹¾ÜºÙ²èÌ̡פذÜÆ°¤·Åö³º¥Ç¥Ð¥¤¥¹¤ÈÏ¢·È¤µ¤»¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡ÊÊ£¿ô²Ä¡£¤³¤³¤Ç¤Ï¡ÖLinking01¡×¡Ë¤òÀßÄꤹ¤ë
              
    5. Linking ¤òÈ´¤±¾å¤Î¼ê½ç¤ÇÀßÄꤷ¤¿¥¢¥×¥ê¤òµ¯Æ°¤·¤Æ¥Ç¥Ð¥¤¥¹¤È¤ÎÏ¢·È¤ò³Îǧ¤¹¤ë
           

    È÷¹Í¡§ ¥Ç¥Ð¥¤¥¹¤Î Linking ¤Ø¤ÎºÆÀܳ¤Ë¤Ä¤¤¤Æ

    ¼ê¸µ¤Î Android 5.1 üËö¤Î´Ä¶­¤Ç¤Ï°Ê²¼¤Î¸½¾Ý¤¬¸«¤é¤ì¤Þ¤¹¡£Linking ¤Î¥Ð¡¼¥¸¥ç¥ó¤Ï 2016ǯ8·î¸½ºßºÇ¿·¤Î¡Ö03.10.00000¡×¤Ç¤¹¡£

    • Linking ¤ËÀܳ¤º¤ß¤Î¥Ç¥Ð¥¤¥¹¤ò Linking ¾å¤Ç¡ÖÀÚÃǡפ¹¤ë¤ÈºÆÀܳ¤Ç¤­¤Ê¤¯¤Ê¤ë
                 
    ¼ê¸µ¤Ç¤Ï¤³¤Î¾õ¶·¤Ë°Ê²¼¤Î¼ê½ç¤ÇÂн褷¤Æ¤¤¤Þ¤¹¡£
    • Android ¤Î Bluetooth ÀßÄê¤Ë¤ª¤¤¤ÆÅö³º¥Ç¥Ð¥¤¥¹¤È¤Î¥Ú¥¢¤ò²ò½ü¤·¤Æ¤«¤é Linking ¾å¤ÇºÆÀܳ¤ò¹Ô¤¦
                 
           
    ´ØÏ¢µ­»ö
    (tanabe)
    klab_gijutsu2 at 19:54¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(2)
    2016ǯ03·î11Æü

    ¡ÖÆþ±¡¼Ô¤È³°Éô¤È¤Î¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¡×¤Ø¤Î IoT ¤Î±þÍÑ

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    ¥Õ¥§¥¤¥¹¥¹¥±¡¼¥ë¤Î¤³¤È

    ÀèÆü¿ÈÆ⤬Æþ±¡¤·¤¿Àޤˤ³¤¦¤¤¤¦´é¤Î³¨¤ÎÆþ¤Ã¤¿¥¯¥ê¥¢¥Õ¥¡¥¤¥ë¤òÉÂÅï¤Ç¸«¤«¤±¤Þ¤·¤¿¡£

    ¥Õ¥§¥¤¥¹¥¹¥±¡¼¥ë¡Ê±Ñ: Face scale¡Ë¤È¤Ï¡¢¸½ºß¡×¤ÎÄˤߤò¡Ö¤Ë¤Ã¤³¤ê¾Ð¤Ã¤¿´é¡×¤«¤éÉáÄ̤δ顢
    ¤½¤·¤Æ¡Ö¤·¤«¤á¤ÃÌ̡פ½¤·¤Æ¡Öµã¤­´é¡×¤Þ¤Ç¤ÎÍÍ¡¹¤ÊÃʳ¬¤Î´é¤òÍÑ°Õ¤·¤Æ¡¢¿À·ÐÄˤʤɤÎÄˤߤò
    Áʤ¨¤Æ¤¤¤ë´µ¼Ô¤Ë¤É¤Î¤°¤é¤¤Äˤà¤Î¤«¤ò¼¨¤·¤Æ¤â¤é¤¦¤³¤È¤Ç¡¢¤½¤ÎÄˤßÅÙ¤òµÒ´ÑŪ¤ËÃΤ뤿¤á¤Ë¡¢
    ¥Ú¥¤¥ó¥¯¥ê¥Ë¥Ã¥¯¡¦Ëã¿ì²Ê¤Ê¤É¤ÇÍѤ¤¤é¤ì¤ëÍѶñ¡¦ÍÑ»æ¤Î¤³¤È¤Ç¤¢¤ë¡£
    
    ´Ç¸î»Õ¤µ¤ó¤¬¥Ù¥Ã¥É¤Ë²£¤Ë¤Ê¤Ã¤¿¤Þ¤Þ¤Î¤´¹âÎð¼Ô¤Ë¤³¤ì¤ò¸«¤»¤Ê¤¬¤éÂ礭¤ÊÌÀ¤ë¤¤À¼¤Ç¿Ò¤Í¤Æ¤¤¤ëÍͻҤ¬°õ¾Ý¤Ë»Ä¤ê¤Þ¤·¤¿¡£¤¿¤Ã¤¿°ìËç¤Î°õºþʪ¤Ç¤¹¤¬¡¢¼«Í³¤ËÏä·¤¿¤êÂΤòÆ°¤«¤·¤¿¤ê¤¹¤ë¤³¤È¤Î¤à¤º¤«¤·¤¤¾õÂÖ¤ÎÆþ±¡¼Ô¤È¤Î¤ä¤ê¤È¤ê¤Ë¤ÏÆäËÍ­ÍѤʥġ¼¥ë¤Ç¤¢¤ë¤³¤È¤¬ÁÛÁü¤µ¤ì¤Þ¤¹¡£

    Æþ±¡¼Ô¤È³°Éô¤È¤Î¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤Ø¤Î IoT ¤Î±þÍÑ

    ·ÈÂÓüËö¤Ç¤ÎÅŻҥ᡼¥ëÍøÍѤÎÉáµÚ¤Ë¤è¤êÆþ±¡¼Ô¤È³°Éô¤È¤ÎÏ¢Íí¤Ï¥á¡¼¥ë°ÊÁ°¤Î»þÂå¤ËÈæ¤Ù³ÊÃʤËÊØÍø¤Ë¤Ê¤ê¤Þ¤·¤¿¡£É¼¼Æâ¤Ç¤ÎÄÌÏäÏ̵Íý¤Ç¤â¥á¡¼¥ë¤ÎÁ÷¼õ¿®¤Ï¿¤¯¤Î¾ì¹çǧ¤á¤é¤ì¤Æ¤ª¤ê¡¢¤ª¤½¤é¤¯¤Ï»ÜÀߦ¤¬ÅÁ¸À¤ò¼è¤ê¼¡¤°ÉÑÅÙ¤âÀΤè¤ê¤â¤º¤Ã¤È¾¯¤Ê¤¯¤Ê¤Ã¤¿¤³¤È¤Ç¤·¤ç¤¦¡£

    ¤½¤Î°ìÊý¤Ç¡¢¾É¾õ¤ä¾õ¶·¤Ë¤è¤Ã¤Æ¤Ï¾®¤µ¤Ê¥­¡¼¤òÁàºî¤¹¤ë¤³¤È¤¬º¤Æñ¤Ç¤¢¤Ã¤¿¤ê¡¢¤¢¤ë¤¤¤Ï·ÈÂÓüËö¤ä¥á¡¼¥ë¤È¤ÎÀÜÅÀ¤òÁÛÁü¤·¤Ë¤¯¤¤Ê·°Ïµ¤¤ÎÆþ±¡¼Ô¤â¾¯¤Ê¤¯¤Ê¤¤¤³¤È¤òÏ¢Æü¤ÎÉÂÅïÆâ¤Î¸÷·Ê¤Ç¤¢¤é¤¿¤á¤Æ¼Â´¶¤·¤Þ¤·¤¿¡£»ÄÇ°¤Ê¤³¤È¤Ë¡¢¸½¼Â¤Ë¤Ï¤½¤¦¤¤¤¦¿Í¤¿¤Á¤Ë¤³¤½´Ø·¸¼Ô¤È¤ÎÆü¾ïŪ¤Ê¤Ä¤Ê¤¬¤ê¤¬¤è¤êɬÍפʥ±¡¼¥¹¤¬Â¿¤¤¤è¤¦¤Ë¤â´¶¤¸¤é¤ì¤Þ¤¹¡£¤¿¤È¤¨ºÇ¾®¸Â¤ÎÆâÍƤǤ¢¤Ã¤Æ¤âÅö»ö¼Ô´Ö¤Ç¼ê·Ú¤Ë¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤ò¤È¤ë¤³¤È¤¬¤Ç¤­¤ì¤ÐÁÐÊý¤ÎÉ԰¤¬³Î¼Â¤Ë·Ú¤¯¤Ê¤ë¤³¤È¤ò¹Í¤¨¤¢¤ï¤»¤ë¤È¡¢¼Ò²ñ¤Î¹âÎ𲽤¬¿Ê¹Ô¤¹¤ë¾õ¶·¤Ë¤¢¤Ã¤Æ¤³¤ÎÏÃÂê¤ÏÀøºßŪ¤ÊɬÍ×À­¤Î¹â¤¤¥Æ¡¼¥Þ¤Î¤Ò¤È¤Ä¤È¸À¤¨¤ë¤Î¤Ç¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¤«¡£

    »î¤ß¤Ë¡¢¥Õ¥§¥¤¥¹¥¹¥±¡¼¥ë¤ò¥Ò¥ó¥È¤Ëɼ¼Æâ¤Ç¤Î»ÈÍѤòÁÛÄꤷ¤Æ¤´¤¯´Êñ¤ÊÁàºî¤ÇÎ¥¤ì¤¿Áê¼ê¤È¥á¥Ã¥»¡¼¥¸¤ò¸ò¤ï¤¹¤·¤¯¤ß¤ò·Á¤Ë¤·¤Æ¤ß¤Þ¤·¤¿¡£¿È¶á¤Ê¾ìÌ̤ǤμÂÍÑÀ­¤Î¤¢¤ë IoT ¤Î¥¢¥¤¥Ç¥£¥¢¤È¤·¤Æ¾Ò²ð¤·¤Þ¤¹¡£

    »îºîÁõÃ֤γ°´Ñ¤È³µÍ×

    ²¼¤Î¼Ì¿¿¤ÎÁõÃ֤Τ¤¤º¤ì¤«¤Î¥Ü¥¿¥ó¤ò²¡¤¹¤ÈÁê¼ê¦¤ÎÁõÃÖ¤ÎƱ¤¸³¨¤Î²¼¤ÎÎФΠLED ¤¬ÅÀÌǤ·¡¢Ê»¤»¤Æ¤½¤Î³¨ÊÁ¤òź¤¨¤¿¥á¡¼¥ë¤¬½êÄê¤Î¥¢¥É¥ì¥¹¤ØÆϤ­¤Þ¤¹¡£
    ¿Æ¤·¤¤´ÖÊÁ¤Î¿Í¤ä¼«Ê¬¼«¿È¤¬É¼¼¤Î¥Ù¥Ã¥É¤Ç¶ì¤·¤ó¤À·Ð¸³¤Î¤¢¤ëÊý¤Ë¤Ï¤ï¤«¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¤¬¡¢¤¤¤ÞÆþ±¡¼Ô¤Ë¡Ö¥Ü¥¿¥ó¤ò²¡¤¹¤À¤±¤Î;Îϡפȡֳ¨ÊÁ¤òÁªÂò¤¹¤ë°Õ¼±¡×¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤ò¾ðÊó¤È¤·¤ÆÅÁ¤¨¤é¤ì¤ë¤³¤È¤Ë¤Ï¡¢Î¥¤ì¤Æ°Æ¤º¤ë¦¤Ë¤È¤Ã¤Æ¤âÆþ±¡¼Ô¼«¿È¤Ë¤È¤Ã¤Æ¤â¤½¤ì¼«ÂΤËÂ礭¤Ê°ÕÌ£¤¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢°ìÊýÄ̹ԤǤϤʤ¯Áê¼ê¤«¤é¤ÎÈ¿±þ¤¬¼ê¸µ¤ËÆϤ¯¤³¤È¤ÏÁÐÊý¤ÎÀº¿ÀŪ¤Ê»Ù¤¨¤È¤Ê¤ë¤Ç¤·¤ç¤¦¡£¼Ì¿¿¤Î¤È¤ª¤ê¡¢¸ß¤¤¤Ë¸ÀÍÕ¤ä°ÕÌ£¤Ç¤Ï¤Ê¤¯µ¤»ý¤Á¤ä°Õ¼±¤òÅÁ¤¨¤ë¤³¤È¤Ë¼ç´ã¤òÃÖ¤¤¤Æ¤½¤ì¤¾¤ì¤Î¥Ü¥¿¥ó¤Î³¨ÊÁ¤Ï¤¢¤¨¤Æ²ò¼á¤Î;ÃϤι­¤¤¤â¤Î¤òÁª¤ó¤Ç¤¤¤Þ¤¹¡£

    ¢¨¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨
     

    ÁõÃÖ¤òɼ¼¤ËÀßÃÖ¤·¤¿¥¤¥á¡¼¥¸

    ¥á¡¼¥ë¤Ë¤Ï²¡¤·¤¿¥Ü¥¿¥ó¤Î²èÁü¤¬¥¤¥ó¥é¥¤¥ó¤Çɽ¼¨¤µ¤ì¥ê¥ó¥¯¤Î¥¯¥ê¥Ã¥¯¤ÇÊÖ¿®ÍѤΥڡ¼¥¸¤¬³«¤¯

    • ¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÀܳ´Ä¶­¤òÈ÷¤¨¤¿Æþ±¡»ÜÀߤ¬¾¯¤Ê¤¤¤³¤È¤ò¹Íθ¤·ÁõÃ֤ϸ½ºß¤â¤Ã¤È¤âÄ㥳¥¹¥È¤Ç¥â¥Ð¥¤¥ëÄÌ¿®¤Î¥Ï¥ó¥É¥ê¥ó¥°¤¬²Äǽ¤Ê Raspberry Pi ¡Ü 3G ¥â¥Ç¥à¤Î¹½À®¤Ç MVNO SIM ¤ò»ÈÍѤ·¤Æ¤ª¤ê¥³¥ó¥»¥ó¥È¤Ò¤È¤Ä¤Ç²ÔƯ²Äǽ
    • ¼«Ê¬¤¬²¡¤·¤¿¥Ü¥¿¥ó¤ÏÀÖ LED ¤ÎÅÀÅô¡¢Áê¼ê¤Î²¡¤·¤¿¥Ü¥¿¥ó¤ÏÎФΠLED ¤Î´Ë¤ä¤«¤ÊÅÀÌǤǼ¨¤µ¤ì¤ë
    • ÁõÃִ֤Υá¥Ã¥»¡¼¥¸¥ó¥°¤Ë¤Ï Milkcocoa ¡¢¥á¡¼¥ëÁ÷¿®¤Ë¤Ï SendGrid ¤òÍøÍÑ
    • À֥ܥ¿¥ó¤Î²¡²¼¤Ç³Æ LED ¤ò¾ÃÅô¡¢5Éðʾå¤ÎĹ²¡¤·¤ÇÁõÃÖ¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó
    • ±¦Ã¼¤Î LED ¤ÏÁõÃ֤βÔƯ¤ò¼¨¤¹¥Ñ¥¤¥í¥Ã¥È¥é¥ó¥×

    Æ°ºî¤ÎÍͻҡÊÆ°²è¡§2ʬ20Éà ²»À¼¤Ê¤·¡Ë

    ¤³¤Î¥Ç¥âÆ°²è¤ÏÆþ±¡¼Ô¦¤¬¼ÂÁõÃÖ¤ò»ÈÍѤ·Áê¼ê¦¤¬¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÀܳ´Ä¶­¤Î¤â¤È¤Ç Web ÈǤβ¾ÁÛÁõÃÖ¤ò»ÈÍѤ¹¤ë¤³¤È¤òÁÛÄꤷ¤¿ÆâÍƤǤ¹¡£¤â¤Á¤í¤óÆóÂæ¤Î¼ÂÁõÃִ֤Ǥαþ½·¤â²Äǽ¤Ç¤¹¡£

    ²èÁü¤Ë¤Ä¤¤¤Æ

    º£²ó¤Î»îºî¤Ç¤Ï²èÁü¤¬¥³¥ß¥å¥Ë¥±¡¼¥·¥ç¥ó¤ÎÃç²ð¼Ô¤È¤·¤ÆÂ礭¤ÊÌò³ä¤òô¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤é¤Ïɼ¼¤È¤¤¤¦µ¤»ý¤Á¤ÎÄÀ¤ß¤¬¤Á¤Ê¶õ´Ö¤Ë¾®¤µ¤ÊÌþ¤·¤òÅô¤¹¥·¥ó¥Ü¥ë¤Ç¤â¤¢¤ê¤Þ¤¹¡£°ìÏ¢¤Î²èÁü¤Ï Beeboo.SLI¡Ê¥Ó¥Ö¡¼¥¹¥é¥¤¡ËÍͤ¬±¿ÍѤµ¤ì¤ë²èÁüÁǺॵ¥¤¥È ¡Ö¥¤¥é¥¹¥È̵ÎÁÁǺࡡ¥¤¥é¥¹¥È¥Ü¥Ã¥¯¥¹¡×¤Ø I¡ã¥¢¥¤¡ä¤µ¤ó ¤¬·ÇºÜ¤µ¤ì¤¿ºîÉʤò²Ã¹©¤·¤Æ»ÈÍѤµ¤»¤Æ夤¤Æ¤¤¤Þ¤¹¡£I¡ã¥¢¥¤¡ä¤µ¤ó¤ÎÁÇŨ¤Ê¥¤¥é¥¹¥È¤ÈÁÇÀ²¤é¤·¤¤¥µ¥¤¥È¤Ë¶à¤ó¤Ç¸æÎ鿽¤·¾å¤²¤Þ¤¹¡£

    ÁõÃ֤Ť¯¤ê

    ¥á¥¤¥ó¤ÎÍ×ÁÇ

    ¤³¤ì¤é¤ËÀâÌÀ¤ÏÍפé¤Ê¤¤¤Ç¤·¤ç¤¦¡£¤¤¤º¤ì¤â¡Ö»ý¤Ã¤Æ¤¤¤ë¤ÈÊØÍø¡×¤ÊÆ»¶ñ¤Ç¤¹¡£
    Raspberry Pi 2 Model B

    ¥¢¥Þ¥¾¥ó¤Ç 5,000±ßÁ°¸å
    3G USB ¥â¥Ç¥à¡§ L-05A

    2015ǯ10·î¤Ë¡Ö¥¤¥ª¥·¥¹¡×¤Ç 1,180±ß¤Ç¹ØÆþ¡ÊÃæ¸Å¡Ë
    MVNO SIM¡§0 SIM
    ¡Ê¥Ç¥¸¥â¥Î¥¹¥Æ¡¼¥·¥ç¥ó 2016ǯ02·î¹æÉÕ°ÈÇ¡Ë

    ¼ê¸µ¤Î SORACOM Air ¤È¤É¤Á¤é¤ò»È¤¦¤«Ì¤ä¿¤¬º£²ó¤Ï 0 SIM ¤ò»ÈÍÑ

    ãþÂΤκàÎÁ¤È²Ã¹©

    º£²ó¤ÎÁõÃ֤ǤÏÁàºîÍѤΥܥ¿¥ó¤ÎÁªÄ꤬Â礭¤Ê¥Ý¥¤¥ó¥È¤Ç¤·¤¿¡£¾®¤µ¤¹¤®¤ºÂ礭¤¹¤®¤Ê¤¤¤â¤Î¤òõ¤·°Ê²¼¤ÎÀ½ÉʤòÁª¤Ó¤Þ¤·¤¿¡£

    ¥Ñ¥Í¥ë¼èÉÕÍѲ¡¤·¥Ü¥¿¥ó¥¹¥¤¥Ã¥Á¡ÊÎп§¡Ë¤Ç¤¹¡£²á¹ó¤Ê»ÈÍѤËÂѤ¨¤é¤ì¤ë¥Ø¥Ó¡¼¥Ç¥å¡¼¥Æ¥£¡¼
    »ÅÍͤǤ¹¡£¥×¥Ã¥·¥åµ¡¹½Éô¡Ê¼ù»éÀ½¡Ë¤È¥Þ¥¤¥¯¥í¥¹¥¤¥Ã¥Á¤Ç¹½À®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
    

    ¤³¤Î¥Ü¥¿¥ó¤Ï¼è¤ê¤Ä¤±»þ¤ÎÀêͭľ·Â¤¬¤ª¤è¤½ 34mm ¤Ç¡¢¤³¤ì¤ò 5mm ÄøÅÙ¤Î´Ö³Ö¤Ç 7¤ÄÀßÃÖ¤¹¤ë¤Ë¤ÏºÇÄã 28cm ¤Û¤É¤ÎŤµ¤¬É¬ÍפǤ¹¡£100±ß¥·¥ç¥Ã¥×¤ò¤¤¤¯¤Ä¤«¸«¤Æ¤Þ¤ï¤êãþÂΤȤ·¤Æ¼Ì¿¿¤Î¥Ñ¥¹¥¿¥±¡¼¥¹¤òÁª¤Ó¤Þ¤·¤¿¡ÊŤµ¡§30.6cm Éý¡§8.5cm ¹â¤µ¡§7.6cm¡Ë¡£ ³¸¤ÎÊý¤¬¾¯¤·¹­¤á¤ÎÂæ·Á¤Ç¡¢¸Ç¤¤Äì¤Î¤Û¤¦¤ò¾å¤Ë¤¹¤ì¤Ð°ÂÄê´¶¤¬¤¢¤ê¤Þ¤¹¡£

    ¤³¤Î¥±¡¼¥¹¤ÎÄì¤Ë¥Ü¥¿¥ó¤ò¼è¤ê¤Ä¤±¤ë¤Ë¤Ï¸ü¤µ 3mm ¤Î¥Ý¥ê¥×¥í¥Ô¥ì¥óÈÄ¤Ë 30mm ÄøÅ٤Τޤ뤤·ê¤¬ 7¤ÄɬÍפǤ¹¡£º£¤Î¼«Ê¬¤Î¹©ºîÎϤǤϤ³¤Î¤è¤¦¤Ë¹Å¤¯¸ü¤ß¤Î¤¢¤ëÁǺà¤ËåºÎï¤Ê¤Þ¤ë¤¤·ê¤ò¤¢¤±¤ë¤³¤È¤¬Æñ¤·¤¯¡¢Îý½¬ÍѤÎͽÈ÷¤Ç¤¢¤ì¤³¤ì¤ä¤Ã¤Æ¤ß¤Þ¤·¤¿¤¬¤Ê¤«¤Ê¤«¤¦¤Þ¤¯¤¤¤­¤Þ¤»¤ó¡£Å¹Àè¤Ç¤¿¤Þ¤¿¤ÞÌîºÚÄ´ÍýÍѤζâ°À½¤ÎÈ´¤­·¿¤¬ÌܤˤȤޤê¤Þ¤·¤¿¡£²¼¤Î¼Ì¿¿¤ÎÂç2 + ¾®2 ¥»¥Ã¥È¤Î¡Ö¾®¡×¤Î»ý¤Á¼ê¦¤Î³°·Â¤¬ 3cm ¤Ë¶á¤¯¡¢»î¤·¤Ë¤³¤ì¤òÇ®¤·¤Æ¥±¡¼¥¹¤Ë²¡¤·Åö¤Æ¤ë¤È¤Á¤ç¤¦¤É¤è¤¤¥µ¥¤¥º¤ÎåºÎï¤Ê·ê¤¬ÆÀ¤é¤ì¤Þ¤·¤¿¡£¥±¡¼¥¹¤Îξü¤Ë¤Ï 1cm ¤Î¥Þ¡¼¥¸¥ó¤òÀߤ±¡¢¥·¥ã¥Ã¥È¥À¥¦¥ó¥Ü¥¿¥óÍѤΰìÈÖ±¦¤Î·ê¤ÏÎÙ¤ê¤È 1cm Î¥¤·¤Æ¤¢¤È¤Ï 5mm ´Ö³Ö¤Ç·ê¤ò¤¢¤±¤Þ¤·¤¿¡£

    ÌîºÚ¤ÎÈ´¤­·¿ ¡Ê¶â°À½¡Ë

    ·ê¤ò¤¢¤±½ª¤¨¤¿¥±¡¼¥¹

    ¥Ñ¡¼¥Ä¤Î¼è¤ê¤Ä¤±

    ¼ÂºÝ¤Ë¥Ü¥¿¥ó¤ò¼è¤ê¤Ä¤±¤Æ¤ß¤ë¤ÈÁ´ÂΤΰõ¾Ý¤ÏÅö½é¤Î¥¤¥á¡¼¥¸¤É¤ª¤ê¤Ç¤·¤¿¡£¤¿¤À¡¢¥Ü¥¿¥ó 7¸Ä¡¢LED 13¸Äʬ¤Î·× 40ËܤÎÇÛÀþ¤òÆâÉô¤Î»Ä¤ê¤Î¥¹¥Ú¡¼¥¹¤Î»ÍÊý¤Ø¤á¤°¤é¤»¤ë¤Ë¤ÏÅŻҹ©ºîÍѤΰìÈÌŪ¤Ê¥ï¥¤¥ä¤Ç¤Ï¸Ç¤¹¤®¤Æ¼è¤ê²ó¤·¤ËÍ»Ä̤¬Íø¤«¤º¡¢½À¤é¤«¤¤Æ³Àþ¤ò²Ã¹©¤·¤ÆãþÂÎÆâ¤Î·ä´Ö¤ØÇç¤ï¤»¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£¥¹¥Ú¡¼¥¹ÀáÌó¤Î¤¿¤á GND ¤Ø¤Î·Ò¤®¹þ¤ß¤Ë¤Ï¥á¥¹¤Î¥Ô¥ó¥½¥±¥Ã¥È¤Î¥ª¥¹Â¦¤ò¥¹¥º¥á¥Ã¥­Àþ¤ÇÏ¢·ë¤·¤¿¤â¤Î¤ò»È¤¤¤Þ¤·¤¿¡£

    ¤¶¤Ã¤¯¤ê·ëÀþ¡£¥ï¥¤¥ä¤¬¸Ç¤¤

    ƳÀþ¤ËLED¤ÈÄñ¹³¤È¥Ï¥ó¥À¤Å¤±¤·¤ÆËöü¤ò¥ª¥¹¡¦¥á¥¹²½

    ºÛÃǤ·¤¿¿§²èÍÑ»æ¤ò²Ã¹©

    ¥±¡¼¥¹¤Ø°ì¼°¤ò¼ýǼ¤·¤ÆÆ°ºî³Îǧ

    ¥½¥Õ¥È¥¦¥§¥¢Í×ÁÇ

    ºîÀ®¤·¤¿¥×¥í¥°¥é¥àÎà°ì¼°¤ò°Ê²¼¤Î¾ì½ê¤Ç¸ø³«¤·¤Æ¤¤¤Þ¤¹¡£

    https://github.com/mkttanabe/iot_hospital

    »ÈÍѤ·¤Æ¤¤¤ë¥½¥Õ¥È¥¦¥§¥¢»ñ»º¤È¥µ¡¼¥Ó¥¹

    ÅÚÂæ¤Î Raspberry Pi 2 Model B ¤Ë¤Ïɸ½à¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥·¥ç¥ó¤Î Raspbian ¤ò¥¤¥ó¥¹¥È¡¼¥ë¤º¤ß¤Çº£²ó¤Ï°Ê²¼¤Î¥½¥Õ¥È¥¦¥§¥¢»ñ»º¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£

    ¤Þ¤¿¡¢¤Õ¤¿¤Ä¤ÎÍ¥¤ì¤¿¥µ¡¼¥Ó¥¹¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£
    • Milkcocoa¡¡ÁõÃִ֤Υá¥Ã¥»¡¼¥¸¥ó¥°ÍÑ
    • SendGrid¡¡¼ÂÁõÃÖ¤«¤é¤Î¥á¡¼¥ëÁ÷¿®ÍÑ

    ¥á¥¤¥ó¥×¥í¥°¥é¥à

    ¼ÂÁõÃÖÍÑ¤Î¥×¥í¥°¥é¥àËÜÂÎ¤Ï Node.js ¥¹¥¯¥ê¥×¥È¤È¤·¤Æµ­½Ò¤·¤Æ¤¤¤Þ¤¹¡£

    /home/pi/node/iot_hospital.js

    Web ÈDz¾ÁÛÁõÃ֤Υڡ¼¥¸¤Ï°Ê²¼¤Î URL ¤«¤é»²¾È¤Ç¤­¤Þ¤¹¡£

    http://dsas.blog.klab.org/data/iot_hospital/index.html?ID02&ID01

    Ãí¡§Web ÈǤÎÆ°ºî¤Ë¤Ï Milkcocoa ¥¢¥«¥¦¥ó¥È¤ò¼èÆÀ¤· 22¹Ô¤á¤ËÀµ¤·¤¤ APP ID ¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹

    ¥â¥Ç¥à¤Þ¤ï¤ê

    L-05A ¡Ü 0 SIM ¤ÎÁȤ߹ç¤ï¤»¤Ç¤Î¥¤¥ó¥¿¡¼¥Í¥Ã¥È¤Ø¤ÎÀܳ¤Ë¤Ï wvdial ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£/etc/wvdial.conf ¤Ï°Ê²¼¤ÎÆâÍÆ¡£"sudo wvdial" ¤Î¼Â¹Ô¤ÇÀܳ¤ò³«»Ï¤·¤Þ¤¹¡£

    /etc/wvdial.conf

    [Dialer Defaults]
    init1 = ATZ
    init2 = AT+CGDCONT=1,"IP","so-net.jp"
    Password = nuro
    Username = nuro
    Dial Attempts = 3
    Stupid Mode = 1
    Modem Type = Analog Modem
    Dial Command = ATD
    Stupid Mode = yes
    Baud = 115200
    New PPPD = yes
    Modem = /dev/ttyACM0
    ISDN = 0
    Phone = *99***1#
    Carrier Check = no
    

    ¢¨L-05A ¤Ï¥¼¥í¥¤¥ó¥¹¥È¡¼¥ëµ¡Ç½¤òÆ⢤·¤Æ¤ª¤ê½Ð²Ù»þ¤ÎÀßÄê¤Ë¤è¤ê USB Àܳ»þ¤Ë¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç CD-ROM ¥Ç¥Ð¥¤¥¹¤È¤·¤Æǧ¼±¤µ¤ì¤Þ¤¹¡£eject ¥³¥Þ¥ó¥É¤ÇËè²ó¤³¤ì¤ò²ò½ü¤¹¤ë¤Î¤¬ÈѤ路¤¤¤¿¤á¼ê¸µ¤Ç¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç USB ¥â¥Ç¥à¤È¤·¤Æǧ¼±¤µ¤ì¤ë¤è¤¦¤ËÀßÄê¤òÊѹ¹¤·¤Æ¤¤¤Þ¤¹¡£

    ¥â¥Ç¥à¥â¡¼¥É¤ËÀßÄꤷ¤¿ L-05A ¤Ï lsusb ¥³¥Þ¥ó¥É¤Ç°Ê²¼¤ÎÍ×ÎΤÇɽ¼¨¤µ¤ì¤Þ¤¹¡£

    Bus 001 Device 004: ID 1004:6124 LG Electronics, Inc. 
    

    ¥¹¥¿¡¼¥È¥¢¥Ã¥×¤Þ¤ï¤ê

    ¥·¥¹¥Æ¥àµ¯Æ°»þ¤Ëº£²ó¤Î°ì¼°¤ò¼«Æ°¼Â¹Ô¤¹¤ë¤¿¤á¤Ë /etc/rc.local ¤Ë iot_hospital.sh ¤Î¸Æ¤Ó½Ð¤·¤òµ­½Ò¤·¤Æ¤¤¤Þ¤¹¡£ iot_hospital.sh ¤Ï L-05A ¤¬ÁõÃ夵¤ì¤Æ¤¤¤ì¤Ð wvdial ¤Ç¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÀܳ¤ò»î¹Ô¤·¡¢Àܳ¤ËÀ®¸ù¤¹¤ì¤ÐÁ°·Ç¤Î iot_hospital.js ¤ò¼Â¹Ô¤·¤Þ¤¹¡£

    /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
      printf "My IP address is %s\n" "$_IP"
    fi
    
    # run app
    sudo /bin/bash /home/pi/node/iot_hospital.sh &
    
    exit 0
    

    /home/pi/node/iot_hospital.sh


    (tanabe)
    klab_gijutsu2 at 07:01¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(2)¨¢TrackBack(0)
    2016ǯ01·î01Æü

    ¥Í¥Ã¥È¥ï¡¼¥¯Âбþ¤Î¸÷ÄÌÃΥǥХ¤¥¹¤ò¼«ºî¤·¤Æ¤ß¤ë

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    ¡Öblink(1)¡×¤Î¤³¤È

    ¥³¡¼¥É¥Í¡¼¥à¤Î¤è¤¦¤ÊÀ½ÉÊ̾¤Ç¤¹¤¬¡¢¡Öblink(1)¡×¤Ï KickStarter ȯ¤Î¥«¥¹¥¿¥Þ¥¤¥º²Äǽ¤Ê USB ¥Ç¥Ð¥¤¥¹¤Ç¤¹¡£ÀܳÀè¤Îµ¡´ï¤ä¥Í¥Ã¥È¥ï¡¼¥¯¤«¤é½êÄê¤Î¾ðÊó¤ò¼õ¤±¤È¤ë¤È LED ¸÷¤Î¿§¤äÌÀÌǤˤè¤ê¿Í´Ö¤Ø¤ÎÄÌÃΤò¹Ô¤¦¤â¤Î¤Ç¡¢2012ǯ¤ËÀ½Éʲ½¤µ¤ì 2013ǯ¤Ë¤Ï IFTTT ¤È¤ÎÏ¢·Èµ¡Ç½¤ò¶¯²½¤·¤¿ blink(1) mk2 ¤¬¥ê¥ê¡¼¥¹¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    ʸ»ú¤Î¾ðÊó¤Ï¿Í´Ö¤¬°Õ¼±Åª¤Ë¤½¤³¤Ë¸þ¤­¹ç¤ï¤Ê¤±¤ì¤ÐÅÁ¤ï¤é¤º¡¢²»¤Î¾ðÊó¤Ï¾õ¶·¤Ë¤è¤ê¾ì¤Î´Ä¶­¤òÍ𤹲ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£°ìÊý¡¢¡Ö¸÷¡×¤Ë¤è¤ë¾ðÊó¤Ï¤½¤ì¤¬Å¬ÅÙ¤ÊÌÀ¤ë¤µ¤Ç¤¢¤ì¤Ð¾¤Î²¿¤«¤ò˸¤²¤ë¤³¤È¤Ê¤¯¿Í´Ö¤Î»ë³¦¤ØÆϤ­¼«Á³¤Ëǧ¼±¤µ¤ìÆÀ¤Þ¤¹¡£¤½¤Î¤³¤È¤ò±þÍѤ·¤¿Îã¤Ï¾¤Ë¤â¸«¤é¤ì¤Þ¤¹¤¬¡¢blink(1) ¤â¤Þ¤¿¸÷¤ÎÆÃÀ­¤ò³è¤«¤·¤¿µ¡´ï¤Î¤Ò¤È¤Ä¤Ç¤¹¡£

    www.kickstarter.com gigazine.net gigazine.net
    ¢¨¾ÜºÙ¤Ê¥ì¥Ý¡¼¥È¤¬ GIGAZINE Íͤΰʲ¼¤Î°ìÏ¢¤Îµ­»ö¤Ë·ÇºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î blink(1)¡¢¤Ê¤«¤Ê¤«³Ú¤·¤½¤¦¤Ê¤Î¤Ç»È¤Ã¤Æ¤ß¤¿¤¤¤È»×¤¤¤Þ¤·¤¿¡£¤¿¤À¡¢ÆüËܹñÆâ¤Ë¤Ïº£¤Î¤È¤³¤íÂåÍýŹ¤¬¤Ê¤¯¹ñ³°¤Î¥Þ¡¼¥±¥Ã¥È¤«¤é¹ØÆþ¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢¤³¤ì¤¬ * Èù̯¤Ë¹â²Á * ¤Ê¤Î¤Ç¤¹¤Í¡£ ¤½¤³¤Ç¡¢°ìÏ¢¤Îµ¡Ç½¤ÎÃæ¤Ç¤â¤Ã¤È¤â¶½Ì£¤Î¤¢¤ë¥Í¥Ã¥È¥ï¡¼¥¯Ï¢·ÈÉôʬ¤ò¼«ºî¤·¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£¤É¤³¤«¤Ç²¿¤«¤¬¤¢¤Ã¤¿¤éÃΤ餻¤ë¤È¤¤¤¦¤Î¤Ï¤Þ¤µ¤Ë IoT ¸þ¤­¤Î¥Æ¡¼¥Þ¤Ç¤¢¤ê¡¢¤Þ¤¿¡¢ÉáÃʤϼç¤Ë¥Ð¥¤¥×¥ì¥¤¥ä¡¼¤Ç¤¢¤ë LED ¤¬°ìÌö¼çÌò¤È¤Ê¤ë¤Á¤ç¤Ã¤ÈÌÌÇò¤¤¥±¡¼¥¹¤Ç¤â¤¢¤ê¤Þ¤¹¡£ÁõÃ֤ϡÖWi-Fi µ¡Ç½¤Ä¤­¤Î¾®¤µ¤Ê¥Þ¥¤¥³¥ó¡×¤È¤·¤Æ¤³¤Î¤È¤³¤í²¿¤«¤È½ÅÊõ¤·¤Æ¤¤¤ë ESP8266 ¥â¥¸¥å¡¼¥ë¤ò¥á¥¤¥ó¤Ë¹½À®¤¹¤ì¤Ð¼ê¶á¤ÊÁǺà¤Î¤ß¤Ç¤â USB ¥Ý¡¼¥È¤ØľÁÞ¤·²Äǽ¤Ê¥µ¥¤¥º¤Ë¼ý¤á¤ë¤³¤È¤¬²Äǽ¤Ç¤·¤ç¤¦¡£ÁõÃ֤ؤΥá¥Ã¥»¡¼¥¸¥ó¥°ÍѤΥ½¥ê¥å¡¼¥·¥ç¥ó¤Ë¤Ïº£²ó PubNub ¤òÁª¤Ó¤Þ¤·¤¿¡£

    PubNub ¤Î¤³¤È / ESP8266 ¤È¤Î´Ø·¸

    PubNub ¤Ï Pub/Sub ¥â¥Ç¥ë¤Î¥ê¥¢¥ë¥¿¥¤¥à¥á¥Ã¥»¡¼¥¸¥ó¥°µ¡Ç½¤ò¼ç¼´¤È¤¹¤ë BaaS ¤Ç¤¹¡£ 2010ǯ¤Î¥í¡¼¥ó¥Á°ÊÍ襹¥Þ¥Û¤ä Web ¥¢¥×¥ê¸þ¤±¤Î¥×¥Ã¥·¥åÄÌÃÎ¥µ¡¼¥Ó¥¹Åù¤òŸ³«¡¢¶áǯ¤Ï IoT ÊýÌ̤ˤâÃíÎϤ·¤Æ¤ª¤êÂбþ¸À¸ì¡¦´Ä¶­¤Î¹­¤¤Í­ÍѤʥץé¥Ã¥È¥Õ¥©¡¼¥à¤Î¤Ò¤È¤Ä¤Ç¤¹¡£¥µ¥Ý¡¼¥ÈÂоݤϸ½ºß¤â³ÈÂçÃæ¡¢¤Á¤Ê¤ß¤Ë̵ÎÁÏȤâ¤Ê¤«¤Ê¤«¤ÎÂÀ¤ÃÊ¢¤Ç¤¹¡£

    ¤Þ¤¿¡¢GET ¥ê¥¯¥¨¥¹¥È¥Ù¡¼¥¹¤Î REST API ¥»¥Ã¥È¤¬ÍÑ°Õ¤µ¤ì¤Æ¤ª¤ê¡ÊHTTPS, HTTP¡Ë¡¢¤³¤ì¤òÍøÍѤ¹¤ì¤Ð¾¤Î¥·¥¹¥Æ¥à¤ä¥Ç¥Ð¥¤¥¹¤«¤é¤â PubNub ¤Î½êÄê¤Î Channel ¤Ø½ÀÆð¤Ë¥á¥Ã¥»¡¼¥¸¤òÁ÷¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£ ¤³¤Î¤è¤¦¤ËÊص¹¤ÎÂ礭¤¤ PubNub ¤Ç¤¹¤¬¡¢¤³¤Îµ­»ö¤ò½ñ¤¤¤Æ¤¤¤ë 2015ǯ12·î»þÅÀ¤Ç¤Ï¼Â¤Ï´Î¿´¤Î ESP8266 ¤¬¤Þ¤À¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤Ç¤â¹¬¤¤Èó¸ø¼°¤Î¥¯¥é¥¤¥¢¥ó¥È¥é¥¤¥Ö¥é¥ê¤¬¸ø³«¤µ¤ì¤Æ¤¤¤ë¤³¤È¤òÃΤê¤Þ¤·¤¿¡£ËܲȤΠGitHub ¥ê¥Ý¥¸¥È¥ê¤Ë¤â fork ¤µ¤ì¤Æ¤¤¤ë¤³¤È¤«¤éÈó¸ø¼°¤Ê¤¬¤é¤â¸øǧ¤Î°ÌÃ֤Ť±¤Î¤è¤¦¤Ç¤¹¡£ ¾å¤Îµ­»ö¤Î¤È¤ª¤ê¤³¤ÎÈó¸ø¼°¥é¥¤¥Ö¥é¥ê¤ÏǤ°Õ¤Î¥¿¥¤¥ß¥ó¥°¤Ç¤ÎÁÐÊý¸þÄÌ¿®¤Ë¤ÏÂбþ¤·¤Æ¤¤¤Ê¤¤¡Êsubscribe() ¸Æ¤Ó½Ð¤·¸å¤Î¼õ¿®´°Î»Á°¤Ë¤Ï publish() ÉԲġˤâ¤Î¤Î¡¢º£²óÁÛÄꤷ¤Æ¤¤¤ëÁõÃ֤Ϥâ¤Ã¤Ñ¤é¼õ¿®Â¦¤Ç¤¢¤ë¤¿¤áÆä˻پã¤Ï¤Ê¤µ¤½¤¦¤Ç¤¹¡£ºî¼Ô¤Î Kurt Clothier ¤µ¤ó¼«¿È¤¬¡Öcan be adjusted for a particular need¡×¤È½ñ¤¤¤Æ¤¤¤ë¤è¤¦¤Ë¥é¥¤¥Ö¥é¥ê¥³¡¼¥É¤ÏÍÑÅӤ˱þ¤¸Å¬µ¹¼ê¤ò²Ã¤¨¤ÆÍøÍѤ¹¤ì¤ÐÎɤ¤¤Ç¤·¤ç¤¦¡£
    ¤Ê¤ª¡¢¤³¤Î¥é¥¤¥Ö¥é¥ê¤Ï Espressif ¼Ò¤Ë¤è¤ë½ãÀµ¤Î ESP8266 SDK ¸þ¤±¤Ëµ­½Ò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤è¤ê°·¤¤¤ä¤¹¤¤ Arduino IDE for ESP8266 ´Ä¶­¤Ç¤âÍøÍѤǤ­¤ë¤è¤¦¤ËÊ»¤»¤Æ¼ê¤ò²Ã¤¨¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

    »îºî¤ÎÆ°ºî¤ÎÍÍ»Ò ¡ÊÆ°²è¡§1ʬ11Éà ´Ä¶­²»¡¦Áàºî²»¤¢¤ê¡Ë

    ²¼¤ÎÆ°²è¤Ï¡¢ºîÀ®¤·¤¿ÁõÃÖ¤Ø PubNub ¤Î Web ¥³¥ó¥½¡¼¥ë¤«¤é¥á¥Ã¥»¡¼¥¸¤òÁ÷¤êÆ°ºî¤ò³Îǧ¤·¤Æ¤¤¤ëÍͻҤǤ¹¡£³Æ¥á¥Ã¥»¡¼¥¸¤Ï¤½¤ì¤¾¤ì°ì¹Ô¤Î REST API µ­½Ò¤ËÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£     

    ¼ê¸µ¤Ç¤Î¸½ºß¤Î»ÈÅÓ

    ¼ê¸µ¤Ç¤Ï¤³¤Î»îºî¤ò²¼µ­¤ÎÍ×ÎΤǻÈÍÑÃæ¡£¡Ö¸÷¤Ë¤è¤ëÄÌÃΡפ¬ÁÛÁü°Ê¾å¤ËÊØÍø¤Ç¼ÂÍÑŪ¤Ç¤¢¤ë¤³¤È¤ò¼Â´¶¤·¤Æ¤¤¤Þ¤¹¡£¥¹¥Þ¡¼¥È¤µ¤äɽ¸½À­¤Ï blink(1) ¤ËµÚ¤Ð¤Ê¤¤¤â¤Î¤ÎɬÍפˤʤì¤Ð¹¥¤­¤Ê¤è¤¦¤Ë¤¤¤¸¤ì¤ë¤³¤È¤¬¼êºî¤ê¤ÎÍøÅÀ¤Ç¤¹¤Í¡£

    • ²«ÅÀÅô¡§ÌÀÆü¤ÎͽÊ󤬱«¤Î¾ì¹ç
      ¡ÊIFTTT ¥ì¥·¥Ô¤òÍøÍÑ¡Ë

          ¡¡¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨
      ¤¢¤ê¤¬¤Á¤Ê¥Æ¡¼¥Þ¤À¤¬¼ÂºÝ¤Ë»È¤Ã¤Æ¤ß¤ë¤È¼êÊü¤»¤Ê¤¯¤Ê¤ë¡£¹¥Å·Â³¤­¤Ç²¿¤È¤Ê¤¯ÌýÃǤ·¤Æ¤¤¤ëÀÞ¤ËÉÔ°Õ¤ËÅÀÅô¤òÌܤˤ·¤¿¤éľ¤Á¤ËͽÊó¤ò¥Á¥§¥Ã¥¯¡£

    • ÀÄÅÀÌÇ¡§¹âÎð¼ÔÀ¤ÂӤΰÂÈݳÎǧÁõÃÖ¤ËÈ¿±þ¤¬¤¢¤Ã¤¿¾ì¹ç
      ¡ÊParse.com ¥µ¡¼¥Ð¥µ¥¤¥É¤Î Cloud Code ¤òÍøÍÑ¡Ë

          ¡¡¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨
      ¿Í¤ò¸¡ÃΤ¹¤ë¤ÈºÇû 30ʬ´Ö³Ö¤Ç Parse.com ¤Ø¥ì¥Ý¡¼¥È¤òÁ÷½Ð¤¹¤ë¼«ºîÁõÃÖ¤ò¼Â²È¤Ç²ÔƯÃæ¡£Âиþ¤¹¤ë¥µ¡¼¥Ð¦¥³¡¼¥É¤Ë»îºî¤Ø¤ÎÄÌÃνèÍý¤òÄɲ᣸÷¤ì¤Ð°Â¿´¡¢¥á¡¼¥ë¤Ë¤è¤ëÄÌÃΤè¤ê¤â¨»þÀ­¤¬¹â¤¯ÈÑ»¨´¶¤¬¾®¤µ¤¤¡£

    • ÀÖÅÀÌÇ¡§ÆÃÄê¤Î¥æ¡¼¥¶¤«¤é¤Î¥Ä¥¤¡¼¥È¤¬¤¢¤Ã¤¿¾ì¹ç
      ¡ÊIFTTT ¥ì¥·¥Ô¤òÍøÍÑ¡Ë

           ¡¡¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨

      ·ï¿ô¤Ï¾¯¤Ê¤¤¤¬¤¤¤Ä¤âÈó¾ï¤ËÍ­ÍѤʾðÊó¤òÄ󶡤·¤Æ¤¯¤ì¤ëË¿»á¤Î¥Ä¥¤¡¼¥È¤ò¸«Íî¤È¤µ¤Ê¤¤¤¿¤á¤Ë¡£

    • ÎÐÅÀÌÇ¡§½êÄê¤Î¥Ö¥í¥°¤¬¹¹¿·¤µ¤ì¤¿¾ì¹ç
      ¡ÊIFTTT ¥ì¥·¥Ô¤òÍøÍÑ¡Ë

           ¡¡¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨

      ¤È¤ê¤¢¤¨¤ººòǯËö ¡ÖKLab Advent Calendar 2015¡×¤Î¥Á¥§¥Ã¥¯ÍѤ˻ȤäƤߤ¿¤é¤È¤Æ¤â²÷Ŭ¡£

    • ´ÉÍýÍÑ HTML ¥Õ¥©¡¼¥à

           ¡¡¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨

      PC¡¦¥¹¥Þ¥Û¤Î Web ¥Ö¥é¥¦¥¶¤«¤éÁõÃ֤إá¥Ã¥»¡¼¥¸¤ò¼êÁ᤯´Êñ¤ËÁ÷¤ë¤¿¤á¤ËÍÑ°Õ¡£¡¡[¥½¡¼¥¹]

    ÁõÃ֤ˤĤ¤¤Æ

    ³°´Ñ¤È¹½À®

        

           ¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨

    ºàÎÁ

    ¥á¥â

    • blink(1) ¤Ï PC ¤Ê¤ÉÂбþµ¡´ï¤Îµ¡Ç½¤òÍøÍѤ¹¤ë¤¬º£²ó¤ÎÁõÃ֤ϥͥåȥ¥¯ÀìÍѤǤ¢¤êÄÌ¿®µ¡Ç½¤òÆ⢤·¤Æ¤¤¤ë¤¿¤á USB AC ¥¢¥À¥×¥¿¤Ç¤â»È¤¨¤ë
    • USB ü»Ò¤Ïµ¬³Ê¾åξü¤Î2Ëܤ¬ 5V (500mA) OUT ¤È GND
          
    • ¥Õ¥ë¥«¥é¡¼ LED ¤Ç¤Ï¤Ê¤¯ÀÖ¡¦ÎС¦ÀÄ¡¦²«¤Î 4¤Ä¤Îñ¿§ LED ¤ò»ÈÍÑ¡£LED ÍѤÎÄñ¹³¤Ï¸½Êª¤Îȯ¿§¤ò¤ß¤Ê¤¬¤é¡ÖÀÖ 75¦¸ ÎÐ 75¦¸ ÀÄ 470¦¸ ²« 390¦¸¡×¤Ë
    • LED ¤Îɽ¼¨¤Ï³Æ¿§¡ÖÅÀÅô¡¦ÅÀÌǡפÎÆó¼ïÎà¤Ç¹ç·× 8¥Ñ¥¿¡¼¥ó¡£¤³¤ì¤Ï¼ê¸µ¤Ç¤Î¼ÂÍøÍѤòÁÛÄꤷÂÅÅö¤ÈȽÃǤ·¤¿¿ô
      ¡ÊÊ£¿ô LED ¤ÎÅÀÌÇ»þ¤ÏÌÀÌǤΥ¿¥¤¥ß¥ó¥°¤¬½Å¤Ê¤é¤Ê¤¤¤è¤¦¥×¥í¥°¥é¥à¦¤Ç´ÉÍý¡Ë
    • ÎØ¥´¥à¤Ï USB ¥³¥Í¥¯¥¿³°È´¤±ËÉ»ßÍÑ
    • ¥¨¥¢¥­¥ã¥Ã¥×¤Ï¥¿¥Ã¥Ñ³¸¤Î²¼¤ËÃæÉߤ­¡£LED ¸÷³È»¶¡¢³°´Ñ½Àϲ½¡¢USB ¥³¥Í¥¯¥¿¤È¥¿¥¯¥È¥¹¥¤¥Ã¥Á¤Î°µÇ÷ÍÑ
    • ¥¿¥Ã¥Ñ³¸¤Î¾å¤«¤é¥¿¥¯¥È¥¹¥¤¥Ã¥Á¤ò²¡¤¹¤ÈÁõÃÖ¤¬¥ê¥»¥Ã¥È¤µ¤ì¤ë¡£ÅŸ»Àܳ»þ¤È LED ¾ÃÅôÍѤ˻Ȥ¦

    ¥×¥í¥°¥é¥à¤Ë¤Ä¤¤¤Æ

    ESP8266 ÍÑ PubNub ¥é¥¤¥Ö¥é¥ê

    Á°½Ò¤Î¤è¤¦¤Ë¸½»þÅÀ¤Ç¤Ï PubNub ¤Ï ESP8266 ¤òÀµ¼°¤Ë¥µ¥Ý¡¼¥È¤·¤Æ¤ª¤é¤º Espressif ¼Ò½ãÀµ SDK ¸þ¤±¤ÎÈó¸ø¼°¥é¥¤¥Ö¥é¥ê¤¬¸ø³«¤µ¤ì¤Æ¤¤¤ë¤Î¤ß¤Ç¤¹¡£¤³¤ì¤Ë°Ê²¼¤ÎÍ×ÎΤǼê¤ò²Ã¤¨¤Æ»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£

    • Arduino IDE ¤ÇÍøÍѤǤ­¤ë¤è¤¦¤Ë
    • publish() ¤Î´°Î»ÄÌÃÎÍѤ˥³¡¼¥ë¥Ð¥Ã¥¯¤òÅÐÏ¿²Äǽ¤Ë
    • HTTPS Âбþ

    °Ê²¼¤Ë¥½¡¼¥¹¥³¡¼¥É¤ò·ÇºÜ¤·¤Þ¤¹¡£¥é¥¤¥Ö¥é¥ê¡Öpubnub-esp8266¡×¤Ï¥Õ¥¡¥¤¥ë°ì¼°¤ò¥í¡¼¥«¥ë¤Î Arduino ¥é¥¤¥Ö¥é¥ê¥Õ¥©¥ë¥À²¼¤Î pubnub-esp8266/ ²¼¤Ø¥³¥Ô¡¼¤·¤Æ»È¤¤¤Þ¤¹¡£

    ¡Ê¥­¡¼¥ï¡¼¥É "DSAS" Éôʬ¤¬¥ª¥ê¥¸¥Ê¥ë¤«¤é¤ÎÊѹ¹²Õ½ê¡Ë

    pubnub.h - GitHub

    pubnub.cpp - GitHub

    Arduino ¥¹¥±¥Ã¥Á

    ¥¢¥×¥ê¦¤Î¥³¡¼¥É¤Ç¤¹¡£Arduino ¤Î SimpleTimer ¥é¥¤¥Ö¥é¥ê¤òÊ»ÍѤ·¤Æ¤¤¤Þ¤¹¡£

    LEDMessage.ino - GitHub

    ºî¤ë¤Î¤Ï´Êñ¡¢¥¢¥¤¥Ç¥£¥¢¼¡Âè¤Ç¤È¤Æ¤âÊØÍø¤Ë»È¤¨¤Þ¤¹¡£


    (tanabe)
    klab_gijutsu2 at 00:41¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)¨¢TrackBack(0)
    2015ǯ11·î06Æü

    º£¡¢¥ï¥ó¥Ü¥¿¥ó¤Î IoT ¥Ç¥Ð¥¤¥¹¤¬ÌÌÇò¤¤

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    ÊÆ¥¢¥Þ¥¾¥ó¤¬ 2015ǯ3·î31Æü¤Ëȯɽ¤·¤¿¡ÖAmazon Dash Button¡×¤Ï¥Ü¥¿¥ó¤ò²¡¤¹¤À¤±¤Ç½êÄê¤ÎÆüÍÑÉʤΥª¡¼¥À¡¼¤ò²Äǽ¤È¤¹¤ë¾®¤µ¤Ê¥Ç¥Ð¥¤¥¹¤Ç¤¹¡£ÅÅÃÓ¸ò´¹¤ÏÉԲġ£¥¢¥¤¥Æ¥à¤´¤È¤ËÀìÍѤΥǥХ¤¥¹¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    Dash Button¤Ï¤¿¤À¤ÎÄ̲áÅÀ¡¢¥¢¥Þ¥¾¥ó¤¬¿¿¤ËÁÀ¤¦¤Ï²ÈÅŤ¹¤Ù¤Æ¤È¤ÎÏ¢·È¥·¥ç¥Ã¥Ô¥ó¥°¡§¥®¥º¥â¡¼¥É¡¦¥¸¥ã¥Ñ¥ó
    Åö½é Dash Button ¤ÎÍøÍѤϾ·ÂÔÀ©¤Ç¥Ç¥Ð¥¤¥¹¤Ï̵ÎÁ¤ÇÇÛÉÛ¤µ¤ì¤Æ¤¤¤Þ¤·¤¿¡£¤½¤Î¸å¡ð4.99 ¤Ç¤ÎÈÎÇä¤ËÊѹ¹¤µ¤ì¡¢2015ǯ9·î¤ËÊÆ¥¢¥Þ¥¾¥ó¤Ï Dash Button ¥Ó¥¸¥Í¥¹¤Î³ÈÂçÊý¿Ë¤ò·èÄꤷ¤Æ¤¤¤Þ¤¹¡£¹¥Ä´¤Î¤è¤¦¤Ç¤¹¡£

    ¤Ê¤ª¡¢º£¤Î¤È¤³¤í¤³¤Î¥µ¡¼¥Ó¥¹¤ÎÆüËܤǤγ«»Ï¤Ï¥¹¥±¥¸¥å¡¼¥ë¤µ¤ì¤Æ¤ª¤é¤º¡¢ÊÆ¥¢¥Þ¥¾¥ó¤«¤é Dash Button ñÂΤò¹ØÆþ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤»¤ó¡£

    2016-12-22 Äɵ­¡§
    Amazon.co.jp ¤Ï 2016ǯ12·î5Æü¤ËÆüËܹñÆâ¤Ç Dash Button ¥µ¡¼¥Ó¥¹¤ò³«»Ï¤·¤Þ¤·¤¿¡£¤³¤ì¤Ëȼ¤¤´ØÏ¢¤¹¤ë°Ê²¼¤Îµ­»ö¤òÅö¥Ö¥í¥°¤ËÄɲ䷤Ƥ¤¤Þ¤¹¡£

    ¥ï¥ó¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤Î¥á¥ê¥Ã¥È¤È±þÍÑÎã

    Amazon Dash Button ¤Ï»ö¶È·ÁÂ֤Ȥ·¤Æ¤âÌÌÇò¤½¤¦¤Ç¤¹¤¬¤³¤Îµ­»ö¤Ç¤Ï¥Ç¥Ð¥¤¥¹ËÜÂΤËÃíÌܤ·¤Þ¤¹¡£Dash Button ¤Î¼ÂÂΤϥޥ¤¥³¥ó¤È̵Àþ LAN ¥â¥¸¥å¡¼¥ë¤ò¼çÍ×ÁǤȤ¹¤ë´¥ÅÅÃÓ¶îÆ°¤Î IoT ¥Ç¥Ð¥¤¥¹¤Ç¤¹¡£

           
    http://mpetroff.net/

    Dash Button ¤ÏÆÈΩ¤·¤¿ÁõÃ֤ʤΤÇɬÍפÊÀޤ˥¹¥Þ¡¼¥È¥Õ¥©¥ó¥¢¥×¥êÅù¤è¤ê¤âÁÇÁ᤯»ÈÍѤ¹¤ë¤³¤È¤¬²Äǽ¡£¥Ü¥¿¥ó¤Ò¤È¤Ä¤Îñµ¡Ç½¤Ç¤¢¤ë¤³¤È¤¬¼ê·Ú¤µ¤È¨±þÀ­¤ò¤µ¤é¤Ë¹â¤á¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î̤¤¤è¤¦¤Î¤Ê¤¤¥æ¡¼¥¶¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ï¡¢¤½¤ÎÁÇËѤµ¤È¤Ï΢ʢ¤Ë¡¢´Ø·¸¼Ô¤¬¾ÃÈñ¼Ô¤Ø¤Î¸ú²ÌŪ¤Ê¥¢¥×¥í¡¼¥Á¤òÌϺ÷¤¹¤ë²áÄø¤Ë¤ª¤¤¤ÆÌÊÌ©¤ËÀïά¤òÎý¤Ã¤¿·ë²Ì¤ÈÁÛÁü¤µ¤ì¤Þ¤¹¡£°ì¸«¡Öï¤Ç¤â»×¤¤¤Ä¤­¤½¤¦¤Ê¤³¤È¡×¤Ï¤½¤ì¤¬ËÜÅö¤Ë¼Â¸½¤µ¤ì¤ì¤Ð¤·¤Ð¤·¤Ð»Â¿·¤Ç¤¹¡£¼ê·Ú¤µ¤È¤¤¤¨¤Ð¥¹¥Þ¥Û¤Ð¤«¤ê¤ËÌܤ¬¸þ¤±¤é¤ì¤ë¸½¾õ¤Ë¤ª¤¤¤Æ¤¢¤¨¤ÆÀìÍѥϡ¼¥É¤Î·ÁÂÖ¤òÁª¤ó¤ÀȯÁۤˤϳؤ֤٤­Í×ÁǤ¬¤¢¤ë¤è¤¦¤Ë»×¤¤¤Þ¤¹¡£

    ¤³¤Î¥Ç¥Ð¥¤¥¹¤Î¥¢¥¤¥Ç¥£¥¢¤Ï¥Ó¥¸¥Í¥¹ÍÑÅӰʳ°¤Î IoT ¤Ë¤ª¤¤¤Æ¤â¹­¤¯³èÍѤ¹¤ë¤³¤È¤¬²Äǽ¤Ç¤·¤ç¤¦¡£¡ÖʪÍý¥Ü¥¿¥ó¤Î²¡²¼¡×¤È¤¤¤¦¼ê´Ö¤¬¤«¤«¤é¤ºÃ¯¤Ë¤Ç¤â¤Ç¤­¤ë´Êñ¤ÊÁàºî¤ò¥È¥ê¥¬¡¼¤Ë¤É¤Î¤è¤¦¤Ê½èÍý¤ò¹Ô¤¦¤«¤Ï¥¢¥¤¥Ç¥£¥¢¼¡Âè¤Ç¤¢¤ê¡¢¤½¤ÎÊص¹¤ÈÌ¥ÎϤ˵¤¤Å¤¤¤¿¸þ¤­¤¬¤³¤Î°Â²Á¤Ê Dash Button ¤òËÜÍè¤ÎÌÜŪ°Ê³°¤Î¤³¤È¤ËÍøÍѤ·»Ï¤á¤Æ¤¤¤Þ¤¹¡£°Ê²¼¤Ë¤¤¤¯¤Ä¤«Îã¤òµó¤²¤Þ¤¹¡£

    • How I Hacked Amazon¡Çs $5 WiFi Button to track Baby Data ¡Ê2015Ž°08Ž°10¡Ë - medium.com
      ¤ª¤½¤é¤¯¤³¤ì¤¬ºÇ½é¤Î Dash Button žÍÑÎã¡£Edward Benson »á¤Ï¼«Âð¤ÇÆý»ù¤ÎÇÓÝõÆü»þ¤ò¼êÁ᤯µ­Ï¿¡¦´ÉÍý¤¹¤ë¼êÃʤòõ¤¹Ãæ¤Ç¡¢ÌëÃæ¤Ë¥¹¥Þ¥Û¤òÁàºî¤¹¤ëÈѤ路¤µ¤â¤Ê¤¯¥Ü¥¿¥ó²¡²¼¤Î¤ß¤Ç´°·ë¤¹¤ë Dash Button ¤ÎĹ½ê¤ËÃåÌܤ·¤¿¡£
      "using your smart phone at night disrupts sleep. I want a simple button I can stick to the wall and push to record"

      Amazon ¤Ø¤Î¥ª¡¼¥À¡¼¤ò¹Ô¤¦¾å¤ÇËÜÍèɬÍפʽé´üÀßÄê¤ò°Õ¿ÞŪ¤ËÊÝα¡£¥Ç¥Ð¥¤¥¹ËÜÂΤò¥Ï¥Ã¥¯¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥Ü¥¿¥ó²¡²¼¡Á¥Ç¥Ð¥¤¥¹µ¯¾²»þ¤Ë LAN ¾å¤Ëή¤ì¤ë ARP ¥Ñ¥±¥Ã¥È¤ËÃíÌܤ·¡¢Åö³º¥Ç¥Ð¥¤¥¹¤Î MAC ¥¢¥É¥ì¥¹¤ò¸¡½Ð¤¹¤ì¤Ð¤½¤ì¤ò¥È¥ê¥¬¡¼¤Ë PC ¤Ç½èÍý¤ò¼Â¹Ô¤¹¤ë¼êË¡¤Ë¤è¤Ã¤ÆÍ×·ï¤ò¼Â¸½¤·¤¿¡£


      https://medium.com/
      ¡ÖThe Internet of Things is already here.¡×¤È¤¤¤¦·ë¸ì¤¬°õ¾Ý¤Ë»Ä¤ë¡£¥Ç¥Ð¥¤¥¹¤Î¥³¥¹¥È¤ò»ö¼Â¾åÅÙ³°»ë¤·¤Æ Button ¤ò¶¡µë¤·¤Æ¤¤¤ë¥¢¥Þ¥¾¥ó¤Ë¤È¤Ã¤Æ¤Ï¤¢¤Þ¤ê´¿·Þ¤Ç¤­¤Ê¤¤»î¤ß¤È»×¤ï¤ì¤ë¤¬¡¢ËÜÂΤò²þÊѤ·¤Æ¤¤¤ë¤ï¤±¤Ç¤Ï¤Ê¤¯°Ọ̃Ū¤Ë¤Ïñ¤Ë¡Ö̤ÅÐÏ¿¡×¤Î¾õÂ֤˲᤮¤Ê¤¤¡£¤³¤Î¼ê¤ÎžÍѤ¬³È¤¬¤ì¤Ð²¿¤é¤«¤ÎÂй³Á¼ÃÖ¤òÉߤ«¤ì¤ë²ÄǽÀ­¤¬³§Ìµ¤Ç¤Ï¤Ê¤¤¤â¤Î¤Î¡¢¸½»þÅÀ¤Ç¤Ï¤³¤¦¤·¤¿¹Ô°Ù¤ËÂФ·Ä¾ÀÜ¥¯¥ì¡¼¥à¤ò¤Ä¤±¤ë¤³¤È¤ÏÆñ¤·¤¤¤À¤í¤¦¡£

    • Amazon Dash — It¡Çs Dinner Time! ¡Ê2015Ž°08Ž°27¡Ë - theappslab.com
      Raymond Xie »á¤Ï Dash Button ¤Î¥³¥¹¥È¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Î¹â¤µ¤ËÂç´î¤Ó¡£²ÔƯÃæ¤ËÇ®¤ò»ý¤Ä PiTFT ¤ò¥³¡¼¥É¤òÈ´¤«¤º´Êñ¤Ë ON/OFF ¤¹¤ëÌÜŪ¤Ë¤µ¤Ã¤½¤¯ÍøÍѤ·¤Æ¤¤¤¿¤È¤³¤í±üÊý¤«¤é¤â¤Ã¤È¼ÂÍÑŪ¤Ê¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤Î¡©¤Èʹ¤«¤ì¡¢¥Ø¥Ã¥É¥Û¥óÁõÃåΨ¤Î¹â¤¤Æ󳬤λҶ¡¤¿¤Á¤òͼ¿©»þ¤Ë¤¤¤Á¤¤¤Á¸Æ¤Ó¤Ë¹Ô¤¯Âå¤ï¤ê¤Ë Dash Button ¤Ç»Ò¶¡Éô²°¤Î ¥Õ¥£¥ê¥Ã¥×¥¹ ¥Ò¥å¡¼ ¤òÅÀÌǤµ¤»¤ë¤³¤È¤ò»×¤¤¤Ä¤¯¡£Button ¤ÏÂæ½ê¤Î±üÊý¤Î¼ê¤Ë¡£

    • PizzaDash ¡Ê2015Ž°09Ž°12¡Ë - github.com/bhberson
      Á°½Ð¤Î Benson »á¤Îµ­»ö¤Ë¿¨È¯¤µ¤ì¤¿¡¢¤È Brody Berson »á¤Ï Dash Button ¤ò¥É¥ß¥Î¥Ô¥¶¤ÎÂðÇÛ¥ª¡¼¥À¡¼¤ËÍøÍÑ¡Ê̵ÏÀ¥¢¥Þ¥¾¥ó¤È¤Ï̵´Ø·¸¡Ë¡£¥Ü¥¿¥ó²¡²¼¤ò¥È¥ê¥¬¡¼¤Ë Raspberry Pi ¤¬ ¥É¥ß¥Î¥Ô¥¶¸ø¼° API ¤òᤤ¤ÆÃíʸÀ®Î©¡£
      2015-11-25 Äɵ­¡§
      ±Ñ¹ñ¥É¥ß¥Î¥Ô¥¶¤¬¸ø¼°¤Ë¥ï¥ó¥Ü¥¿¥ó¤Î¥ª¡¼¥À¡¼¥µ¡¼¥Ó¥¹¤ò³«»Ï¤¹¤ë»Ý¤Î¾ðÊó¤¢¤ê ¡Ê2015-11-23) "PizzaDash" ¤«¤é¤Î±Æ¶Á¤Î̵ͭ¤ÏÉÔÌÀ¤À¤¬¡¢dominos ¼Ò¤Ï¤³¤ì¤Þ¤Ç¤ËÆȼ«¤ÎÍÍ¡¹¤Ê¥ª¥ó¥é¥¤¥ó¥ª¡¼¥À¡¼¥·¥¹¥Æ¥à¤ò³ÎΩ¤·¤Æ¤ª¤ê IT ³èÍѤˤ­¤ï¤á¤ÆÀѶËŪ

    • Amazon dash button automation silliness. ¡Ê2015Ž°09Ž°26¡Ë - www.youtube.com
      Michael Donnelly »á¤Ë¤è¤ë Youtube ¤Ø¤ÎÅê¹ÆÆ°²è¡£¸¼´Ø¤Î¾ÈÌÀ¤òÅÀÅô¡¿¾ÃÅô¤·¤¿¤ê¡¢¥¬¥ì¡¼¥¸¤Î¼Ö¤ÎÆâÉô¤¬°ìÄê¤Î²¹Å٤ˤʤ俤饯¥é¥¯¥·¥ç¥ó¤òÌĤ餷¤¿¤ê¡£

    • Dash Hacking: Bare-Metal STM32 Programming - learn.adafruit.com
      Adafruit ¼Ò ¤Î TONY DICOLA »á¤Ë¤è¤ëÀµÌ̤«¤é¤Î Dash Button ¥Ï¥Ã¥¯¤Î»î¤ß¡£¥Õ¥¡¡¼¥à¥¦¥§¥¢¤ò½ñ¤­´¹¤¨ËÜÂΤΠLED ¤ò¼«ºî¤Î¥³¡¼¥É¤ÇÀ©¸æ¡£"this guide didn't touch on the Dash's WiFi module yet" ¤È¤Î¤³¤È¡£

    ¤Þ¤¿¡¢ÊÆ¥¢¥Þ¥¾¥ó¥¦¥§¥Ö¥µ¡¼¥Ó¥¹¡ÊAWS¡Ë¤Ï 2015ǯ10·î¤Î AWS IoT ¥Ù¡¼¥¿¸ø³«¤Ë¤¢¤ï¤»¡¢Amazon Dash Button ¤ÈƱ°ì¤Î¥Ï¡¼¥É¤ò»È¤Ã¤¿ AWS IoT Button (beta)¤òȯɽ¤·¤Þ¤·¤¿¡£10·î6¡Á9Æü¤Ë¥é¥¹¥Ù¥¬¥¹¤Ç³«ºÅ¤µ¤ì¤¿¡ÖAWS re:Invent 2015¡×¤Î²ñ¾ì¤Ç¤Ï»²²Ã¼Ô¤Ø AWS IoT Âθ³ÍѤËÇÛÉÛ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ü¥¿¥ó¤ò²¡¤¹¤È AWS IoT ¥µ¡¼¥Ó¥¹¤ØÄÌÃΤµ¤ìÍøÍѼԤε­½Ò¤·¤¿½èÍý¤ò¼Â¹Ô¤Ç¤­¤ë¤·¤¯¤ß¤Ç¤¹¡£
            

    ¤µ¤é¤Ë¡¢¥¯¥é¥¦¥É¥Õ¥¡¥ó¥Ç¥£¥ó¥°È¯¤Î¼¡¤Î¤è¤¦¤Ê¥ª¥ê¥¸¥Ê¥ë¤Î¥Ü¥¿¥óÀ½ÉʤâÅо줷¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¤³¤ì¤«¤é¤â¿·¤·¤¤¤â¤Î¤¬½Ð¤Æ¤¯¤ë¤³¤È¤Ç¤·¤ç¤¦¡£

    ¤³¤Î¤è¤¦¤Ë¡Ö¥Ü¥¿¥ó¤Ò¤È¤Ä¡×¤Î IoT ¥Ç¥Ð¥¤¥¹¤ÎÍ­ÍÑÀ­¤¬¤¤¤ÞÃíÌܤµ¤ì¤Æ¤¤¤Þ¤¹¡£

    ¹©ºî¤È¼Â¸³

    ¤³¤¦¤¤¤Ã¤¿»ö¾ð¤òÇطʤ˥ï¥ó¥Ü¥¿¥ó¥Ç¥Ð¥¤¥¹¤ò¼«ºî¤¹¤ë¸þ¤­¤â¤¢¤ê¡ÊÎã 1¡¦Îã 2¡Ë¡¢»î¤ß¤Ë¼ê¸µ¤Ç¤â¼ê¶á¤ÊºàÎÁ¤ò»È¤Ã¤Æºî¤Ã¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£ÁõÃÖ¤¬·Á¤Ë¤Ê¤ì¤Ð¤½¤³¤Ë¤É¤Î¤è¤¦¤Ê½èÍý¤òÍí¤á¤ë¤«¤Ï¼«Í³¤Ç¤¹¤¬¡¢¤Þ¤º¤â¤Ã¤È¤â¿È¶á¤ÊÂêºà¤Î¤Ò¤È¤Ä¤È¤·¤Æ¼«Ê¬¤¢¤Æ¤Î¥á¡¼¥ëÁ÷¿®µ¡Ç½¤òÁȤ߹þ¤ß¤Þ¤·¤¿¡£

    • º£²ó¤Î¡Ö¥ï¥ó¥Ü¥¿¥ó¥á¡¼¥é¡×¤Ï»îºî¾å¤ÎÂêºà¤Ç¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢¼ÂÍѤòÁÛÄꤹ¤ë¤È°ÊÁ°¼ê¤¬¤±¤¿¹âÎð¼ÔÀ¤ÂÓ°ÂÈݳÎǧ¤Î¤·¤¯¤ß¤ÈÊ»¤»¡¢±ó³ÖÀ¤ÂÓ¤«¤é¤Î¼ê´Ö¤¤¤é¤º¤Î ping ŪÄê¹ïÏ¢Íí¤ä¥Ê¡¼¥¹¥³¡¼¥ëŪ¤Ê»È¤¤Êý¤¬¤Ç¤­¤½¤¦¤Ç¤¹

    »îºî¤ÎÆ°ºî¤ÎÍÍ»Ò ¡ÊÆ°²è¡§30ÉáË

        

    ÁõÃ֤ˤĤ¤¤Æ

    »îºî¤·¤¿ÁõÃ֤κàÎÁ¤È¹½À®¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¹¡£Arduino IDE for ESP8266 ¥×¥í¥¸¥§¥¯¥È¤Î¥ê¥½¡¼¥¹¤ò»ÈÍѤ· ESP8266 Wi-Fi ¥â¥¸¥å¡¼¥ë¤ò¥¹¥¿¥ó¥É¥¢¥í¥ó¤Î¥Þ¥¤¥³¥ó¤È¤·¤ÆÀ©¸æ¤·¤Æ¤¤¤Þ¤¹¡£
    ¡Ê²Á³Ê¤Ï 2015ǯ10·î»þÅÀ¡Ë

    • ESP8266 ¥â¥¸¥å¡¼¥ë¡¡CDP-ESP8266 - Cerevo¡¡¡ï842¡ÊÀÇÊÌ¡Ë
    • ¥Ð¥Ã¥Æ¥ê¡¼¡¡RW-111¡ÊÅÅÏõ¡ÍÑ¡§3.6V 800mAh¡Ë - ¥í¥ï¥¸¥ã¥Ñ¥ó¡¡¡ï780¡ÊÀǹþ¡Ë¡¡amazon
      ¢¨ÀâÌÀÍó¤Î¡Öñ»°ÅÅÃÓ»°ËܤηÁ¾õ¡×¤Îµ­½Ò¤Ï¡Öñ»ÍÅÅÃÓ»°Ëܡפ¬Àµ¤·¤¤
    • ¥Ö¥ì¥Ã¥É¥Ü¡¼¥É¡¡EIC-15010 - ¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹¡¡¡ï216¡ÊÀǹþ¡Ë
    • ¥¸¥ã¥ó¥×¥ï¥¤¥ä¡¦Äñ¹³¡¦¥¿¥¯¥È¥¹¥¤¥Ã¥Á¡¦ÀÖ LED
    • ¥¿¥Ã¥Ñ¡¦¥Ú¡¼¥Ñ¡¼¥¿¥ª¥ë

         

         

    ¥á¥â

    • ¥¿¥¯¥È¥¹¥¤¥Ã¥Á¤Ï¥Ú¡¼¥Ñ¡¼¥¿¥ª¥ë¤ò¥¯¥Ã¥·¥ç¥ó¤Ë¥¿¥Ã¥Ñ³¸¤Î¤¿¤ï¤ß¤òÍøÍѤ·¤ÆÁàºî¡£¥Á¡¼¥×¤Ê¤¬¤é¤³¤ÎÃæÉߤ­¤ÏÁõÃÖ¤òÊݸ³°´Ñ¤òϤ餲 LED ¤Î¥·¥§¡¼¥É¤ÎÌò³ä¤â
    • ¥í¥ï¤Î¥Ð¥Ã¥Æ¥ê¡¼¤Ï¼ê¸µ¤Î¸ÇÄêÅÅÏõ¡ ¡Ê¥æ¥Ë¥Ç¥ó¼ÒÀ½ UCT-002¡Ë ÍѤ˥¹¥È¥Ã¥¯¤·¤Æ¤¤¤¿¤â¤Î¡£Äê³Ê¤â¥µ¥¤¥º¤â¤Ô¤Ã¤¿¤ê¤À¤¬½¼ÅŤˤÏÅÅÏõ¡¤Ø¤ÎÁõÃ夬ɬÍס£½¼ÅÅ´ï¤Î̵ͭ¤òƱ¼Ò¤ØÌ䤤¹ç¤ï¤»¤ë¤È¤ä¤Ï¤ê¡ÖËÜÂν¼ÅŤΤߡפȤΤ³¤È
    • ¥Ð¥Ã¥Æ¥ê¡¼¾ÃÈñÍÞÀ©¤Î¤¿¤á ESP8266 ¥â¥¸¥å¡¼¥ë¤ÏÊ¿»þ¤Ï¥Ç¥£¡¼¥×¥¹¥ê¡¼¥×¾õÂÖ¤ÇÂÔµ¡¤µ¤»¤ë¡£¥Ü¥¿¥ó²¡²¼¤Ç¥ê¥»¥Ã¥È¤ò¤«¤±¤ë¤Èµ¯¾²¤·¤ÆɬÍפʽèÍý¤ò¹Ô¤¤¤Õ¤¿¤¿¤Ó¥¹¥ê¡¼¥×¤Ø
      • ¥Ç¥£¡¼¥×¥¹¥ê¡¼¥×Ãæ¤Î ESP8266 ¤Î»ÈÍÑÅÅή¤Ï¸ø¾Î 10¦ÌA¡¢¼ê¸µ¤Î¼Â¬¤Ç 11¦ÌA
      • ESP8266EX ¤Î Operating Voltage ¤Ï 3.0¡Á3.6V¡¢Operating Current(Average value) ¤Ï¸ø¾Î 80mA¡Ê²¼¿Þ¡Ë¡¢º£²ó¤Î¼Â¸³¤Ç¥Ü¥¿¥ó²¡²¼¡ÁºÆ¥¹¥ê¡¼¥×¤Þ¤Ç¤Î¼Â¬¤Ç¤Ï LED ÅÀÅôʬ¤ò´Þ¤á¤ª¤è¤½ 60mA¡£½èÍý´°Î»¤Þ¤Ç¤Î½êÍ×»þ´Ö¤Ï 10ÉÃÁ°¸å

                    ESP8266EX Datasheet Version 4.4 (2015-08-01) Page 8
                        ¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

      • ¥Ð¥Ã¥Æ¥ê¡¼¶îÆ°²Äǽ´ü´Ö¤òÂç¤Þ¤«¤Ë»î»»¤·¤Æ¤ß¤ë¡£
        ¾ò·ï¤È¤·¤Æ¡¢»ÈÍѼԤ¬ 1Æü¤Ë 2²ó¡¢µ¯¾²»þ¤È½¢¿²»þ¤Ë¥Ü¥¿¥ó¤ò²¡¤¹¤â¤Î¤È¤¹¤ë¡£¤³¤Î¾ì¹ç¡¢Á°·Ç¤ÎÃͤòÅö¤Æ¤Ï¤á¤ë¤È 1Æü¤Î¤¦¤Á 2 ¡ß 10Éô֤¬ 80mA¡¢»Ä¤ê¤Î 86380Éô֤¬ 11¦ÌA¡Ê0.011mA¡Ë¤Ç¤¢¤ê¡¢Ê¿¶Ñ¤ò¤È¤ë¤È¤ª¤è¤½ 0.03mA¡£ ¼«Á³ÊüÅÅÆÃÀ­¤ò²ÃÌ£¤»¤º www.digikey.jp ¤Î ÅÅÃÓ¼÷Ì¿¥«¥ê¥­¥å¥ì¡¼¥¿¤Çñ½ã·×»»¤¹¤ë¤Èº£²ó¤Î¥í¥ï¤Î 800mAh ¤Î¥Ð¥Ã¥Æ¥ê¡¼¤Î¾ì¹ç¤Ï¼¡¤Î·ë²Ì¤È¤Ê¤ë
        800mAh / 0.03mA * 0.7 ¢â 18666.67 »þ´Ö ¢â 777.78 Æü ¢â 25.1 ·î ¢â 2.1 ǯ

      • ¤Á¤Ê¤ß¤Ë Amazon Dash Button ¤Ï ÊÆ¥¨¥Ê¥¸¥ã¥¤¥¶¡¼¼Ò¤Î Ultimate Lithium ´¥ÅÅÃÓ Ã±4·Á¡ÊÆó¼¡ÅÅÃӤǤϤʤ¤¡Ë1ËܤòÆ⢤·¤Æ¤¤¤ë¡£¥¢¥ë¥«¥êÅÅÃÓ¤ËÈæ¤Ù¡ÖºÇÂç 9ÇÜĹ»ý¤Á¡×¤ò¼æ¶ç¤È¤¹¤ë¸½»þÅÀ¤Ç¤ª¤½¤é¤¯ºÇ¶¯¤Î´¥ÅÅÃÓ¡£²¼µ­µ­»ö¤Î Button ʬ²ò¼Ì¿¿¤Ë¤³¤ÎÅÅÃÓ¤ÎÍͻҤâ¼Ì¤Ã¤Æ¤¤¤ë¡£ÅŶˤ¬¥¿¥ÖÉÕ¤±¤µ¤ì¤Æ¤ª¤êÅÅÃÓ¸ò´¹¤ÏÁÛÄꤵ¤ì¤Æ¤¤¤Ê¤¤ÌÏÍÍ
        Amazon Dash Button Teardown - mpetroff.net
        AWS IoT Button¤òʬ²ò¤·¤Æ¤ß¤¿ - Developers.IO
        ¢¨¥×¥é¥¹¶Ë¦¤Î¹õÃϤËÇòʸ»ú¤Î¡Ö12-2034¡×¡Ö12-2035¡×Åù¤Îɽµ­¤Ï̤»ÈÍÑ»þ¤ÎÉʼÁÊÝ»ý´ü¸Â¤ò¼¨¤¹¡£20ǯ¡ª

        http://mpetroff.net/
      • ¥Ç¡¼¥¿¥·¡¼¥È¤Ë¤è¤ë¤È ¥¨¥Ê¥¸¥ã¥¤¥¶¡¼ Ultimate Lithium AAA ¤Ï "Max Discharge: 1.5 Amps Continuous, 2.0Amps Pulse (2 sec on / 8 sec off)" ¤È¹âÍÆÎ̤Ǥ¢¤ê¡¢Dash Button ¤Î¤è¤¦¤Ë´Ö·çŪ¤ËÅÅÎϤò»ÈÍѤ¹¤ëµ¡´ï¤Ë¤ª¤¤¤Æ¤Ï¸å¼Ô¤Î¥á¥ê¥Ã¥È¤òºÇÂç¸Â¤Ëµý¼õ¤Ç¤­¤ë¤â¤Î¤ÈÁÛÁü¤µ¤ì¤ë
      • ¾å¤Î mpetroff.net ¤Îµ­»ö¤Ë¼¡¤Îµ­½Ò¤¬¤¢¤ë¡£ÆâÉô¤Ç 3.3V ¤Ë¾º°µ¤·¤Æ¤¤¤ë¤È¤Î¤³¤È
        "The Dash Button operates at 3.3 V boosted from the battery¡Çs nominal 1.5 V, drawing 200–300 mA from the battery when on and 2.3 ¦ÌA when in sleep."
        ¸½»þÅÀ¤Ç¤Ï Dash Button ¤Î battery life ¤Ë´Ø¤¹¤ë¸ø¼°¤Îµ­½Ò¤Ï¸«Åö¤¿¤é¤º
      • ¥¨¥Ê¥¸¥ã¥¤¥¶¡¼¤Î Ultimate Lithium ´¥ÅÅÃÓ¤ÏÀ­Ç½Áê±þ¤Ë¹â²Á¤¤¡£¥Ð¥Ã¥Æ¥ê¡¼¤À¤±¤ò¤ß¤Æ¤â Dash Button ¤Î¡ð4.99¤È¤¤¤¦²Á³ÊÀßÄê¤Ø¤Î¶½Ì£¤òͶ¤ï¤ì¤ë
        Energizer L92BP-Energizer Ultimate Lithium AAA Battery (4-Pack) - www.amazon.com¡¡¡ð7.99
        ¥¨¥Ê¥¸¥ã¥¤¥¶¡¼ ¥ê¥Á¥¦¥à´¥ÅÅÃÓñ4·Á 4Ëܥѥå¯ - www.amazon.co.jp¡¡¡ï1250
    • ¥Ö¥ì¥Ã¥É¥Ü¡¼¥É¤ò»È¤ï¤Ê¤±¤ì¤ÐÇÛÀþÉôʬ¤ò¤â¤Ã¤È¾®¤µ¤¯¤Ç¤­¤ë¤¬Á´ÂΤΥµ¥¤¥º¤Ï¼Â¸³ÍѤȤ·¤Æ¤Ï¼êº¢¤«

    ¥×¥í¥°¥é¥à¤Ë¤Ä¤¤¤Æ

    ¥á¡¼¥ë¤ÎÁ÷¿®¤Ë¤Ï¡ÖSendGrid¡×¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£¤½¤ÎÊýÌ̤Ǥϥ᥸¥ã¡¼¤Ê¥µ¡¼¥Ó¥¹¤Ç¤¢¤ê¡¢¹ñÆâ¤ËÀµµ¬ÂåÍýŹ¡Ê³ô¼°²ñ¼Ò ¹½Â¤·×²è¸¦µæ½ê¡Ë¤¬¤¢¤êÆüËÜÈǤθø¼°¥µ¥¤¥È¤â±¿±Ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ÍôÍÑËɻߤΤ¿¤á¥µ¥¤¥ó¥¢¥Ã¥×¤ÎºÝ¤Ë¤Ï»ÈÍÑÌÜŪÅù¤Î¾ÜºÙÀâÌÀ¤¬µá¤á¤é¤ì¥¢¥«¥¦¥ó¥Èȯ¹Ô²ÄÈݤϿʹ֤ˤè¤Ã¤Æ¿³ºº¤µ¤ì¤Þ¤¹¡£

    ¥Õ¥ê¡¼¥×¥é¥ó¤Ç 400ÄÌ¡¿Æü¤ÎÁ÷¿®¤¬²Äǽ¤Ç¤¢¤ê¼ê¸µ¤Ç¤ÎÍøÍѤˤϤޤº½½Ê¬¤½¤¦¤Ç¤¹¡£¥É¥­¥å¥á¥ó¥È¡¦API ¤â½¼¼Â¤·¤Æ¤¤¤Þ¤¹¡£ º£²ó¤Ïñ½ãÌÀ²÷¤Ç¤¯¤ß¤·¤ä¤¹¤¤½éÈǤΤۤ¦¤Î Web API ¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£ ¤È¤³¤í¤Ç¡¢Â¿¤¯¤Î¥¯¥é¥¦¥É¥µ¡¼¥Ó¥¹¤¬¤½¤¦¤Ç¤¢¤ë¤è¤¦¤Ë SendGrid Web API ¤ÎÍøÍѤˤâ HTTPS ¤¬É¬¿Ü¤Ç¤¹¡£ Arduino IDE for ESP8266 ¥×¥í¥¸¥§¥¯¥È¤Ï 2015-08-31 ¤è¤ê TLS 1.0/1.1 ¤Ø¤ÎÂбþ¤ò»Ï¤á¤Æ¤ª¤êÍøÍѼԤΰì¿Í¤È¤·¤ÆÂ礤¤Ë´üÂÔ¤·¤Æ¤¤¤ë¤Î¤Ç¤¹¤¬¡¢¤³¤Îµ­»ö¤ò½ñ¤¤¤Æ¤¤¤ë 2015ǯ11·î½é½Ü¤Î»þÅÀ¤Ç¤Ï¤Ê¤ª³èȯ¤Ë³«È¯¤¬¿Ê¹ÔÃæ¤Ç¡¢stable ¤Ë¤Ê¤ë¤Þ¤Ç¤Ë¤Ï¤Þ¤À¿¾¯»þ´Ö¤¬¤«¤«¤ê¤½¤¦¤Ç¤¹¡£ ¤½¤¦¤·¤¿»ö¾ð¤â¤¢¤ê¡¢Àè¤À¤Ã¤Æ¡ÖESP8266 ¥â¥¸¥å¡¼¥ë¤Î AT ¥³¥Þ¥ó¥É¤Ë SSL ¥¯¥é¥¤¥¢¥ó¥Èµ¡Ç½¤òÄɲ乤ë¡×¤Î»î¤ß¤Ç Espressif ¼Ò¤Ë¤è¤ë¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à¤ò¤â¤È¤Ë¹½À®¤·¤¿ HTTPS ¥¯¥é¥¤¥¢¥ó¥È¥³¡¼¥É¤Ë¼ê¤ò²Ã¤¨¡¢ÅöÌÌ Arduino IDE ¤Ç¥é¥¤¥Ö¥é¥ê¤È¤·¤Æ»È¤¦¤³¤È¤Ë¤·¤Þ¤·¤¿¡£¤â¤Á¤í¤ó¥á¡¼¥ë¥µ¡¼¥Ó¥¹°Ê³°¤ÎÍÑÅӤˤâÍøÍѤǤ­¤ë¤Ç¤·¤ç¤¦¡£
    ¢¨¼ê¸µ¤Î Arduino IDE for ESP8266 ¤Î¥Ð¡¼¥¸¥ç¥ó¤Ï¸½»þÅÀ¤Ç stable ¤Ê
    ¡¡2015-07-23 ¥ê¥ê¡¼¥¹¤Î¡Ö1.6.5-947-g39819f0¡×¤Ê¤Î¤Ç¤¹¤¬¡¢¤³¤ÎÈǤË
    ¡¡Æ±º­¤µ¤ì¤Æ¤¤¤ë Espressif ¥é¥¤¥Ö¥é¥ê¤ò»È¤Ã¤Æ¥¹¥±¥Ã¥Á¤ò¥Ó¥ë¥É¤¹¤ë¤È
    ¡¡SendGrid ¤Î API ¥µ¡¼¥Ð ¤Ç¤¢¤ë https://api.sendgrid.com/ ¤Ø¤ÎÀܳ
    ¡¡Í×µá»þ¤Ë°Û¾ï½ªÎ»¤ÎȯÀ¸¤ò³Îǧ¤·¤Þ¤·¤¿¡£Æ±¥é¥¤¥Ö¥é¥ê·²¤ÎÇÛÃÖ¤µ¤ì¤¿
    ¡¡packages/esp8266/hardware/esp8266/1.6.5-947-g39819f0/tools/sdk/lib/
    ¡¡ÇÛ²¼¤Î *.a ¤ò¸½»þÅÀ¤ÇºÇ¿·¤Î esp_iot_sdk_v1.4.0_15_09_18 ¤Ë
    ¡¡´Þ¤Þ¤ì¤ë°ì¼°¤Ëº¹¤·Âؤ¨¤¿¤È¤³¤íÌäÂê¤Î²ò¾Ã¤¬¸«¤é¤ì¤Þ¤·¤¿¡£
    

    °Ê²¼¤Ë¥½¡¼¥¹¥³¡¼¥É¤ò·ÇºÜ¤·¤Þ¤¹¡£¥é¥¤¥Ö¥é¥ê¡ÖEspHttpsClient¡×¤Ï¥Õ¥¡¥¤¥ë°ì¼°¤ò¥í¡¼¥«¥ë¤Î¥é¥¤¥Ö¥é¥ê¥Õ¥©¥ë¥À²¼¤Î EspHttpsClient/ ²¼¤Ø¥³¥Ô¡¼¤·¤Æ»È¤¤¤Þ¤¹¡£

    ¥é¥¤¥Ö¥é¥ê¡§EspHttpClient

    EspHttpClient.h - GitHub

    EspHttpClient.cpp - GitHub

    ¥¹¥±¥Ã¥Á¡§OneButtonMailer

    OneButtonMailer.h - GitHub

    OneButtonMailer.ino

    ¤Þ¤¿¡¢Â¿¾¯Ãٱ䤬ȯÀ¸¤¹¤ë²ÄǽÀ­¤Ï¤¢¤ë¤â¤Î¤Î¡¢ÀìÍѤΥµ¡¼¥Ó¥¹¤ÎÂå¤ï¤ê¤Ë¼ê¶á¤Ë IFTTT ¤Î Maker Channel ¤òÍøÍѤ¹¤ëÁªÂò»è¤â¤¢¤ë¤Ç¤·¤ç¤¦¡£ÌÜŪ¤¬¥á¡¼¥ëÁ÷¿®¤Ç¤¢¤ì¤Ð²¼¿Þ¤ÎÎã¤ÎÍ×ÎΤǥ쥷¥Ô¤òºîÀ®¤·¤Æ¤ª¤­¤Þ¤¹¡£¡¡¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

         

    ¤³¤Î¥ì¥·¥Ô¤ò¸Æ¤Ó½Ð¤¹¥¹¥±¥Ã¥Á¤Ç¤¹¡£

    OneButtonMailer_IFTTT.h - GitHub

    OneButtonMailer_IFTTT.ino

    ÉÕÏ¿

    Espressif ¼Ò¤Î¥É¥­¥å¥á¥ó¥È¤è¤ê ESP8266 ¤Î¥¹¥ê¡¼¥×¥â¡¼¥É¤Ë´Ø¤¹¤ëµ­½Ò²Õ½ê¤ò°Ê²¼¤ËÈ´¿è¤·¤Þ¤¹¡£
    ¡Ê¥¯¥ê¥Ã¥¯¤Ç²ÄÆÉÂçɽ¼¨¡Ë

    ¡ÖESP8266EX Datasheet Version 4.4 (2015-08-01) ¡×¤è¤ê

       

    ¡ÖESP8266 SDK API Guide Version 1.4 (2015-09-18)¡×Ãæ¤Î system_deep_sleep() ¤ª¤è¤Ó system_deep_sleep_set_option() ¤Î¥ê¥Õ¥¡¥ì¥ó¥¹

       


    (tanabe)
    klab_gijutsu2 at 14:46¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
    2015ǯ10·î08Æü

    ESP8266 ¥â¥¸¥å¡¼¥ë + Blynk ¤Ç¤µ¤é¤ê¤È Wake On Wan

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    Android / iOS üËö¤«¤é½êÄê¤Î IoT ¥Ç¥Ð¥¤¥¹¤Î±ó³ÖÀ©¸æ¤ä´Æ»ë¤ò²Äǽ¤È¤¹¤ë Kickstarter ȯ¤Î Blynk ¤¬¿Íµ¤¤ò½¸¤á¤Æ¤¤¤Þ¤¹¡£2015ǯ10·î¸½ºß Blynk ¤Ï¤Þ¤À³«È¯¤ÎÅÓ¾å¤Ë¤¢¤ê¡¢º£¤Î»þÅÀ¤Ç¤Ï Backer¡Ê½Ð»ñ¼Ô¡Ë¤Ç¤Ê¤¯¤È¤â¼ÂÁõ¤º¤ß¤Î¤¹¤Ù¤Æ¤Îµ¡Ç½¤ò̵½þ¤ÇÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡Ê¢¨¡Ë¡£¥·¥ó¥×¥ë¤Ç¼è¤ê¤Þ¤ï¤·¤Î¤·¤ä¤¹¤¤¤³¤Î¥µ¡¼¥Ó¥¹¤ò»È¤¤¡¢¤Á¤ç¤Ã¤È¤·¤¿¼ÂÍÑÀ­¤Î¤¢¤ëÆ»¶ñ¤È¤·¤Æ±ó³Ö¤Î PC ¤ò¥¹¥Þ¥Û¤Ç Wake On Wan ¤¹¤ë¤â¤Î¤òºî¤Ã¤Æ¤ß¤Þ¤·¤¿¡£¤Ê¤«¤Ê¤«ÊØÍø¤Ê¤Î¤Ç°ì¼°¤ò¸ø³«¤·¤Þ¤¹¡£

    • ¡Ê¢¨¡Ë¸ø¼°¥µ¥¤¥È¤Î¡ÖFAQ¡×¤è¤ê
      + I backed Blynk on Kickstarter. Where are my widgets and
        why the app is free?
      
        - App is free becasuse otherwise you would have to pay to
          download it. This is how AppStore and Google Play works.
        - Current Blynk release has a limited amount of widgets.
          We decided to make them free for everyone until we
          implement store. After that,every widget will be paid.
          However every backer will get them for free (according
          to their pledge).
      
    Blynk ¤Ï ESP8266 Wi-Fi ¥â¥¸¥å¡¼¥ë¤ËÂбþ¤·¤Æ¤ª¤ê¡¢°Ê²¼¤Îµ­»ö¤Ç¤Ïµ»Å¬¥Þ¡¼¥¯¤Ä¤­¤Î¡ÖESP-WROOM-02¡×¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥·¥ê¡¼¥º¤Î¥â¥¸¥å¡¼¥ë¤Ï¼«Î©¤·¤¿¥Þ¥¤¥³¥ó¤È¤·¤ÆÆ°ºî²Äǽ¤Ç¤¢¤ë¤¿¤á IoT ¥Ç¥Ð¥¤¥¹¤Î¼çÍ×ÁǤȤ·¤Æ¤â¤Ã¤È¤â¼ê·Ú¤ÊÁªÂò»è¤Î¤Ò¤È¤Ä¤È¸À¤¨¤ë¤Ç¤·¤ç¤¦¡£

    ½àÈ÷

    ¤Þ¤º Blynk ¤ÎÍøÍѤò¹½À®¤¹¤ë¤ß¤Ã¤Ä¤ÎÍ×ÁǤòÀ°Íý¤·¤Æ¤ª¤­¤Þ¤¹¡£

    • Blynk ¥¢¥×¥ê
      Google Play / AppStore ¤Ç¸ø³«Ãæ¤ÎÀìÍÑ¥¢¥×¥ê¤ò»È¤Ã¤Æ¥æ¡¼¥¶¤¬¹½À®¤·¤¿À©¸æÍѤΥ¢¥×¥ê
    • IoT ¥Ç¥Ð¥¤¥¹
      ÀìÍѤΠBlynk ¥é¥¤¥Ö¥é¥ê¤ò»È¤Ã¤Æ¥æ¡¼¥¶¤¬ºîÀ®¤·¤¿¥×¥í¥°¥é¥à¤òƳÆþ¤º¤ß¤ÎÀ©¸æÂоݤÎÁõÃÖ
    • Blynk ¥µ¡¼¥Ð
      Blynk ¥¢¥×¥ê¤È IoT ¥Ç¥Ð¥¤¥¹¤ÎÏ¢·¸¤òÃç²ð¤¹¤ë¥¯¥é¥¦¥É¥µ¡¼¥Ó¥¹¡Ê¢¨¥ª¡¼¥×¥ó¥½¡¼¥¹¤Ç¤¢¤ê¼«Á°¤Ç¤Î¹½ÃÛ¤â²Äǽ¡Ë

    Android / iOS üËö¤Ë¤Ï¤½¤ì¤¾¤ì¤Î¸ø¼°¥¹¥È¥¢¾å¤ÇÇÛÉÛ¤µ¤ì¤Æ¤¤¤ëÀìÍѤΥ¢¥×¥ê¡ÖBlynk¡×¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£ÍøÍѼԤϤ³¤Î¥¢¥×¥ê¤ò»È¤Ã¤ÆÆȼ«¤Î Blynk ¥¢¥×¥ê¤ò¹½À®¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
    Blynk ¥¢¥×¥ê¤ËÂиþ¤¹¤ë IoT ¥Ç¥Ð¥¤¥¹¤Î¤¿¤á¤Î¥×¥í¥°¥é¥à³«È¯¤Ë¤Ï Arduino IDE ¤ò»ÈÍѤ·¤Þ¤¹¡£¤¢¤é¤«¤¸¤á IDE ¤Ë ESP8266 Íѥ饤¥Ö¥é¥ê¥â¥¸¥å¡¼¥ë¤òƳÆþ¤·¤Æ¤ª¤­¡¢¤½¤³¤Ø Blynk ¤ÎÄ󶡤¹¤ë¥é¥¤¥Ö¥é¥ê·²¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£
    Blynk ¤Î¸ø¼°¥É¥­¥å¥á¥ó¥È¤Ë¤Ï Blynk ¤òÍøÍѤ¹¤ë¾å¤ÇɬÍפȤʤ뤳¤¦¤¤¤Ã¤¿¾ðÊ󡦼ê½ç¤¬¤ï¤«¤ê¤ä¤¹¤¯µ­½Ò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢¥Í¥Ã¥È¤ò¸¡º÷¤¹¤ì¤Ð¿¤¯¤ÎÍ­ÍѤʵ­»ö¤ò»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

    »îºî¤ÎÂêºà¤Ë¤Ä¤¤¤Æ

    ¼ê¸µ¤Î¥Ë¡¼¥º¤Ë´ð¤­¡¢Blynk ¤ò»È¤Ã¤¿±ó³ÖÀ©¸æ¤Î¿È¶á¤Ê±þÍÑÎã¤È¤·¤Æ¼¡¤ÎÆâÍƤòÁÛÄꤷ¤Þ¤·¤¿¡£IoT ¥Ç¥Ð¥¤¥¹¤ÏÂоݤΠPC ¤ÈƱ¤¸ LAN ´Ä¶­¤ØÀßÃÖ¤·¤Þ¤¹¡£

    1. ½êÄê¤Î PC ¤ò Wake On Wan ¤¹¤ë
    2. ½êÄê¤Î PC ¤Ø ping ¤òÂǤÄ
    3. ½êÄê¤Î AC µ¡´ï¤Ø¤ÎµëÅŤò ON / OFF ¤¹¤ë
    4. À©¸æÂоݤΠIoT ¥Ç¥Ð¥¤¥¹¤ò¥ê¥»¥Ã¥È¤¹¤ë

    ³°½ÐÃæ¤Ë¼«Âð¤Î PC ¤òÍøÍѤ·¤¿¤¯¤Ê¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£PC ¤ò¤º¤Ã¤Èµ¯¤Á¾å¤²¤¿¤Þ¤Þ¤Ë¤·¤Æ¤ª¤¯¤Î¤Ï¹¥¤Þ¤·¤¯¤Ê¤¤¤Î¤Ç¡¢¤³¤ì¤Þ¤Ç¤ÏÍ·¤ó¤Ç¤¤¤ë Android üËö¤ò¼«Âð¤ÇÂÔµ¡¤µ¤»¤Æ¤ª¤­ GCM ·Ðͳ¤Ç½êÄê¤Î PC ¤ò Wake On Lan ¤¹¤ë¤È¤¤¤¦ÊýË¡¤ò¤È¤Ã¤Æ¤¤¤Þ¤·¤¿¡£¤½¤ì¤Ï¤½¤ì¤ÇÌäÂê¤Ê¤¯µ¡Ç½¤·¤Æ¤¤¤ë¤Î¤Ç¤¹¤¬¡¢É¬Íפʼê½ç¤òƧ¤à¤Î¤¬¤À¤ó¤À¤óÌÌÅݤˤʤäƤ­¤¿¤³¤È¤Ë²Ã¤¨¡¢¤½¤Î¾ì¤Ç¼êÁ᤯ PC ¤Îµ¯¾²¾õ¶·¤ò³Îǧ¤Ç¤­¤Ê¤¤¤³¤È¤ËÉÔÊؤò´¶¤¸¤Æ¤¤¤Þ¤·¤¿¡£³ÎǧÊýË¡¤Ï½êÄê¤Î IP ¥¢¥É¥ì¥¹¤ËÂФ¹¤ë ping ¥Æ¥¹¥È¤Ç½½Ê¬¤Ç¤·¤ç¤¦¡£

    ¾åµ­ 3.¤Ï³ÈÄ¥ÍѤǤ¹¡£¼ê¸µ¤Ç¤Ïα¼é¤ÎÌë¤ÎËÉÈÈÍѤ˼«Âð¤ÎÉô²°¤ÎÅÅÅô¤òǤ°Õ¤Î¥¿¥¤¥ß¥ó¥°¤ÇÅÀÅô¡¿¾ÃÅô¤¹¤ë¤¿¤á¤Ë»È¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤Þ¤Ç¤Ï¾å¤Î PC ¤ËÀܳ¤·¤¿ USB ÀÖ³°Àþ¥ê¥â¥³¥ó¤ÇÁàºî¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤·¤¿¤¬¡¢¤½¤ì¤âÌÌÅݤʤΤÇÊ̤μêÃʤ¬¤Û¤·¤¤¤È»×¤Ã¤Æ¤¤¤Þ¤·¤¿¡£

    ¼ÂÁõÊýË¡¤Ë¤Ä¤¤¤Æ

    Wake On Lan ¥Þ¥¸¥Ã¥¯¥Ñ¥±¥Ã¥È¤ÎÁ÷½Ð¤È½êÄê¤Î PC ¤Ø¤Î ping ÂǤÁ¤Ï Blynk ¤Î¡ÖVirtual Pin¡×µ¡Ç½¤ò»È¤Ã¤Æ IoT ¥Ç¥Ð¥¤¥¹Â¦¤ÈÏ¢·È¤¹¤ì¤Ð´Êñ¤Ë¼Â¸½¤Ç¤­¤ë¤È¹Í¤¨¤Þ¤·¤¿¡£Blynk ¥¢¥×¥ê¾å¤ËÇÛÃÖ¤·¤¿¥Ü¥¿¥ó¤ÎÀßÄê¤Ë¤ª¤¤¤Æ¡ÖOUTPUT¡×¤ËʪÍý¥Ô¥ó¤Ç¤Ï¤Ê¤¯Å¬Åö¤Ê²¾ÁÛ¥Ô¥ó¤ÎÈÖ¹æ¤ò³ä¤êÅö¤Æ¤Æ¡¢¼õ¤±Â¦¤Î IoT ¥Ç¥Ð¥¤¥¹Â¦¤Î¥³¡¼¥É¤Ë "BLYNK_WRITE(²¾ÁÛ¥Ô¥óÈÖ¹æ¡Ë" ¥Ï¥ó¥É¥é¤òÄêµÁ¤·¤Æ¤½¤³¤ËɬÍפʽèÍý¤òµ­½Ò¤¹¤ì¤Ð¤è¤¤¤Ï¤º¤Ç¤¹¡£

    • Send data from app to hardware - Blynk ¸ø¼°¥É¥­¥å¥á¥ó¥È - blynkkk.github.io
      Send data from app to hardware
      
      You can send any data from Widgets in the app to your
      hardware.
      
      All Controller Widgets can send data to Virtual Pins on
      your hardware. 
      For instance, code below shows how to get values from
      the Button Widget in the App
      
      BLYNK_WRITE(V1) //Button Widget is writing to pin V1
      {
        int pinData = param.asInt(); 
      }
      
      When you press Button, Blynk App sends 1 On second
      click - it sends 0
      
      This is how Button Widget is set up:
    • Wake On Lan ¥Þ¥¸¥Ã¥¯¥Ñ¥±¥Ã¥È¤Î»ÅÍͤ˴ؤ¹¤ëµ­»ö
    • Espressif ¼Ò¸ø¼°¥Õ¥©¡¼¥é¥à¤Î°Ê²¼¤Îµ­»ö¤ÎËöÈø¤Ë ESP8266 ¤Ç ping ¤ò¼Â¹Ô¤¹¤ë¥µ¥ó¥×¥ë¥³¡¼¥É¤¢¤ê
    ping ·ë²Ì¤ò¥¢¥×¥ê¤ØÄÌÃΤ¹¤ë¤Ë¤Ï¡¢¥¢¥×¥ê¦¤ËÀßÃÖ¤·¤¿¥Ç¡¼¥¿ INPUT ÍѤΥ¦¥£¥¸¥§¥Ã¥È¤Ë½êÄê¤Î²¾ÁÛ¥Ô¥óÈÖ¹æ¤òÀßÄꤷ¤Æ¤ª¤­¡¢¤½¤ÎÈÖ¹æ¤ËÂФ· IoT ¥Ç¥Ð¥¤¥¹Â¦¤Î¥³¡¼¥É¤Ç "Blynk.virtualWrite(²¾ÁÛ¥Ô¥óÈÖ¹æ, ¥Ç¡¼¥¿)" API ¤ò»È¤Ã¤Æ¥Ç¡¼¥¿¤òÁ÷¤Ã¤Æ¤ä¤ì¤Ð¤è¤µ¤½¤¦¤Ç¤¹¡£

    • Virtual Pins - Blynk ¸ø¼°¥É¥­¥å¥á¥ó¥È - blynkkk.github.io
      Virtual Pins
      
      Virtual Pins are designed to send any data from your
      microcontroller to the Blynk App and back. Think about
      Virtual Pins as channels for sending any data. Make sure
      you differentiate Virtual Pins from physical pins on your
      hardware. Virtual Pins have no physical representation.
      
      Virtual Pins can be used to interface with libraries
      (Servo, LCD and others) and implement custom functionality. 
      The device may send data to the Widget to the Virtual Pin
      like this:
      
      Blynk.virtualWrite(pin, "abc");
      Blynk.virtualWrite(pin, 123);
      Blynk.virtualWrite(pin, 12.34);
      

    AC µ¡´ï¤Ø¤ÎµëÅŤΠON / OFF ¤ÎÀ©¸æ¤Ë¤Ï ESP8266 ¥â¥¸¥å¡¼¥ë¤«¤é¤Î 3.3V ½ÐÎÏ¿®¹æ¤Ç¥ê¥ì¡¼¥¹¥¤¥Ã¥Á¤òÁàºî¤¹¤ì¤Ð¤è¤¤¤Ç¤·¤ç¤¦¡£ÆþÎϦ¤È½ÐÎϦ¤ÎÀä±ïÀ­¤Î¹â¤¤¥½¥ê¥Ã¥É¥¹¥Æ¡¼¥È¥ê¥ì¡¼¡ÊSSR¡Ë ¤ÏÆ°ºî»þ¤Ë¥«¥Á¥ê¤È²»¤Î¤¹¤ëÍ­ÀÜÅÀ¥ê¥ì¡¼¤ËÈæ¤ÙÃÍÃʤ¬¹â¤á¤Ç¤¹¤¬½©·îÅŻҤµ¤ó¤¬ÅŻҹ©ºî¸þ¤­¤Î¼êº¢¤Ê¥­¥Ã¥È¤òÈÎÇ䤷¤Æ¤¤¤Þ¤¹¡£

    ¢¨Í¾Ã̤ʤ¬¤é¡¢¸Ä¿ÍŪ¤Ë¤Ï¤³¤Î¤è¤¦¤Ë¹âÅÅ°µ¤ò°·¤¦¤â¤Î¤ÏËÜÅö¤Ï¤¢¤Þ¤ê¼«ºî¤·¤¿¤¯¤Ê¤¤¤Ç¤¹¡£¤½¤ÎÊýÌ̤ËÁÇÍܤ¬¤Ê¤¯¤Æ¤âÉôÉʤò·¤¨¤ì¤Ðºî¤ë¤Î¤Ï´Êñ¤Ç¤¹¤¬¡¢¡Ö¼êºî¤ê¤Î³Ú¤·¤µ¡×¤Ê¤É¤è¤ê¤â°ÂÁ´À­¤¬¤â¤Ã¤È¤â½ÅÍפǤ¹¤«¤é¡¢¼êº¢¤Ê²Á³Ê¤Ç·øÏ´¤Ê´°À®ÉʤòÆþ¼ê¤Ç¤­¤ë¤Ê¤é¤½¤ì¤ò»È¤¤¤¿¤¤¤È¤¤¤¦¤Î¤¬ÀµÄ¾¤Ê¤È¤³¤í¤Ç¤¹¡£»ÄÇ°¤Ê¤¬¤éº£¤Î¤È¤³¤í¤½¤¦¤¤¤¦¾¦Éʤϸ«Åö¤¿¤é¤Ê¤¤¤è¤¦¤Ç¤¹¤¬¡Ê¼ûÍפϤ¢¤ë¤È»×¤¦¤Î¤Ç¤¹¤¬¡¦¡¦¡Ë¡¢¾å¤Î¥­¥Ã¥È¤ò»È¤Ã¤Æ¥ê¥ì¡¼¤Ä¤­ÅŸ»¥±¡¼¥Ö¥ë¤òºî¤ëÊýË¡¤¬²¼µ­¤Î½ñÀҤˤ狼¤ê¤ä¤¹¤¯µ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    Æ°ºî¤ÎÍÍ»Ò

    ¤Ò¤ÈÄ̤ê·Á¤Ë¤Ê¤Ã¤¿¤â¤Î¤¬Æ°ºî¤·¤Æ¤¤¤ëÍͻҤò°Ê²¼¤ÎÆ°²è¤Ë¼ý¤á¤Æ¤¤¤Þ¤¹¡£¡Ê1ʬ56Éà ´Ä¶­²»¤¢¤ê¡Ë

    ÆâÍÆ¡§

    • IoT ¥Ç¥Ð¥¤¥¹²ÔƯÃæ¤Ï»à³è³ÎǧÍѤΠLED ¤¬ 2Éôֳ֤ÇÅÀÌÇ¡¢¤½¤Î¥¿¥¤¥ß¥ó¥°¤Ç¥¢¥×¥ê¤Î TICK ¥Õ¥£¡¼¥ë¥É¡Ê¥Ç¥Ð¥¤¥¹²ÔƯÉÿô¡Ë¤¬¹¹¿·¤µ¤ì¤ë
    • ¥¢¥×¥ê¤Î BOOT PC ¥Ü¥¿¥ó²¡²¼¤Ç IoT ¥Ç¥Ð¥¤¥¹¤¬½êÄê¤Î PC ¤ò Wake On Lan ¤¹¤ë
    • ¥¢¥×¥ê¤Î PING ¥Ü¥¿¥ó²¡²¼¤Ç IoT ¥Ç¥Ð¥¤¥¹¤¬½êÄê¤Î PC ¤Ø ping ¤òÅꤲ¥¢¥×¥ê¤Î OK / NG ¥Õ¥£¡¼¥ë¥É¤Ø·ë²Ì¤ò¥«¥¦¥ó¥È
    • ¥¢¥×¥ê¤Î AC DEVICE ¥Ü¥¿¥ó²¡²¼¤Ç IoT ¥Ç¥Ð¥¤¥¹¤ØÀܳ¤·¤¿ AC µ¡´ï¤Ø¤ÎµëÅŤò ON / OFF
    • ¥¢¥×¥ê¤Î RESTART ¥Ü¥¿¥ó¤òĹ²¡¤·¡Ê3Éðʾå¡Ë¤·¤Æ¥ê¥ê¡¼¥¹¤¹¤ë¤È IoT ¥Ç¥Ð¥¤¥¹¤ÏºÆ»ÏÆ°¤¹¤ë

    ¥ê¥½¡¼¥¹°ì¼°

    º£²ó¤Î Blynk ¥¢¥×¥ê¤ª¤è¤Ó IoT ¥Ç¥Ð¥¤¥¹¤ò¹½À®¤¹¤ëÍ×ÁǤϰʲ¼¤Î¤È¤ª¤ê¤Ç¤¹¡£

    ¢¨³Æ²èÁü¤Ï¥¯¥ê¥Ã¥¯¤Ç¼ÂÀ£É½¼¨

    Blynk ¥¢¥×¥ê¦

    Android / iPhone ¤Ç¤ÎÅö³º Blynk ¥¢¥×¥ê¤Î²èÌÌɽ¼¨

    ¥×¥í¥¸¥§¥¯¥È¤È³Æ¥¦¥£¥¸¥§¥Ã¥È¤ÎÀßÄê

    IoT ¥Ç¥Ð¥¤¥¹Â¦

    ÁõÃÖÁ´ÂΤÎÍÍ»Ò
    ¢¨ESP-WROOM-02 ¥â¥¸¥å¡¼¥ë¤Ï Cerevo ¼ÒÀ½¤Î¥Ö¥ì¥¤¥¯¥¢¥¦¥È´ðÈÄ¡ÖCDP-ESP8266¡×¤È¤È¤â¤Ë»ÈÍÑ
    ¢¨²ÔƯ¾õ¶·³ÎǧÍÑ¤Ë IO4 ¤ËÀÖ¿§ LED ¤ò¡¢AC µ¡´ïÀ©¸æÍÑ¤Ë IO12 ¤Ë¥ê¥ì¡¼¤Ä¤­¥±¡¼¥Ö¥ë¤òÁõÃ夷¤Æ¤¤¤ë¤¬ÉÔÍפʤé¤É¤Á¤é¤â¾Êά²Ä

    ¥ê¥ì¡¼¤Ä¤­ÅŸ»¥±¡¼¥Ö¥ë

    ¥½¡¼¥¹¥³¡¼¥É
    ¡ÊSimpleTimer ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥ó¥¹¥È¡¼¥ë¤¬É¬ÍפǤ¹¡Ë

    ESP8266_WakeOnWan.ino - github.com/mkttanabe

    α°Õ¤¹¤Ù¤­»ö¹à¤Ê¤É

    Blynk ¤ÏÊØÍø¤ÇÍ­ÍѤǤ¹¤¬¸½ºß¿Ê¹Ô·Á¤Ç³«È¯Ãæ¤Ç¤¢¤ë¤¿¤áÍøÍÑ»þ¤Ë¼ã´³Ãí°Õ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤ÅÀ¤â¤¢¤ê¤Þ¤¹¡£º£²ó¼ê¸µ¤Çµ¤¤Å¤¤¤¿ÏÃÂê¤ò¥á¥â¤·¤Æ¤ª¤­¤Þ¤¹¡£

    Blynk ¥é¥¤¥Ö¥é¥êµì¥Ð¡¼¥¸¥ç¥ó¤Ç¤ÎÉÔ¶ñ¹ç¤Ë¤Ä¤¤¤Æ¡Ê½ÅÍסË

    2015-08-06 ¤Ë¥ê¥ê¡¼¥¹¤µ¤ì¤¿ v0.3.0 ¤Þ¤Ç¤ÎBlynk ¥é¥¤¥Ö¥é¥ê¤Ë¤Ï ESP8266 ¥â¥¸¥å¡¼¥ë¤Î¥Ï¥ó¥É¥ê¥ó¥°¤ËÂ礭¤ÊÉÔ¶ñ¹ç¤¬¤¢¤ê¤Þ¤¹¡£Æ±¥â¥¸¥å¡¼¥ë ¡Ý Blynk ¥µ¡¼¥Ð´Ö¤Î»ý³Àܳ¤ËÉÔ°Õ¤ËÀÚÃǤ¬È¯À¸¤·¤¿¾ì¹ç¤Ë̵¸Â¥ë¡¼¥×¤Ë´Ù¤ê¥Ç¥Ð¥¤¥¹¤ò¥ê¥»¥Ã¥È¤·¤Ê¤¤¸Â¤êºÆÀܳÉÔǽ¤È¤Ê¤ëÌäÂê¤Ç¤¹¡£¤³¤ÎÉÔ¶ñ¹ç¤Ï 2015-09-24 ¤Ë¥ê¥ê¡¼¥¹¤µ¤ì¤¿ v0.3.1 ¤Ç¤Ï½¤Àµ¤µ¤ì¤Æ¤ª¤ê¡¢ÀÚÃǤ¬È¯À¸¤·¤¿¾ì¹ç¤ËÀܳ¤ò¼«Æ°Éüµì¤¹¤ëµ¡¹½¤¬Àµ¾ï¤Ëµ¡Ç½¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î½¤Àµ¤Ë¤è¤êϢ³²ÔƯ¤¬°ÂÄꤹ¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£Blynk ¤Ç ESP8266 ¤ò»È¤¦¾ì¹ç¤Ïɬ¤º¤³¤Î v0.3.1 °Ê¹ß¤Î¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤Ù¤­¤Ç¤¹¡£¸ø¼°¥Õ¥©¡¼¥é¥à¾å¤Î°Ê²¼¤Îµ­»ö¤Ë´ØÏ¢¤¹¤ë±þ½·¤¬¤¢¤ê¤Þ¤¹¡£

    Android - iOS üËö´Ö¤Î Blynk ¥¢¥×¥ê¤Î¸ß´¹À­¤Ë¤Ä¤¤¤Æ

    Blynk ¤Ï Android ¤È iOS ¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¤¬¡¢Î¾Êý¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ÇÅù¤·¤¯Æ°ºî¤¹¤ë Blynk ¥¢¥×¥ê¤ò¹½À®¤¹¤ë¤¿¤á¤Ë¤Ï°Ê²¼¤ÎÅÀ¤Ø¤ÎÃí°Õ¤¬É¬ÍפǤ¹¡£

    • 2015ǯ10·î8Æü»þÅÀ¤Î Android ÈÇ Blynk ¤ÎºÇ¿·¥Ð¡¼¥¸¥ç¥ó¤Ï "1.0RC7 fix"¡¢iOS ÈÇ Blynk ¤ÎºÇ¿·¥Ð¡¼¥¸¥ç¥ó¤Ï "1.3" ¤Ç¤¹¡£¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤Ï iOS ÈǤΤۤ¦¤¬¾å¤Ç¤¹¤¬¡¢Android ÈǤÇÍøÍѲÄǽ¤Ê¥¦¥£¥¸¥§¥Ã¥È¤¦¤Á iOS ÈǤǤϤޤÀ¼ÂÁõ¤µ¤ì¤Æ¤¤¤Ê¤¤¤â¤Î¤¬¤¤¤¯¤Ä¤«¤¢¤ê¤Þ¤¹¡£²¼¿Þº¸¤Ï Android ÈÇ "1.0RC7 fix¡¢±¦¤Ï iOS ÈÇ "1.3" ¤Ç¤Î¥¦¥£¥¸¥§¥Ã¥È°ìÍ÷¤Ç¤¹¡£

      iOS ÈÇ̤¼ÂÁõ¤Î¥¦¥£¥¸¥§¥Ã¥È¤ò Android ÈǤÇÇÛÃÖ¤·¤ÆÊݸ¤·¤¿¥¢¥×¥ê¤ò iOS ÈǤdz«¤¯¤È¤½¤ÎÉôʬ¤¬¶õÇò¤È¤Ê¤ê¤Þ¤¹¡£¤½¤ì¤À¤±¤Ç¤Ï¤Ê¤¯¡¢¤½¤Î¥¢¥×¥ê¤ò iOS ÈǤÇÊݸ¤¹¤ë¤ÈÅö³º¥¦¥£¥¸¥§¥Ã¥È¤Ï¼º¤ï¤ì¤Þ¤¹¡£Í×Ãí°Õ¤Ç¤¹¡£


    • Android ÈÇ¤Ç¤Ï LED ¥¦¥£¥¸¥§¥Ã¥È¤¬Àµ¾ï¤Ëµ¡Ç½¤·¤Þ¤»¤ó
    °Ê¾å¤Î»ö¾ð¤Ë¤è¤ê¡¢¸½»þÅÀ¤Ç¤Ï¡¢Î¾¥×¥é¥Ã¥È¥Õ¥©¡¼¥à´Ö¤Ç¤Î¸ß´¹À­¤Î³ÎÊݤ¬É¬Íפʥ¢¥×¥ê¤Ë¤ª¤¤¤Æ¤Ï iOS ÈǤÇÍøÍѤǤ­¤ë¥¦¥£¥¸¥§¥Ã¥È¤Î¤ß¤ò»ÈÍѤ·¡¢¤Þ¤¿¡¢LED ¥¦¥£¥¸¥§¥Ã¥È¤Ï»È¤ï¤Ê¤¤¤è¤¦¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£º£¸å¤Î²þÁ±¤¬´üÂÔ¤µ¤ì¤Þ¤¹¡£

    ºÇ¸å¤Ë

    Prepare to Blynk! - www.kickstarter.com¡¡¤Ë·ÇºÜ¤µ¤ì¤Æ¤¤¤ë¥¤¥é¥¹¥È

    ¤¬¤ó¤Ð¤ì Blynk¡ª


    (tanabe)
    klab_gijutsu2 at 05:49¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)
    2015ǯ08·î27Æü

    ESP8266 ¥â¥¸¥å¡¼¥ë¤Î AT ¥³¥Þ¥ó¥É¤Ë SSL ¥¯¥é¥¤¥¢¥ó¥Èµ¡Ç½¤òÄɲ乤ë

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    Ãæ¹ñ Espressif Systems ¼ÒÀ½ ESP8266EX ÅëºÜ¤Î¡ÖESP-WROOM-02¡×¤Ï¶½Ì£¤Ö¤«¤¤¥â¥¸¥å¡¼¥ë¤Ç¤¹¡£ º£Ç¯¡Ê2015ǯ¡Ë¾åȾ´ü¤Ëµ»Å¬¤ò¼èÆÀ¤·¿Íµ¤¤ò½¸¤á¤Æ¤¤¤ë¤³¤ÎÀ½Éʤϰ²Á¤Ç¤¢¤ë¤Ë¤â´Ø¤ï¤é¤º¼«Î©¤·¤¿¥Þ¥¤¥³¥ó¤È¤·¤Æ°·¤¨¤ëÅÀ¤¬ÁÇÀ²¤é¤·¤¯¡¢¤Þ¤¿¡¢½Ð²Ù»þ¤Î¥Õ¥¡¡¼¥à¥¦¥§¥¢¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤ë AT ¥³¥Þ¥ó¥É¥»¥Ã¥È¤òÍøÍѤ¹¤ì¤Ð¥Û¥¹¥È¦¤ËÉé²Ù¤ò¤«¤±¤º´Êñ¤Ë´Ý¤´¤ÈÄÌ¿®½èÍý¤òÂå¹Ô¤·¤Æ¤¯¤ì¤ë¼ê·Ú¤µ¤Ë¤â¹¥´¶¤¬»ý¤Æ¤Þ¤¹¡£

    ¤¿¤À¡¢¤³¤Î AT ¥³¥Þ¥ó¥É¥»¥Ã¥È¤Ç HTTPS ¥ê¥¯¥¨¥¹¥È¤ò½èÍý¤¹¤ëÊýË¡¤¬¸«Åö¤¿¤é¤Ê¤¤¤³¤È¤òÉԻ׵Ĥ˻פäƤ¤¤Þ¤·¤¿¡£¤¢¤é¤¿¤á¤Æ¥É¥­¥å¥á¥ó¥È¤ò³Îǧ¤¹¤ë¤È¤É¤¦¤ä¤é AT ¥³¥Þ¥ó¥É¤Ç SSL ÄÌ¿®¤ò°·¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤è¤¦¤Ç¤¹¡£¥×¥í¥°¥é¥Þ¥Ö¥ë¤Ç¤¢¤ë¤³¤È¤¬¤³¤ÎÀ½ÉʤÎÌ¥ÎϤΤҤȤĤǤ¢¤ë¤È¤Ï¸À¤¨ ½Ð²Ù»þ¤Î¾õÂÖ¤Ç SSL ¤òÍøÍѤǤ­¤Ê¤¤¤Î¤Ï¤½¤Î¤³¤È¼«ÂΤ¬»ÄÇ°¤Ë»×¤ï¤ì¤Þ¤¹¡£AT ¥³¥Þ¥ó¥É¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤½¤Î¤â¤Î¤Ï²¿¤«¤ÈÊØÍø¤Ê¤Î¤Ç¤³¤ì¤ò³ÈÄ¥¤¹¤ë·Á¤Ç SSL ¤Ø¤ÎÂбþ¤ò»î¤ß¤Þ¤·¤¿¡£

    ºÇ½ªÅª¤Ë¤Ï¥µ¡¼¥Ð¾ÚÌÀ½ñ¤Î¸¡¾Ú¤â´Þ¤á´üÂÔÄ̤ê¤ËÆ°ºî¤·¤Þ¤·¤¿¤¬¡¢¤½¤Î²áÄø¤Ç°Õ³°¤Ê¶ÊÀޤ⤢¤ê¡¢¼ê¸µ¤Ç·Ð¸³¤·¤¿¤³¤È¤òÈ÷˺¤ò¤«¤Í¤Æ¤Û¤Ü½çÈ֤ɤª¤ê¤Ëµ­Ï¿¤·¤Æ¤ª¤¯¤³¤È¤Ë¤·¤Þ¤¹¡£¶½Ì£¤Î¤¢¤ëÊý¤ÏÄɤäƤߤƲ¼¤µ¤¤¡£

    AT ¥³¥Þ¥ó¥É³ÈÄ¥¤Ë¤Ä¤¤¤Æ

    ¥á¡¼¥«¡¼¤Ï¼¡¤Î¥Ú¡¼¥¸¤Ç ESP8266 ÍѤΠSDK ¤ò¸ø³«¤·¤Æ¤¤¤Þ¤¹¡£

    2015-08-21 »þÅÀ¤ÎºÇ¿·ÈǤϰʲ¼¤ÎÄ̤ê¤Ç¤¹¡£

    SDK ¥¢¡¼¥«¥¤¥Ö¤òÇÁ¤¤¤Æ¤ß¤ë¤È examples/at/ ¥Ç¥£¥ì¥¯¥È¥ê²¼¤Ë AT ¥³¥Þ¥ó¥É¥»¥Ã¥È¤ò³ÈÄ¥¤¹¤ë¤¿¤á¤Î¥µ¥ó¥×¥ë¥³¡¼¥É¤¬¼ýÏ¿¤µ¤ì¤Æ¤ª¤ê¡ÖAT+CIUPDATE¡×¥³¥Þ¥ó¥É¤Ï¾¤Î¥³¥Þ¥ó¥É·²¤È¤ÏÊ̤ˤ³¤³¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤³¤È¤¬¸«¤Æ¤È¤ì¤Þ¤¹¡£

    examples/at/user/user_main.c

    ¥³¡¼¥É¤ÎËöÈøÉÕ¶á¤Î at_custom_cmd[] ¥Æ¡¼¥Ö¥ë¤Ë¤Ï¡ÖAT+CIUPDATE¡×¤Ë²Ã¤¨¡ÖAT+TEST¡×¤È¤¤¤¦³ÈÄ¥¥³¥Þ¥ó¥É¤¬µ­½Ò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£³ÈÄ¥¥³¥Þ¥ó¥É¤ÎÄêµÁ¤ÎÊýË¡¤Ï¼¡¤Îµ­»ö¤ËÀâÌÀ¤¬¤¢¤ê¤Þ¤¹¡£

    In the example of \esp_iot_sdk\examples\at\user\user_main.c, 
    ways are delivered on how to implement a self-defined AT Command,
     AT+TEST¡É.
    The structure, at_funcationType, is used to define four types of
    a command, e.g., ¡ÈAT+TEST¡É. 
    
    "at_testCmd" is a testing command and it¡Çs formatted as AT+TEST=?.
    In the example of AT, the registered callback is ¡Èat_testCmdTest¡É; 
    the testing demand could be designed as the value range of the
    return parameter. If registered as NULL, there will be no testing
    command.
    
    "at_queryCmd" is a query command and it¡Çs formatted as AT+TEST?.
    In the example of AT, the registered callback is ¡Èat_queryCmdTest¡É ; 
    the query command could be designed as returning the current value. 
    If registered as NULL, there will be no query command.
    
    "at_setupCmd" is a setup command and it¡Çs formatted as
    AT+TEST=parameter1,parameter2,........ In the example of AT, 
    the registered callback is "at_setupCmdTest"; 
    the setup command could be designed as the value of the parameter; 
    if registered as NULL, there will be no setup command.
    
    "at_exeCmd" is an execution command and it¡Çs formatted as AT+TEST. 
    In the example of AT, the registered callback is ¡Èat_exeCmdTest¡É; 
    if registered as NULL, there will be no execution command.
    
    °ìÏ¢¤Î½ñ¼°¤Ï¾¤Î¥³¥Þ¥ó¥É¤Ç¤â¸«¤«¤±¤ë¤â¤Î¤Ç¤¹¡£°ìÆɤ·¤¿¤È¤³¤í¤Ç¤Ï´û¸¤Î¥³¥Þ¥ó¥É¥»¥Ã¥È¤Ë¥ª¥ê¥¸¥Ê¥ë¤Î AT ¥³¥Þ¥ó¥É¤òÄɲ乤뤳¤È¤Ï¤¢¤Þ¤êÆñ¤·¤¯¤Ê¤¤¤è¤¦¤Ç¤¹¡£

    SDK ¤ËƱº­¤Î¥Ó¥ë¥É¤º¤ß¥Õ¥¡¡¼¥à¤ò½ñ¤­¹þ¤ó¤Ç¤ß¤ë

    SDK ¤Î bin/ ¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ï¥á¡¼¥«¡¼Â¦¤¬¥Ó¥ë¥É¤·¤¿¥Õ¥¡¡¼¥à¥¦¥§¥¢¥Ð¥¤¥Ê¥ê·²¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
    ESP-WROOM-02 ½Ð²Ù»þ¤Îɸ½à¥Õ¥¡¡¼¥à¡ÊAT ¥³¥Þ¥ó¥É¥»¥Ã¥È¡Ë¤Ï°Ê²¼¤Î¥Ð¥¤¥Ê¥ê¤«¤é¹½À®¤µ¤ì¤Þ¤¹¡£

    • bin/boot_v1.2.bin ---- ¥Ö¡¼¥È¥í¡¼¥À
    • bin/at/user1.1024.new.2.bin ---- AT ¥³¥Þ¥ó¥É¥×¥í¥°¥é¥àËÜÂÎ
    • bin/blank.bin ---- Îΰè½é´ü²½ÍÑ¡¡Ãæ¿È¤Ï 0xFF * 4096¥Ð¥¤¥È
    • bin/esp_init_data_default.bin --- "Stores default RF parameter values"

    ¼«ºî¤Î¥Õ¥¡¡¼¥à¤ò¥Ó¥ë¥É¤·¤Æ½ñ¤­¹þ¤àÁ°¤Ë¡¢¤Þ¤º¤³¤ì¤é¤òÎý½¬Âæ¤È¤·¤ÆÆ⢥եé¥Ã¥·¥å¥á¥â¥ê¤Ë½ñ¤­¹þ¤ó¤Ç¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£ Àµ¤·¤¯½ñ¤­¹þ¤á¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤ª¤±¤Ð¤¤¤¶¤È¸À¤¦¤È¤­¤ÎÀÚ¤êÌᤷ¤â³Ú¤Ç¤·¤ç¤¦¡£

    ¡Öbin/at/readme.txt¡×ËÁƬ¤Ë¼¡¤Îµ­½Ò¤¬¤¢¤ê¤Þ¤¹¡£

    download:
    boot_v1.2+.bin      	0x00000
    user1.1024.new.2.bin  	0x01000
    blank.bin           	0x7e000 & 0xfe000
    

    ¢¨¡Öuser1.1024.new.2.bin¡×¤Î¡Ö1024¡×¤Ï 1024KB¡Ê8Mbit¡ËÍÆÎ̤Υեé¥Ã¥·¥å¥á¥â¥ê»ÈÍѤòÁÛÄꤷ¤Æ¥Ó¥ë¥É¤µ¤ì¤¿¥Ð¥¤¥Ê¥ê¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ESP-WROOM-02 ¤Ï 32Mbit ¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤òÆ⢤·¤Æ¤¤¤ë¤¬¡¢°Ê²¼¤Îµ­»ö¤Ë¤ª¤¤¤Æ¤Ï¤³¤Î¥Ð¥¤¥Ê¥ê¤Î»ÅÍͤ˽स 8Mbit ¶õ´ÖÈϰϤλÈÍѤòÁ°Äó¤È¤¹¤ë¡£

    ¢¨¡Öesp_init_data_default.bin¡×¤Ë¤Ï RF¡ÊRadio Frequency¡Ë¥Ñ¥é¥á¡¼¥¿¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤ¬ÊÝ»ý¤µ¤ì¤Æ¤¤¤ë»Ý¤ÎÀâÌÀ¤¬ SDK ¤Î¡ÖESP8266 IOT SDK User Manual¡×¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¡£¼¡¤Îµ­»ö¤Ë¤âÀâÌÀ¤¢¤ê¡£

    ¥Õ¥¡¡¼¥à¥¦¥§¥¢¤Î½ñ¤­¹þ¤ß¤Ï°Ê²¼¤Î¡ÖFlash Download Tool¡×¤ò»È¤¤ USB - ¥·¥ê¥¢¥ëÊÑ´¹´ï·Ðͳ¤Ç¹Ô¤¤¤Þ¤¹¡£¥Ä¡¼¥ë¤Ï Windows ÈÇ¤È Python ÈǤ¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ½ñ¤­¹þ¤ß¤Ï¥â¥¸¥å¡¼¥ë¤Î IO0 ¥Ô¥ó¤ò Lo ¤Ë¥»¥Ã¥È¤·¤Æ¡ÖUART Download Mode¡×¤Ø°Ü¹Ô¤·¼¡¤ÎÍ×ÎΤǡ£
    ¡Ê¿Þ¤Ï Windows ÈÇ¡Ë
      ¢¨1024KB ¥Õ¥é¥Ã¥·¥å»ÈÍÑ»þ¤Î¥á¥â¥ê¥Þ¥Ã¥×
      
           - SDK ¤Î¡ÖEspressif IOT SDK User Manual¡×¤è¤ê
      
      Note 
      
      • System param (system parameter area) is the last 16KB offlash. 
      
      • User param is the user parameter area used by Espressif demo code
        ( IOT_Demo or AT ). If users develop their own application, 
        user data can be saved in any available flash area. 
      
      • User Data area ( green area in pictures below ) means the flash
        area that may be available, if program area doesn¡Çt reach the
        maximum size, remaining area can be used to save user data. 
      
    Æ°ºî³Îǧ
    AATTEE00
    
    
    OK
    AT+GMR
    AT version:0.40.0.0(Aug  8 2015 14:45:58)
    SDK version:1.3.0
    compile time:Aug  8 2015 17:19:38
    OK
    AT+CWMODE=1
    
    OK
    AT+CWLAP
    +CWLAP:(1,"GPMAP",-93,"10:6f:3f:XX:XX:XX",1,-47)
    +CWLAP:(0,"000D0BF6C164_G",-91,"00:16:01:XX:XX:XX",5,-32)
    +CWLAP:(3,"hogehogeSSID",-72,"00:22:cf:XX:XX:XX",10,-91)
    +CWLAP:(2,"STWEBKAIGI",-88,"4c:e6:76:XX:XX:XX",10,-27)
    +CWLAP:(4,"elecom2g-DE8564",-90,"00:90:fe:XX:XX:XX",10,-26)
    +CWLAP:(3,"e-timer-DE8564",-90,"02:90:fe:XX:XX:XX",10,-26)
    +CWLAP:(3,"auhome_acyCYh",-92,"8c:4c:dc:XX:XX:XX",1,-31)
    
    OK
    

    ³«È¯´Ä¶­¤ÎƳÆþ

    ESP8266 ¥â¥¸¥å¡¼¥ë¤Î¥Õ¥¡¡¼¥à¥¦¥§¥¢³«È¯¤Ë¤Ï¸½ºß Arduino ¸þ¤±¤Î IDE¡¦¸À¸ì¤òÍѤ¤¤ë¤³¤È¤â²Äǽ¤Ç¤¹¤¬ SDK ¤Ë´Þ¤Þ¤ì¤ë¥³¡¼¥É¤Ï¤¤¤º¤ì¤â¥Í¥¤¥Æ¥£¥Ö¤Î³«È¯´Ä¶­¤òÁ°Äó¤È¤·¤Æ¤¤¤ë¤¿¤áº£²ó¤Ï¤½¤ì¤ò»È¤¤¤Þ¤¹¡£

    ¥á¡¼¥«¡¼¤ÏɬÍפʰ켰¤ò¥¤¥ó¥¹¥È¡¼¥ë¤º¤ß¤Î³«È¯´Ä¶­¡ÊLinux¡Ë¤Î VirtualBox ²¾ÁÛ¥Þ¥·¥ó¥¤¥á¡¼¥¸¤òÇÛÉÛ¤·¤Æ¤ª¤ê¡¢Æ³Æþ¼ê½ç¡¦ÊýË¡¤Ï°Ê²¼¤Îµ­»ö¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    ¥Ý¥¤¥ó¥È¤Ê¤É
    • SDK ¤Î°ì¼°¤òÇÛÃÖ¤·¤¿ PC ¾å¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ò "share" ¤Î̾Á°¤Ç VirtualBox ²¾ÁÛ¥Þ¥·¥ó¤Î¶¦Í­¥Õ¥©¥ë¥À¤È¤·¤ÆÀßÄꤷ¤Æ¤ª¤¯
    • ²¾ÁÛ¥Þ¥·¥ó¤Î¥Ç¥¹¥¯¥È¥Ã¥×¾å¤Î "LXTerminal" ¤òµ¯Æ°¤¹¤ë¤È¥¢¥«¥¦¥ó¥È esp8266 ¤Ç¥¿¡¼¥ß¥Ê¥ë¤¬³«¤¯
    • ¥¢¥«¥¦¥ó¥È esp8266 ¥Û¡¼¥à¥Ç¥£¥ì¥¯¥È¥ê¤Î ./mount.sh ¤ò¼Â¹Ô¤¹¤ë¤È PC ¾å¤Î¶¦Í­¥Õ¥©¥ë¥À¤¬ ~/Share ¤Ë¥Þ¥¦¥ó¥È¤µ¤ì¤ë
    • ¥¢¥«¥¦¥ó¥È esp8266 ¤Î¥Ñ¥¹¥ï¡¼¥É¤Ï "espressif"

    ¢¨²¾ÁÛ¥Þ¥·¥ó¤Î¥¿¥¤¥à¥¾¡¼¥ó¤Ï CST Ë̵þ»þ´Ö¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¤¿¤áÊѹ¹¤¬É¬ÍפǤ¹

    ¥Õ¥¡¡¼¥à¥¦¥§¥¢¤ò¥Ó¥ë¥É¤·¤Æ¤ß¤ë

    SDK ¤Î examples/ ²¼¤Ë¤ÏÊ£¿ô¤Î¥µ¥ó¥×¥ë¥×¥í¥¸¥§¥¯¥È¤¬ÇÛÃÖ¤µ¤ì¤Æ¤ª¤ê¡¢ÍøÍѤ¹¤ë¥×¥í¥¸¥§¥¯¥È¤Î¥Õ¥¡¥¤¥ë·²¤ò¤½¤³¤«¤é app/ ²¼¤Ø´Ý¤´¤È¥³¥Ô¡¼¤·¤Æ»È¤¤¤Þ¤¹¡£º£²ó¤ÏÁ°½Ò¤Î¤È¤ª¤ê examples/at/* ¤ò»ÈÍѤ·¤Þ¤¹¡£

    ²¾ÁÛ¥Þ¥·¥ó¦¤Ç app/ ¤Ø°ÜÆ°¤· gen_misc.sh ¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô¤¹¤ë¤È¥Ð¥¤¥Ê¥ê¤¬¥Ó¥ë¥É¤µ¤ì¤Þ¤¹¡£ °Ê²¼¤Î¥Ó¥ë¥É³«»Ï»þ¤Î¥ª¥×¥·¥ç¥ó»ØÄê¤Ï¥á¡¼¥«¡¼Â¦¥Ó¥ë¥É¤Ç¤ÎÆâÍƤ˽स¤Æ¤¤¤Þ¤¹¡£

    $ pwd
    /home/esp8266/Share/esp_iot_sdk_v1.3.0_15_08_08_build/esp_iot_sdk_v1.3.0/app
    
    $ make clean
    make -C user clean;
    make[1]: Entering directory `/mnt/Share/esp_iot_sdk_v1.3.0_15_08_08_build/esp_iot_sdk_v1.3.0/app/user'
    rm -f -r .output/eagle/debug
    make[1]: Leaving directory `/mnt/Share/esp_iot_sdk_v1.3.0_15_08_08_build/esp_iot_sdk_v1.3.0/app/user'
    rm -f -r .output/eagle/debug
    
    $./gen_misc.sh
    gen_misc.sh version 20150511
    
    Please follow below steps(1-5) to generate specific bin(s):
    STEP 1: choose boot version(0=boot_v1.1, 1=boot_v1.2+, 2=none)
    enter(0/1/2, default 2):
    1
    boot mode: new
    
    STEP 2: choose bin generate(0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin)
    enter (0/1/2, default 0):
    1
    generate bin: user1.bin
    
    STEP 3: choose spi speed(0=20MHz, 1=26.7MHz, 2=40MHz, 3=80MHz)
    enter (0/1/2/3, default 2):
    
    spi speed: 40 MHz
    
    STEP 4: choose spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT)
    enter (0/1/2/3, default 0):
    
    spi mode: QIO
    
    STEP 5: choose spi size and map
        0= 512KB( 256KB+ 256KB)
        2=1024KB( 512KB+ 512KB)
        3=2048KB( 512KB+ 512KB)
        4=4096KB( 512KB+ 512KB)
        5=2048KB(1024KB+1024KB)
        6=4096KB(1024KB+1024KB)
    enter (0/2/3/4/5/6, default 0):
    2
    spi size: 1024KB
    spi ota map:  512KB + 512KB
    
    
    start...
    
    make[1]: Entering directory `/mnt/Share/esp_iot_sdk_v1.3.0_15_08_08_build/esp_iot_sdk_v1.3.0/app/user'
    DEPEND: xtensa-lx106-elf-gcc -M -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions
    -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-
    
    ¡ÊÃæά¡Ë
    
    !!!
    Support boot_v1.2 and +
    Generate user1.1024.new.2.bin successully in folder bin/upgrade.
    boot.bin------------>0x00000
    user1.1024.new.2.bin--->0x01000
    !!!
    

    °Ê¾å¤Î¼ê½ç¤Ç bin/upgrade/ ²¼¤ËÀ¸À®¤µ¤ì¤ë user1.1024.new.2.bin ¤òÁ°½Ð¤Î bin/at/user1.1024.new.2.bin ¤ÎÂå¤ï¤ê¤Ë¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Î 0x01000 ÈÖÃϤòµ¯ÅÀ¤Ë½ñ¤­¹þ¤á¤Ð´°Î»¤Ç¤¹¡£

    ¤Ê¤ª¡¢boot*.bin, blank.bin ¤Ï¥æ¡¼¥¶¤Ë¤è¤ë¥Ó¥ë¥É¤ÎÂоݤǤϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤é¤Ï SDK ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¤â¤Î¤ò¤½¤Î¤Þ¤Þ»È¤¤¤Þ¤¹¡£

    HTTPS ¥¯¥é¥¤¥¢¥ó¥È½èÍý¤Ï¤É¤Î¤è¤¦¤Ë½ñ¤±¤Ð¤¤¤¤¤Î¡©

    SDK ¤Ë¤Ï¥É¥­¥å¥á¥ó¥È¤È¤·¤Æ¡ÖESP8266 SSL User Manual¡×¤¬Æ±º­¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤·¤«¤·¡¢¸½»þÅÀ¤Ç¤Ï ESP8266 ¥â¥¸¥å¡¼¥ë¤Ç¤Î SSL ÍøÍѤ˴ؤ¹¤ë¾ðÊó¤Ï¾¯¤Ê¤¤¤Î¤¬¼Â¾õ¤Ç¤¹¡£

    ¤Á¤Ê¤ß¤Ë¡¢IBM ½ê°¤Î Neil Kolban »á¤¬ 2015ǯ8·î1Æü¤Ë¸ø³«¤·¤¿¡ÖKolban's book on the ESP8266¡×¤Ïµ»½Ñ¾ðÊ󤬾ܺ٤˵­½Ò¤µ¤ì¤¿µ®½Å¤Ê»ñÎÁ¤Ç¤¹¤¬¡¢Æ±Ãø¤Ë¤ª¤¤¤Æ¤â SSL ½èÍý¤Ë¤Ä¤¤¤Æ¤Ï API ¤Î¾Ò²ð¤Î¤ß¤Ëα¤Þ¤Ã¤Æ¤¤¤Þ¤¹¡£

    ³Æ¹ñ¤ÎÍøÍѼԤâ¼êõ¤ê¤ÎÅÓÃæ¤È¤¤¤Ã¤¿°õ¾Ý¤Ç¼¡¤Î¤è¤¦¤Ê±þ½·¤¬¿ï½ê¤Ç¸«¼õ¤±¤é¤ì¤Þ¤¹¡£


    By helpme -  Tue Jun 30, 2015 5:14 am
    
    Can the ESP8266 support HTTPS websites? Does the Espressif SDK
    support SSL function?
    
    By Angelo Santagata -  Tue Jun 30, 2015 4:51 pm
    
    Alas I no, but I happened to see this ESP8266 SSL Example on their website!
    http://bbs.espressif.com/viewtopic.php?f=21&t=389
    
    hopefully someone can port it to the SDK
    
    ¤È¤¤¤¦¤ï¤±¤Ç¡¢¥á¡¼¥«¡¼Â¦¤Ï²¼µ­¥Ú¡¼¥¸¤Ë HTTPS ¥¯¥é¥¤¥¢¥ó¥È½èÍý¤Î¥µ¥ó¥×¥ë¥³¡¼¥É¤ò·ÇºÜ¤·¤Æ¤¤¤Þ¤¹¡£

    Here is a demo code of ESP8266 as TCP SSL client. 
    It is based on ESP8266 SDK without OS.
    
    It just like ESP8266 to be normal TCP client except
    change espconn_xxx to be espconn_secure_xxx
    
    If your SSL packet is larger than 2048 bytes, please
    try to call espconn_secure_set_size
    to enlarge SSL buffer size (max:8192 )
    

    ¤³¤Î¥³¡¼¥É¤ò²¼Éߤ­¤Ë AT ¥³¥Þ¥ó¥É¤ò³ÈÄ¥¤¹¤ì¤Ð¤è¤¤¤È¹Í¤¨¤Þ¤·¤¿¡£

    AT ¥³¥Þ¥ó¥É³ÈÄ¥¤Ç¤Ï SSL ½èÍý¤¬Àµ¾ïÆ°ºî¤·¤Ê¤¤¡©¡© (SDK v1.2.0)

    ¤µ¤Ã¤½¤¯¼«ºî¤Î +GETTEST ¥³¥Þ¥ó¥É¤ò½ñ¤¤¤Æ¤ß¤Þ¤·¤¿¡£
    ¤Á¤Ê¤ß¤Ë¤³¤Î¼Â¸³¤Î»þÅÀ¤Ç»ÈÍѤ·¤Æ¤¤¤¿ SDK ¤Ï 2015ǯ8·î½é½ÜÅö»þ¤ÎºÇ¿·ÈǤÀ¤Ã¤¿ v1.2.0 ¤Ç¤¹¡£

    »îºî¤·¤¿ +GETTEST ¥³¥Þ¥ó¥É¤Ï¼¡¤ÎÆâÍƤǤ¹¡£

    AT+GETTEST="hostname" ¤ÇÅö³º¥Û¥¹¥È¤Ø "GET /" ¥ê¥¯¥¨¥¹¥È¤òÁ÷¤ë
    
    AT+GETTEST  --- °ú¿ô¤¬¤Ê¤±¤ì¤Ð www.example.com:80 ¤Ø HTTP ¥ê¥¯¥¨¥¹¥È
    
    AT+GETTEST="www.example.com",0 --- 2nd arg ¤¬ 0 ¤Ê¤é
                                       80È֥ݡ¼¥È¤Ø HTTP ¥ê¥¯¥¨¥¹¥È
    AT+GETTEST="www.example.com",1 --- 2nd arg ¤¬ 1 ¤Ê¤é
                                       443È֥ݡ¼¥È¤Ø HTTPS ¥ê¥¯¥¨¥¹¥È
    
    AT+GETTEST="www.example.com",1,0 --- 3rd arg ¤¬ 0 ¤Ê¤é¥µ¡¼¥Ð¾ÚÌÀ½ñ¸¡¾Ú¤Ê¤·¤Ç
                                         443È֥ݡ¼¥È¤Ø HTTPS ¥ê¥¯¥¨¥¹¥È
    AT+GETTEST="www.example.com",1,1 --- 3rd arg ¤¬ 1 ¤Ê¤é¥µ¡¼¥Ð¾ÚÌÀ½ñ¸¡¾Ú¤¢¤ê¤Ç
                                         443È֥ݡ¼¥È¤Ø HTTPS ¥ê¥¯¥¨¥¹¥È
    
    ¥½¡¼¥¹¥³¡¼¥É¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
    ¡ÊÃí¡§¤³¤ì¤é¤Ï¤½¤Î¸å¤ÎÄ´ºº·ë²Ì¤âÈ¿±Ç¤·¤¿¤â¤Î¤Ç¤¹¡£ºÇ½é¤Î¼Â¸³¤ÎÃʳ¬¤Ç¤Ï¤º¤Ã¤È¥é¥Õ¤ÊÆâÍƤǤ·¤¿¡Ë ¤È¤³¤í¤¬¤³¤Î AT+GETTEST ¥³¥Þ¥ó¥É¤Ï´üÂÔÄ̤ê¤Ë¤ÏÆ°ºî¤·¤Þ¤»¤ó¤Ç¤·¤¿¡£HTTP ¥ê¥¯¥¨¥¹¥È¤ÏÀµ¤·¤¯½èÍý¤µ¤ì¤ë¤â¤Î¤Î HTTPS ¥ê¥¯¥¨¥¹¥È¤Ç¤Ï¥¨¥é¡¼¤¬È¯À¸¤¹¤ë¤Î¤Ç¤¹¡£
    AATTEE00
    
    
    OK
    AT+GMR
    AT version:0.30.0.0(Jul  3 2015 19:35:49)
    SDK version:1.2.0
    compile time:Aug 11 2015 14:09:10
    OK
    
    
    AT+GETTEST="www.example.com",1
    mode : sta(18:fe:34:a4:0f:a0) + softAP(1a:fe:34:a4:0f:a0)
    add if0
    11
    f 0, 221
    scandone
    add 0
    aid 4
    
    connected with hogehogeSSID, channel 10
    WIFI CONNECTED
    dhcp client start...
    WIFI GOT IP
    ip:10.10.0.19,mask:255.255.255.0,gw:10.10.0.1
    got ip !!!
    start connect to server
    client handshake start. 
    client handshake failed
    reconnect callback, error code -28 !!! 
    
    ¥¨¥é¡¼¥³¡¼¥É -28 ¤Ï SDK ¤Î include/espconn.h ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹
    /* Definitions for error constants. */
    
    #define ESPCONN_OK          0    /* No error, everything OK. */
    #define ESPCONN_MEM        -1    /* Out of memory error.     */
    #define ESPCONN_TIMEOUT    -3    /* Timeout.                 */
    #define ESPCONN_RTE        -4    /* Routing problem.         */
    #define ESPCONN_INPROGRESS  -5    /* Operation in progress    */
    
    #define ESPCONN_ABRT       -8    /* Connection aborted.      */
    #define ESPCONN_RST        -9    /* Connection reset.        */
    #define ESPCONN_CLSD       -10   /* Connection closed.       */
    #define ESPCONN_CONN       -11   /* Not connected.           */
    
    #define ESPCONN_ARG        -12   /* Illegal argument.        */
    #define ESPCONN_ISCONN     -15   /* Already connected.       */
    
    #define ESPCONN_HANDSHAKE  -28   /* ssl handshake failed	 */
    #define ESPCONN_SSL_INVALID_DATA  -61   /* ssl application invalid	 */
    
    ¥Ï¥ó¥É¥·¥§¥¤¥¯¤Ë¼ºÇÔ¤·¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¤¬¤³¤ì¤Ç¤Ï²¿¤â¤ï¤«¤ê¤Þ¤»¤ó¡£¤µ¤Æ¡©

    SDK v1.2.0 ¤Ç¤Î AT ¥³¥Þ¥ó¥É³ÈÄ¥Æâ¤Ç SSL ¤¬µ¡Ç½¤·¤Ê¤¤Íýͳ

    ÉÔ¿³¤Ë»×¤¤¾ðÊó¤òõ¤·¤¿¤È¤³¤íƱ¤¸ÌäÂê¤ËÁø¶ø¤·¤¿¥æ¡¼¥¶¤È¥¹¥¿¥Ã¥Õ¤Î±þ½·¤Ëµ¤¤Å¤­¤Þ¤·¤¿¡£

    Re: SSL connection via AT commands
    
    Postby doughboy ¢ä Tue Apr 21, 2015 11:59 pm
    
    I am writing AT command to support SSL, but it seems none of
    the espconn_secure_* api works. 
    At least when I connect to real ssl servers using real
    cerfificates. (and yes, I have set buffer size to 8196 and
    use the patched ssl library) esp module will
    reset (I think due to wdt timeout). I already reported this
    via email.
    
    Re: SSL connection via AT commands
    
    Postby Espressif_Faye ¢ä Mon Apr 27, 2015 10:22 am
    
    Hi, doughboy,
    
    We debugged on your problem, it's the RAM limitation cause that.
    
    AT commands has only 17KBytes available heap now¡¤
    SSL need 12KBytes free heap size, 
    if you espconn_secure_set_size to set 5KBytes¡¤it is not enough..
    
    So SSL can not be used in AT commands because RAM is limited. 
    
    Sorry for the inconvenience.
    

    AT ¥³¥Þ¥ó¥É¥×¥í¥°¥é¥à¼Â¹Ô»þ¤Ë¤Ï»Ä¥Ò¡¼¥×¤¬ 17KB ÄøÅÙ¤À¤¬¡¢SSL ½èÍý¤Ë¤Ï 12KB ¤Î¥Ò¡¼¥×¤¬É¬Íפǡ¢¤½¤³¤Ë espconn_secure_set_size() ¤Ç¿ô KB ¤Î SSL ¥Ð¥Ã¥Õ¥¡³ÎÊݤò»ØÄꤹ¤ë¤È´°Á´¤Ë¸Ï³é¤·¤Æ¤·¤Þ¤¦¡£¤½¤Î¤¿¤á¡¢AT ¥³¥Þ¥ó¥É¤Ç SSL ¤ò°·¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¢¤È¤¤¤¦ÏäǤ¹¡£

    ¥Û¥¹¥È¤Ø¤ÎÀܳÍ×µá¤ÎÁ°¤Ë system_print_meminfo() ¤ª¤è¤Ó system_get_free_heap_size() ¤ò¸Æ¤Ó½Ð¤·¤Æ¤ß¤ë¤È¼¡¤Î·ë²Ì¤Ç¤·¤¿¡£

    
    data  : 0x3ffe8000 ~ 0x3ffe89d8, len: 2520
    rodata: 0x3ffe89e0 ~ 0x3ffeabd4, len: 8692
    bss   : 0x3ffeabd8 ~ 0x3fff5010, len: 42040
    heap  : 0x3fff5010 ~ 0x3fffc000, len: 28656
    
    system_get_free_heap_size=16592 
    

    ¤Ê¤ë¤Û¤É¡£¤Ê¤ª¡¢AT ¥³¥Þ¥ó¥É¥»¥Ã¥È¤Ï SDK ¤Ë¤ª¤¤¤Æ¤Ï¥é¥¤¥Ö¥é¥ê·Á¼°¤Ç¶¡µë¤µ¤ì¤Æ¤ª¤ê¡¢¼«ºî¥³¥Þ¥ó¥É¤òÄɲ乤뤳¤È¤Ï¤Ç¤­¤Æ¤â´û¸¤Î¤â¤Î¤òÊѹ¹¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£

    ¤µ¤Æ¡©

    ËÁƬ¤Ë½ñ¤¤¤¿¤è¤¦¤Ë¡¢ESP-WROOM-02 ¤òÄÌ¿®¥â¥¸¥å¡¼¥ë¤È¤·¤Æ°·¤¦¾õ¶·¤Ë¤ª¤¤¤Æ¤Ï¥·¥ê¥¢¥ë·Ðͳ¤Ç¤Î¥³¥Þ¥ó¥ÉÅϤ·¤Ç´Êñ¤ËÄÌ¿®½èÍý¤òÍøÍѤǤ­¤ë¤³¤È¤Ë¤ÏÊص¹¤¬¤¢¤ê¤Þ¤¹¡£

    ¤·¤«¤·¡¢¤½¤³¤Ç SSL ¤òÍøÍѤǤ­¤Ê¤¤¤³¤È¤ÏÂ礭¤Ê¥Þ¥¤¥Ê¥¹¤Ç¤¢¤ê¼ÂÍѤòÁÛÄꤹ¤ë¤È»ÈÅÓ¤¬¸ÂÄꤵ¤ì¤ë¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£¤½¤Î¤¿¤á´û¸¤Î AT ¥³¥Þ¥ó¥É¥»¥Ã¥È¤ËÂå¤ï¤ë¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¹þ¤ß¤Ç¤Î SSL ½èÍý¤Î¼ÂÁõ¤¬É¬ÍפǤ¢¤ê¡¢¤½¤ÎÊýË¡¤Ï¤¤¤í¤¤¤í¹Í¤¨¤é¤ì¤ë¤â¤Î¤Î¤É¤¦¤â±ó¤Þ¤ï¤ê¤Ê°õ¾Ý¤¬¤¢¤ê¤Þ¤¹¡£

    ¤½¤ì¤Ï¤½¤ì¤È¤·¤Æ¡¢°ìÊý¤Ç¤Ï ESP-WROOM-02 ¤Ï¼«Î©¤·¤¿¥Þ¥¤¥³¥ó¤È¤·¤Æ¤Î¦Ì̤â»ý¤Á¹ç¤ï¤»¤Æ¤¤¤ë¤¿¤á¡¢Í×·ï¤Ë¤è¤Ã¤Æ¤ÏñÂΤǽèÍý¤ò¤Þ¤«¤Ê¤¦¤³¤È¤¬²Äǽ¤Ç¤¢¤ë¤ï¤±¤Ç¡¢¤È¤É¤Î¤Ä¤Þ¤êÀ½Éʽвٻþ¤Î AT ¥³¥Þ¥ó¥É¥»¥Ã¥È¤Ï¡Ö¤ª¤Þ¤±¡×ÄøÅ٤Τâ¤Î¤È³ä¤êÀÚ¤ë¤Ù¤­¤Ê¤Î¤«¤â¡©

    ¤½¤ó¤Ê¤³¤È¤ò¹Í¤¨¤Ê¤¬¤é¡¢SSL ½èÍý¤½¤Î¤â¤Î¤¬Àµ¾ï¤ËÆ°ºî¤¹¤ë¤³¤È¤ò³Îǧ¤¹¤ë¤¿¤á¤ËÁ°·Ç¤Î¥×¥í¥°¥é¥à¤ò AT ¥³¥Þ¥ó¥É¥»¥Ã¥È¤ÈÀÚ¤êÎ¥¤·Ã±ÂΤǵ¯Æ°¤¹¤ë·Á¤ËÊѹ¹¤·¤ÆÆ°ºî¤ò»î¤·¤Æ¤ß¤Þ¤·¤¿¡£
    ¥Û¥¹¥È¤Ø¤ÎÀܳÍ×µáÁ°¤Î¥Ò¡¼¥×¾õ¶·¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¡¢HTTPS ¥ê¥¯¥¨¥¹¥È¤ÏÌäÂê¤Ê¤¯½èÍý¤µ¤ì¤Þ¤·¤¿¡£¤ä¤Ï¤ê¥á¥â¥êÉÔ­¤ÎÌäÂê¤Î¤è¤¦¤Ç¤¹¡£

    
    data  : 0x3ffe8000 ~ 0x3ffe8560, len: 1376
    rodata: 0x3ffe8560 ~ 0x3ffe9764, len: 4612
    bss   : 0x3ffe9768 ~ 0x3fff2b30, len: 37832
    heap  : 0x3fff2b30 ~ 0x3fffc000, len: 38096
    
    system_get_free_heap_size=34856
    

    ¥µ¡¼¥Ð¾ÚÌÀ½ñ¤Î¸¡¾Ú¤Ë¤Ä¤¤¤Æ

    Ω¤Á»ß¤Þ¤Ã¤Æ¤¤¤Æ¤â»ÅÊý¤¬¤Ê¤¤¤Î¤Ç¡¢¤¤¤º¤ì¤Ë¤·¤Æ¤âɬÍפȤʤë SSL ¥µ¡¼¥Ð¾ÚÌÀ½ñ¤Î¸¡¾Ú¤Ë¼ê¤ò¤Ä¤±¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£

    SDK ¤ËƱº­¤Î¡ÖESP8266 SSL User Manual¡×¤Ë¤Ï HTTPS ¥¯¥é¥¤¥¢¥ó¥È½èÍý¤Ë¤ª¤¤¤Æ¥µ¡¼¥Ð¾ÚÌÀ½ñ¤ò¸¡¾Ú¤¹¤ëÊýË¡¤¬¼¡¤Î¤è¤¦¤Ëµ­½Ò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    ¡Ê¥¯¥ê¥Ã¥¯¤Ç¼ÂÀ£É½¼¨¡Ë

    ¾åµ­¥É¥­¥å¥á¥ó¥È¤«¤é¤ÎÈ´¿è

    CA verify function default to be disabled, user can enable it
    by espconn_secure_ca_enable.
    
    3.1. Generate CA Certificate
    
    (1) Put script ¡Èmake_cert.py¡Éand CA certificate into
        the same folder. 
    (2) Run script ¡Èmake_cert.py¡É to generate esp_ca_cert.bin
        which contains all CA certificates
        (2 CA certificates at most) in the same folder. 
        Download address of esp_ca_cert.bin depends on
        espconn_secure_ca_enable.
    
    3.2. CA Verify
    
    STEP 1: ESP8266 connects to server, read esp_ca_cert.bin
            from flash, get the corresponding SSL 
            ctx. Only 2 CA certificates is allowed at most.
    STEP 2: ESP8266 starts TLS handshake, get certificate from
            SSL server, check with the CA in step 1¡§
            • if CA check fail, connection break¡¨
            • if succeed, CA verify pass. 
    
    4.2. espconn_secure_ca_enable
    
    Function: 
      Enable SSL CA (certificate authenticate) function 
    
    Note¡§
      • CA function is disabled by default 
      • If user want to call this API, please call it before 
                     espconn_secure_accept
                     (ESP8266 as TCP SSL server) or 
                     espconn_secure_connect
                     (ESP8266 as TCP SSL client)
    Prototype: 
      bool espconn_secure_ca_enable (uint8 level, uint16 flash_sector) 
    
    Parameter: 
      uint8 level : set configuration forESP8266
                    SSL server/client¡§
                     0x01 SSL client¡¨
                     0x02 SSL server¡¨
                     0x03 both SSL client and SSL server 
    
      uint16 flash_sector : flash sector in which CA
      (esp_ca_cert.bin) is downloaded. For example, 
      flash_sector is 0x3B, then esp_ca_cert.bin need to
      download into flash 0x3B000
    
    Return:
      true : succeed
      false  : fail 
    

    ¡Ömake_cert.py¡×¤Ï SDK ¤Ë¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£²¼µ­¥Ú¡¼¥¸¤Ë¥À¥¦¥ó¥í¡¼¥É¥ê¥ó¥¯¤¬·ÇºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    °Ê²¼¤Î¼ê½ç¤Ç¡Öhttps://www.example.com/¡×¤Î¥µ¡¼¥Ð¾ÚÌÀ½ñ¤Î¸¡¾Ú¤ò»î¤ß¤Þ¤·¤¿¡£

    • DigiCert ¤Î¥ë¡¼¥È¾ÚÌÀ½ñ¤ò¥Ö¥é¥¦¥¶¤«¤é X509 ·Á¼°¡ÊDER ¥¨¥ó¥³¡¼¥É¡Ë¤Ç¥¨¥¯¥¹¥Ý¡¼¥È¤·³ÈÄ¥»Ò¤ò .cer ¤È¤¹¤ë
    • *.cer ¤òÃÖ¤¤¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ç¾åµ­¤Î make_cert.py ¤ò¼Â¹Ô¤·¡Öesp_ca_cert.bin¡×¤òÀ¸À®¤¹¤ë
    • espconn_secure_connect() ¤ÎÁ°¤Ë²¼µ­¹Ô¤òµ­½Ò¤·user1.bin ¤ò¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¥µ¥¤¥º 1024KB ¤Î»ØÄê¤Ç¥Ó¥ë¥É
      espconn_secure_ca_enable(0x01, 0x65)); // 0x01 = client
    • ¾¤Î *.bin ¥Õ¥¡¥¤¥ë¤È°ì½ï¤Ë¡¢esp_ca_cert.bin ¤ò¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Î 0x65000 ÈÖÃÏ¡ÊUser Data area¡Ë¤òµ¯ÅÀ¤Ë½ñ¤­¹þ¤à
      ¢¨¥Ó¥ë¥É¤·¤¿ user1.bin ¤Î¥µ¥¤¥º¤Ï 300KB ¤Û¤É¤Ç¤¢¤ê;͵¤ò¤ß¤Æ 400KB ¤È¤·¤Æ
      ¥Ö¡¼¥ÈÎΰè¤Î 4KB ¤È¹ç»»¤¹¤ë¤È 404KB ¤Ë¤Ä¤­ 404 * 1024 = 413696 = 0x65000
      - ²¼¤Î¥á¥â¥ê¥Þ¥Ã¥×¡ÊºÆ·Ç¡Ë¤ò»²¾È¤Î¤³¤È
      ¢¨1024KB ¥Õ¥é¥Ã¥·¥å»ÈÍÑ»þ¤Î¥á¥â¥ê¥Þ¥Ã¥×
      
           - SDK ¤Î¡ÖEspressif IOT SDK User Manual¡×¤è¤ê
      
      Note 
      
      • System param (system parameter area) is the last 16KB offlash. 
      
      • User param is the user parameter area used by Espressif demo code
        ( IOT_Demo or AT ). If users develop their own application, 
        user data can be saved in any available flash area. 
      
      • User Data area ( green area in pictures below ) means the flash
        area that may be available, if program area doesn¡Çt reach the
        maximum size, remaining area can be used to save user data. 
      
    • ´üÂÔÄ̤ê¤Ë¥µ¡¼¥Ð¾ÚÌÀ½ñ¤Î¸¡¾Ú¤¬¹Ô¤ï¤ì www.example.com ¤Ø¤Î HTTPS ¥ê¥¯¥¨¥¹¥È¤ÏÀµ¾ï¤Ë½èÍý¤µ¤ì¡¢¥ë¡¼¥È CA ¤¬ DigiCert ¤Ç¤Ï¤Ê¤¤¥µ¥¤¥È¤Ø¤Î HTTPS ¥ê¥¯¥¨¥¹¥È¤Ë¤ª¤¤¤Æ¤Ï¥Ï¥ó¥É¥·¥§¥¤¥¯¤Î»þÅÀ¤Ç¥¨¥é¡¼¤È¤Ê¤ë¤³¤È¤ò³Îǧ

    ²ò·è¡§SDK v1.3.0 ¤Ê¤é AT ¥³¥Þ¥ó¥É³ÈÄ¥Æâ¤Ç SSL ½èÍý¤¬Æ°¤¯¡ª

    ¤½¤¦¤³¤¦¤·¤Æ¤¤¤ëÆâ¤Ë¡¢2015-08-08 ¤Ë¸ø³«¤µ¤ì¤¿ esp_iot_sdk_v1.3.0_15_08_08 ¤Î¥ê¥ê¡¼¥¹¥Î¡¼¥È¤Î¼¡¤Îµ­½Ò¤¬ÌܤËÈô¤Ó¹þ¤ó¤Ç¤­¤Þ¤·¤¿¡£

    Optimization:
    
    1.Memory optimization to save 12KBytes.
                :
    

    Á°½Ò¤Î¤È¤ª¤ê¡¢SDK v1.2.0 ¤ò»È¤Ã¤Æ¥Ó¥ë¥É¤·¤¿ AT ¥³¥Þ¥ó¥É³ÈÄ¥ÈÇ¤Ç SSL ¤¬µ¡Ç½¤·¤Ê¤«¤Ã¤¿¤Î¤Ï¥á¥â¥êÉÔ­¤¬¸¶°ø¤À¤Ã¤¿¤¿¤á¡¢v1.3.0 ¤Ç 12KB ;͵¤¬½ÐÍ褿¤Î¤Ç¤¢¤ì¤Ð¤¢¤ë¤¤¤ÏÆ°ºî²Äǽ¤Ç¤Ï¤Ê¤¤¤«¤È¹Í¤¨¤Þ¤·¤¿¡£ ¼ÂºÝ¤Ë v1.3.0 ¤Ç¥Ó¥ë¥É¤·¤¿ user1.bin ¤Ç AT+GETTEST ¥³¥Þ¥ó¥É¤ò»î¤·¤¿¤È¤³¤í HTTPS ¥ê¥¯¥¨¥¹¥È¤¬Àµ¾ï¤Ë½èÍý¤µ¤ì¤ë¤³¤È¤ò³Îǧ¡¢¥Û¥¹¥È¤Ø¤ÎÀܳÍ×µáÁ°¤Î¥Ò¡¼¥×¾õ¶·¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤·¤¿¡£¤Þ¤º¤Ï¤á¤Ç¤¿¤·¡¢¤Ç¤¹¡£

    
    data  : 0x3ffe8000 ~ 0x3ffe83ac, len: 940
    rodata: 0x3ffe83b0 ~ 0x3ffe9d40, len: 6544
    bss   : 0x3ffe9d40 ~ 0x3fff18b8, len: 31608
    heap  : 0x3fff18b8 ~ 0x3fffc000, len: 42824
    
    system_get_free_heap_size=31376
    

    Æ°ºî¤ÎÍÍ»Ò ¡ÊÆ°²è¡§2ʬ19ÉáË

    º£²ó»îºî¤·¤¿ GETTEST ¥³¥Þ¥ó¥É¤Ï½êÄê¤Î¥Û¥¹¥È¤ËÂФ· "GET /" ¤ò¹Ô¤¦¤Î¤ß¤ÎÆâÍƤǤ¹¤¬¡¢°Ê¾å¤Î¤è¤¦¤ËÂçÏȤǤÎÆ°ºî¤ò³Îǧ¤Ç¤­¤¿¤¿¤áº£¸å¤ÏǤ°Õ¤Î URI ¤Î»ØÄê¤ä POST ¥á¥½¥Ã¥É¤Ø¤ÎÂбþ¤Ê¤É¼ÂÍѾåɬÍפÊÆùÉÕ¤±¤ò¼ê¸µ¤Ç¹Ô¤¦¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£³Ú¤·¤ß¤Ç¤¹¡£

    ¾å¤ÎÆ°²è¤Ç»ÈÍѤ·¤Æ¤¤¤ë¸½»þÅÀ¤Î¥Õ¥¡¡¼¥à°ì¼°¤Î¤¦¤Á user1.bin °Ê³°¤Î¥Ð¥¤¥Ê¥ê¤ò°Ê²¼¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¼ý¤á¤Æ¤¤¤Þ¤¹¡£ ¼«Ê¬¤Î´Ä¶­¤Î AP ¤Î SSID ¤È¥Ñ¥¹¥ï¡¼¥É¤ò¥½¡¼¥¹¤Ëµ­½Ò¤·¤Æ user1.bin ¤ò¥Ó¥ë¥É¤·¡¢¿Þ¤ÎÍ×ÎΤǤ³¤ì¤é¤Î¥Ð¥¤¥Ê¥ê°ì¼°¤ò ESP-WROOM-02 ¤Î¥Õ¥é¥Ã¥·¥å¥á¥â¥ê¤Ë½ñ¤­¹þ¤á¤Ð AT+GETTEST ¥³¥Þ¥ó¥É¤¬Æ°ºî¤¹¤ë¤Ï¤º¤Ç¤¹¡£¶½Ì£¤Î¤¢¤ëÊý¤Ï¼«¸ÊÀÕǤ¤Ç¤ª»î¤·²¼¤µ¤¤¡£


    (tanabe)

    klab_gijutsu2 at 18:00¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)¨¢TrackBack(0)
    2015ǯ04·î21Æü

    ¡ÖTWE-LITE¡×¥Õ¥¡¡¼¥à¥¦¥§¥¢¥×¥í¥°¥é¥ß¥ó¥°¤Î»î¤ß

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    2017-01-13 Äɵ­¡§
    TWE-LITE¡Êµìɽµ­¡ÖTWE-Lite¡×¡Ë¤Î¥á¡¼¥«¡¼¤¬ÊѤï¤êƱ¼Ò¤«¤é¤Î¥ê¥¯¥¨¥¹¥È¤Ë´ð¤Å¤¤¤Æ´ØÏ¢²Õ½ê¤Î²þÄû¤ò¹Ô¤¤¤Þ¤·¤¿¡£·ë²Ì¤È¤·¤Æ¡¢2015ǯ4·î¤Ë¸ø³«¤·¤¿¸µ¤Îµ­»ö¤Ë2017ǯ1·î¸½ºß¤Î¿·¤·¤¤¾ðÊó¤ä¥­¡¼¥ï¡¼¥É¤¬ÉôʬŪ¤ËÈ¿±Ç¤µ¤ì¤¿ÆâÍƤȤʤäƤ¤¤Þ¤¹¡£Ç°¤Î¤¿¤áÍ×½ê¤ËÃí¼á¤ò²Ã¤¨¤Æ¤ª¤êº®Íð¤Ë¤Ä¤Ê¤¬¤ëÍ×ÁǤÏÆä˴ޤޤì¤Æ¤¤¤Ê¤¤¤ÈȽÃǤ·¤Æ¤¤¤Þ¤¹¤¬¡¢µ­»ö»²¾È¤ÎºÝ¤Ë¤Ï¤´Ãí°Õ²¼¤µ¤¤¡£

    ¥â¥Î¥ï¥¤¥ä¥ì¥¹³ô¼°²ñ¼ÒÍͤΠZigBee ̵Àþ¥Þ¥¤¥³¥ó¥â¥¸¥å¡¼¥ë¡ÖTWE-LITE DIP¡×¤Ï¥³¥¹¥È¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¹â¤¯¿Íµ¤¤Î¤¢¤ëÀ½ÉʤǤ¹¡£¼ê·Ú¤Ë¥Î¡¼¥É´Ö¤Î̵ÀþÄÌ¿®¤ò¼Â¸½¤Ç¤­¤ë¤¿¤á IoT ¤ò¹½À®¤¹¤ëÍ×ÁǤȤ·¤Æ¤â½êÄê¤Î·÷Æâ¤ËÊĤ¸¤¿µ¡´ï´Ö¥Í¥Ã¥È¥ï¡¼¥¯¤Î¤¿¤á¤ÎÆ»¶ñΩ¤Æ¤È¤·¤Æ¤âÍ­ÍѤǤ·¤ç¤¦¡£
    ɸ½à¤Î¤â¤Î¤Ë²Ã¤¨Ê£¿ô¤Îŵ·¿Åª¤ÊÍÑÅӤ˨¤·¤¿¥Õ¥¡¡¼¥à¥¦¥§¥¢·²¤È¤½¤Î¥½¡¼¥¹¥³¡¼¥É¤¬³«È¯´Ä¶­¤È¤È¤â¤Ë̵½þ¤Ç¸ø³«¤µ¤ì¤Æ¤¤¤ë¤³¤È¤â¶½Ì£¿¼¤¯¡¢À½Éʤϥۥ¹¥È PC ¤«¤éÀìÍѤΠUSB ¥¢¥À¥×¥¿ ¡ÊTWE-LITE R¡Ë ¤Þ¤¿¤Ï»ÔÈΤΠUSB ¥·¥ê¥¢¥ëÊÑ´¹¥â¥¸¥å¡¼¥ë¡¿¥±¡¼¥Ö¥ë·Ðͳ¤Ç¼«Í³¤Ë¥Õ¥¡¡¼¥à¤ò½ñ¤­´¹¤¨¤é¤ì¤ë¤è¤¦¤Ë¥Ç¥¶¥¤¥ó¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    ¤³¤Î¤è¤¦¤Ëñ¤Ê¤ëÄÌ¿®¥â¥¸¥å¡¼¥ë¤Ç¤Ï¤Ê¤¯¥×¥í¥°¥é¥Þ¥Ö¥ë¤Ê¥Þ¥¤¥³¥ó¤È¤·¤Æ¤Î¦Ì̤ò»ý¤Á¹ç¤ï¤»¤Ê¤¬¤é²Á³Ê¤¬ÄãÎ÷¤Ç¤¢¤ë¤³¤È¤¬ TWE-LITE DIP ¤ÎÂ礭¤ÊÌ¥ÎϤǤ¹¡£¤Þ¤¿¡¢¡ÖĶ´Êñ¡ª¡×¤Î¼æ¶ç¤ÎÄ̤ê½Ð²Ù»þ¤Îɸ½à¥Õ¥¡¡¼¥à¤Ç¤Ï°·¤¤¤ä¤¹¤µ¤¬Æä˽Ż뤵¤ì¤Æ¤ª¤ê¡¢¤½¤¦¤¤¤Ã¤¿´Ö¸ý¤Î¹­¤µ¤È±ü¤Î¿¼¤µ¤¬¤³¤ÎÀ½ÉʤÎÆÃĹ¤È¸À¤Ã¤Æ¤è¤¤¤Ç¤·¤ç¤¦¡£

    »î¤ß¤Î¤­¤Ã¤«¤±

    TWE-LITE ¥æ¡¼¥¶¤Ï¥á¡¼¥«¡¼¤ÎÄ󼨤¹¤ë¥½¥Õ¥È¥¦¥§¥¢»ÈÍѵöÂú·ÀÌó½ñ¤Ë´ð¤Å¤¤¤Æ TWE-NET SDK ¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢µ¬Ìó¤Îǧ¤á¤ëÈϰϤǸø¼°¥Õ¥¡¡¼¥à¤Î¥½¡¼¥¹¥³¡¼¥É¤ò²þÊѤ·¤¿¤ê¤½¤ÎÆâÍƤò¸ø³«¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£

    ¥Í¥Ã¥È¤ò»²¾È¤¹¤ë¤È¸½»þÅÀ¤Ç¤Ï¼ÂºÝ¤Ë¸ø¼°¥Õ¥¡¡¼¥à¤Ë¼ê¤ò²Ã¤¨¤Æ TWE-LITE DIP ¤ò»È¤Ã¤Æ¤¤¤ëÍøÍѼԤÏÀ½Éʤο͵¤¤ËÈæ¤Ù¤Þ¤À¤¢¤Þ¤ê¿¤¯¤Ê¤¤¤è¤¦¤Ë¸«¼õ¤±¤é¤ì¤Þ¤¹¡ÊÃí¡§2015ǯ04·î»þÅÀ¤Îµ­½Ò¡Ë¡£¤½¤ÎÇطʤˤϡ¢¤Þ¤º¸ø¼°¤Î¥Õ¥¡¡¼¥à¥¦¥§¥¢·²¤¬½¼¼Â¤·¤Æ¤¤¤ë¤¿¤á²þÊѤÎÉÔÍפʥ±¡¼¥¹¤Î¿¤¤¤³¤È¤¬ÁÛÁü¤µ¤ì¤Þ¤¹¤¬¡¢¤½¤ì¤Ë²Ã¤¨¤Æ¡¢ÀºÌ©¤Ëµ­½Ò¤µ¤ì¤Æ¤¤¤ë³Æ¥Õ¥¡¡¼¥à¤Î¥Ü¥ê¥å¡¼¥à¤Î¤¢¤ë¥½¡¼¥¹¥³¡¼¥É¤Ï¤½¤ÎÆâÍƤòŬÀÚ¤ËÍý²ò¤·¤Ê¤±¤ì¤Ð¼ê¤ò¿¨¤ì¤Ë¤¯¤¤¤È¤¤¤¦»ö¾ð¤â¤¢¤ë¤è¤¦¤Ë»×¤ï¤ì¤Þ¤¹¡£¥á¡¼¥«¡¼¤¬¸ø³«¤·¤Æ¤¤¤ë¤³¤ì¤é¤Î¥Õ¥¡¡¼¥à¤Ï´ðËÜŪ¤Ë¼ÂÍѤòÌÜŪ¤È¤¹¤ë¤â¤Î¤Ç¤¢¤Ã¤Æ¶µ°éÍѤǤϤ¢¤ê¤Þ¤»¤ó¤«¤é¡¢ÍøÍѤ¹¤ë¦¤Ï¥³¡¼¥É¤ÎÀ¤³¦¤ò¤¸¤Ã¤¯¤ê³Ú¤·¤ß¤Ê¤¬¤é¥Î¥¦¥Ï¥¦¤ò³Ð¤¨¤ë¥¹¥¿¥ó¥¹¤ËΩ¤Ä¤³¤È¤¬¹¥¤Þ¤·¤¤¤Ç¤·¤ç¤¦¡£

    ¤¿¤À¡¢¤³¤³¤·¤Ð¤é¤¯ TWE-LITE ¤Ë¿¨¤ì¤¿°õ¾Ý¤Ç¤Ï¡¢¤½¤³¤Ë¡Ö¤Á¤ç¤Ã¤È¤·¤¿Â­¤¬¤«¤ê¡×¤¬¤¢¤ì¤Ð¸ø¼°¥Õ¥¡¡¼¥à¤Î¥³¡¼¥É¤ò¤è¤ê¸«ÅϤ·¤ä¤¹¤¯¤Ê¤ê¡¢¤½¤Î¤³¤È¤¬¤³¤ÎÍ¥¤ì¤¿À½Éʤò¼ê¸µ¤Ç³èÍѤ¹¤ëµ¡²ñ¤ò³È¤²¤ë¤³¤È¤Ë¤â¤Ä¤Ê¤¬¤ë¤è¤¦¤Ë´¶¤¸¤Þ¤·¤¿¡£»×¤¤É⤫¤Ù¤¿¤Î¤Ï "Hello, world!" ¤Î¤è¤¦¤Ë¤â¤Ã¤È¤âñ½ã¤Ç´Ê·é¤ÊÆâÍƤ«¤é¤Ï¤¸¤Þ¤ê½ù¡¹¤Ë½èÍý¤¬ÆùÉÕ¤±¤µ¤ì¤Æ¤¤¤¯¥¤¥á¡¼¥¸¤Î¾®¤µ¤Ê¥µ¥ó¥×¥ë¥Õ¥¡¡¼¥à¥³¡¼¥É·²¤Ç¤¹¡£¤Ç¤â»ÄÇ°¤Ê¤¬¤éº£¤Î¤È¤³¤í¤½¤¦¤¤¤¦¤â¤Î¤Ï¸«Åö¤¿¤ê¤Þ¤»¤ó¡ÊÃí¡§2015ǯ04·î»þÅÀ¤Îµ­½Ò¡Ë¡£¤½¤³¤Ç¡¢¼Â¸³¤ÈÊÙ¶¯¤ò¤«¤Í¤Æ¸½»þÅÀ¤Ç¤Î¼«Ê¬¤ÎÅþãÅÀ¤Ê¤ê¤Ë¤½¤¦¤¤¤¦¥³¡¼¥É¤ò½ñ¤¤¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£°ìÏ¢¤Î²áÄø¤Ç¤Îµ¿ÌäÅÀ¡¦ÉÔÌÀÅÀ¤Î²ò·è¤Ë¤Ï¸À¤¦¤Þ¤Ç¤â¤Ê¤¯¸ø¼°¥Õ¥¡¡¼¥à¤Î¥½¡¼¥¹¤È¾åµ­¤Î SDK ¥Þ¥Ë¥å¥¢¥ë¤¬Èó¾ï¤Ë»²¹Í¤Ë¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î»î¤ß¤Ïº£¸å¤â·Ñ³¤¹¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¤¬¡¢¤Þ¤º¤Ï¤³¤³¤Þ¤Ç¤Î¥½¡¼¥¹¥³¡¼¥É¤ÈÆ°ºî¤ÎÍͻҤò¸ø³«¤·¤Þ¤¹¡£¶½Ì£¤Î¤¢¤ëÊý¤ÏÇÁ¤¤¤Æ¤ß¤Æ²¼¤µ¤¤¡£

    ¢¨Ëܵ­»ö¤Ë·ÇºÜ¤Î¥½¡¼¥¹¥³¡¼¥É¤Ë¤Ï¸ø¼°¥Õ¥¡¡¼¥à¥¦¥§¥¢¤Î¥½¡¼¥¹¤«¤é¤Î
    ¡¡°úÍѤ¬´Þ¤Þ¤ì¤Þ¤¹¡£¼è¤ê°·¤¤¤ËºÝ¤·¤Æ¤ÏÃøºî¸¢É½µ­¤ò³Îǧ¤Î¾å¡¢Á°·Ç¤Î
     ¡Ö¥â¥Î¥ï¥¤¥ä¥ì¥¹¥½¥Õ¥È¥¦¥§¥¢»ÈÍѵöÂú·ÀÌó½ñ¡×¤ÎÆâÍƤò½å¼é¤·¤Æ²¼¤µ¤¤¡£
      ¤Ê¤ª¡¢Ëܵ­»ö¤Ç¤Î³Æ¥½¡¼¥¹¥³¡¼¥É¤Î·ÇºÜ¤Ê¤é¤Ó¤Ë¥á¡¼¥«¡¼¸ø¼°¥µ¥¤¥È¾å¤Î
      ¸Ä¡¹¤Î¥Ú¡¼¥¸¤Ø¤ÎľÀܤΥê¥ó¥¯¡¦¸ø¼°Ê¸½ñ¤«¤é¤Î¾ðÊó¤ÎÈ´¿è¤Ë¤Ä¤¤¤Æ¤Ï
      ¤¤¤º¤ì¤â»öÁ°¤Ë¥â¥Î¥ï¥¤¥ä¥ì¥¹Íͤè¤ê¾µÂú¤òÆÀ¤Æ¤¤¤Þ¤¹¡£
    
    ¢¨Ëܵ­»ö¤ÎËÜʸ¤ª¤è¤ÓËܵ­»ö¤Ë·ÇºÜ¤Î¥½¡¼¥¹¥³¡¼¥É¤Ë¤Ï¸í¤ê¤¬´Þ¤Þ¤ì¤Æ
    ¡¡¤¤¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¤³¤È¤¬¤¤¤«¤Ê¤ë»³²¤Ë·Ò¤¬¤Ã¤¿¤È¤·¤Æ¤â
    ¡¡É®¼Ô¤ª¤è¤Ó KLab ¤Ï°ìÀÚ¤ÎÀÕǤ¤òÉ餤¤Þ¤»¤ó¡£¤¢¤é¤«¤¸¤á¤´Î»¾µ²¼¤µ¤¤¡£
    

    µ»½Ñ¾ðÊó¤Ë¤Ä¤¤¤Æ

    TWE-LITE ÍÑ¥×¥í¥°¥é¥ß¥ó¥°¤ËɬÍפʾðÊó¤Ï¿´ô¤ËÅϤꡢ¥á¡¼¥«¡¼¸ø¼°¥µ¥¤¥È¤Î¾ðÊó¤äÁ°·Ç¤Î TWE-NET SDK ¥Þ¥Ë¥å¥¢¥ë¡¢¤Þ¤¿¡¢NXP ¼ÒÀ½ JN5164 ÍѤΥڥê¥Õ¥§¥é¥ë ¡ÊTWE-LITE ¤Î I/O ¥Ý¡¼¥È¤Þ¤ï¤ê¡Ë API ¤Î¥Þ¥Ë¥å¥¢¥ëÅù¤¬¼ç¤Ê¾ðÊ󸻤Ȥʤê¤Þ¤¹¡£¸å³¤Î¥½¡¼¥¹¥³¡¼¥É¤ò»²¾È¤¹¤ë¾å¤ÇºÇ¾®¸ÂɬÍפʤâ¤Ã¤È¤â´ðËÜŪ¤Ê»ñÎÁ»°ÅÀ¤ò°Ê²¼¤ËÈ´¿è¤·¤Þ¤¹¡£
    ¢¨¿Þ¤Ï¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¤µ¤ì¤Þ¤¹

    TWE-LITE DIP ¤Î¥Ô¥óÇÛÃÖ   ¡Ê¥á¡¼¥«¡¼¸ø¼°¥µ¥¤¥È¤Î¡ÖĶ´Êñ¡ªTWEɸ½à¥¢¥×¥ê¡×¥Ú¡¼¥¸¤è¤ê¡Ë

    TWE-LITE ¥Õ¥¡¡¼¥à¥¦¥§¥¢¥³¡¼¥É¤ÎÆ°ºî¥Õ¥í¡¼   ¡ÊÁ°·Ç¤Î SDK ¥Þ¥Ë¥å¥¢¥ë¤è¤ê¡Ë

    Test01¡§ LED ¤òÅÀÌǤµ¤»¤ë

    ¤Þ¤º¤Ï¥Þ¥¤¥³¥ó¡¦ÅŻҹ©ºî¤ÎÀ¤³¦¤Ç¤Î¡ÖHello, world!¡×¤Ë¤¢¤¿¤ë LED ¤ÎÅÀÌÇ¡¢¤¤¤ï¤æ¤ë¡ÖL ¥Á¥«¡×¤ò¹Ô¤¤¤Þ¤¹¡£¥Í¥Ã¥È¥ï¡¼¥¯ÄÌ¿®¤Ï¹Ô¤¤¤Þ¤»¤ó¡£

    Æ°ºî¤ÎÍÍ»Ò

    ÁõÃ֤μ̿¿¤È¹½À®¿Þ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

    ¥½¡¼¥¹¥³¡¼¥É  GitHub

    ¥æ¡¼¥¶ÄêµÁ¤Î¥¤¥Ù¥ó¥È¥Ï¥ó¥É¥éÆâ¤Ç 1Éüþ´ü¤Î E_EVENT_TICK_SECOND ÄÌÃΤ˸Ʊþ¤·½ÐÎϥݡ¼¥È¤Î Lo, Hi ¤ò¥È¥°¥ë¤¹¤ë

    Test02¡§ ¥¹¥¤¥Ã¥ÁÁàºî¤Ë LED ¤Î¾õÂÖ¤òϢư¤µ¤»¤ë

    ¾å¤Î Test01 ¤ÏÁ´¼«Æ°¤«¤Ä¥¨¥ó¥É¥ì¥¹¤Ç¤¹¤¬¡¢º£Å٤Ͽʹ֤ÎÁàºî¤ËÈ¿±þ¤µ¤»¤Æ¤ß¤Þ¤¹¡£¥¿¥¯¥È¥¹¥¤¥Ã¥Á¤Î ON/OFF ¤Ë LED ¤ÎÅÀÅô/¾ÃÅô ¤¬Ï¢Æ°¤·¤Þ¤¹¡£¥Í¥Ã¥È¥ï¡¼¥¯ÄÌ¿®¤Ï¹Ô¤¤¤Þ¤»¤ó¡£

    Æ°ºî¤ÎÍÍ»Ò

    ÁõÃ֤μ̿¿¤È¹½À®¿Þ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

    ¥½¡¼¥¹¥³¡¼¥É  GitHub

    ´ûÄê¤Î¥¤¥Ù¥ó¥È¥Ï¥ó¥É¥é cbToCoNet_vMain() Æâ¤Ç¥¿¥¯¥È¥¹¥¤¥Ã¥Á¤Î¾õÂ֤˱þ¤¸¤Æ LED ¤Î¾õÂÖ¤òÊѲ½¤µ¤»¤ë

    Test03¡§ ¥·¥ê¥¢¥ë·Ðͳ¤Ç¥Ç¥Ð¥Ã¥°¥á¥Ã¥»¡¼¥¸¤ò½ÐÎÏ

    ¥×¥í¥°¥é¥ß¥ó¥°¤Ë¤Ï¥Ç¥Ð¥Ã¥°¤Î¤¿¤á¤Î¼êÃʤ¬ÉԲķç¤Ç¤¹¡£Test02 ¤Î¥³¡¼¥É¤Ë¡¢¥·¥ê¥¢¥ëÀܳ·Ðͳ¤Ç PC ¾å¤Î¥¿¡¼¥ß¥Ê¥ë¥¢¥×¥ê¤Ø¥È¥ì¡¼¥¹Ê¸¤ò½ÐÎϤ¹¤ë½èÍý¤ò²Ã¤¨¤Æ¤ß¤Þ¤¹¡£PC ¤È¤ÎÀܳ¤Ë¤ÏÀìÍѤΠUSB ¥¢¥À¥×¥¿ ¡ÖTWE-LITE R¡×¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£¡¡¡Ê»ÔÈΤΠUSB ¥·¥ê¥¢¥ëÊÑ´¹¥â¥¸¥å¡¼¥ë¡¿¥±¡¼¥Ö¥ë¤âÍøÍѤǤ­¤Þ¤¹¡Ë¡¡¥Í¥Ã¥È¥ï¡¼¥¯ÄÌ¿®¤Ï¹Ô¤¤¤Þ¤»¤ó¡£

    Æ°ºî¤ÎÍÍ»Ò

    ÁõÃ֤μ̿¿¤È¹½À®¿Þ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

    ¥½¡¼¥¹¥³¡¼¥É  GitHub

    µ¯Æ°»þ¤Ë UART ¤È¥Ç¥Ð¥Ã¥°½ÐÎÏÍѤνé´ü²½¤ò¹Ô¤¤ vfPrintf() ´Ø¿ô¤ò»È¤Ã¤Æ¥·¥ê¥¢¥ë¤Ø¥È¥ì¡¼¥¹Ê¸¤ò½ÐÎÏ

    Test04¡§ ¥¹¥¤¥Ã¥Á²¡²¼¤Ç¥á¥Ã¥»¡¼¥¸¤òÁ÷¿® ¡Á ¼õ¿®Â¦¤Ï LED ¤ÇÈ¿±þ

    ̵ÀþÁ÷¼õ¿®¤ò¹Ô¤¤¤Þ¤¹¡£Test02 ¤ÎÁõÃÖ¤ÈƱ¤¸¤â¤Î¤ò¤â¤¦¤Ò¤È¤ÄÍÑ°Õ¤·¤Þ¤¹¡£¥¿¥¯¥È¥¹¥¤¥Ã¥Á¤¬²¡²¼¤µ¤ì¤ë¤È¥á¥Ã¥»¡¼¥¸¤ò¥Ö¥í¡¼¥É¥­¥ã¥¹¥È¤·¡¢¼õ¿®¤·¤¿Â¦¤Ï LED ¤ò°ìÄê»þ´ÖÅÀÅô¤µ¤»¤Þ¤¹¡£

    Æ°ºî¤ÎÍÍ»Ò

    ÁõÃ֤μ̿¿¤È¹½À®¿Þ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

    ¥½¡¼¥¹¥³¡¼¥É  GitHub

    ¥¹¥¤¥Ã¥Á²¡²¼»þ¤Ë ToCoNet_bMacTxReq() ¤Ë¤è¤ê¥Ö¥í¡¼¥É¥­¥ã¥¹¥È¤ò¼Â¹Ô¡£´ûÄê¤Î¥¤¥Ù¥ó¥È¥Ï¥ó¥É¥é cbToCoNet_vTxEvent() ¤ª¤è¤Ó cbToCoNet_vRxEvent() Æâ¤ÇÁ÷¼õ¿®ÄÌÃΤؤÎÂбþ¤ò¹Ô¤¦

    Test05¡§ ÅÅÎϾÃÈñ¤òÍÞÀ©¤·¤¿Á÷¿®ÀìÍÑ¥³¡¼¥É¤ÈÁõÃÖ

    ¾åµ­ Test04 ¤Ç¤ÎÁ÷¿®½èÍý¤òÆÈΩ¤µ¤»¡¢¾ÃÈñÅÅÎϤòÍÞ¤¨¤ë¤³¤È¤òÌÜŪ¤Ë¥á¡¼¥«¡¼¸ø¼°¤Î¡Ö̵Àþ¥¿¥°¥¢¥×¥ê¡ÊApp_Tag¡Ë¡×¡ÊÃí¡§2015ǯ04·î»þÅÀ¤Ç¤Î̾¾Î¤Ï¡ÖSamp_Monitor¡×¡Ë¤Î²¡¤·¥Ü¥¿¥ó¡¦¼§µ¤¥¹¥¤¥Ã¥ÁÂбþµ¡Ç½¤Ë¤ª¤±¤ë»Òµ¡½èÍý¡ÊEndDevice_Input¡Ë¤Ç¤Î°Ê²¼¤ÎÍ×½ê¤ò¼è¤êÆþ¤ì¤¿ÆâÍƤǤ¹¡£

    • TWE-LITE ¤Î¥â¡¼¥ÉÀßÄê¥Ó¥Ã¥È 1 (M1) ¤¬ GND ¤ËÀܳ¤µ¤ì¤Æ¤¤¤ì¤Ð¡Ê¤¹¤Ê¤ï¤Á M1 ¤¬ Lo ¤Ç¤¢¤ì¤Ð¡Ë¡¢¥Ç¥¸¥¿¥ëÆþÎÏ 1 (DI1) ¤ÎΩ¤Á¾å¤¬¤ê (Lo -> Hi) ¤òÁ÷¿®¤Î¥È¥ê¥¬¡¼¤È¤¹¤ë
      ¡Êŵ·¿Åª¤Ë¤ÏÊ¿»þ¤¬Æ³Ä̾õÂ֤짵¤¥ê¡¼¥É¥¹¥¤¥Ã¥Á¤¬¼§³¦¤«¤éÎ¥¤ìÀÚÃǤµ¤ì¤¿¾õ¶·¡Ë
      • Ω¤Á¾å¤¬¤ê¥È¥ê¥¬¡¼¤Î¾ì¹ç ÀáÅŤΤ¿¤á DI1 ¤ÎÆâÉô¥×¥ë¥¢¥Ã¥×¤ò̵¸ú²½¤¹¤ë¡£¤½¤Î¤¿¤á¤³¤Î¾ì¹ç¤Ï³°Éô¥×¥ë¥¢¥Ã¥×Äñ¹³¤òÀßÃÖ¤¹¤ë¡£¡Ê¸ø¼°¥µ¥¤¥È¾å¤Îµ­»ö¤ò»²¹Í¤Ë 1M¦¸ Äñ¹³¤ò»ÈÍÑ¡Ë
    • M1 ¤¬ GND ¤ËÀܳ¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð DI1 ¤ÎΩ¤Á²¼¤¬¤ê (Hi -> Lo) ¤ò¥È¥ê¥¬¡¼¤È¤¹¤ë
      ¡Êŵ·¿Åª¤Ë¤ÏÊ¿»þ¤¬ÈóƳÄ̾õÂ֤Υ¿¥¯¥È¥¹¥¤¥Ã¥Á¤¬²¡²¼¤µ¤ì¤¿¾õ¶·¡Ë

    • Á÷¿®¤ò½ª¤¨¤¿¤é¤¹¤ß¤ä¤«¤Ë Sleep ¾õÂ֤ذܹԤ· DI1 ¤Î¾õÂÖ¤¬ÊѲ½¤¹¤ë¤È Sleep ¤«¤éÉüµ¢¤¹¤ë

    ¼õ¿®Â¦¤Ï Test04 ¤Î¤â¤Î¤ò¤½¤Î¤Þ¤Þ»È¤¤¤Þ¤¹¡£°Ê²¼¤ÎÆ°²è¡¦¼Ì¿¿¤Ç¤ÏÁ÷¿®Â¦¤ÎÁõÃ֤ϼ§µ¤¥ê¡¼¥É¥¹¥¤¥Ã¥Á¤ò»È¤Ã¤Æ¤ª¤êΩ¤Á¾å¤¬¤ê¸¡½Ð¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£ ¤Á¤Ê¤ß¤Ë¤³¤ÎÁõÃÖ¤ÎÂÔµ¡¡ÊSleep¡Ë¾õÂ֤ξÃÈñÅÅή¤ò¬¤Ã¤¿¤È¤³¤í 3¦ÌA¡Ê0.003mA¡Ë¤Ç¤·¤¿¡£°ìÈÌ¤Ë CR2032 ¤ÎÊüÅÅÍÆÎ̤Ϥª¤è¤½ 225mAh ¤Ç¤¢¤ë¤³¤È¤«¤é¡¢²¼µ­¤Î¥µ¥¤¥È¤òÍøÍѤ·¤Æñ½ã·×»»¤¹¤ë¤ÈÂÔµ¡·Ñ³²Äǽ´ü´Ö¤Ï 225mAh / 0.003mA * 0.7 ¡á 52500»þ´Ö ¡á 2187.5Æü ¢â 5.99ǯ¤È¤Ê¤ê¤Þ¤¹¡£¼ÂºÝ¤ÎÅÅÃÓ¼÷Ì¿¤ÏÁ÷¿®ÉÑÅ٤ˤè¤Ã¤ÆÂ礭¤¯ÊѤï¤ë¤Ç¤·¤ç¤¦¡£

    ÅÅÃÓ¼÷Ì¿¥«¥ê¥­¥å¥ì¡¼¥¿ - www.digikey.jp

    Æ°ºî¤ÎÍÍ»Ò

    ÁõÃ֤μ̿¿¤È¹½À®¿Þ¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

    ¥½¡¼¥¹¥³¡¼¥É  GitHub

    ÅŸ»ÅêÆþľ¸å¤ä¥ê¥»¥Ã¥È¸å¤Ï¤Þ¤º¤½¤Î¤Þ¤Þ Sleep ¾õÂ֤ذܹԡ£DI1 ¤Î¾õÂÖ¤¬ÊѲ½¤¹¤ë¤Èµ¯¾²¤·¤ÆÁ÷¿®¤ò¹Ô¤¤¤Õ¤¿¤¿¤Ó Sleep ¤Ø¡£DI1 ¤ÎΩ¤Á¾å¤¬¤ê¡¿Î©¤Á²¼¤¬¤ê¤Î¤É¤Á¤é¤ÇÁ÷¿®¤ò¹Ô¤¦¤«¤Ï M1 ¤Î Lo / Hi ¾õÂ֤ǷèÄꤹ¤ë

    ÉÕÏ¿¡§¡Ö̵Àþ¥¿¥°¥¢¥×¥ê¡×¥«¥¹¥¿¥Þ¥¤¥º¤Îµ­Ï¿

    2015ǯ4·î¡¢¼ê¸µ¤Î¼Â¸³ÅªÍ×·ï¤Ø¤ÎÂбþ¤Î¤¿¤á¤ËÁ°·Ç¤Î¸ø¼°¥¢¥×¥ê¡Ö̵Àþ¥¿¥°¥¢¥×¥ê¡ÊApp_Tag¡Ë¡×¡ÊÅö»þ¤Î̾¾Î¤Ï¡ÖSamp_Monitor¡×¡Ë¤Î¿Æµ¡¡ÊParent/¡Ë¤ª¤è¤Ó»Òµ¡¡ÊEndDevice_Input/¡Ë¥³¡¼¥É¤Î¥«¥¹¥¿¥Þ¥¤¥º¤ò»î¤ß¤Þ¤·¤¿¡£°Ê²¼¤Ï¤½¤Îµ­Ï¿¤Ç¤¹¡£

    Êѹ¹¤ò²Ã¤¨¤¿¥½¡¼¥¹¡¦¥Ø¥Ã¥À

    ¢¨¥Ù¡¼¥¹¤Î¥Ð¡¼¥¸¥ç¥ó¤Ï 2015ǯ4·î20ÆüÅö»þ¤ÎºÇ¿·ÈÇ¡ÖSamp_Monitor v1.4.1 ¦Â¡×¤Ç¤¹¡Ê2017ǯ1·î¸½ºß¤Ï´û¤Ë¸ø³«½ªÎ»¡Ë
    ¢¨Êѹ¹²Õ½ê¤Ï¼±Ê̻ҡÖMODIFIED_BY_KLAB¡×¤Ç¶èÊ̤·¤Æ¤¤¤Þ¤¹

    Êѹ¹ÆâÍÆ

    EndDevice_Input¡§

    • ¥»¥ó¥µ¥â¡¼¥É¤¬ PKT_ID_BUTTON¡Ê²¡¤·¥Ü¥¿¥ó¡¦¼§µ¤¥¹¥¤¥Ã¥Á¡Ë ¤Î¾ì¹ç¡¢°ìÅÙ¤ÎÁ÷¿®´°Î»¤Ç¤¿¤À¤Á¤Ë¥¹¥ê¡¼¥×¾õÂ֤ذܹԤ»¤º½êÄê¤Î²ó¿ô·«¤êÊÖ¤·Á÷¿®¤ò¹Ô¤Ã¤Æ¤«¤é°Ü¹Ô¤¹¤ë (diff)

    Parent¡§

    • ÅŻҥ֥¶¡¼¤ÎÀܳ¤òÁÛÄꤷ DO4 ¤Î»ÈÍѤòÄɲᣥ»¥ó¥µ¥â¡¼¥É¤¬ PKT_ID_BUTTON ¤Î»Òµ¡¤«¤é¥Ñ¥±¥Ã¥È¤ò¼õ¿®¤·¤¿¾ì¹ç¡¢DO1 ¤Î LED ¥È¥°¥ë¤Ë¹ç¤ï¤» DO4 ¤Î¾õÂÖ¤â¥È¥°¥ë¤¹¤ë
    • PKT_ID_BUTTON ¤Î»Òµ¡¤«¤é¤Î¼õ¿®È¯À¸¸å¤Ï¿Æµ¡¤¬¥ê¥»¥Ã¥È¤µ¤ì¤ë¤Þ¤Ç DO1 ¤Î LED ¤òÅÀÌǤµ¤»¤ë¡Ê¼õ¿®Í­Ìµ¤ò»ö¸å¤ËÌܤdzÎǧ¤¹¤ë¤¿¤á¤ÎÊص¹¡Ë (diff)

    °Ê²¼¤ÎÆ°²è¡¦¼Ì¿¿¤Ç¤Ï»Òµ¡Â¦¤ÎÁõÃ֤ϼ§µ¤¥ê¡¼¥É¥¹¥¤¥Ã¥Á¤ò»ÈÍѤ·Î©¤Á¾å¤¬¤ê¸¡½Ð¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¤³¤Î»Òµ¡¤Î¥Ñ¥é¥á¡¼¥¿ÀßÄê¤Ë¤ª¤¤¤Æ¡Öm¡§¥»¥ó¥µ¼ïÊ̤ÎÀßÄê¡×¤Ë¤Ï 0xFE¡¢¡Öp¡§¥»¥ó¥µ¸ÇÍ­¥Ñ¥é¥á¡¼¥¿¤ÎÀßÄê¡×¤Ë¤Ï 1 ¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹¡£

    Æ°ºî¤ÎÍÍ»Ò

    ÁõÃ֤μ̿¿¤È¹½À®¿Þ¡¡¾å¡§¿Æµ¡¡¡²¼¡§»Òµ¡¡¡¡Ê¥¯¥ê¥Ã¥¯¤ÇÂ礭¤¯É½¼¨¡Ë

    ¡ÊÈ÷¹Í¡Ë

    2017ǯ1·î13Æü»þÅÀ¤Ç¤ÎºÇ¿·ÈÇ SDK ¡Ö2014/8·î¹æ¡×¤Ë¼ýÏ¿¤µ¤ì¤Æ¤¤¤ëµì Samp_Monitor v1.3.2 ¤Î»Òµ¡Â¦¥½¡¼¥¹¥³¡¼¥É¤Ë¤ÏËÜÍè¤Î°Õ¿Þ¤È¤Ï°Û¤Ê¤ë¤â¤Î¤È¹Í¤¨¤é¤ì¤ë¥í¥¸¥Ã¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£

    1. »Òµ¡¤Î¥Ñ¥é¥á¡¼¥¿ÀßÄêÆâÍƤò¥»¡¼¥ÖÎΰ褫¤éÆɤ߽Ф¹¥¿¥¤¥ß¥ó¥°
      ¡Ê/TWESDK/Wks_ToCoNet/Samp_Monitor/EndDevice_Input/Source/EndDevice_Input.c¡Ë
      ¢¨ µì Samp_Monitor v1.4.1¦Â ¤Ç²þ½¤¤µ¤ì¤Þ¤·¤¿
    2. »Òµ¡¤Î¥»¥ó¥µ¥â¡¼¥É¤¬ PKT_ID_BUTTON (0xFE) ¤Î¾ì¹ç¤Î¸ÇÍ­¥Ñ¥é¥á¡¼¥¿ Ω¤Á¾å¤¬¤ê (1) / Ω¤Á²¼¤¬¤ê (0) »ØÄê¤ËÂФ¹¤ë½èÍý
      ¡Ê/TWESDK/Wks_ToCoNet/Samp_Monitor/EndDevice_Input/Source/ProcessEv_Button.c¡Ë
      ¢¨ µì Samp_Monitor v1.3.3 ¤Ç²þ½¤¤µ¤ì¤Þ¤·¤¿

    ¤½¤Î¤¿¤á¡¢º£¤Î»þÅÀ¤Ç¡Ö̵Àþ¥¿¥°¥¢¥×¥ê¡×¤ò»È¤¦¾ì¹ç¤ÏñÂΤÇÇÛÉÛ¤µ¤ì¤Æ¤¤¤ëÈǤòÍøÍѤ¹¤ë¤Û¤¦¤¬Îɤ¤¤Ç¤·¤ç¤¦¡£


    (tanabe)
    klab_gijutsu2 at 16:37¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(18)
    2015ǯ02·î17Æü

    mbed ¤È Parse ¤Çºî¤ë¹âÎð¼ÔÀ¤ÂÓ°ÂÈݳÎǧ¥·¥¹¥Æ¥à

    ¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

    2017-01-30 Äɵ­¡§
    2017ǯ1·îËö¤Î Parse.com ¥µ¡¼¥Ó¥¹½ªÎ»¤Ëȼ¤¤°Ê²¼¤Îµ­»ö¤òÄɲä·¤Þ¤·¤¿¡£Â¾¥µ¡¼¥Ó¥¹¤Ø¤Î°Ü¹Ô¤Ë´Ø¤¹¤ë¾ðÊóÅù¤òµ­½Ò¤·¤Æ¤¤¤Þ¤¹¡£

    ¤µ¤è¤Ê¤é Parse - Åö¥Ö¥í¥°

    ¸Ä¿ÍŪ¤Ë¡¢¹âÎð¼ÔÀ¤ÂӤΰÂÈݤòÆü¾ïŪ¤ËÀŤ«¤Ë³Îǧ¤Ç¤­¤ë»ÅÁȤߤ¬¤Û¤·¤¤¤È»×¤Ã¤Æ¤¤¤Þ¤·¤¿¡£Í×·ï¤È¤·¤ÆÁÛÄꤷ¤Æ¤¤¤¿¤Î¤Ï¼¡¤ÎÆóÅÀ¡£¸½ÃϤˤϥ¤¥ó¥¿¡¼¥Í¥Ã¥È¤Ø¤ÎÀܳ´Ä¶­¤¬À°¤Ã¤Æ¤¤¤Þ¤¹¡£

    • ¸½ÃϤǤÎÈï´Æ»ë´¶¤ä¹´Â«´¶¤¬´õÇö¤Ç¤¢¤ë¤³¤È
    • ¾ðÊó¤ò¼«Ê¬¤Ç¥Ï¥ó¥É¥ê¥ó¥°¤Ç¤­¤ë¤³¤È
    ¼Â¸½ÊýË¡¤ò¹Í¤¨¤ë¤È°Æ³°Çº¤Þ¤·¤¯¡¢¤è¤¯¤¢¤ë¥ê¥â¡¼¥È¥«¥á¥é¤ÎÎà¤Ï¼ê·Ú¤ÊÈ¿ÌÌ Æü¾ï¤òÀ¸¡¹¤·¤¯´Æ»ë¤¹¤ë¤è¤¦¤Ç£Î£Ç¡¢¼«ºî¤ÎÁªÂò»è¤Ï¤¢¤ì¤É PC ¤ò¥Õ¥í¥ó¥È¥¨¥ó¥É¤È¤¹¤ë¤³¤È¤Ë¤Ï²¿¤«¤ÈµíÅá´¶¤¬¤¢¤êµ¤¤¬¿Ê¤Þ¤º¡¢¤Þ¤¿¡¢³Æ¼ÒÍͤˤè¤ëÍ¥¤ì¤¿¥µ¡¼¥Ó¥¹¤Î¿ô¡¹¤Ë¤â´Ø¿´¤Ï¤¢¤ë¤â¤Î¤Î¹±¾ïŪ¤ËÈñÍѤ¬¤«¤«¤ë¤³¤È¤ÏÅöÁ³¤È¤·¤Æ¤â¼«Ê¬¤¬¸Ä¿ÍŪ¤Ë˾¤à½ÀÆðÀ­¡¦³ÈÄ¥À­¤ËŬ¹ç¤¹¤ë»ÅÁȤߤò¤Ê¤«¤Ê¤«¸«½Ð¤¹¤³¤È¤¬¤Ç¤­¤ºÆ³Æþ¤Ë¤Ï»ê¤é¤º¤Ë¤¤¤Þ¤·¤¿¡£
    °ÊÁ°¤«¤éƬ¤ÎÃæ¤Ç¤È¤­¤É¤­¤½¤¦¤¤¤¦¥ë¡¼¥×¤ò½ä¤é¤»¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬¡¢ÀèÆü¤Õ¤È¥Þ¥¤¥³¥ó¤È¥¯¥é¥¦¥É¥µ¡¼¥Ó¥¹¤òÁȤ߹ç¤ï¤»¤ÆÍøÍѤ¹¤ë¤³¤È¤ò»×¤¤¤Ä¤­¤Þ¤·¤¿¡£ÀÞ¤«¤é¤Î¡Ö¥â¥Î¤Î¥¤¥ó¥¿¡¼¥Í¥Ã¥È¡ÊInternet of Things : IoT¡Ë¡×¤ÎĬή¤Ë¤â¹çÃפ¹¤ë¤¿¤á¤½¤Î»ëÅÀ¤«¤é¤âÌÌÇò¤½¤¦¤Ç¤¹¡£

    ¥Þ¥¤¥³¥óÊýÌ̤ˤϺ£¤Þ¤Ç¤Û¤È¤ó¤ÉÆëÀ÷¤ß¤¬¤Ê¤«¤Ã¤¿¤Î¤Ç¤¹¤¬¡¢¾ðÊó¼ý½¸¤ò·Ð¤ÆÁªÂò¤·¤¿ mbed ¥Þ¥¤¥³¥ó¥Ü¡¼¥É¤òÍøÍѤ¹¤ë¤³¤È¤Ç¥Õ¥í¥ó¥È¥¨¥ó¥É¤ÎÁõÃÖËÜÂΤ⤽¤ì¤òÆ°¤«¤¹¤¿¤á¤Î¥×¥í¥°¥é¥à¤â¼êÁ᤯ºî¤ë¤³¤È¤¬¤Ç¤­¤Þ¤·¤¿¡£¥Ð¥Ã¥¯¥¨¥ó¥É¤Ë¤Ï¥á¥¸¥ã¡¼¤Ê BaaS ¤Î¤Ò¤È¤Ä¤Ç¤¢¤ë Parse ¤òÍøÍѤ·¥µ¡¼¥Ð¦½èÍý¤â¥·¥ó¥×¥ë¤Ë»Å¾å¤²¤Æ¤¤¤Þ¤¹¡£É¬ÍפÊÈñÍѤÏÁõÃÖºàÎÁʬ¤Î¤ª¤è¤½ 1Ëü±ßÄøÅÙ¡Ê2015ǯ2·î¸½ºß¡Ë¤Î¤ß¤Ç¥¯¥é¥¦¥É¥µ¡¼¥Ó¥¹¤Ï¼ê¸µ¤Ç¤Ï̵ÎÁÏÈÆâ¤Ç¤æ¤Ã¤¿¤ê¤È»È¤¨¤Æ¤ª¤ê¡¢º£¸å¤â¤¤¤í¤¤¤í¼ê¤ò²Ã¤¨¤Æ¤¤¤¯¤Ä¤â¤ê¤Ç¤¹¡£¤Ê¤«¤Ê¤«ÊØÍø¤Ê¤â¤Î¤Ë¤Ê¤Ã¤¿¤Î¤Ç¸½»þÅÀ¤Ç¤ÎÆâÍƤȹ½À®¤ò¾Ò²ð¤·¤Þ¤¹¡£Î¥¤ì¤ÆÊë¤é¤¹²È²¤òµ¤¤Ë·ü¤±¤Æ¤ª¤é¤ì¤ëÊý¤Î¤´»²¹Í¤È¤Ê¤ì¤Ð¹¬¤¤¤Ç¤¹¡£

    Á´ÂÎÁü¤ò¿Þ¤Ë¼¨¤·¤Þ¤¹¡£

    Æ°ºî¤ÎÍÍ»Ò

    ÁõÃÖ¤ÎÆ°¤­¤È¥¯¥é¥¦¥É¥µ¡¼¥Ó¥¹¤È¤ÎÏ¢·È¤ÎÍͻҤò°Ê²¼¤ÎÆ°²è¤Ë¼ý¤á¤Æ¤¤¤Þ¤¹¡£

    Æ°²è£±¡§ÁõÃÖ¤¬¿Í´Ö¤ò¸¡ÃΤ¹¤ë¤È Parse ¥µ¡¼¥Ð¤Ø¥Ç¡¼¥¿¤òÁ÷½Ð

    Æ°²è¤ÎÆâÍÆ
    ¡Ê̵²»¡¡1ʬ15ÉáË

    1. ÁõÃ֤صëÅÅ ¡Á ½é´ü²½¤¬´°Î»¤¹¤ë¤Þ¤ÇÁ´ LED ¤¬ÅÀÌÇ
    2. ÀÖ³°Àþ¥»¥ó¥µ¤¬¿Í¤ò¸¡ÃΤ·ÀÖ LED ¤¬ÅÀÅô ¡Á Parse ¥µ¡¼¥Ð¤Ø¸¡ÃξðÊó¤òÁ÷½Ð
    3. PC ¾å¤Î¥Ö¥é¥¦¥¶¤Ç¤Ï Parse ¥¢¥×¥ê¡ÖAnpi¡×¤Î¡ÖDetected¡× ¥¯¥é¥¹¡Ê¥Æ¡¼¥Ö¥ë¡Ë¤Î¥Ç¡¼¥¿¤òɽ¼¨Ãæ
    4. ɽ¼¨¤ò¹¹¿·¤·¤Æ¿·¤·¤¤¥Ç¡¼¥¿¤¬Äɲ䵤ì¤Æ¤¤¤ë¤³¤È¤ò³Îǧ
    5. Gmail ¤ÇÁ°Æü¼õ¿®¤·¤¿¥ì¥Ý¡¼¥È¥á¡¼¥ë¡Ê¿Í¤ò¸¡ÃΤ·¤¿ÆüÉÕ»þ¹ï¤Èµ¤²¹¾ðÊó¤Îľ¶á¤Î°ìÍ÷¡Ë¤òɽ¼¨¤·¤Æ¤ß¤ë
    6. ºÇ¸å¤Ë¤Õ¤¿¤¿¤ÓÁõÃÖ¤ÎÀÖ³°Àþ¥»¥ó¥µ¤Ë¼ê¤ò¤«¤¶¤·¤ÆÈ¿±þ¤ò»î¤·¤Æ¤ß¤ë

    Æ°²è£²¡§ÁõÃ֤Ρֶ۵ޥܥ¿¥ó¡×¤¬Ä¹²¡¤·¤µ¤ì¤ë¤È¤½¤Î¾ì¤Ç¥á¡¼¥ëÄÌÃÎ

    Æ°²è¤ÎÆâÍÆ
    ¡Ê´Ä¶­²»¡Ü¥Ö¥¶¡¼²»¤¢¤ê¡¡30ÉáË

    1. ¶ÛµÞ¥Ü¥¿¥ó¤ò²¡¤¹¤ÈÁõÃ֤ΠLED ¤¬È¿±þ ¡Á û»þ´Ö¤Î²¡²¼¤Ï¤½¤Î¤Þ¤Þ¼õ¤±Î®¤µ¤ì¤ë
    2. 2ÉÃÄøÅÙĹ²¡¤·¤¹¤ë¤ÈÁàºî¼Ô¤Ë¥Ö¥¶¡¼¤ÇĹ²¡¤·¤Î¼õ¤±Æþ¤ì¤òÅÁ¤¨ Parse ¥µ¡¼¥Ð¤Ø¶ÛµÞ¥Ü¥¿¥ó²¡²¼¤òÄÌÃÎ
    3. ¥Ü¥¿¥ó²¡²¼¤¬¥á¡¼¥ë¤ÇÄÌÃΤµ¤ì¤ë

    mbed ¤Ë¤Ä¤¤¤Æ

    ARM ¼Ò ¤Ë¤è¤Ã¤Æ³«È¯¤µ¤ì¤¿ mbed ¤Ï ARM ¥Þ¥¤¥³¥óÅëºÜ¤Î¥³¥ó¥Ô¥å¡¼¥¿¥Ü¡¼¥É¤ÈÀìÍѤγ«È¯´Ä¶­¤Ë¤è¤Ã¤Æ¹½À®¤µ¤ì¡Ö¹â®¥×¥í¥È¥¿¥¤¥Ô¥ó¥°¥Ä¡¼¥ë¡×¤Î¥­¥ã¥Ã¥Á¥Õ¥ì¡¼¥º¤ÎÄ̤ꥷ¥ó¥×¥ë¤Ê¼ê½ç¤Ç¼êÁ᤯°·¤¦¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£¸½ºß¤µ¤Þ¤¶¤Þ¤Ê mbed ¥Ü¡¼¥É¤¬ÈÎÇ䤵¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢º£²óÁª¤ó¤À¤Î¤Ï¤â¤Ã¤È¤âÂåɽŪ¤Ê¡Ömbed NXP LPC1768¡×¤Ç¤¹¡£Cortex-M3 ¥×¥í¥»¥Ã¥µ¤òºÜ¤»¤¿¤³¤Îñ»°ÅÅÃÓÆóËÜʬ¤Û¤É¤ÎÂ礭¤µ¤Î¥Ü¡¼¥É¤Ë¤Ï¿ÍͤÊÆþ½ÐÎϥݡ¼¥È¤Ë²Ã¤¨¥¤¡¼¥µ¥Í¥Ã¥ÈÍÑ¥³¥ó¥È¥í¡¼¥é¤Þ¤Ç¤â¤¬¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

    ½é¤á¤Æ mbed ¤Ë¿¨¤ì¤ë¾ì¹ç¤Ï mbed.org ¤Ø¤Î¥æ¡¼¥¶ÅÐÏ¿¤¬É¬ÍפǤ¹¡£À½ÉʤËƱº­¤Î USB ¥±¡¼¥Ö¥ë¤Ç¡¡mbed LPC1768 ¤ò PC ¤ØÀܳ¤¹¤ë¤È¥Ü¡¼¥É¾å¤Î¥¹¥È¥ì¡¼¥¸¤¬¥Þ¥¦¥ó¥È¤µ¤ì¤Þ¤¹¡£¥¹¥È¥ì¡¼¥¸¾å¤Î¡ÖMBED.HTM¡×¤ò¥Ö¥é¥¦¥¶¤Ø¥í¡¼¥É¤¹¤ë¤È¥æ¡¼¥¶ÅÐÏ¿²èÌ̤ØÁ«°Ü¤¹¤ë¤Î¤Ç¤½¤³¤ØɬÍפʾðÊó¤òÅêÆþ¤·¤Þ¤¹¡£ÅÐÏ¿¤¬´°Î»¤¹¤ë¤È mbed ¤Î¥ª¥ó¥é¥¤¥ó¥³¥ó¥Ñ¥¤¥é¤ò¥Ö¥é¥¦¥¶¤«¤éÍøÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£C, C++ ¤Ç¥³¡¼¥É¤òµ­½Ò¤·¡ÖCompile¡×¥Ü¥¿¥ó¤ò²¡¤¹¤È¥µ¡¼¥Ð¦¤Ç¥Ó¥ë¥É¤¬¹Ô¤ï¤ì¡¢¤½¤³¤ÇÀ¸À®¤µ¤ì¤¿¼Â¹Ô·Á¼°¤ò¥À¥¦¥ó¥í¡¼¥É ¡Á mbed ¤Î USB ¥¹¥È¥ì¡¼¥¸¤Ø¥³¥Ô¡¼¤·¤Æ¥Ü¡¼¥É¤Î¥ê¥»¥Ã¥È¥Ü¥¿¥ó¤ò²¡²¼¤¹¤ë¤È¥×¥í¥°¥é¥à¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¤½¤³¤«¤éÀè¤Ï¡¢¥³¡¼¥É¤òÊÔ½¸¤·¤¿¤ê´û¸¤Î¥é¥¤¥Ö¥é¥ê¤ò¥¤¥ó¥Ý¡¼¥È¤·¤¿¤ê mbed ¥Ü¡¼¥É¤òÁõÃ夷¤¿²óÏ©¤Ë¼ê¤ò²Ã¤¨¤¿¤ê¡¢¡¢¤È¤¤¤Ã¤¿¼ê½ç¤Î·«¤êÊÖ¤·¤Ç¤¹¡£ºîË¡¤É¤ª¤êºÇ½é¤Ï¤Þ¤º¤¢¤ì¤³¤ì¥µ¥ó¥×¥ë¥³¡¼¥É¤ò¥Ó¥ë¥É¤·¤ÆÆ°¤«¤·¤¿¤ê¤½¤ì¤Ë¼ê¤ò²Ã¤¨¤Æ»î¤·¤¿¤ê¤È¤¤¤¦¤³¤È¤«¤é»Ï¤á¤Þ¤·¤¿¡£¤Ê¤ª¡¢mbed ¥Ü¡¼¥É¤Î¥³¥ó¥È¥í¡¼¥é¤Ï USB ²¾ÁÛ¥·¥ê¥¢¥ë¥Ý¡¼¥È·Ðͳ¤Ç¥Û¥¹¥È PC ¤È¤Î¥·¥ê¥¢¥ëÄÌ¿®¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤ª¤ê PC ¦¤Ç¥¿¡¼¥ß¥Ê¥ë¥¢¥×¥ê¤ò»È¤¨¤Ð¥Ç¥Ð¥Ã¥°¤Ë¤âÊØÍø¤Ç¤¹¡£

    mbed ¤ÎÀ¤³¦¤Ç¤Ï¥³¥ß¥å¥Ë¥Æ¥£¤¬È¯Å¸¤·¤Æ¤ª¤êÍÍ¡¹¤Ê»ñ»º¤¬¶¦Í­¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤ï¤«¤ê°×¤¯Í­ÍѤʵ­»ö¡¦Ê¸½ñ¤â¿ô¿¤¯Â¸ºß¤¹¤ë¤Î¤Ç¤È¤Æ¤â»²¹Í¤Ë¤Ê¤ê¤Þ¤¹¡£

    ÁõÃ֤ˤĤ¤¤Æ

    À½ºî¤·¤¿ÁõÃ֤κàÎÁ¤ÈÁȤßΩ¤ÆÊý¡¢À©¸æÍÑ¥×¥í¥°¥é¥à¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£

    ºàÎÁ

    ¡Ê¢¨²Á³Ê¤Ï¤¤¤º¤ì¤â2015ǯ1·î»þÅÀ¤ÎÀǹþ³Û¡Ë

    • ¥Þ¥¤¥³¥ó¥Ü¡¼¥É mbed NXP LPC1768 ¡ï5,800¡¡½©·îÅÅ»ÒÄ̾¦
    • ¾ÇÅÅ·¿ÀÖ³°Àþ¥»¥ó¥µ¡¼¥â¥¸¥å¡¼¥ë¡¡(SB612A)¡¡¡ï600¡¡½©·îÅÅ»ÒÄ̾¦
    • LAN ¥³¥Í¥¯¥¿ (mbedÍÑ¥¤¡¼¥µ¥Í¥Ã¥ÈÀܳ¥­¥Ã¥È)¡¡¡ï514¡¡¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹
    • IC ²¹ÅÙ¥»¥ó¥µ (LM61BIZ)¡¡¡ï200¡¡¡Ê4¸ÄÆþ¡Ë¡¡½©·îÅÅ»ÒÄ̾¦
    • ÅŻҥ֥¶¡¼¡¡(PKB24SPCH3601)¡¡¡ï150¡¡½©·îÅÅ»ÒÄ̾¦¡¡¡¡
      ¢¨ÉÔÍפʤé¾Êά²Ä
    • ¥Ö¥ì¥Ã¥É¥Ü¡¼¥É¡¡(EIC-801)¡¡¡ï257¡¡¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹
    • ¥¸¥ã¥ó¥×¥ï¥¤¥ä¡¡(¸Ç¤¤¥ª¥¹¡Á¥ª¥¹) ¡¡¡ï257¡¡¡Ê70ËÜÆþ¡Ë¡¡¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹
    • ¥¸¥ã¥ó¥×¥ï¥¤¥ä¡¡(½À¤é¤«¤¤¥ª¥¹¡Á¥á¥¹)¡¡¡ï691¡¡¡Ê50ËÜÆþ¡Ë¡¡¥¹¥¤¥Ã¥Á¥µ¥¤¥¨¥ó¥¹
    • ÀÖ¿§ LED¡¡¡ï350¡¡¡Ê100¸ÄÆþ¡Ë¡¡½©·îÅÅ»ÒÄ̾¦¡¡¡¡
      ¢¨ÉÔÍפʤ饫¡¼¥Ü¥óÄñ¹³¤È¤È¤â¤Ë¾Êά²Ä
    • 75 ¦¸ ¥«¡¼¥Ü¥óÄñ¹³¡¡¡ï100¡¡¡Ê100ËÜÆþ¡Ë¡¡½©·îÅÅ»ÒÄ̾¦¡¡¡¡
      ¢¨ÉÔÍפʤé LED ¤È¤È¤â¤Ë¾Êά²Ä
    • ²¡¤·¥Ü¥¿¥ó¡¦¥Ô¥ó¥³¥Í¥¯¥¿¡¦Æ³Àþ¡¡¶á½ê¤Î¥Û¡¼¥à¥»¥ó¥¿¡¼¤Ç 5¡Á600 ±ß¤¯¤é¤¤¤Ç¹ØÆþ¡¡
      ¢¨ÉÔÍפʤé¾Êά²Ä
    • ŬÅö¤Ê¥±¡¼¥¹¡¡ÇÑʪÍøÍÑ
    ¢¨¾åµ­»²¹Í²Á³Ê·× ¡ï9,519
    ¢¨LAN ¥±¡¼¥Ö¥ë¤È DC 5V USB-A¥¿¥¤¥× ¤Î AC ¥¢¥À¥×¥¿¤Ï¼ê»ý¤Á¤Î¤â¤Î¤òÍøÍÑ

    ÁȤßΩ¤Æ

    LAN ¥³¥Í¥¯¥¿¤Ç¤¢¤ë¡ÖmbedÍÑ¥¤¡¼¥µ¥Í¥Ã¥ÈÀܳ¥­¥Ã¥È¡×¤ÎÁȤßΩ¤Æ¤Î¤ß¥Ï¥ó¥À¤Å¤±¤¬É¬ÍפǤ¹¤¬¡¢¤½¤Î¾¤ÎÇÛÀþ¡¦¥Ñ¡¼¥Ä¤Î¼è¤ê²ó¤·¤Ï¤¹¤Ù¤Æ¥Ö¥ì¥Ã¥É¥Ü¡¼¥É¾å¤Ç¹Ô¤¦¤¿¤áºàÎÁ¤¬Â·¤Ã¤Æ¤¤¤ì¤ÐÁõÃÖ¤ÎÁȤßΩ¤Æ¤Ï´Êñ¤Ç¤¹¡£¼Ì¿¿¤Î¤è¤¦¤Ë¥Ö¥ì¥Ã¥É¥Ü¡¼¥É¾å¤ÎÇÛÀþ¤Ë¤Ï¸Ç¤¤¥¸¥ã¥ó¥×¥ï¥¤¥ä¡¢¥»¥ó¥µ¤ä¥Ö¥¶¡¼¤ÎÀܳ¤Ë¤Ï¥ª¥¹¡Ý¥á¥¹¤Î½À¤é¤«¤¤¥¸¥ã¥ó¥×¥ï¥¤¥ä¤ò»È¤¤¤Þ¤·¤¿¡£¼ÂÂÎÇÛÀþ¿Þ¤ò¤¢¤ï¤»¤Æ·ÇºÜ¤·¤Þ¤¹¡£¡Ê¥¯¥ê¥Ã¥¯¤Ç³ÈÂç¡Ë

    ¤à¤­½Ð¤·¤Î¤Þ¤Þ¤Ç¤Ï°·¤¤¤Ë¤¯¤¤¤Î¤ÇÁ°¤ËÇã¤Ã¤¿ PC Íѥѡ¼¥Ä¤Î³°È¢¤òºÆÍøÍѤ·¤Æ´Êñ¤Ê¥±¡¼¥¹¤òÍÑ°Õ¤·¤Þ¤·¤¿¡£ÁǺबÇö¤¤¥×¥é¥¹¥Á¥Ã¥¯¤È»æ¤Ê¤Î¤Ç²Ã¹©¤·¤ä¤¹¤¯Âѵ×À­¤â¤½¤ì¤Ê¤ê¤Ë¤¢¤ê¤½¤¦¤Ç¤¹¡£

    ¾ÇÅÅ·¿ÀÖ³°Àþ¥»¥ó¥µ¥â¥¸¥å¡¼¥ë¤ÏÇò¤¤¥ì¥ó¥º¤ÎÉôʬ¤òϪ½Ð¤·¤Ê¤¤¤Èµ¡Ç½¤·¤Ê¤¤¤¿¤á¥µ¥¤¥º¤Ë¹ç¤ï¤»¤Æ¥±¡¼¥¹¤ËÀÚ¤ê¹þ¤ß¤òÆþ¤ì¤Þ¤·¤¿¡£Â¬Äê¸íº¹·Ú¸º¤Î¤¿¤á¤Ë IC ²¹ÅÙ¥»¥ó¥µ¤â³°¤Ë°ú¤­½Ð¤·¤Æ¤¤¤Þ¤¹¡£³°´Ñ¤òÉÔÆ©ÌÀ¤Ë¤·¤Æ¤¤¤ë¤Î¤ÏÀßÃÖÀè¤Ç¤Î¸ºß´¶¤òÍÞ¤¨¤ë¤¿¤á¤Ç¡¢LED ¤ÏÆ°ºî³ÎǧÍѤȳä¤êÀÚ¤ê¥È¥é¥Ö¥ë¤¬µ¯¤³¤Ã¤¿¾ì¹ç¤Î¤ßÅÀÌǾõÂÖ¤ò¸«¤ë¤³¤È¤Ë¤·¤Æ¤¤¤Þ¤¹¡£

    ¥×¥í¥°¥é¥à

    ¾åµ­¤ÎÁõÃÖ¹½À®¤Ë¤¢¤ï¤»¤ÆºîÀ®¤·¤¿ mbed LPC1768 ÍÑ¥×¥í¥°¥é¥à¤ò°Ê²¼¤Î¾ì½ê¤Ç¸ø³«¤·¤Æ¤¤¤Þ¤¹¡£

    Parse ¥µ¡¼¥Ð¾å¤ÎÂиþ½èÍý¤È¤ÎÏ¢·È¤Î¤¿¤á¤Ë main.cpp ¤ÎËÁƬ¤ËÅö³º Parse ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î ID ¤È REST API ¥­¡¼¤òµ­½Ò¤¹¤ë·Á¤Ë¤·¤Æ¤¤¤Þ¤¹¡£¸ø³«¤·¤¿¥½¡¼¥¹¤Ç¤ÏÉú»ú¤Ë¤·¤Æ¤¤¤Þ¤¹¤¬¡¢¸å½Ò¤Î¼ê½ç¤ÇÅö³º Parse ¥¢¥×¥ê¤Î¥³¥Ô¡¼¤òºîÀ®¤·¤½¤Î ID ¤È¥­¡¼¤ò¤³¤³¤Ëµ­½Ò¤·¤Æ¥ê¥Ó¥ë¥É¤¹¤ì¤Ð¼ÂºÝ¤ËÏ¢·È¤ò»î¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£Parse ¾å¤Î½êÄê¤Î ID ¤È¥­¡¼¤Ï Parse ¤Ø¤Î¥í¥°¥¤¥ó¸å¡¢[Dashboard] - [¡Ê¥¢¥×¥ê̾¡Ë] - [Settings] - [Keys] ¤«¤é³Îǧ¤Ç¤­¤Þ¤¹¡£

    ÁõÃ֤ˤϼ±ÊÌÍѤËǤ°Õ¤Î̾Á°¤ò¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£Ì¾Á°¤Ï mbed ¥Ü¡¼¥É¤Î USB ¥¹¥È¥ì¡¼¥¸¾å¤Î "id.txt" ¥Õ¥¡¥¤¥ë¤Ëµ­½Ò¤·¤Þ¤¹¡£¤³¤Î̾Á°¤ÏÁõÃÖ¤¬¿Í¤ò¸¡ÃΤ·¤¿ºÝ¤Ë Parse ¥µ¡¼¥Ð¤ØÁ÷½Ð¤¹¤ë¾ðÊó¤Î¤Ò¤È¤Ä¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£

    ÁõÃÖ¤¬¿Í¤ò¸¡ÃΤ¹¤ë¤¿¤Ó¤Ë Parse ¥µ¡¼¥Ð¤Ø¥Ç¡¼¥¿¤òÁ÷¤ë¤Î¤ÏÉԷкѤʤΤǡ¢¥Ç¡¼¥¿Á÷½Ð¤ÎºÇû´Ö³Ö¤ò°Ê²¼¤ÎÄêµÁ¤Ç»ØÄꤷ¤Æ¤¤¤Þ¤¹¡£
    #define HTTPS_REQUEST_INTERVAL 1800 // 30ʬ

    ¥¯¥é¥¦¥É¥µ¡¼¥Ó¥¹¤Ë¤Ä¤¤¤Æ

    ÁõÃÖ¤ÎÂиþ½èÍýÍѤËÍÑ°Õ¤·¤¿ Parse ÍѤΥµ¡¼¥Ð¥³¡¼¥É¤È¡¢¤½¤Î¥³¡¼¥É¤«¤é¥á¡¼¥ëÁ÷¿®¤Î¤¿¤á¤Ë¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë Mailgun ¥µ¡¼¥Ó¥¹¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£

    Mailgun ¤Î½àÈ÷

    Mailgun ¤Ï¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÂбþ¤·¤¿¥¯¥é¥¦¥É¥á¡¼¥ë¥µ¡¼¥Ó¥¹¤Ç¤¹¡£REST API ¥»¥Ã¥È¤Ë²Ã¤¨ Python, Ruby, Java, C#, PHP ÍѤΥ饤¥Ö¥é¥ê¤¬¸ø³«¤µ¤ì¤Æ¤ª¤ê¡¢¼«ºî¤Î¥³¡¼¥É¤Ç´Êñ¤Ë¥á¡¼¥ëÁ÷¿®¤ò¥Ï¥ó¥É¥ê¥ó¥°¤Ç¤­¤ëÊØÍø¤Ê¥µ¡¼¥Ó¥¹¤Ê¤Î¤Çº£²ó¤ÎÏÃÂê¤È¤Ï̵´Ø·¸¤Ë¥¢¥«¥¦¥ó¥È¤òºî¤Ã¤Æ»î¤·¤Æ¤ß¤ë¤Î¤âÎɤ¤¤Ç¤·¤ç¤¦¡£¥µ¥¤¥ó¥¢¥Ã¥×»þ¤Ë¥¯¥ì¥¸¥Ã¥È¥«¡¼¥É¾ðÊó¤ÎÆþÎϤÏÉÔÍפǤ¹¡£

    http://www.mailgun.com/

    Mailgun ¤Ë¥¢¥«¥¦¥ó¥È¤òºîÀ®¤¹¤ë¤È°ì·ï¤Î¡ÖSandbox Domain¡×¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£¤³¤Î Mailgun Subdomain ¤Ï¥Æ¥¹¥ÈÍѤȤµ¤ì¤Æ¤ª¤ê¥á¡¼¥ëÁ÷¿®¤Ï 300·ï/Æü¤Þ¤Ç¤È¤¤¤¦À©Ì󤬤¢¤ê¤Þ¤¹¤¬¡¢¼«Á°¤Î¥É¥á¥¤¥ó¤¬¤¢¤ì¤Ð¤½¤ì¤òÅÐÏ¿¤¹¤ë¤³¤È¤Ç¤³¤ÎÀ©Ìó¤Ï¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤Ê¤ª¡¢ÌµÎÁÏȤϤ³¤Îµ­»ö¤Î»þÅÀ¤Ç 10,000·ï/·î¤Þ¤Ç¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£[¾ÜºÙ]
    ¤Á¤Ê¤ß¤Ë¼ê¸µ¤Ç¤Ïº£¤Î¤È¤³¤í°ìÆü 300·ï¤â¥á¡¼¥ë¤òÁ÷¿®¤Ç¤­¤ì¤Ð¤Þ¤º½½Ê¬¤Ê¤Î¤Ç¤Ò¤È¤Þ¤º Sandbox Domain ¤ò¤½¤Î¤Þ¤Þ»È¤Ã¤Æ¤¤¤Þ¤¹¡£

    Parse ¤«¤é¤Î Mailgun API ¸Æ¤Ó½Ð¤·¤Ë¤ª¤¤¤Æ¤Ï Mailgun ¥¢¥«¥¦¥ó¥È¤ËɳÉÕ¤±¤é¤ì¤¿¡ÖAPI Key¡×¤ò»ÈÍѤ·¤Þ¤¹¡£Parse ¤Ï Mailgun ¤È¸ø¼°¤ËÏ¢·È¤·¤Æ¤¤¤ë¤¿¤á¤´¤¯¥·¥ó¥×¥ë¤Ê¥³¡¼¥Éµ­½Ò¤Ç Mailgun API ¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

    Parse ¤Î½àÈ÷

    Parse ¤Ï Facebook »±²¼¤Î Parse.com ¤¬³«È¯¡¦±¿±Ä¤¹¤ë¸½ºß¤â¤Ã¤È¤â¥á¥¸¥ã¡¼¤Ê BaaS¡ÊBackend as a Service¡Ë ¤Î¤Ò¤È¤Ä¤Ç¤¹¡£¥æ¡¼¥¶´ÉÍý¡¦¥Ç¡¼¥¿¥¹¥È¥¢¡¦¥¹¥Þ¥Û¤Ø¤Î¥×¥Ã¥·¥åÄÌÃΡ¦¥¢¥¯¥»¥¹²òÀÏ¡¦¥Û¥¹¥Æ¥£¥ó¥°¡¦SNS Ï¢·È¡¦°ÌÃÖ¾ðÊóÏ¢·È¤Ê¤É¿¤¯¤Îµ¡Ç½¤«¤é¹½À®¤µ¤ì¤Æ¤ª¤êÂоݥץé¥Ã¥È¥Õ¥©¡¼¥à¡¦¸À¸ì¤â¹­ÈϤǤ¹¡£ÌµÎÁÏȤ⹭¤¯ 30¥ê¥¯¥¨¥¹¥È/Éäޤǡ¢¥×¥Ã¥·¥åÄÌÃÎ 100Ëü·ï/·î¤Þ¤Ç¤Ï̵ÎÁ¡¢¤Þ¤¿¡¢¥¢¥¯¥»¥¹²òÀϵ¡Ç½¤â¼«Í³¤ËÍøÍѤǤ­¤Þ¤¹¡£[¾ÜºÙ]

    https://parse.com/

    °ìÈÌ¤Ë BaaS ¤Î¼ç¤ÊÌÜŪ¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÂиþ¥µ¡¼¥Ð¦µ¡Ç½¤òÂåÂØ¡¦Êä´°¤¹¤ë¤³¤È¤Ë¤¢¤ê¡¢¥µ¡¼¥Ð¤Î´ÉÍý±¿ÍѤ䥵¡¼¥Ð¦¥³¡¼¥É³«È¯¤ËƧ¤ß¹þ¤à¥³¥¹¥È¤òÍÞÀ©¤·¥¢¥×¥êËÜÂΤγ«È¯¤ËÃíÎϲÄǽ¤È¤Ê¤ë¤³¤È¤¬ÍøÍѼԤˤȤäƤΥá¥ê¥Ã¥È¤Ç¤¹¤¬¡¢Parse ¤Ë¤Ï¥µ¡¼¥Ð¾å¤Ç¥æ¡¼¥¶¥³¡¼¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Î¤Ç¤­¤ë¡ÖCloud Code¡×¤È¤¤¤¦¤·¤¯¤ß¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤òÍøÍѤ¹¤ë¤³¤È¤Çɸ½à¤Îµ¡Ç½¤Î¤ß¤Ç¤Ï¥«¥Ð¡¼¤Ç¤­¤Ê¤¤¸ÇÍ­¤ÎÍ×·ï¤ËÂбþ¤Ç¤­¤ë;ÃϤ¬Â礭¤¯¤Ê¤ê¡¢¤Þ¤¿¡¢¥Õ¥í¥ó¥È¥¨¥ó¥É¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò°ìÀÚȼ¤ï¤º½êÄê¤Î¥µ¡¼¥Ð¥³¡¼¥É¤Î¤ß¤ò Parse ¥µ¡¼¥Ð¾å¤Ç¼Â¹Ô¤¹¤ë¤È¤¤¤Ã¤¿»È¤¤Êý¤â²Äǽ¤È¤Ê¤ê¤Þ¤¹¡£º£²óºî¤Ã¤¿ÁõÃÖ¤Ï Parse ¥µ¡¼¥Ð¾å¤ËÀßÃÖ¤·¤¿¼«ºî¥³¡¼¥É¤ò¤½¤Î¤Þ¤Þ¸Æ¤Ó½Ð¤·¤ÆɬÍפʽèÍý¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤ËÌÜŪ¤Ë±þ¤¸¤Æ½ÀÆð¤ËÍøÍѤǤ­¤ë¤³¤È¤¬ Parse ¤ÎÌ¥ÎϤΤҤȤĤȸÀ¤Ã¤Æ¤è¤¤¤Ç¤·¤ç¤¦¡£

    Parse ¥µ¡¼¥ÐÍѤ˺îÀ®¤·¤¿¥³¡¼¥É¤ò https://github.com/mkttanabe/Anpi ¤Ç¸ø³«¤·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥³¡¼¥É¤ò¼«Ê¬¤Î Parse ¥¢¥«¥¦¥ó¥È´Ä¶­¤Ç»ÈÍѤ¹¤ë¼ê½ç¤ò°Ê²¼¤Ëµ­½Ò¤·¤Þ¤¹¡£

    1. ¡ÖAnpi¡×¥¢¥×¥ê¤È¡ÖDetected¡×¥¯¥é¥¹¤ÎºîÀ®

    Parse ¤Ø¥í¥°¥¤¥ó¸å¡¢[Dashboard] - [Create a new App] ¤ò¥¯¥ê¥Ã¥¯¤·¤Æ¡ÖAnpi¡×¤È¤¤¤¦Ì¾Á°¤Î¥¢¥×¥ê¤òºîÀ®¤·Æ±¥¢¥×¥ê¤Î [Core] ¤Ø°ÜÆ°

    [Dashboard] - [Anpi] - [Core] - [Data] ¤Î [+ Add Class] ¤ò¥¯¥ê¥Ã¥¯¤·¤Æ Custom ¥¿¥¤¥×¤Î¡ÖDetected¡×¥¯¥é¥¹¤òºîÀ®
    ¢¨¤³¤³¤Ç¤¤¤¦¡Ö¥¯¥é¥¹¡×¤È¤Ï Parse ÍѸì¤Ç¤¢¤ê¡¢¡Ö¥Æ¡¼¥Ö¥ë¡×¤Î³µÇ°¤È¤Û¤ÜƱ¤¸¤â¤Î¤Ç¤¹

    [+Col] ¥Ü¥¿¥ó¤ò¥¯¥ê¥Ã¥¯¤·¤Æ Detected ¥¯¥é¥¹¤Ë¼¡¤Î³Æ¥«¥é¥à¤òÄɲᣥ«¥é¥àʤӤÏǤ°Õ¤ËÄ´À°²Ä

    • ¡Öposted¡×Date ·¿
    • ¡ÖdeviceId¡×String ·¿
    • ¡ÖdeviceAddress¡×String ·¿
    • ¡Ötemperature¡×Number ·¿

    ÁõÃÖ¤«¤é¼õ¿®¤·¤¿¿Í¸¡ÃξðÊó¤Ï¤³¤Î Detected ¥¯¥é¥¹¤Î¥Ç¡¼¥¿¤È¤·¤ÆÊݸ¤µ¤ì¤Þ¤¹¡£

    2. Parse ¥³¥Þ¥ó¥É¥é¥¤¥ó¥Ä¡¼¥ë¤ÎƳÆþ¤È Cloud Code ¤Î¥»¥Ã¥È¥¢¥Ã¥×

    Parse ÍѤγ«È¯¤ò¹Ô¤¦ PC ¤Ë¤ÏÀìÍѤΥ³¥Þ¥ó¥É¥é¥¤¥ó¥Ä¡¼¥ë¤ÎÀßÃÖ¤¬É¬ÍפǤ¹¡£¸ø¼°¥É¥­¥å¥á¥ó¥È¡ÖCloud Code¤È¤Ï¡×¤ÎËÁƬ¤ÎÀâÌÀ¤Ë¤½¤Ã¤Æ³«È¯´Ä¶­¤Ø¥Ä¡¼¥ë¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¥¤¥ó¥¹¥È¡¼¥ë¤¬½ª¤ï¤Ã¤¿¤éǤ°Õ¤Î³«È¯ÍÑ¥Õ¥©¥ë¥À¤Ø°ÜÆ°¤·¡Öparse new¡×¥³¥Þ¥ó¥É¤Ç¡ÖAnpi¡×¥¢¥×¥êÍÑ Cloud Code ¤Î¿÷·Á¤òÀ¸À®¤·¤Þ¤¹¡£

    $ parse new Anpi
    Email: your@mail.com
    Password:
    1:Anpi
    Select an App: 1
    

    github.com/mkttanabe/Anpi ²¼¤Î Parse/Anpi/cloud/main.js ¤ÎÆâÍƤò³«È¯ÍÑ¥Õ¥©¥ë¥À²¼¤Î Anpi/cloud/main.js ¤Ø¾å½ñ¤­¤·¡¢ËÁƬ¤Î²¼µ­¤Î²Õ½ê¤ò¼«Ê¬¤Î Mailgun ¥É¥á¥¤¥ó¤È API Key¡¢Á÷¿®Àè¤È¤¹¤ë¥á¡¼¥ë¥¢¥É¥ì¥¹¤Ç½ñ¤­´¹¤¨¤Þ¤¹¡£

    var MAILGUN_DOMAIN = 'sandboxXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.mailgun.org';
    var MAILGUN_KEY    = 'key-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
    var MAILGUN_TO     = 'Makoto Tanabe <XXXXXXXXXXXXX@XXXXX.XXXX>';
    var MAILGUN_FROM   = 'Safety Alert <postmaster@' + MAILGUN_DOMAIN + '>';
    

    ³«È¯ÍÑ¥Õ¥©¥ë¥À²¼¤Î Anpi/ ¤Ø°ÜÆ°¤·¤½¤³¤«¤é¡Öparse deploy¡×¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤ÈÇÛ²¼¤Î³Æ¥Õ¥¡¥¤¥ë¤¬ Parse ¥µ¡¼¥Ð¤ØžÁ÷¤µ¤ì¤Þ¤¹¡£

    $ cd Anpi
    $ parse deploy
    Uploading source files
    Finished uploading files
    New release is named v1
    

    Parse ¥µ¡¼¥Ð¤ØžÁ÷¤·¤¿¥³¡¼¥É¤ÎÆ°ºî¤Ï ¸ø¼°¥É¥­¥å¥á¥ó¥È¡ÖCloud Code¤È¤Ï] - [¤Ï¤¸¤á¤Ë] - [¥·¥ó¥×¥ë¤Ê´Ø¿ô] ¤Ëµ­½Ò¤µ¤ì¤¿ÊýË¡¤Ç³Îǧ¤Ç¤­¤Þ¤¹¡£

    3. ¥¸¥ç¥Ö¤ÎÅÐÏ¿

    ¾å¤Î¼ê½ç¤Ç deploy ¤·¤¿ main.js ¤Ë¤Ï Detected ¥¯¥é¥¹¾å¤Îľ¶á 30·ï¤Î¥Ç¡¼¥¿¤ò¥á¡¼¥ë¤Ç¥ì¥Ý¡¼¥È¤¹¤ë¤¿¤á¤Î¥¸¥ç¥ÖÍÑ´Ø¿ô¡Öreport¡×¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ¥¸¥ç¥Ö¤ÎÅÐÏ¿¡¦ÊÔ½¸¡¦ºï½ü¤Ï [Dashboard] - [Anpi] - [Core] - [Jobs] ¤«¤é¹Ô¤¤¤Þ¤¹¡£¿Þ¤Î UI ¤«¤éǤ°Õ¤ÎÆâÍƤÇÀßÄê²Äǽ¤Ç¤¹¡£

    ¢¨ÌµÎÁÏȤΠParse ¥¢¥«¥¦¥ó¥È¤Ç¤ÏÊ£¿ô¤Î¥¸¥ç¥Ö¤òƱ»þ¤Ë¼Â¹Ô¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó

    °Ê¾å¤Î¼ê½ç¡¦ÀßÄê¤Ç¡¢º£²óºîÀ®¤·¤¿ mbed ¥Ù¡¼¥¹¤ÎÁõÃÖËÜÂΤȳƥ¯¥é¥¦¥É¥µ¡¼¥Ó¥¹¤¬Ï¢·È¤·¤Æ²ÔÆ°¤·¤Þ¤¹¡£¥¢¥¤¥Ç¥£¥¢¼¡Âè¤Ç±þÍѤâ²Äǽ¤Ç¤·¤ç¤¦¡£¤³¤¦¤¤¤¦»ÅÁȤߤòÄ㥳¥¹¥È¤Ç¼«ºî¤Ç¤­¤ë»þÂå¤Ë¤Ê¤ê¤Þ¤·¤¿¡£


    (tanabe)
    klab_gijutsu2 at 07:54¡Ã¤³¤Îµ­»ö¤ÎURL¨¢Comments(0)¨¢TrackBack(0)
    BlogÆ⸡º÷
    Archives
    ¤³¤Î¥Ö¥í¥°¤Ë¤Ä¤¤¤Æ
    DSAS¤È¤Ï¡¢KLab ¤¬¹½ÃÛ¤·±¿ÍѤ·¤Æ¤¤¤ë¥³¥ó¥Æ¥ó¥Ä¥µ¡¼¥Ó¥¹ÍѤÎLinux¥Ù¡¼¥¹¤Î¥¤¥ó¥Õ¥é¤Ç¤¹¡£¸½ºß5¥ö½ê¤Î¥Ç¡¼¥¿¥»¥ó¥¿¤Ë¤Æ¹½ÃÛ¤·¡¢±¿ÍѤ·¤Æ¤¤¤Þ¤¹¤¬¡¢²æ¡¹¤ÏDSAS¤ò¤è¤ê»È¤¤¤ä¤¹¤¯¡¢¤è¤ê°ÂÁ´¤Ë¡¢¤½¤·¤Æ¤è¤ê¾ÊÎϤDZ¿ÍѤǤ­¤ë¤³¤È¤òÌܻؤ·¤Æ¡¢Æü¡¹²þÎɤ˶Ф·¤ó¤Ç¤¤¤Þ¤¹¡£
    ¤³¤Î¥Ö¥í¥°¤Ç¤Ï¡¢¤½¤ó¤Ê DSAS ¤Ç»È¤Ã¤Æ¤¤¤ëµ»½Ñ¤Î¾Ò²ð¤ä¡¢¼Â¸³¤·¤Æ¤ß¤¿·ë²Ì¤ÎÊó¹ð¡¢¥È¥é¥Ö¥ë¤Ë´¬¤­¹þ¤Þ¤ì¤¿»þ¤Î·Ð¸³Ã̤ʤɡ¢¹­¤¯¿¼¤¯¡¢¿§¡¹¤ÊÏÃÂê¤ò¿¥¤ê¤Þ¤¼¤Æ¾Ò²ð¤·¤Æ¤¤¤­¤¿¤¤¤È»×¤¤¤Þ¤¹¡£
    ºÇ¿·¥³¥á¥ó¥È