0

需要有关如何为与 ESP32 配对的 React Native 应用程序布局功能的指南,该应用程序最终将使用读取特性反馈重量读数,并能够通过写入特性来切换 DI。

我目前可以扫描并连接到 ESP32 并显示来自 ESP32 的值(现在是随机变化的值),还可以通过更改硬编码值来切换 LED。但我希望能够通过应用程序中的按钮来做到这一点。

 const scanDevices = () => {
        //set isLoading to true to show activity Indicator
        setIsLoading(true);

        //scan for devices, (UUIDs, ScanOptions(error, device))
        manager.startDeviceScan(null, null, (error, device) => {
            if (error) {
                console.log("Error in scanning", error.message)
                return;
            }
            if (device) {   
                //if a device is scanned, add the name & id details into the scannedDevice object via reducer             
                dispatch({type: 'DEVICE_ADD', payload: {name: device.name, id: device.id}});
            }
        });
        
        //end scan after 3 seconds, stop the activity indicator swirly thing
        setTimeout(() => {
            console.log("Scan timeout after 5 seconds");
            manager.stopDeviceScan();
            setIsLoading(false);
          }, 5000);
    };
  const deviceConnect = (device) => {

            console.log("Connecting to:", device.name, device.id);
            setIsConnected(true);
            setConnectedDevice(device);
        
            manager.connectToDevice(device.id)
                .then((device) => {
                    console.log("Discovering all services & chars");
                    return device.discoverAllServicesAndCharacteristics()
                }).then((device) => {     
                   // console.log("Write Value inside deviceConnect:", writeValue)
                    console.log("Device:", device.name, "has been connected."); 
                    return deviceNotifications(device, writeValue);
                }).catch((error) => {
                    console.log("device connect error:", device.name, error)
                    //JSON.stringify(error)
                });
            
    };
   const deviceNotifications = async (device, writeValue) => {

        const service = "af493e2a-f002-11eb-9a03-0242ac130003";
        const characteristicTX = "af49423a-f002-11eb-9a03-0242ac130003";
        const characteristicRX = "af49414a-f002-11eb-9a03-0242ac130003"; 

        if (device) {
            try {
                device.monitorCharacteristicForService(service, characteristicTX, (error, characteristic) => {
                    if (error) {
                        console.log(error);
                    } else {
                        setCharacteristicValue(() => {                    
                        return [{id: uuid.v4(), value: (base64.decode(characteristic.value))}];
                    })}
                });
            device.writeCharacteristicWithResponseForService(service, characteristicRX, base64.encode(writeValue));
            console.log("Writing to RX:", writeValue);   
            }
            catch (err) {
                console.log("deviceNotification catch error:", err);
            } 
        };
}

试图对 [ble-plx 文档][1] ([github wiki][2]) 进行排序时,我感到很困惑

目前我可以让 LED 打开/关闭的唯一方法是我在 deviceNotifications 异步函数中有 LED 切换部分,并且必须手动更改在代码本身中编码和写入的值,而不是从 App UI使用 useState 值。

我尝试使用 useState 关闭一个按钮(切换值并注销 OK),然后重新调用 deviceConnect 函数,但是 .then promise 部分中注释掉的 console.log 在第一个之后不起作用,返回打开 LED(将“A”写入特征)。

感谢您提前提供的任何帮助,我知道很多这些 ble-plx 问题都没有得到解答。

//this is at a top level inside the main function
 const [writeValue, setWriteValue] = useState('A');
    const toggleLED = () => {
        if (writeValue == 'B') {
            setWriteValue('A');
            console.log("Toggling write value:", writeValue);
        } else {
            setWriteValue('B')
            console.log("Toggling write value", writeValue)
        };
    };



  [1]: https://dotintent.github.io/react-native-ble-plx/
  [2]: https://github.com/dotintent/react-native-ble-plx/wiki
  [3]: https://www.polidea.com/blog/ReactNative_and_Bluetooth_to_An_Other_level/
4

0 回答 0