Node.jsむけBLEライブラリnoble実行で「Error: Cannot find module 'xpc-connection'」が出る。

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,295

OKstyle-Tokyo

score 10

前提・実現したいこと

MacBook Air (11-inch, Early 2015,)OS X Yosemiteバーション10.10.5でBLEデータを受け取るセントラルにしようとしています。
① Node.jsをnode.jsの本家サイトからダウンロード
② nobleのインストール
③ 下記「実行したソースコードの「app.js」ファイルを作成
④ BLEデータの受け取りができるか、Node.jsむけBLEライブラリのnobleを使用したapp.jsファイルをターミナルで実行しました。
そうしたところ以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Nakamu-no-MacBook-Air-8:ble_central nakamu$ node app.js
internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module 'xpc-connection'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/Users/nakamu/Desktop/ble_central/node_modules/noble/lib/mac/yosemite.js:7:21)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)

実行したソースコード

'use strict';

const noble = require('noble');
const serviceuuid = `a6ad91bd376e465f8c6c460fd3e15038`;
const charauuid = `80d881a61ab347f08c752c31eac31f43`;

//キャラクタリスティックにアクセスしてデータやりとり
const accessChara = (chara) => {
    console.log('-----Start GATT Access-----')
    chara.notify(true, (err) => {
        if (err) {
          console.log('listen notif error', err)
        } else {
          console.log('listen notif')
        }
    });
    chara.on('data', (data, isNotif) => {
        const jsonStr = data.toString('utf-8');
        const jsonData = JSON.parse(jsonStr);
        console.log(jsonData);
    });
}


//discovered BLE device
const discovered = (peripheral) => {
    console.log(`BLE Device Found: ${peripheral.advertisement.localName}(${peripheral.uuid}) RSSI${peripheral.rssi}`);

    if(peripheral.advertisement.localName === 'SAKETAMU'){
        noble.stopScanning();
        console.log('device found');
        console.log(`service discover...`);

        peripheral.connect(error => {
            if (error) {
                console.log("connection error:", error)
            } else {
                console.log("device connected");
            }

            peripheral.discoverServices([],(err, services) => {
                if (error) {
                    console.log("discover service error", error)
                }
                console.log('discover service');               
                services.forEach(service => {
                    if(service.uuid === serviceuuid){
                        service.discoverCharacteristics([], (error, charas) => {
                            console.log('discover chara');
                            charas.forEach(chara => {
                                if(chara.uuid === charauuid){
                                    console.log("found chara: ", chara.uuid)
                                    accessChara(chara);
                                }
                            });
                        });
                    }
                });
            });
        });
    }
}

//BLE scan start
const scanStart = () => {
    noble.startScanning();
    noble.on('discover', discovered);
}

if(noble.state === 'poweredOn'){
    scanStart();
}else{
    noble.on('stateChange', scanStart);

試したこと

① 最初、nobleのインストールもできていなかったのか

Error: Cannot find module 'noble'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/Users/nakamu/Desktop/app.js:3:15)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)


のエラーがでいたので

mkdir ble_central
cd ble_central
touch app.js
npm init -y
npm i --save noble


でインストールし直しました。

