How can I receive simple integer values over bluetooth in ios

回眸只為那壹抹淺笑 提交于 2020-01-03 05:48:45

问题


I am trying to learn how to get some sensors plugged into an Arduino board to talk to an iPhone over Bluetooth with a Red Bear Labs mini board but have hit a brick wall.

The sensors get a reading and this is sent to the phone over BLE. So far I've connected to the device and I get back what appears to be data but I can't make sense of it.

I've written a little sketch that looks like this, to simulate the sensor data.

#include <SoftwareSerial.h>
SoftwareSerial bluetooth(5, 6);

void setup() {
  bluetooth.begin(57600);
}

void loop() {
  //int reading = analogRead(2);
  int reading = 123; // fake reading
  byte lowerByte = (byte) reading & 0xFF;
  byte upperByte = (byte) (reading >> 8) & 0xFF;
  bluetooth.write(reading);
  bluetooth.write(upperByte);
  bluetooth.write(lowerByte);
  delay(1000);
}

In iOS I send a call to read the data and then the data is received by a piece of code that looks something like:

- (void)peripheral:(CBPeripheral *)peripheral 
didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic 
             error:(NSError *)error
{
    Byte data[20];
    static unsigned char buf[512];
    static int len = 0;
    NSInteger data_len;

    if (!error && [characteristic.UUID isEqual:[CBUUID UUIDWithString:@RBL_CHAR_TX_UUID]]){
            data_len = characteristic.value.length;
            [characteristic.value getBytes:data length:data_len];

            if (data_len == 20){
                memcpy(&buf[len], data, 20);
                len += data_len;

                if (len >= 64){
                    [[self delegate] bleDidReceiveData:buf length:len];
                    len = 0;
                }
            } else if (data_len < 20) {
                memcpy(&buf[len], data, data_len);
                len += data_len;

                [[self delegate] bleDidReceiveData:buf length:len];
                len = 0;
            }
        }
    }...
}

But when I look at the data that comes back it just makes no sense to me at all.. (I'll dig out an example as soon as I can).

Does anyone know a simple step I'm missing or a good example I could look at to try and better understand this?


回答1:


I finally realised that the data was correct, I had to 'pull out' the data by bit shifting it.

UInt16 value;
UInt16 pin;

for (int i = 0; i < length; i+=3) {
  pin = data[i];
  value = data[i+2] | data[i+1] << 8;
  NSLog(@"Pin: %d", pin);
  NSLog(@"Value %d",value);
}


来源:https://stackoverflow.com/questions/24207727/how-can-i-receive-simple-integer-values-over-bluetooth-in-ios

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!