Raspberry Pi 3의 블루투스에서 BLE Peripheral (bleno)를 사용해보십시오.

마에오키



조금 앱의 대항으로서 BLE Peripheral 을 구현(에뮬레이션)할 필요가 있었지만, iOS/Android라면 MAC 주소 주위의 보안 고려나, Android끼리라면 궁합이 나온다고 하는 불치의 병등이 있어, 스마트폰으로 한다 무리가 있다고 생각했다.
또, 현장에서 실제로 앱의 테스트를 하려고 하면, Mac의 에뮬레이션이라든지, 파라로 하는 것에 적합하지 않기 때문에 어쩐지라는 상태였다.

「Raspberry Pi 3 Model B」발표 알림
htps : //등 sp 밧 ry-피.ぃ c. 이 m/네 ws/파게/응 wp. 이 d/24

그런 때, Raspberry Pi 3 선생님에게 Bluetooth 4.0/Wifi가 내장되었다고 하는 것으로, node.js/bleno당으로 실장하면 하드의 사양 차이도 적고 조달도 편하고 현실적이지? 라고 생각했다.
다만, 부끄러워하면서 bleno 자체 처음이고, Raspberry Pi 3에서 Peripheral 키메타라는 이야기도 별로 발견되지 않았기 때문에, 일단 최소한으로 시험해 보았다.

전제


  • Raspberry Pi 3 Model B가 있습니다
  • raspbian 설치됨
  • Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux
  • /etc/debian_version : 8.0

  • sudo apt-get update 라든지는 종료

  • 시시



    nodebrew로 node.js 설치



    Mac에 익숙하다는 이유로 깊이 생각하지 않고 nodebrew를 설치
    여기 편 참조

    Raspberry Pi에 nodebrew로 Node.js 설치
    ぃ tp // 코 m / 윤기 / ms / 아 1225154445520dc2db3

    참조가 잘 전환되지 않았으므로 일단 재부팅 한 후 nodebrew에서 node.js를 설정하십시오.
    $ nodebrew install-binary v4.4.3
    $ nodebrew use v4.4.3
    

    bleno용 모듈군



    htps : // 기주 b. 코 m / 씨데에 p stri / b ぇ 의 말대로 설정
    $ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
    

    BLE Peripheral 샘플



    bleno의 샘플을 그대로 copipe 해 돈이라도 좋지만, 무엇을 실장하지 않으면 안 되는지를 파악하고 싶었기 때문에, 최소한의 내용으로 굳이 단숨 통관으로 써 보았다.

    package.json
    {
      "name": "bleno-sample",
      "version": "1.0.0",
      "description": "bleno sample for rspi3",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "dependencies": {
        "bleno": "^0.4.0"
      }
    }
    

    index.js
    var bleno = require('bleno');
    
    var name = 'raspberrypi';
    var serviceUuids = ['180F'];
    
    var primaryService = new bleno.PrimaryService({
        uuid: '180F',
        characteristics: [
            new bleno.Characteristic({
                uuid: '2A19',
                properties: ['read'],
                value: new Buffer([100])
            })
        ]
    });
    
    bleno.on('stateChange', function(state) {
        console.log('stateChange: '+state);
        if (state === 'poweredOn') {
            bleno.startAdvertising(name, serviceUuids, function(error){
                if (error) console.error(error);
            });
        } else {
            bleno.stopAdvertising();
        }
    });
    bleno.on('advertisingStart', function(error){
        if (!error) {
            console.log('start advertising...');
            bleno.setServices([primaryService]);
        } else {
            console.error(error);
        }
    });
    

    내용은, BatteryService/BatteryLevel만의 향기로운 느낌으로.

    샘플 실행



    장치 놀리기 때문에 sudo에서 실행
    $ sudo node index.js 
    stateChange: poweredOn
    start advertising...
    

    iOS의 LightBlue에서 보면 이런 느낌.


    Android의 B-BLE이라고 이렇게.


    대체로 좋은 것처럼.

    결과


  • node.js의 버젼으로 최초 빠졌지만, 그 이외는 대체로 아무것도 하지 않아도 움직였다.
  • 광고 중지 및 재부팅 등도 시도했지만 iOS/Android에 통지되는 Peripheral의 MAC 주소 (or UDID)는 제대로 고정되어 있습니다 (당연하지만)
  • NEXUS9나 NEXUS Player로 구현했을 때는 Android -> Android의 접속이 비정상적으로 늦었지만, 그런 것은 없고, iOS와 같은 정도의 속도로 Connect 할 수 있었다.
  • 안드로이드로 구현했을 때와 달리 어쨌든 전체적으로 빠르다.
  • 좋은 웹페이지 즐겨찾기