BLE

BLEではscanにのみ対応しておりペアリングは非対応となります。

ble.on()

bleを開始します。

ble.on()

ble.off()

bleを停止します。
停止した段階でLuaからの占有は解放されます。

ble.scanStart(callback, options)

bleのスキャンを無期限で開始します。

Options

Key Type Default 意味
active boolean true trueでアクティブスキャンを意味します。
interval number 0x10 スキャンインターバルを指定します。2バイトの数値です。
window number 0x10 スッキャンインターバルを指定します。2バイトの数値です。
phy1m boolean true trueで通常のBLEパケットを探索・受信します。
phyCoded boolean true trueでBLE5のCoded PHYのパケットを探索・受信します。
duplicate boolean true falseで同じmacaddressから来た信号を覚えてcallbackを呼ばないようにします。

注意: duplicate=false の挙動について

duplicate=false を指定すると、一度受信したmacaddressからの信号は再通知されなくなりますが、このフィルタが有効なのは「スキャンを終了するまで」または「内部バッファがいっぱいになるまで」です。

スキャンを終了せずに動かし続けると、いつか内部バッファが溢れます。溢れた場合、フィルタはリセットされ、すでに受信済みのデバイスからの信号も再び受信(再通知)されるようになります。

そのため duplicate=false を使う場合は、定期的にスキャンを終了・再開させるコードとセットで使うことを前提にしてください。スキャンを再開するとフィルタの状態がリセットされ、バッファ溢れによる予期しない再通知を避けられます。

callback(peripheral)

引数で指定するcallback関数では受信したadvertisementをtableで(objectで)受け取ります。

Options

Key Type 意味
address string macaddressを意味します
rssi number 受信時の電波強度
advData string 受け取ったパケット
isScanResp boolean スキャンレスポンスのときにtrue、アドバタイズのときにfalseです。(OS7.1.0以降)

Example

以下の例は起動と同時にパッシブスキャンを開始し可能な限りすべての信号を受信するようにします。

受信した信号はシリアルコンソールに表示します。


local function tohex(data)
  local hex = {}
  for i = 1, #data do
    hex[#hex+1] = string.format("%02x", data:byte(i))
  end
  return table.concat(hex, "")
end

function onFind(peripheral)
  os.log("found\n addr: " .. tohex(peripheral.address) .. "\n rssi:" .. tostring(peripheral.rssi) .. "\n data:" .. tohex(peripheral.advData));
end

local ret = ble.on();
os.log("ble on ret=" .. tostring(ret));

ret = ble.scanStart(onFind, {
  active=false,
  interval=16,
  window=16,
  phy1m=true,
  phyCoded=true,
  duplicate=true
});
os.log("scan started ret=" .. tostring(ret));