

BLE CordovaPlugin(<https://github.com/don/cordova-plugin-ble-
central/blob/master/README.md>)  
を使ってMonacaでiPhoneアプリを開発しようとしています。  
実行環境: iPhone5s(iOS7)  
プラグインを設定してjavascriptで以下コードを実行すると  
javascript:

[code]

        document.addEventListener("deviceready", onDeviceReady, false);
    
        function onDeviceReady()
        {
            console.log("PhoneGap is ready");
        }
        $(function()
        {
                log("bbbb");
                scan();
                log("aaaa");
        })
    
        function log(str)
        {
            $("#log").append(str + "<br />");
            $("#log").scrollTop($("#log")[0].scrollHeight);
        }
    
        function scan()
        {
            log(">> scan");
            window.ble.scan([], 5, function(device)
            {
                log(JSON.stringify(device));
            }, function(reason)
            {
                log("ERROR: " + reason);
            });
            log("<< scan");
        }
    
[/code]

HTML:

[code]

    <body>
        <div id="log"></div>
    </body>
    
[/code]

実行結果が、

[code]

    bbbb
    >> scan
    
[/code]

と表示されるだけでした。

期待している結果は、

[code]

    bbbb
    >> scan
    [Device情報]
    << scan
    aaaa
    
[/code]

です。

iPhoneのコンソールログは、以下のようになります。

[code]

    Apr  5 15:09:43 WWTF MonacaApp[957] <Notice>: DiskCookieStorage changing policy from 2 to 0, cookie file: file:///private/var/mobile/Containers/Data/Application/3A33816B-D3DC-4EC2-8866-DEA6F2221654/Library/Cookies/Cookies.binarycookies
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: Multi-tasking -> Device: YES, App: YES
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: Unlimited access to network resources
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: [CDVTimer][monaca] 0.181019ms
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: [CDVTimer][splashscreen] 33.852994ms
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: [CDVTimer][statusbar] 11.131048ms
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: Cordova BLE Central Plugin
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: (c)2014-2015 Don Coleman
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: [CDVTimer][ble] 1.643002ms
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: [CDVTimer][TotalPluginStartup] 49.099982ms
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: Status of CoreBluetooth central manager changed 5 State powered up and ready (CBCentralManagerStatePoweredOn)
    Apr  5 15:09:43 WWTF MonacaApp[957] <Warning>: Resetting plugins due to page load.
    Apr  5 15:09:44 WWTF MonacaApp[957] <Warning>: Finished load of: file:///private/var/mobile/Containers/Bundle/Application/5B3DD2D2-53DA-4040-B246-9E70DC9501A7/MonacaApp.app/www/index.html
    
[/code]

iPhoneアプリのLightBlue等では正常にスキャンができて、デバイス情報が取得できているのは確認できています。

何が間違っているのかどなたかご教授して頂けないでしょうか？


CC BY-SA 3.0
2015-04-05T06:54:20.490
8785
2015-04-05T17:52:01.197
2015-04-05T07:37:29.280
9171
9171
question
javascript ios monaca cordova bluetooth
Bluetooth Low Energy (BLE) Central Plugin for Apache Cordovaの使い方


自己解決しました。

以下のような原因がありました。

  * PhoneGap初期化完了後に実行されるようにする必要がある。
  * onDevicereadyの中でボタンリスナーを登録する必要がある。
  * jQueryの$(function(){})では、PhoneGapの初期化が終わっていない場合がある。
  * Monacaのプレビュー機能では、devicereadyが呼ばれない。

以下のコードで実行できるようになりました。

[code]

    <!DOCTYPE HTML>
    <html>
    
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
        <script src="components/loader.js"></script>
        <link rel="stylesheet" href="components/loader.css">
        <link rel="stylesheet" href="css/style.css">
        <script>
            $(document).ready(function()
            {
                // are we running in native app or in a browser?
                window.isphone = false;
                if (document.URL.indexOf("http://") === -1 && document.URL.indexOf("https://") === -1)
                {
                    window.isphone = true;
                }
                if (window.isphone)
                {
                    document.addEventListener("deviceready", onDeviceReady, false);
                }
                else
                {
                    onDeviceReady();
                }
            });
    
            function onDeviceReady()
            {
                $('#scan').on('click', function()
                {
                    scan();
                });
            }
    
            function log(str)
            {
                $("#log").append(str + "<br />");
                $("#log").scrollTop($("#log")[0].scrollHeight);
            }
    
            function scan()
            {
                log(">> scan");
                ble.scan([], 5, function(device)
                {
                    log("DEVICE: " + JSON.stringify(device));
                }, function(reason)
                {
                    log("ERROR: " + reason);
                });
                log("<< scan");
            }
        </script>
    </head>
    
    <body>
        <button id="scan" type="button">Scan</button>
        <div id="log"></div>
    </body>
    
[/code]


CC BY-SA 3.0
2015-04-05T08:48:33.733
8786
2015-04-05T17:52:01.197
2015-04-05T17:52:01.197
9171
9171
8785
answer