【问题标题】:How to send data from raspberry pi 3 to my cordova app?如何将数据从树莓派 3 发送到我的科尔多瓦应用程序?
【发布时间】:2018-11-18 12:57:09
【问题描述】:

首先,我不是一个非常有经验的编码员,但我正在学习和练习!目前,我正在尝试使用cordova 开发一个混合应用程序,这是一个用于创建能够像原生应用程序一样安装在ios 或android 上的网络应用程序的框架。

所以,我在家里有一个私人项目。我想创建一个应用程序来读取我的蓝牙加热器恒温器(彗星蓝)的温度。感谢我在网上找到的一个很棒的教程,我设法在我的 raspberry pi 3gatttool 的蓝牙加热器恒温器之间建立了连接。现在我可以读取温度,这很好,但我当然想在我的 iphone 上显示数字,准确地说是在我的应用程序中。 你将如何实现这一点?如何将数据从树莓派发送到手机?最好通过无线网络?如果有人知道这个问题的好教程,我将非常感激。

谢谢! 恩

【问题讨论】:

  • 答案可能取决于您使用的手机类型——Android、iOS?您会只在有 wifi 的地方使用您的应用程序 - 还是您的手机提供 wifi 热点?您可以在 RaspberryPi 上使用简单的 bash 脚本持续传输温度,该脚本位于循环中,使用 gattool 读取温度,并使用 netcat 通过 UDP 将其发送到手机的 IP 地址。想必您知道如何打开套接字并在您的设备上阅读?
  • 我使用 iOS,不幸的是,我还不知道如何在我的 iPhone 上打开一个套接字。谢谢你的帮助!我会马上研究 netcat ;)

标签: javascript cordova raspberry-pi data-transfer


【解决方案1】:

有几种方法可以做到这一点。

在 Raspberry Pi 上,您可以编写使用 gatttool 读取温度并将值写入 /tmp/temperature 之类的文件的脚本。运行此脚本 cron 以每 x 分钟运行一次以更新值。

创建第二个程序,它是一个 Web 服务器,通过 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 库来使用蓝牙并从恒温器获取温度。

另一种选择是编写一个使用蓝牙直接与恒温器对话的 Cordova 应用程序。您可以使用cordova-plugin-ble-central 执行此操作。

【讨论】:

    【解决方案2】:

    您可以使用简单明了的 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)
    

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      相关资源
      最近更新 更多