インストールする過程で下記メッセージも出ていました(^^;;

Nakamu-no-MacBook-Air-8:ble_central nakamu$ npm i --save noble

> xpc-connection@0.1.4 install /Users/nakamu/Desktop/ble_central/node_modules/xpc-connection
> node-gyp rebuild

gyp ERR! configure error 
gyp ERR! stack Error: Command failed: /Users/nakamu/anaconda/bin/python -c import sys; print "%s.%s.%s" % sys.version_info[:3];
gyp ERR! stack   File "<string>", line 1
gyp ERR! stack     import sys; print "%s.%s.%s" % sys.version_info[:3];
gyp ERR! stack                                ^
gyp ERR! stack SyntaxError: invalid syntax
gyp ERR! stack 
gyp ERR! stack     at ChildProcess.exithandler (child_process.js:294:12)
gyp ERR! stack     at ChildProcess.emit (events.js:182:13)
gyp ERR! stack     at maybeClose (internal/child_process.js:962:16)
gyp ERR! stack     at Socket.stream.socket.on (internal/child_process.js:381:11)
gyp ERR! stack     at Socket.emit (events.js:182:13)
gyp ERR! stack     at Pipe._handle.close (net.js:610:12)
gyp ERR! System Darwin 14.5.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/nakamu/Desktop/ble_central/node_modules/xpc-connection
gyp ERR! node -v v10.15.0
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok 
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN ble_central@1.0.0 No description
npm WARN ble_central@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: bluetooth-hci-socket@0.5.1 (node_modules/bluetooth-hci-socket):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for bluetooth-hci-socket@0.5.1: wanted {"os":"linux,android,win32","arch":"any"} (current: {"os":"darwin","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: xpc-connection@0.1.4 (node_modules/xpc-connection):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: xpc-connection@0.1.4 install: `node-gyp rebuild`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Exit status 1

+ noble@1.9.1
added 4 packages from 4 contributors and audited 107 packages in 8.094s
found 3 low severity vulnerabilities
  run `npm audit fix` to fix them, or `npm audit` for details

② app.jsを実行したら上記「発生している問題・エラーメッセージ」に記載のエラーが発生

エラーメッセージの中にある「xpc-connection」は
OS X Lionから採用されたXPCサービスだと他のサイトなどに書き込みがありました。
ということは、Yosemiteから最新バージョンにアップデートすると解決されるのかなど
アドバイスいただけると助かります。
スペックの低いMacBook Airのため、できればYosemiteのままで解決できると助かります。

補足情報(FW/ツールのバージョンなど)

Node.js バージョン v10.15.0

わかりづらくて申し訳ありませんが宜しくお願い致しますm(_ _)m

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

いろいろ調べたところ、「xpc-connection」を、Node@10で実行するとエラーが出るというのを見つけました。
Node@8にバージョンを下げると実行が完了できたとのことでした。
(参考)
https://github.com/line/line-simple-beacon/issues/7

ということで、

npm -v
2.15.11
node -v
v4.7.2

とバージョンを下げて

$ node app.js

を実行したところ下記のとおり、BLEデバイスにアドバイタズしてGATTにアクセスできました!

BLE Device Found: SAKETAMU(000000aaaa00000a0a00aa0aa000a00a) RSSI-37
device found
service discover...
device connected
discover service
discover chara
found chara:  88a888a88aa888a88a888a88aaa88a88
-----Start GATT Access-----
listen notif

BLEデバイスに正式なファームを書き込んでないので、値が取れていないのが、
まだ気になりますが。。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

gyp ERR! stack Error: Command failed: /Users/nakamu/anaconda/bin/python -c import sys; print "%s.%s.%s" % sys.version_info[:3];
gyp ERR! stack   File "<string>", line 1
gyp ERR! stack     import sys; print "%s.%s.%s" % sys.version_info[:3];
gyp ERR! stack                                ^
gyp ERR! stack SyntaxError: invalid syntax

()なしの print で syntax error になるのって、スクリプトが python2 を想定しているのに使われたのが python3 であるときに出る典型的なエラーですね。
PATH をいじって "python" が python2 を指している状況にしてから再インストールするといける気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/24 18:57

    ありがとうございます!
    そうですね!インストールでpython2を使いたいのに、python3が邪魔してそうですね。早速、修正してみます!結果は、また書き込みますm(_ _)m

    キャンセル

  • 2019/01/31 13:06

    python3から、python2を指定してインストールしてみました。
    上記のあるようなエラーは出なくなりましたが、下記のような”Error: Cannot find module 'xpc-connection'”は相変わらず出てしまいます。
    Node.jsのバージョンを下げて試してみようと思います。

    $ node app.js
    internal/modules/cjs/loader.js:583
    throw err;
    ^

    Error: Cannot find module 'xpc-connection'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/Users/nakamu/ble_central/node_modules/noble/lib/mac/yosemite.js:7:21)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)

    Node.jsとnpmのバージョンは下記のとおりです。
    ”$ node --version
    v10.15.0
    $ npm --version
    6.4.1”

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る