obniz를 LineSimpleBeacon화
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을 설정합니다.
HTTPS 서버가 필요하기 때문에 을 사용했습니다.
※ runkit은 node.js의 무료 호스팅 서비스입니다. https 요청이 수락되므로 편리합니다.
만든 bot과는 친구가 됩니다.
그렇지 않으면 알림이 오지 않습니다
LINE Beacon 설정
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.type
가 beacon
이면 beacon 정보이므로 회신 메시지를 변경하고 있습니다.
보통 에코로 하고 있습니다
이것에 channelAccessToken과 channelSecret를 붙이면 움직입니다.
움직였다
사이고에게
obniz에는 도 있기 때문에, 스위치를 누른다→beacon을 낸다→LINE beacon으로 검지→LINE에 뭔가 내는 것도 할 수 있을 것 같습니다
동적으로 deviceMessage의 내용을 바꿀 수도 있기 때문에, 지금까지의 독립형 beacon으로는 할 수 없었던 것이 여러가지 할 수 있을지도 모르겠네요
참고
Reference
이 문제에 관하여(obniz를 LineSimpleBeacon화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wicket/items/e1953f47e33d5d3b265c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)