收到开发板也有一个月了,最近在公司忙于一些琐事,6月最后一天抽个空写一下第二篇评测,本人是入门级玩家,有不当之处还请各位大佬指教,谢谢,言归正传吧,今天写的是将开发板监测到的温湿度通过BLE功能传输到手机上动态显示,分以下几步实现:
一、修改代码,论坛里也有各种实现方法,大家可以依据自己喜欢的方式修改,我也是参考了好几个,摸索了几天找到一个相对简单的方法,修改的比较少,只需修改simple_gatt_service.c 如下部分的代码就可以了,里面有调用到打包函数将在第二步说明。
bool sp_svc_ntf_flag;
gatt_ntf_t ntf_att;
uint8_t conn_idx;
static void sp_gatt_write_cb(uint8_t *write_buf, uint16_t len, uint16_t att_idx)
{
for (int i = 0; i < len; i++)
{
co_printf("Write request: len: %d, 0x%x \r\n", len, write_buf);
uint8_t ble_ntf_buff[30];
uint8_t ble_ntf_length;
int32_t temperature, humidity;
int16_t ret = 0;
if (ret == STATUS_OK )
{
ntf_att.att_idx = SP_IDX_CHAR4_VALUE;
ntf_att.conidx = conn_idx;
ntf_att.svc_id = sp_svc_id;
ret = sht3x_measure_blocking_read(&temperature, &humidity);
co_printf("BLE Notification:temperature = %d,humidity = %d\r\n",temperature,humidity);
startValuePack(ble_ntf_buff);
putFloat(temperature/1000.0);
putFloat(humidity/1000.0);
ble_ntf_length = endValuePack();
ntf_att.data_len = ble_ntf_length;
ntf_att.p_data = ble_ntf_buff;
gatt_notification(ntf_att);
co_printf("Notification Data OK!\r\n");
}
if (att_idx == SP_IDX_CHAR1_VALUE)
memcpy(sp_char1_value, write_buf, len);
if (att_idx == SP_IDX_CHAR3_VALUE)
memcpy(sp_char3_value, write_buf, len);
if (att_idx == SP_IDX_CHAR5_VALUE)
memcpy(sp_char5_value, write_buf, len);
}
uint16_t uuid = BUILD_UINT16( simple_profile_att_table[att_idx].uuid.p_uuid[0], simple_profile_att_table[att_idx].uuid.p_uuid[1] );
if (uuid == GATT_CLIENT_CHAR_CFG_UUID)
{
co_printf("Notification status changed\r\n");
if (att_idx == SP_IDX_CHAR4_CFG)
{
sp_char4_ccc[0] = write_buf[0];
sp_char4_ccc[1] = write_buf[1];
co_printf("Char4 ccc: 0x%x 0x%x \r\n", sp_char4_ccc[0], sp_char4_ccc[1]);
}
if(sp_char4_ccc[0]==1&sp_char4_ccc[1]==0)
{
sp_svc_ntf_flag=true;
//ntf_att.att_idx = SP_IDX_CHAR4_VALUE;
//ntf_att.conidx = conn_idx;
//ntf_att.svc_id = sp_svc_id;
ntf_att.data_len = 3;
uint8_t ntf_data[] = "NTF OK";
ntf_att.p_data = ntf_data;
gatt_notification(ntf_att);
co_printf("Notification Data %x\r\n", ntf_data);
}
else
{
sp_svc_ntf_flag=false;
}
}
}
二、第一步里调用了打包函数ValuePack,我把这个函数放在了协议下面,当然在simple_gatt_service.c代码前面要放入打包函数的头文件valuepack.h,如下图,不然编译会出错,此函数会打包放在附件了。
三、上述步骤完成后编译代码生成BIN文件,然后将此文件烧录到开发板,烧录过程论坛里已经有很详细的说明了,这里不再赘述。
四、打开安卓手机上下载的蓝牙调试器,很多伙伴在问怎么使用,在简书上有教程,链接:https://www.jianshu.com/p/1a8262492619,显示界面如下,点击Simple Per后面的“+“号就可以连接,连接成功后显示红色的”X“,点击会断开连接。
五、设置透传识别关键字,现在是模块向手机发送数据,我们选择fff4,如果是手机向模块发送数据是fff3,这里设置好后,我们进入下一步。
六、因为我们是接收数据,而且数据是浮点型的,所以只需在接收数据包的浮点型设置项点“+”,设置两个浮点数就可以了,发送的不用设置,刚开始连接成功后过20秒左右就断开了,最后看LOG发现是模块接收会出错,此蓝牙调试器也有提示说,发送间隔太短,由于传输速率问题会造成拥堵而导致出差,所以就把发送间隔改成了1000ms,后面就不会断开了
七、手机成功显示的界面如下,收到模块的朋友们也可以试者玩一下,大家可以互相学习
2020-6-30 10:28 上传
点击文件名下载附件
全部回复 6
评测文章
热帖
大家都在看的技术资料
举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
关闭
站长推荐 /3
- 返回顶部
工具栏