CSR1010蓝牙开发探索(一)

2023-05-16

花了多少时间我已经不想提起,但是至少还是有点成果的,分析了不少代码,也看了不少资料,发现比较接地气的东西还是比较少,不多花点时间积累,说实话很辛苦。

现在还没有足够的水平上升到蓝牙协议的层次,饭要一口一口吃,不然就消化不良了不是?所以还是慢慢来,记录一下探索蓝牙协议的过程,希望对像我一样白的新手会有帮助。

准备的开发板是keyfob,蓝牙芯片CSR1010,开发环境是CSR uEnergy SDK2.5.1,今天的内容是让射频工作起来,并且广播我们的名字,让其他蓝牙设备能够发现。

代码中设计到了固件库的部分函数,稍作说明:

1、设置设备地址,地址格式分为LAP低24位,UAP高8位,NAP无意义16位。(UAP和NAP是生产厂商的唯一标示码)当然我们做测试就不要担心了。

ls_err GapSetRandomAddress(const BD_ADDR_T *ra);

2、设置GAP模式。

参数一:设置角色(四种值);参数二:设置可见性(三种值);参数三:连接性(三种值);参数四:可否绑定(两种值);参数五:安全性(三种值)。

ls_err  GapSetMode (gap_role const role, gap_mode_discover const discover, gap_mode_connect const connect, gap_mode_bond const bond, gap_mode_security const security);

3、设置广播间隙。

参数一二标示间隙最小值和最大值。

ls_err  GapSetAdvInterval (uint32 const adv_min_us, uint32 const adv_max_us);

4、存储广播和扫描应答数据。

参数一:数据长度;参数二:数据;参数三:广播数据/应答数据。

每次广播数据的最大长度位31字节,包含特定的7字节。

- 3 字节的AD标志位由固件添加;

- 1 字节的AD长度由固件添加;

- 1 字节存储广播数据类型(用户存入的第一个字节);

- 2 字节存储id;

ls_err  LsStoreAdvScanData (uint16 const len, uint8 *const data, ad_src const src);

5、开始/停止广播。

参数一:设置TRUE(开始);参数二:白名单(两种值);参数三:地址类型(三种值)。

ls_err  LsStartStopAdvertise (bool const go, whitelist_mode const wl_mode, ls_addr_type const addr_type);

下面是示例源码:

#include <main.h>
#include <gap_app_if.h>
#include <random.h>

static void startAdvertising(void);
static void appSetRandomAddress(void);

static void appSetRandomAddress(void)
{
    BD_ADDR_T addr;

    for (;;)
    {
        uint32 now = TimeGet32();
        uint32 rnd = Random16();
        addr.uap = 0xff & (rnd ^ now);
        if ( 0 == addr.uap || 0xff == addr.uap ) continue;
        addr.lap = 0xffffff & ((now >> 8) ^ (73 * rnd));
        if ( 0 == addr.lap || 0xffffff == addr.lap ) continue;
        addr.nap = 0x3fff & rnd;
        if ( 0 == addr.nap || 0x3fff == addr.nap ) continue;
        break;
    }

    /* 再加工处理一下 */
    addr.nap &= ~BD_ADDR_NAP_RANDOM_TYPE_MASK;
    addr.nap |=  BD_ADDR_NAP_RANDOM_TYPE_NONRESOLV;
    GapSetRandomAddress(&addr);
}

void startAdvertising(void)
{
    uint8 advData[] = " CSR TEST";                           /* 第一个字节表示广播数据类型 */
    advData[0] = AD_TYPE_LOCAL_NAME_COMPLETE;                //设置广播内容为名称
    appSetRandomAddress();
    GapSetMode(gap_role_peripheral, gap_mode_discover_general,
               gap_mode_connect_no, gap_mode_bond_no, gap_mode_security_unauthenticate);
    LsStoreAdvScanData(0, NULL, ad_src_advertise);          //清空历史数据
    GapSetAdvInterval(60 * MILLISECOND, 60 * MILLISECOND);  //设置广播间隙为60ms

    //此函数参数ad_src_advertise表示存入广播数据,若值为ad_src_scan_rsp表示被扫描到时的应答数据
    LsStoreAdvScanData(10, advData, ad_src_advertise);
    LsStartStopAdvertise(TRUE, whitelist_disabled, ls_addr_type_random);//开始和停止广播
}

