obniz를 LineSimpleBeacon화

obniz는 LineBeacon이 될 수 있습니까? 라고 질문이 있었으므로, 시험해 보았습니다.

LINE BOOT AWARDS와 관련하여 하나 질문하고 싶습니다만, obniz에서 LINE Beacon을 동작시킬 수 있습니까? ESP32로 동작시키는 것은 가능합니다만… htps // t. 코 / 5 지요 MsY 후 — 다나카 미소 (@miso_develop)


LINE Beacon 개요



특정 advertisement를 발행하는 Beacon을 Line이 발견하면 bot의 webhook에 beacon이 발견되었다고 통지합니다.

서버 측에서 그 beacon 정보를 바탕으로 어떤 처리를 하는지를 결정하고 대응합니다.



예라고 하면, 상품에 붙어 있는 버튼을 누르면 그 상품의 정보가 bot로부터 보내져 오는 등이 있었습니다.



LINE 설정



August 23, 2018 사이트에서 messaging api를 사용하여 bot를 만듭니다



알림이 왔을 때 처리하기 위해 LINE Developers의 bot 설정 화면에서 Webhook을 설정합니다.



Line Developer



HTTPS 서버가 필요하기 때문에 을 사용했습니다.

※ runkit은 node.js의 무료 호스팅 서비스입니다. https 요청이 수락되므로 편리합니다.



만든 bot과는 친구가 됩니다.

그렇지 않으면 알림이 오지 않습니다



LINE Beacon 설정





runkit



obniz 코드



advertisement를 만들 뿐이므로 obniz의 지식이라기보다는 ble의 지식이 됩니다.

deviceMessage와 hardwareId 이외는 고정이므로, 우선은 거기를 만지면 사용할 수 있습니다.




var obniz = new Obniz("XXXXXXXX");
obniz.onconnect = async function () {

  var adv = [];
  var UUID_FOR_LINECORP = [0x6F, 0xFE];
  var deviceMessage = [01,02,10];  //サーバーに送るメッセージ 1~13byte
  var hardwareId = [0x01, 0x16, 0xcb, 0xf3, 0x79 ]; //払い出されたID(元:0116cbf379)


  // flag
  adv = adv.concat([0x02, 0x01, 0x06]);  //LE General Discoverable Mode & BR/EDR Not Supported

  //16bit uuid
  adv = adv.concat([0x03, 0x03]);
  adv = adv.concat(UUID_FOR_LINECORP);

  //simple beacon
  adv = adv.concat([1+9+deviceMessage.length, 0x16]);
  adv = adv.concat(UUID_FOR_LINECORP);
  adv = adv.concat([0x02]);
  adv = adv.concat(hardwareId);
  adv = adv.concat([0x7F]);
  adv = adv.concat(deviceMessage);


  obniz.ble.advertisement.setAdvDataRaw(adv);
  obniz.ble.advertisement.start();
}



adv = adv.concat([ ... ]);에서 advertisement를 만들고 obniz.ble.advertisement.setAdvDataRaw(adv);에서 obniz로 설정하고 obniz.ble.advertisement.start();로 시작합니다.



서버의 코드



runkit로 작성했습니다. 따라서 원시 node.js와 약간 다르지만 거의 동일합니다.

(express의 listen을 하지 않거나, require 하는 것이 다르거나 하는 정도입니다.)



const express = require("@runkit/runkit/express-endpoint/1.0.0");
const app = express(exports);
const line = require('@line/bot-sdk');

// create LINE SDK config from env variables
const config = {
  channelAccessToken: "",
  channelSecret: "",
};

// create LINE SDK client
const client = new line.Client(config);

// register a webhook handler with middleware
// about the middleware, please refer to doc
app.post('/',  line.middleware(config), (req, res) => {
  Promise
    .all(req.body.events.map(handleEvent))
    .then((result) => res.json(result))
    .catch((err) => {
      console.error("ERROR");
      console.error(err.message);
      res.status(500).end();
    });
});

// event handler
function handleEvent(event) {
  console.log(event);
  if (event.type === 'message' && event.message.type === 'text') {
    const echo = { type: 'text',  text: event.message.text };
    console.log(echo)
    return client.replyMessage(event.replyToken, echo);

  }else if(event.type === 'beacon' && event.beacon){
    const message = { type: 'text', text: `beacon device(${event.beacon.hwid})から${event.beacon.dm}が届いたよ` };
    console.log(message)
    return client.replyMessage(event.replyToken, message);

  }
    return Promise.resolve(null);
}




중요한 것은 handleEvent(event)의 내용입니다.
event.typebeacon이면 beacon 정보이므로 회신 메시지를 변경하고 있습니다.

보통 에코로 하고 있습니다



이것에 channelAccessToken과 channelSecret를 붙이면 움직입니다.



움직였다



LINE@ Manager 비콘 등록 화면



사이고에게



obniz에는 도 있기 때문에, 스위치를 누른다→beacon을 낸다→LINE beacon으로 검지→LINE에 뭔가 내는 것도 할 수 있을 것 같습니다



동적으로 deviceMessage의 내용을 바꿀 수도 있기 때문에, 지금까지의 독립형 beacon으로는 할 수 없었던 것이 여러가지 할 수 있을지도 모르겠네요



참고





스위치를 누르면 프로그램을 실행할 수 있는 기능


좋은 웹페이지 즐겨찾기