花了多少时间我已经不想提起,但是至少还是有点成果的,分析了不少代码,也看了不少资料,发现比较接地气的东西还是比较少,不多花点时间积累,说实话很辛苦。
现在还没有足够的水平上升到蓝牙协议的层次,饭要一口一口吃,不然就消化不良了不是?所以还是慢慢来,记录一下探索蓝牙协议的过程,希望对像我一样白的新手会有帮助。
准备的开发板是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(使用前将#替换为@)