void AppPowerOnReset(void)
{
    /* 什么都不做 */
}

void AppInit(sleep_state last_sleep_state)
{
    startAdvertising();
}

void AppProcessSystemEvent(sys_event_id id, void *data)
{
    /* 什么都不做 */
}

bool AppProcessLmEvent(lm_event_code event_code, LM_EVENT_T *p_event_data)
{
    return TRUE;
}
将上面的程序用SDK编译下载到开发板上后,打开手机上的lightblue就能找到名叫CSR TEST的蓝牙设备了,当然现在既不能连接也没有任何服务。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSR1010蓝牙开发探索(一) 的相关文章

  • 全网最简单Win10桌面美化教程,只需4步!!

    时间过得真滴快呀 xff01 咋眼就10月了 不知道国庆期间 小伙伴们是外出旅游 还是宅在家里哪里也没去 或者更悲催一点 还在国庆加班抑或因为疫情正在隔离 无论大家处于任何状态 小七都要在这里祝大家 xff1a 国庆节快乐 吉祥话说完了 下
  • Pycharm配置Jupyter Notebook实现本地开发与调试

    Pycharm专业版中集成了Jupyter Notebook xff0c 方便用户编辑 xff0c 执行和调试Notebook代码 xff0c 并检查执行输出 个人感觉 xff0c 相比于Jupyter提供的网页编辑器 xff0c Pych
  • Zookeeper选举机制介绍

    ZooKeeper是一个高可用的分布式协调服务 xff0c 它的核心功能之一就是选举机制 当ZooKeeper集群中的一个节点宕机时 xff0c 需要通过选举机制来选出一个新的leader节点 xff0c 确保集群的正常运行 下面是ZooK
  • redis实现布隆过滤器

    Redis是一种基于内存的数据存储系统 xff0c 具有高性能 高可用性 高扩展性等特点 xff0c 因此被广泛用于实现布隆过滤器 以下是一种基于Redis实现布隆过滤器的方案 xff1a 创建一个长度为m的位数组 xff08 bit ar
  • 解决shiro的登录成功后跳转到自定义error.html的问题

    解决shiro的登录成功后跳转到error html 1 先说一下问题现象 xff1a saas项目中 xff0c 登录成功之后 xff0c 跳转了error html xff0c 停顿一会儿后进入主页面 2 说一下我处理这个问题的步骤 x
  • 喜茶皇茶茶叶带您走上致富之路

    我国是茶文化的发源地 xff0c 尤其是南方各类品种的茶层出不穷 xff0c 茶韵茶香引人入胜 消费者生活水平大幅提高 xff0c 饮茶几乎已经成为一种时尚 xff0c 皇茶 在市场上受到大家的认可与喜爱 xff0c 短短时间内迅速发展壮大
  • 处理Spire.Pdf 生成书签有 Evaluation Warning : The document was created with Spire.PDF for .NET.字样的问题

    处理spire Pdf生成时的警告信息 这俩天在使用spire Pdf生成书签的时候总是会有Evaluation Warning The document was created with Spire PDF for NET 的警告字样 x
  • Android Drawable Preview插件适配Android Studio4.1版发布

    Android Drawable Preview是一个在安卓开发中非常有用的AS IDEA插件 可以将drawable资源文件的icon替换成内容的预览图 达到不需要打开资源文件 快速预览内容的功能 实在是非常的方便快捷 让开发工作更加的愉
  • 变频器的逆变、变频原理

    变频器的逆变 变频原理 YJZhang 从事制造业质量管理 xff0c 做过PCBA 线束 电话机 变频器行业 90 人赞同了该文章 变频器将直流电转变为交流电的这个过程叫 逆变 xff08 inverting 先讲逆变过程 xff0c 分
  • ubuntu20.04设置自动文字模式登录

    文字模式登录后取得的程序称为 Shell xff08 壳 xff09 xff0c Linux 的壳程序是bash xff08 Bourne Shell的增强版本 xff09 设置文字模式登录 xff1a 第一步 xff1a 进入grub文件
  • 从高考到程序员

    记得当年进入考场的时候也是志气满满 xff0c 心里念叨着一定要考上自己理想的大学 xff0c 光宗耀祖 当时坐在学校安排的bus上向考场的方向行进 xff0c 看到路边的交警叔叔 xff0c 情不自禁的喊了一声 xff0c 交警大哥辛苦了
  • Android内存优化(二)之如何分析native heap

    如何获取native heap请阅读上篇文章 xff0c 本篇文章将主要介绍如何分析一个native heap文件 xff0c 以及我们的native memory leak问题如何发现并定位 首先先来看一下实际中我们看到的native h
  • 基于springboot的薪资管理系统设计

    一 系统介绍 项目源码 xff1a https gitee com oklongmm code 这是一个界面简洁的薪资管理系统 xff0c 虽然界面简单 xff0c 但其工资项配置 xff0c 与考勤挂钩 xff0c 自动核算功能强大 xf
  • Dijkstra算法详解

    1 dijkstra算法简介 Dijkstra算法是由E W Dijkstra于1959年提出 xff0c 又叫迪杰斯特拉算法 xff0c 它应用了贪心算法模式 xff0c 是目前公认的最好的求解最短路径的方法 算法解决的是有向图中单个源点
  • C++建立动态二维数组

    C 43 43 建立动态二维数组主要有两种方法 xff1a 1 使用数组指针 xff0c 分配一个指针数组 xff0c 将其首地址保存在b中 xff0c 然后再为指针数组的每个元素分配一个数组 int b 61 new int row 分配
  • 理解负载均衡

    什么是平均负载 xff1f 单位时间内 xff0c 系统处于可运行状态和不可中断状态的平均进程数 xff0c 也就是平均活跃进程数 xff0c 它和CPU使用率并没有直接关系 所谓可运行状态的进程 xff0c 是指正在使用CPU或者等待CP
  • 理解CPU使用率和CPU上下文切换

    1 CPU使用率 1 1 CPU使用率查看 当发现服务或机器卡的时候 xff0c 我们都是先通过top命令查看服务器CPU使用率 默认每3秒刷新一次 top top 18 10 58 up 1216 days 7 38 4 users lo
  • 自动驾驶概述

    1 自动化能力定义 对自动驾驶能力有多个定义标准 xff0c 比较常用的是SAE International关于自动化层级的定义 具体是 L0 驾驶员完全掌控车辆 L1 自动系统有时能够辅助驾驶员完成某些驾驶任务 L2 自动系统能够完成某些

