这里写目录标题
1.蓝牙传感器需求
1)蓝牙BLE工作在低功耗模式
2)BLE可以通过I2C、SPI或者UART串口获取传感器中的输出,通过广播的信息发送出来
3)在SDK设定广播参数,包括广播间隔、设备名称和广播数据内容等
4)随着传感数据的变化,广播内容也要相应的变化
5)广播的开启与关闭
2.蓝牙传感器特性
工程路径:\Source\DA14531\projects\target_apps\ble_examples\ble_app_peripheral
固件输出路径:Source\DA14531\projects\target_apps\ble_examples\ble_app_peripheral\Keil_5\out_DA14531\Output\ DA14531_Sensor.bin
传感器特性:
名称 | 范围 默认参数 |
---|---|
系统 | ①低功耗系统 ②非低功耗系统 |
功耗 | 不广播状态 1uA |
广播状态200ms | 0.14mA |
广播间隔时间: | 间隔广播(20ms-2000ms) |
广播数据: | 设备名称 “Sensor” |
制造商数据: | FF |
前两字节公司ID | FFC1 |
A数据(uint16_t) | 1001 |
B数据(uint16_t) | 2001 |
C数据(uint16_t) | 3001 |
D数据(uint16_t) | 4001 |
E数据(uint16_t) | 5001 |
F数据(uint16_t) | 6001 |
G数据(uint16_t) | 7001 |
3.主要用户应用代码
3.1.传感器数据结构体
typedef struct
{
uint16_t SensorA;
uint16_t SensorB;
uint16_t SensorC;
uint16_t SensorD;
uint16_t SensorE;
uint16_t SensorF;
uint16_t SensorG;
}Sensor_Data_t;
3.2.配置广播间隔
1)#include “user_config.h” 中
/// Minimum interval for advertising
.intv_min = MS_TO_BLESLOTS(200), // 200ms
/// Maximum interval for advertising
.intv_max = MS_TO_BLESLOTS(200), // 200ms
2)配置设备名称:#define USER_DEVICE_NAME “Sensor”
配置公司ID #define USER_COMPANY_ID 0xFFC1
3.3.主要用户代码说明
3.3.1.主要函数接口
函数接口 说明
user_app_adv_undirect_complete() 广播完成回调函数
user_app_on_db_init_complete() BLE数据库初始化完成回调函数
user_app_adv_start() 开启广播函数
user_app_adv_stop() 关闭广播函数
app_easy_gap_undirected_advertise_start_create_msg 广播数据接口
user_RsfreshSensorData() 传感器数据刷新
user_app_before_sleep() 睡眠前回调函数
user_app_resume_from_sleep() 唤醒时回调函数
3.3.2.打印MAC地址
#if defined (DA14531)
extern struct bd_addr dev_bdaddr;
uint8_t bd_address[6] = CFG_NVDS_TAG_BD_ADDRESS;
arch_printf("OTP addr: %02x %02x %02x %02x %02x %02x\r\n",
dev_bdaddr.addr[0],
dev_bdaddr.addr[1],
dev_bdaddr.addr[2],
dev_bdaddr.addr[3],
dev_bdaddr.addr[4],
dev_bdaddr.addr[5]);
arch_printf("nvds addr: %02x %02x %02x %02x %02x %02x\r\n",
bd_address[0],
bd_address[1],
bd_address[2],
bd_address[3],
bd_address[4],
bd_address[5]);
#endif
arch_printf(“main_loop\r\n”);
3.3.3.低功耗模式
设置为低功耗模式:
arch_set_sleep_mode(ARCH_EXT_SLEEP_ON);
设置为正常模式:
arch_set_sleep_mode(ARCH_SLEEP_OFF);
3.3.4.广播数据底层配置
uint8_t dev_name_len = 0;
uint8_t dev_manu_len = 0;
uint8_t adv_data_len = 0;
uint8_t scan_rsp_data_len = 0;
uint8_t adv_data[31];
uint8_t scan_rsp_data[31];
// Device Name
dev_name_len = strlen(USER_DEVICE_NAME);
dev_manu_len = sizeof(device_info.manu);
arch_printf("adv_name:%s\r\n",USER_DEVICE_NAME);
adv_data_len = 0;
if(dev_name_len)
{
adv_data[adv_data_len + 0] = dev_name_len + 1;
adv_data[adv_data_len + 1] = GAP_AD_TYPE_COMPLETE_NAME;
memcpy(&adv_data[adv_data_len +2],USER_DEVICE_NAME,dev_name_len);
adv_data_len += dev_name_len + 2;
}
if(dev_manu_len)
{
adv_data[adv_data_len + 0] = dev_manu_len + 1;
adv_data[adv_data_len + 1] = GAP_AD_TYPE_MANU_SPECIFIC_DATA;
memcpy(&adv_data[adv_data_len +2],device_info.manu,dev_manu_len);
adv_data_len += dev_manu_len + 2;
}
adv_cmd->info.host.adv_data_len = adv_data_len;
memcpy(&(cmd->info.host.adv_data[0]), adv_data, adv_data_len);
arch_printf("adv_data_len:%d\r\n",adv_data_len);
show_reg(adv_data,adv_data_len,1);
adv_cmd->info.host.scan_rsp_data_len = scan_rsp_data_len;
memcpy(&(cmd->info.host.scan_rsp_data[0]), scan_rsp_data, scan_rsp_data_len);
//arch_printf("scan_rsp_data_len:%d\r\n",scan_rsp_data_len);
//show_reg(scan_rsp_data,scan_rsp_data_len,1);
3.3.5.刷新传感器数据
static void user_RsfreshSensorData(void)
{
///arch_printf(“Rsf\r\n”);
// 获取传感器信息
Sensor.SensorA++;
Sensor.SensorB++;
Sensor.SensorC++;
Sensor.SensorD++;
Sensor.SensorE++;
Sensor.SensorF++;
Sensor.SensorG++;
// 更新数据
User_data.CycleTime++;
if(User_data.CycleTime>=5)
{
User_data.CycleTime = 0;
if(memcmp(&Sensor,&bacSensor,sizeof(Sensor)))
{
device_info.manu[0] =(uint8_t)USER_COMPANY_ID;
device_info.manu[1] =(uint8_t)(USER_COMPANY_ID>>8);
device_info.manu[2] =Sensor.SensorA;
device_info.manu[3] =Sensor.SensorA;
device_info.manu[4] =Sensor.SensorB;
device_info.manu[5] =Sensor.SensorB;
device_info.manu[6] =Sensor.SensorC;
device_info.manu[7] =Sensor.SensorC;
device_info.manu[8] =Sensor.SensorD;
device_info.manu[9] =Sensor.SensorD;
device_info.manu[10] =Sensor.SensorE;
device_info.manu[11] =Sensor.SensorE;
device_info.manu[12] =Sensor.SensorF;
device_info.manu[13] =Sensor.SensorF;
device_info.manu[14] =Sensor.SensorG;
device_info.manu[15] =Sensor.SensorG;
user_app_adv_stop(); // 停止广播后,会重新开启广播 请看
}
}
}