如何解决反应本地中的polidea BLE解码特征值
我正在尝试解码从BLE接收到的软件包,但是我没有任何运气。如果您有任何想法,可以帮助我,我将不胜感激。这是我收到的base64示例:
ReadByte
我应该得到速度,电池电压,选项字节和odo
using System;
using System.IO;
using UnityEngine;
#if UNITY_WINRT && !UNITY_EDITOR
using Windows.Networking.Sockets;
using Windows.Networking;
using Windows.Networking.Connectivity;
using Windows.Storage.Streams;
using System.Runtime.InteropServices.WindowsRuntime;
#endif
public class NetworkManager : MonoBehaviour
{
public int tcpPort;
#if UNITY_WINRT && !UNITY_EDITOR
private StreamSocketListener streamSocketListener;
private StreamReader tcpStreamReader = null;
private StreamSocketListenerConnectionReceivedEventArgs connectionArgs;
private DatagramSocket datagramSocket;
private MemoryStream pendingDatagramSocketStream;
#endif
private UInt32 tcpMessageSizeByteCount;
private UInt32 tcpMessageSizeBytesRead;
private byte[] tcpMessageSizeBuffer;
private bool tcpMessageSizeReceived;
private UInt32 tcpMessageByteCount;
private UInt32 tcpMessageBytesRead;
private byte[] tcpMessageBuffer;
// Use this for initialization
void Start()
{
Application.runInBackground = true;
ResetTcpConnection();
}
public void ResetTcpConnection()
{
#if UNITY_WINRT && !UNITY_EDITOR
ResetTcpRead();
if (streamSocketListener != null)
{
tcpStreamReader.Dispose();
tcpStreamReader = null;
connectionArgs = null;
streamSocketListener.Dispose();
streamSocketListener = null;
}
streamSocketListener = new StreamSocketListener();
streamSocketListener.ConnectionReceived += this.StreamSocketListener_ConnectionReceived;
streamSocketListener.BindServiceNameAsync(tcpPort.ToString());
#endif
}
#if UNITY_WINRT && !UNITY_EDITOR
// Process the client connection.
private async void StreamSocketListener_ConnectionReceived(StreamSocketListener sender,StreamSocketListenerConnectionReceivedEventArgs args)
{
connectionArgs = args; // Keep this alive
tcpStreamReader = new StreamReader(connectionArgs.Socket.InputStream.AsStreamForRead());
}
#endif
// Update is called once per frame
void Update()
{
#if UNITY_WINRT && !UNITY_EDITOR
if (tcpStreamReader != null && !tcpStreamReader.EndOfStream)
{
Stream stream = tcpStreamReader.BaseStream;
ReadTcpData(ref stream);
}
#endif
}
private void ResetTcpRead()
{
tcpMessageSizeByteCount = sizeof(UInt32);
tcpMessageSizeBytesRead = 0;
tcpMessageSizeBuffer = new byte[tcpMessageSizeByteCount];
tcpMessageSizeReceived = false;
tcpMessageByteCount = 0;
tcpMessageBytesRead = 0;
tcpMessageBuffer = null;
}
private void ReadTcpData(ref Stream stream)
{
try
{
if (!tcpMessageSizeReceived)
{
#if UNITY_WINRT && !UNITY_EDITOR
while(tcpMessageSizeBytesRead < tcpMessageSizeByteCount && !tcpStreamReader.EndOfStream)
{
tcpMessageSizeBuffer[tcpMessageSizeBytesRead++] = (byte)stream.ReadByte();
}
if(tcpMessageSizeBytesRead == tcpMessageSizeByteCount)
{
tcpMessageByteCount = BitConverter.ToUInt32(tcpMessageSizeBuffer,0);
}
#endif
if (tcpMessageByteCount > 0)
{
tcpMessageBuffer = new byte[tcpMessageByteCount];
tcpMessageSizeReceived = true;
}
}
else
{
// Read the message
int bytesToRead = (int)(tcpMessageByteCount - tcpMessageBytesRead);
bytesToRead = bytesToRead > 10000 ? 10000 : bytesToRead;
int bytesRead = stream.Read(tcpMessageBuffer,(int)tcpMessageBytesRead,bytesToRead);
tcpMessageBytesRead += (uint)bytesRead;
// Did we finish reading the message?
if (tcpMessageBytesRead >= tcpMessageByteCount)
{
ResetTcpRead();
}
}
}
catch (Exception e)
{
throw e;
}
}
}
解决方法
查看Polidea / react-native-ble-plx库,似乎从特征读取的数据返回了base64。因此,作为字节数组,您的值将是:
AcgAyQ== is [1,200,201]
Av0BAA== is [2,253,1,0]
A0IARQ== is [3,66,69]
BGQEbA== is [4,100,4,108]
这看起来像第一个字节是OpCode,最后一个字节是校验和。我会假设两者之间的字节是小端字节序中的值。
我尝试了一些代码:
import toUint8Array from 'urlb64touint8array';
import { Buffer } from 'buffer'
var speed_bytes = toUint8Array('AcgAyQ==');
var battery_bytes = toUint8Array('Av0BAA==');
var option_bytes = toUint8Array('A0IARQ==');
var odo_bytes = toUint8Array('BGQEbA==');
var speed = Buffer(speed_bytes).readInt16LE(1) / 10;
var battery = Buffer(battery_bytes).readInt16LE(1) / 10;
var options = (Buffer(option_bytes).readInt16LE(1) >>> 0).toString(2)
var odo = Buffer(odo_bytes).readInt16LE(1) / 10;
console.log('Processing speed: [' + speed_bytes + '] ' + speed);
console.log('Processing battery: [' + battery_bytes + '] ' + battery);
console.log('Processing option: [' + option_bytes + '] ' + options);
console.log('Processing odo: [' + odo_bytes + '] ' + odo);
哪个给出了以下输出:
Processing speed: [1,201] 20
Processing battery: [2,0] 50.9
Processing option: [3,69] 1000010
Processing odo: [4,108] 112.4
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。