BLE发送接收任意字节数据
来源:互联网 发布:linux nano vim 编辑:程序博客网 时间:2024/06/01 10:16
一、前言
BLE的SimpleBLECentral和SimpleBLEPeripheral例程是通过SIMPLEPROFILE_CHAR1来发送接收一个字节的数据的。要想发送多个字节的数据,必须修改simpleGATTprofile.c中与SIMPLEPROFILE_CHAR1相关的参数和函数。
二、修改
详细可以参考例程中的SIMPLEPROFILE_CHAR5。
1.定义长度、定义数组
在simpleGATTprofile.h中定义长度:
// Length of Characteristic 1 in bytes define SIMPLEPROFILE_CHAR1_LEN 32
在simpleGATTprofile.c中定义数组:
// Characteristic 1 Valuestatic uint8 simpleProfileChar1[SIMPLEPROFILE_CHAR1_LEN] = {0};
2.修改Characteristic Value
// Characteristic Value 1 { { ATT_BT_UUID_SIZE, simpleProfilechar1UUID }, GATT_PERMIT_READ | GATT_PERMIT_WRITE, 0, simpleProfileChar1 },
3.修改SimpleProfile_SetParameter函数
//if ( len == sizeof ( uint8 ) ) //{ // simpleProfileChar1 = *((uint8*)value); //}
改为:
if ( len == SIMPLEPROFILE_CHAR1_LEN ) { VOID osal_memcpy( simpleProfileChar1, value, SIMPLEPROFILE_CHAR1_LEN ); }
4.修改SimpleProfile_GetParameter函数
// *((uint8*)value) = simpleProfileChar1;
改为:
VOID osal_memcpy( value, simpleProfileChar1, SIMPLEPROFILE_CHAR1_LEN );
5.修改simpleProfile_WriteAttrCB函数
//Validate the value // Make sure it's not a blob oper if ( offset == 0 ) { #if 0 if ( len != SIMPLEPROFILE_CHAR1_LEN ) { status = ATT_ERR_INVALID_VALUE_SIZE; } #else if ( len > SIMPLEPROFILE_CHAR1_LEN ) { status = ATT_ERR_INVALID_VALUE_SIZE; } #endif } else { status = ATT_ERR_ATTR_NOT_LONG; } //Write the value if ( status == SUCCESS ) { uint8 *pCurValue = (uint8 *)pAttr->pValue; osal_memset(pCurValue,0,SIMPLEPROFILE_CHAR1_LEN); VOID osal_memcpy( pCurValue, pValue, len ); if( pAttr->pValue == simpleProfileChar1 ) { notifyApp = SIMPLEPROFILE_CHAR1; } else { notifyApp = SIMPLEPROFILE_CHAR3; } }
6.修改simpleProfile_ReadAttrCB函数
case SIMPLEPROFILE_CHAR1_UUID: *pLen = SIMPLEPROFILE_CHAR1_LEN; VOID osal_memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR1_LEN ); break;
三、测试
修改完成后,就可以在主机和从机当中测试了。
主机:
在simpleBLECentral_HandleKeys函数中:
if ( simpleBLEDoWrite ) //没有其他的读写操作就进行读写操作 { // Do a write attWriteReq_t req; //写请求格式结构体 uint8 buf[] = "123456789abcdef"; osal_memcpy(req.value,buf,sizeof(buf)/sizeof(buf[0])); req.handle = simpleBLECharHdl; //发现特征句柄 req.len = sizeof(buf)/sizeof(buf[0]); req.sig = 0; //身份验证签名状态 0:不包含 1:有效 2:无效 req.cmd = 0; //命令标志 status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId ); }
在此将发送”123456789abcdef”字符串到从机。
从机:
在simpleProfileChangeCB函数中:
uint8 *newValue = (uint8*)osal_mem_alloc(8*32);switch( paramID ){ case SIMPLEPROFILE_CHAR1: SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR1, newValue ); //获得主机发来数据 #if (defined HAL_LCD) && (HAL_LCD == TRUE) HalLcdWriteString((char*)newValue, HAL_LCD_LINE_3 ); //显示到LCD #endif // (defined HAL_LCD) && (HAL_LCD == TRUE) break; default: // should not reach here! break;}osal_mem_free(newValue);
四、结语
本文主要是在SIMPLEPROFILE_CHAR1的基础上修改的,SIMPLEPROFILE_CHAR1本来只可以发送1个字节,修改后最大可以发送在simpleGATTprofile.h中定义的长度,我定义的是32个字节,测试成功。
1 0
- BLE发送接收任意字节数据
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- udp发送接收数据
- 数据发送和接收
- iOS蓝牙4.0(BLE)-后台接收数据
- iOS蓝牙4.0(BLE)-后台接收数据
- 发送/接收数据包与发送/接收字节的区别.
- 一字节触发 用定时器监控UART是否把数据全部接收,然后一起发送
- socket 发送字节如何判断接收完毕
- TCP、UDP 发送、接收0字节问题
- Android的Ble蓝牙最多只能发送20字节数
- nrf51822-提高nordic ble数据发送速率
- nrf51822-提高nordic ble数据发送速率
- 实验_socket数据发送接收
- android发送/接收json数据
- Android接收/发送jSON数据
- Java8 Lambda表达式和流操作如何让你的代码变慢5倍
- 回归测试的精确化
- Ubuntu 13.10 64bit 不能运行 32bit的软件
- 【geoip】geoip操作GeoLiteCity.dat
- 你对做水晶头还有疑问吗?
- BLE发送接收任意字节数据
- H264的I/P/B帧类型判断
- swift ios转场动画详解
- 网络爬虫——爬取糗事百科笑料段子
- 创建实例失败 state error
- 设计模式之适配器
- OC学习篇之-----类目·延展·协议之--类目
- ResourceBundle
- oracle 日期函数 MONTHS_BETWEEN