W801/W800蓝牙收发数据与控制设计(二)-NOTIFY

10 篇文章 0 订阅
9 篇文章 0 订阅

本文使用环境:
主控:W801 (开发板)
兼容:W800 AIR101
软件:CDK

W801蓝牙收发数据与控制设计(一)-INDICATE
W801蓝牙收发数据与控制设计(二)-NOTIFY方式
W800-KIT-蓝牙-温湿度传感器(cht8305c)-RGB灯-demo

一、项目概述

^^^^这篇教程接着上文继续介绍W801的BT使用,上文使用INDICATE方式进行数据的收发,这篇文章主要采用NOTIFY方式进行数据收发。具体Indicate 和 Notify的区别,可以自己查一下,我也不是很了解这个东西。好像是 (indicate发送接收端有应答,notify接收端无应答)

^^^^程序功能: 和上文差不多,区别在于Indicate 和 Notify不一样。

二、程序设计

写在前面:本文的程序是在上文的基础上做的改进,所以必须下载前文的程序。

以下代码均在wm_ble_server_api_demo.c中添加。

1、先添加宏定义,关于notify主要有两个地方,如下:

/* ble attr write/notify handle */
uint16_t g_ble_demo_attr_indicate_handle;
uint16_t g_ble_demo_attr_write_handle;
uint16_t g_ble_demo_conn_handle ;

//add by zxx start
uint16_t g_ble_demo_attr_notify_handle;
//add by zxx end

#define WM_GATT_SVC_UUID      0xFFF0
#define WM_GATT_INDICATE_UUID 0xFFF1
#define WM_GATT_WRITE_UUID    0xFFF2

//add by zxx start
#define WM_GATT_NOTIFY_UUID   0xFFF3
//add by zxx end

2、官方的demo中只有WRITE和INDICATE,因此添加代码characteristics :

//notify_test函数没有任何的作用,不添加蓝牙notify方式初始化会失败。
static int notify_test()
{
	;
}
static const struct ble_gatt_svc_def gatt_demo_svr_svcs[] = {
    {
        /* Service: uart */
        .type = BLE_GATT_SVC_TYPE_PRIMARY,
        .uuid = BLE_UUID16_DECLARE(WM_GATT_SVC_UUID),
        .characteristics = (struct ble_gatt_chr_def[]) { {
                .uuid = BLE_UUID16_DECLARE(WM_GATT_WRITE_UUID),
                .val_handle = &g_ble_demo_attr_write_handle,
                .access_cb = gatt_svr_chr_demo_access_func,
                .flags = BLE_GATT_CHR_F_WRITE,
            },{
                .uuid = BLE_UUID16_DECLARE(WM_GATT_INDICATE_UUID),
                .val_handle = &g_ble_demo_attr_indicate_handle,
                .access_cb = gatt_svr_chr_demo_access_func,
                .flags = BLE_GATT_CHR_F_INDICATE,
            }
			//add by zxx start
			,{
                .uuid = BLE_UUID16_DECLARE(WM_GATT_NOTIFY_UUID),
                .val_handle = &g_ble_demo_attr_notify_handle,
                //这个函数不会调用,但是必须要有,
                .access_cb = notify_test,
                .flags = BLE_GATT_CHR_F_NOTIFY,
            }
			//add by zxx end
			,{
              0, /* No more characteristics in this service */
            } 
         },
    },

    {
        0, /* No more services */
    },
};

3、添加tls_ble_server_demo_api_send_notify_msg 函数,只需仿照tls_ble_server_demo_api_send_msg函数进行修改即可。


//add by zxx start
int tls_ble_server_demo_api_send_notify_msg(uint8_t *data, int data_len)
{
    int rc;
    struct os_mbuf *om;
    
    //TLS_BT_APPL_TRACE_DEBUG("### %s len=%d\r\n", __FUNCTION__, data_len);
    //这句话要注释掉,要不然这个代码的逻辑不对
    //if(g_send_pending) return BLE_HS_EBUSY;

    if(data_len<=0 || data == NULL)
    {
        return BLE_HS_EINVAL;
    }
    
    om = ble_hs_mbuf_from_flat(data, data_len);
    if (!om) {
        return BLE_HS_ENOMEM;
    }
    //参数g_ble_demo_attr_notify_handle句柄要和characteristics 的句柄一样
    rc = ble_gattc_notify_custom(g_ble_demo_conn_handle,g_ble_demo_attr_notify_handle, om); 
    //这句话注释不注释都可以,我注释了
    /*
	if(rc == 0)
    {
        g_send_pending = 1;
    }
	*/
    return rc;
}
//add by zxx end

二、测试

1、app端配置
按照如图所示进行配置,注意TX是xxxf3,RX是xxxf2。配置完成正常收发程序即可。
在这里插入图片描述
其他测试步骤和上文一样,不再赘述。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于W801单片机的智能手机充电器是一种能够更加智能化管理和保护手机充电的设计方案。这款充电器采用了W801单片机作为主控芯片,通过其强大的计算和控制能力,实现了多种功能和优化。 首先,基于W801单片机的充电器可以根据手机电池的容量和电压等信息,智能调节充电电流和电压。通过与手机之间的通信,充电器可以了解手机电池的具体状态,并根据需要进行快速充电或是低电流充电,以达到最佳充电效果,同时避免过度充电对手机电池的损害。 其次,充电器还具备安全保护功能。例如,基于W801单片机的充电器可以实现过充保护,当手机电池充满后自动停止充电,避免过度充电导致手机电池损坏。另外,充电器还可以监测电流和电压的异常情况,一旦发现异常即刻停止充电,确保手机充电安全。 此外,基于W801单片机的充电器还可以具备智能管理功能。它可以通过内置的计时器功能,记录手机充电时间和充电历史,帮助用户了解充电习惯和充电特点。同时,它还可以与用户的手机APP进行连接,实现远程控制和监测。用户可以通过手机APP查看充电器状态、调整充电参数等。 综上所述,基于W801单片机的智能手机充电器设计具备智能调节充电电流和电压、安全保护功能以及智能管理等特点,能够更好地满足用户对手机充电的需求,提供更加智能和安全的充电体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr·赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值