[IOS] IOS设备与BLE设备通信字节序问题

关于字节序:--from 维基百科

在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。

而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效字节在最高有效字节的前面,则称小端序;反之则称大端序。在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。

例如假设上述变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。大端法从首位开始将是:0x100: 01, 0x101: 23,..。而小端法将是:0x100: 67, 0x101: 45,..

OS 设备:小端

Mac OS :小端

BLE 设备(iBeacon等:大端,

网络字节序:大端

关于字节序:

iOS中的字节序 这篇文章写的非常好、给的链接也非常棒~ 强烈推荐下


开源下自己下的大小端转换代码,欢迎拍砖 T_T

相关代码:


- (u_int8_t *)htonRand:(void *)byte length:(NSUInteger)length
{
    u_int8_t *result = malloc(length);
    for ( int i = 0; i < length; i ++) {
        *(result + i) = *((u_int8_t *)(byte + length - i - 1));        
    }

    NSString *key = @"";
    for ( int i = 0; i < length ; i ++) {
        key = [NSString stringWithFormat:@"%@%02hhX",key,*((u_int8_t *)byte + i)];
    }
    NSLog(@"Byte: %@",key);
    
    key = @"";
    for ( int i = 0; i < length ; i ++) {
        key = [NSString stringWithFormat:@"%@%02hhX",key,*(result + i)];
    }
    NSLog(@"Result: %@",key);
    return  result;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Android平台上,使用BLE(低功耗蓝牙)进行设备通信需要编写源代码。下面是一个简单的示例,展示了如何启用BLE功能、搜索和连接设备、发送和接收数据。 首先,需要确保应用程序在AndroidManifest.xml文件中申请必要的权限和特性。 ```xml <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> ``` 接下来,在应用程序的MainActivity中创建一个BluetoothAdapter对象,并启用BLE功能。 ```java BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) { // 设备不支持蓝牙或蓝牙未启用 // 进行相关处理 } ``` 然后,需要创建一个BluetoothLeScanner对象来搜索BLE设备。可以通过扫描结果回调来获取设备信息。 ```java BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); bluetoothLeScanner.startScan(new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { // 获取设备信息 BluetoothDevice device = result.getDevice(); // 进行相关处理,比如连接设备 } }); ``` 接下来,可以通过设备名称或MAC地址来连接设备,并与之进行数据通信。 ```java BluetoothDevice device = bluetoothAdapter.getRemoteDevice(deviceAddress); BluetoothGatt gatt = device.connectGatt(this, false, new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { if (newState == BluetoothProfile.STATE_CONNECTED) { // 设备已连接 // 进行相关处理,比如发现服务 } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { // 设备已断开连接 // 进行相关处理 } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { // 服务已发现 // 进行相关处理,比如获取特征值 } @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { // 特征值已读取 // 进行相关处理 } @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { // 特征值已写入 // 进行相关处理 } }); ``` 最后,可以使用BluetoothGatt对象向设备发送数据或者接收设备发送的数据。 ```java BluetoothGattCharacteristic characteristic = gatt.getService(serviceUuid).getCharacteristic(characteristicUuid); characteristic.setValue(data); gatt.writeCharacteristic(characteristic); ``` 这只是一个简单的示例,实际的BLE设备通信可能会涉及更多的操作和数据处理。使用上述代码作为起点,可以根据实际需求进行扩展和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值