随机推荐

  • java遍历泛型的方法

    一 List遍历 Java中List遍历有三种方法来遍历泛型 xff0c 主要为 xff1a 1 for循环遍历 2 iterator遍历 3 foreach遍历 package com gmail lsgjzhuwei import ja
  • java web文件下载功能实现

    需求 xff1a 实现一个具有文件下载功能的网页 xff0c 主要下载压缩包和图片 两种实现方法 xff1a 一 xff1a 通过超链接实现下载 在HTML网页中 xff0c 通过超链接链接到要下载的文件的地址 lt DOCTYPE htm
  • java创建线程的三种方式及其对比

    Java中创建线程主要有三种方式 xff1a 一 继承Thread类创建线程类 xff08 1 xff09 定义Thread类的子类 xff0c 并重写该类的run方法 xff0c 该run方法的方法体就代表了线程要完成的任务 因此把run
  • 史上最全面最易懂的,Spring框架学习教程

    Spring通过PlatformTransactionManager平台事务管理器接口对事务的管理进行高度抽象 xff0c 但是该接口下具体的实现是由各个平台自己实现 xff0c Spring并不直接管理事务 xff0c 而是提供了多种事务
  • 'hibernate.dialect' must be set when no Connection available

    今天碰到的这个问题 xff0c 很无厘头 xff0c 网上搜索了很多 xff0c 都不靠谱 xff0c 还是靠自己 解决方法是在hibernate cfg xml中添加 lt property name 61 34 dialect 34 g
  • javascript动态插入html元素

    主要有是两种方案 xff1a 1 使用DOM span class hljs comment 使用createElement创建元素 span span class hljs keyword var span dialog 61 docum
  • python中switch语句用法

    python中是没用switch语句的 xff0c 这应该是体现python大道至简的思想 xff0c python中一般多用字典来代替switch来实现 coding utf 8 from future import division d
  • ROS的 sudo rosdep init 的报错终极解决方案

    ROS的 sudo rosdep init 的报错解决方案 安装ROS时sudo rosdep init指令报错 xff1a ERROR span class token operator span cannot download span
  • 干支纪年

    干支纪年 摘自 xff1a http baike baidu com view 187057 htm 1 天干 xff08 甲 xff09 象草林破土而萌 xff0c 阳在内而被阴包裹 又有认为 xff0c 甲者铠甲也 xff0c 把万物冲
  • “密码不满足密码策略的要求,检查最小密码长度、密码复杂性和密码历史的要求”的解决办法(Windows...

    Windows Server 2003解决办法是 xff1a 选择 开始 gt 程序 gt 管理工具 gt 域安全策略 gt 帐户策略 gt 密码策略 密码必须符合复杂性要求 xff1a 由 已启用 改为 已禁用 xff1b 密码长度最小值
  • 解决android studio 不同ApplicationId可能导致xmlns命名空间报错

    遇到一个需求 xff0c 想出不同渠道 xff0c 我们可以知道在build gradle里面声明 productFlavors dev minSdkVersion 21 applicationId 34 xxx xxx xxx 34 ma
  • Manjaro Linux KDE 安装后的配置

    一 更换中国源 span class token function sudo span pacman mirrors i c China m rank 这个命令执行完毕的时候后弹窗让你选择想要使用的源 xff0c 选择速度最快的那个就可以了
  • 盘点程序员情人节的表白,前端程序员最浪漫,后端不服来战

    loonggg 读完需要3分钟 速读仅需1分钟 今天是七夕 xff0c 中国的情人节 xff0c 当然了就是牛郎和织女团聚的日子 在 IT 群体中 xff0c 很多人都说程序员不浪漫 xff0c 程序员不懂得浪漫 xff0c 程序员木讷 x
  • 毕业设计 Spring Boot的在线音乐网站系统(含源码+论文)

    文章目录 1 项目简介2 实现效果2 1 界面展示 3 设计方案3 1 概述3 2 系统流程3 2 1 系统开发流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi xff0c 各位同学好呀 xff0c 这里是M学姐 xff01 今
  • mac(osx) apache无法启动 localhost无法访问服务器

    问题描述 xff1a 由于删除了 private var log下面的日志 xff0c 导致重启电脑后apache无法正常工作 删除log的初衷是 xff1a 当系统用久了 xff0c 日志文件占据了几十个G的硬盘容量 造成的后果 xff1
  • 去掉了“摆动窗口”特效

    自从安装了KDE4以后 xff0c 我就再也离不开那些华丽的特效了 很多的时候 xff0c 不得不忍受万分缓慢的速度 昨天 xff0c 对开启的特效进行了一些精简 xff1a 最大化 最小化窗口特效仅保留魔灯 xff1b 关闭了摆动窗口特效
  • 单片机关键字sfr和sbit的理解

    在单片机C语言编程中 xff0c 扩充了两个关键字sfr和sbit sfr Special Function Register特殊功能寄存器的缩写 xff0c sbit 特殊功能寄存器位 xff0c 与定义一般的int char型变量不同
  • CSR1010蓝牙开发I/O操作

    CSR1010开发前期准备 1 开发环境CSR uEnergy SDK 2 5 1 2 硬件准备keyfob蓝牙开发板 xff0c USB SPI下载器 CSR1010 I O开发须知 xff1a 关于I O操作的函数库被定义在头文件 lt
  • ArchLinux必备命令记录

    1 添加新账户 useradd username新建账户 useradd d home xxx m xxx创建用户 xff0c 并同时生成用户目录 xff0c 不然账户无法正常启用 passwd username修改密码 userdel f
  • CSR1010蓝牙开发探索(一)

    花了多少时间我已经不想提起 xff0c 但是至少还是有点成果的 xff0c 分析了不少代码 xff0c 也看了不少资料 xff0c 发现比较接地气的东西还是比较少 xff0c 不多花点时间积累 xff0c 说实话很辛苦 现在还没有足够的水平