You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将React Native音频数值数据发送至树莓派并同步至ThingSpeak

解决方案:替代蓝牙的WiFi通信方案

因为树莓派无蓝牙模块且无法安装bluez,推荐使用局域网HTTP通信或MQTT双向通信两种方案,以下是具体实现步骤:

方案1:树莓派搭建HTTP服务器接收音频数据

步骤1:树莓派端修改脚本(添加Flask HTTP服务)

先安装Flask依赖:

pip install flask

修改原有Python脚本,新增HTTP接口接收音频数值,并整合温湿度、气压数据一同上传ThingSpeak:

from flask import Flask, request
import time
import paho.mqtt.publish as publish

app = Flask(__name__)
audio_value = 0.0  # 存储接收的音频数值

# 接收音频数据的POST接口
@app.route('/audio', methods=['POST'])
def receive_audio():
    global audio_value
    data = request.get_json()
    audio_value = float(data.get('value', 0.0))
    return {'status': 'success'}

# 整合数据上传ThingSpeak的逻辑
def upload_to_thingspeak(channel_ID, mqtt_host, mqtt_client_ID, mqtt_username, mqtt_password):
    t_transport = "websockets"
    t_port = 80
    topic = "channels/" + channel_ID + "/publish"
    
    while True:
        from sense_hat import SenseHat  # 按实际采集硬件调整
        sense = SenseHat()
        temperature = sense.get_temperature()
        humidity = sense.get_humidity()
        pressure = sense.get_pressure()
        
        # 需提前在ThingSpeak频道添加field4用于存储音频数据
        payload = f"field1={temperature}&field2={humidity}&field3={pressure}&field4={audio_value}"
        
        try:
            print(f"Data sent: Temperature: {temperature} Humidity: {humidity} Pressure: {pressure} Audio: {audio_value}")
            publish.single(topic, payload, hostname=mqtt_host, transport=t_transport, port=t_port, 
                          client_id=mqtt_client_ID, auth={'username':mqtt_username,'password':mqtt_password})
            time.sleep(15)        
        except KeyboardInterrupt:
            break

if __name__ == '__main__':
    # 启动Flask服务,允许局域网设备访问(端口设为5000)
    import threading
    server_thread = threading.Thread(target=lambda: app.run(host='0.0.0.0', port=5000, debug=False))
    server_thread.daemon = True
    server_thread.start()
    
    # 替换为你的ThingSpeak参数
    upload_to_thingspeak("YOUR_CHANNEL_ID", "mqtt.thingspeak.com", "YOUR_CLIENT_ID", "YOUR_USERNAME", "YOUR_API_KEY")

步骤2:React Native端发送音频数据

在录制回调中,通过fetch将音频数值POST到树莓派的局域网静态IP(示例为192.168.1.100):

const startRecording = async () => {
    let { status } = await Audio.requestPermissionsAsync();
    if (status !== 'granted') {
        console.log('Permission to access audio was denied');
        return;
    }
    try {
        const recording = new Audio.Recording();

        await recording.prepareToRecordAsync(
            Audio.RecordingOptionsPresets.HIGH_QUALITY
        );
        // 启用音频计量
        await recording.setMeteringEnabledAsync(true);
        recording.setOnRecordingStatusUpdate((status) => {
            const scaledValue = (Number(status?.metering) + 160) / 160;
            // 发送音频数据到树莓派
            fetch('http://192.168.1.100:5000/audio', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ value: scaledValue }),
            })
            .then(response => response.json())
            .catch(error => console.error('Failed to send audio data:', error));
        });
        await recording.startAsync();
        setRecording(recording);
        setIsRecording(true);
    } catch (error) {
        console.error(error);
    }
};

方案2:MQTT双向通信(自建Broker)

若熟悉MQTT协议,可在树莓派搭建轻量MQTT Broker(如Mosquitto),实现RN端发布音频数据、树莓派订阅接收的双向通信。

步骤1:树莓派安装Mosquitto

sudo apt update && sudo apt install mosquitto mosquitto-clients

步骤2:树莓派脚本修改(订阅音频主题)

import time
import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish

audio_value = 0.0
channel_ID = "YOUR_CHANNEL_ID"
mqtt_host = "mqtt.thingspeak.com"
mqtt_client_ID = "YOUR_CLIENT_ID"
mqtt_username = "YOUR_USERNAME"
mqtt_password = "YOUR_API_KEY"

# MQTT订阅回调:接收音频数据
def on_message(client, userdata, msg):
    global audio_value
    try:
        audio_value = float(msg.payload.decode())
    except:
        audio_value = 0.0

# 初始化MQTT订阅客户端
sub_client = mqtt.Client()
sub_client.on_message = on_message
sub_client.connect("localhost", 1883, 60)
sub_client.subscribe("audio/data")
sub_client.loop_start()

# 数据上传逻辑
t_transport = "websockets"
t_port = 80
topic = "channels/" + channel_ID + "/publish"

while True:
    from sense_hat import SenseHat
    sense = SenseHat()
    temperature = sense.get_temperature()
    humidity = sense.get_humidity()
    pressure = sense.get_pressure()
    
    payload = f"field1={temperature}&field2={humidity}&field3={pressure}&field4={audio_value}"
    
    try:
        print(f"Data sent: Temperature: {temperature} Humidity: {humidity} Pressure: {pressure} Audio: {audio_value}")
        publish.single(topic, payload, hostname=mqtt_host, transport=t_transport, port=t_port, 
                      client_id=mqtt_client_ID, auth={'username':mqtt_username,'password':mqtt_password})
        time.sleep(15)        
    except KeyboardInterrupt:
        sub_client.loop_stop()
        break

步骤3:React Native端使用MQTT发布数据

安装react-native-mqtt库后,在录制回调中发布音频数据:

import MQTT from 'react-native-mqtt';

// 组件挂载时初始化MQTT客户端
const client = new MQTT.Client('192.168.1.100', 1883, 'rn_audio_client');

client.connect({
  onSuccess: () => {
    console.log('MQTT Connected');
  },
  onFailure: (err) => {
    console.error('MQTT Connection Failed:', err);
  },
});

// 录制回调中发布音频数据
const startRecording = async () => {
    // ... 原有权限校验、录制初始化代码
    recording.setOnRecordingStatusUpdate((status) => {
        const scaledValue = (Number(status?.metering) + 160) / 160;
        if (client.isConnected()) {
            client.publish('audio/data', scaledValue.toString(), 0, false);
        }
    });
    // ... 启动录制代码
};

注意事项

  • 确保RN设备与树莓派处于同一WiFi局域网,树莓派建议设置静态IP,避免IP变动导致通信中断。
  • ThingSpeak频道需提前添加对应字段(如field4)用于存储音频数据。
  • HTTP方案适合简单低频次通信,MQTT方案更适配低功耗、高频次数据传输场景。

内容的提问来源于stack exchange,提问作者Steez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:12:52