Как отправить данные из raspberry pi 3 в мое приложение cordova? - PullRequest
0 голосов
/ 08 июня 2018

Прежде всего, я не очень опытный кодер, но я учусь и практикуюсь!В настоящее время я пытаюсь разработать гибридное приложение с помощью cordova , являющейся платформой для создания веб-приложений, которые могут быть установлены на ios или android как собственное приложение.

Итак,У меня есть частный проект дома.Я хочу создать приложение, чтобы узнать температуру моего термостата нагревателя Bluetooth (синяя комета).Благодаря замечательному учебнику, который я нашел в Интернете, мне удалось установить соединение между raspberry pi 3 и термостатом нагревателя bluetooth с помощью gatttool.Теперь я могу читать отличную температуру, но, конечно, я хочу отобразить число на своем iphone, в моем приложении, чтобы быть точным.Как бы вы это реализовали?Как я могу отправить данные с моей малины на телефон?Желательно по Wi-Fi?Если кто-нибудь знает хороший учебник по этому вопросу, я был бы очень признателен.

Спасибо!Em

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Есть несколько способов сделать это.

На Raspberry Pi вы можете написать скрипт, который использует gatttool для чтения температуры и записывает значение в файл, например / tmp / Temperature.Запускает этот скрипт cron, чтобы запускать его каждые x минут, чтобы обновить значение.

Создайте 2-ю программу, которая является веб-сервером для обслуживания этих данных через http.Вы можете использовать любой язык для этого.Вот как я это сделаю с Node.js .

// serve_temp.js
const fs = require('fs');
const http = require('http');

const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {

  fs.readFile('/tmp/temperature', (err, data) => {
    if (err) throw err;
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end(data);
  });
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Чтобы проверить это, запишите некоторые тестовые данные в файл / tmp / Temperature.

echo 70 > /tmp/temperature

Запустите программу

node serve_temp.js

На вашем телефоне откройте Safari и перейдите на http://raspberrypi.local:3000. Вы должны увидеть «70».(Возможно, вам придется использовать IP-адрес вместо имени. Что-то вроде http://192.168.1.123:3000.) Ваше приложение Cordova может выполнить тот же HTTP-вызов для получения данных.

Вы можете объединить две программы в одну.С Node.js вы можете использовать библиотеку noble для использования Bluetooth и получения температуры от термостата.

Другой вариант - написать приложение Cordova, которое напрямую связывается с термостатом через Bluetooth.Вы можете сделать это, используя cordova-plugin-ble-central .

0 голосов
/ 10 июня 2018

Вы можете использовать простые и простые netcat для отправки показаний температуры по UDP.Сохраните следующее на Raspberry Pi в файле с именем $HOME/transmit.Он работает постоянно, считывая температуру каждую секунду с помощью gattool, а затем передавая ее по UDP на ваш телефон:

#!/bin/bash

# Change these to suit your local setup
PHONE_IP=192.168.0.8
PHONE_PORT=5005

while :; do
   # Read value from thermometer with "gattool" - modify as appropriate
   reading=$(gattool -b BC:6A:29:AE:CC:23 --char-read -a 0x25)
   echo "DEBUG: Read with gattool: $reading"

   # Send to phone with netcat
   nc -w0 -u $PHONE_IP $PHONE_PORT <<< "$reading"

   # Wait a second so we don't flood network
   sleep 1
done

Затем вы можете сделать исполняемый скрипт с помощью:

chmod +x $HOME/transmit

Ивы можете запустить его с помощью:

$HOME/transmit

Затем на вашем телефоне вам нужно читать с соответствующего порта UDP.Я не знаю, на что похожа ваша среда, но вы могли бы сделать это с netcat, сохранив это на своем телефоне как $HOME/recv:

#!/bin/bash

PORT=5005

while :; do
   received=$(/usr/bin/nc -w 0 -u -l $PORT)
   echo $received
done

Или, если ваш телефон работает на Python, этосделать то же самое:

#!/usr/local/bin/python3
import socket

UDP_IP   = "0.0.0.0"
UDP_PORT = 5005

# Create UDP socket and bind to any/all interfaces
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

# Display all messages received
while True:
    data, addr = sock.recvfrom(1024)
    print("Received:",data)
...