如何将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
相关产品推荐
相关产品推荐

