Espruino:Примеры/Использование UART-портов (NUS) при помощи BLE
Использование UART-портов (NUS) при помощи BLE[1]
По умолчанию у BLE-устройств вроде Puck.js есть сервис Nordic UART, который служит чем-то вроде последовательного порта для доступа к Espruino REPL. При необходимости его можно отключить при помощи NRF.setServices({},{uart:false}).
Вспомогательный скрипт «puck.js» позволяет получить доступ к UART из веб-браузера с Web Bluetooth – более подробно читайте в этом руководстве.
Отправка
Если вы, имея одно Espruino-устройство, хотите подключиться к сервису UART на другом Espruino-устройстве, то можете просто воспользоваться для отправки данных модулем «ble_simple_uart» (более подробно о модулях читайте тут).
Используйте его следующим образом:
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n", function() {
print('Готово!');
});
});
Кроме того, require("ble_simple_uart").write возвращает промис, который можно использовать в .then().
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
return require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n");
}).then(function() {
print('Готово!');
});
Текст по UART можно передавать сколько угодно долго – модуль будет автоматически разбивать его на BLE-пакеты и отправлять дальше.
Получение / выполнение
Модуль «ble_simple_uart» просто отправляет данные. Но модуль «ble_uart» может также принимать данные. Для этого он держит соединение открытым, и когда всё будет готово, вам нужно будет вручную закрыть его при помощи disconnect().
Здесь мы также воспользуемся вспомогательной функцией eval(), которая вычисляет выражение устройства, находящегося по ту сторону коммуникации, передаёт его обратно в виде JSON-строки, а затем парсит:
var uart;
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
return require("ble_uart").connect(device);
}).then(function(u) {
uart = u;
// Опционально. Ждём 0.5 секунд, пока из BLE-буфера
// не будут отправлены находящиеся в нём данные,
// так как они могут пересечься с результатом eval():
return new Promise(function(r) { setTimeout(r, 500); });
}).then(function() {
return uart.eval('E.getTemperature()');
}).then(function(data) {
print("Получили температуру "+data);
uart.disconnect();
});
Но вы также, если нужно, можете воспользоваться on('data' ...) и write():
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
return require("ble_uart").connect(device);
}).then(function(uart) {
uart.on('data', function(d) { print("Получили:"+JSON.stringify(d)); });
uart.write("digitalPulse(LED,1,10);\n"); // .then(...)
setTimeout(function() {
uart.disconnect();
console.log("Отключились");
}, 2000);
});
См.также
Внешние ссылки