Hi,
I am using sensor observer sample to get the data from sensor sample. However, I notice the power consuption is too high. I have look thourgh the forum and found this technique to reduce the power consumtion. I write one driver for this tehcnique.
After I flash my board, it can work well for around 30s and then will have "<err> bt_mesh_access: Failed to publish (err -105) <err> bt_mesh_transport: Out of network advs" and cannot print "People count is %". I also notice that the Bluetooth Mesh: Sensor can still be trigger and generate data correctly.
Here is my code:
model handler
/*
* Copyright (c) 2020 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
#include <zephyr/bluetooth/bluetooth.h>
#include <bluetooth/mesh/models.h>
#include "model_handler.h"
#include "nus_handler.h"
#include "pm.h"
#define GET_DATA_INTERVAL 999
static struct k_work_delayable get_data_work;
/* 传感器客户端回调函数 - 只处理People Count */
static void sensor_cli_data_cb(struct bt_mesh_sensor_cli *cli,
struct bt_mesh_msg_ctx *ctx,
const struct bt_mesh_sensor_type *sensor,
const struct bt_mesh_sensor_value *value)
{
if (sensor->id == bt_mesh_sensor_people_count.id) {
//printk("People count is %s\n", bt_mesh_sensor_ch_str(value));
const char *count_str = bt_mesh_sensor_ch_str(value);
printk("People count is %s\n", count_str);
/* 更新 NUS 模块中的 people count 字符串 */
nus_update_people_count(count_str);
pre_sleep();
}
}
/* 简化的传感器客户端处理程序 */
static const struct bt_mesh_sensor_cli_handlers bt_mesh_sensor_cli_handlers = {
.data = sensor_cli_data_cb,
};
static struct bt_mesh_sensor_cli sensor_cli =
BT_MESH_SENSOR_CLI_INIT(&bt_mesh_sensor_cli_handlers);
/* 数据获取工作处理函数 - 只请求People Count */
static void get_data(struct k_work *work)
{
post_sleep();
if (!bt_mesh_is_provisioned()) {
k_work_schedule(&get_data_work, K_MSEC(GET_DATA_INTERVAL));
return;
}
int err = bt_mesh_sensor_cli_get(&sensor_cli,
NULL,
&bt_mesh_sensor_people_count,
NULL);
if (err) {
printk("Error getting people count (%d)\n", err);
}
k_work_schedule(&get_data_work, K_MSEC(GET_DATA_INTERVAL));
// set_pm_state();
}
/* 健康服务回调(保留基本功能) */
static void attention_on(const struct bt_mesh_model *mod) {}
static void attention_off(const struct bt_mesh_model *mod) {}
static const struct bt_mesh_health_srv_cb health_srv_cb = {
.attn_on = attention_on,
.attn_off = attention_off,
};
static struct bt_mesh_health_srv health_srv = {
.cb = &health_srv_cb,
};
BT_MESH_HEALTH_PUB_DEFINE(health_pub, 0);
/* 模型元素配置 */
static struct bt_mesh_elem elements[] = {
BT_MESH_ELEM(1,
BT_MESH_MODEL_LIST(
BT_MESH_MODEL_CFG_SRV,
BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
BT_MESH_MODEL_SENSOR_CLI(&sensor_cli)
),
BT_MESH_MODEL_NONE
),
};
static const struct bt_mesh_comp comp = {
.cid = CONFIG_BT_COMPANY_ID,
.elem = elements,
.elem_count = ARRAY_SIZE(elements),
};
const struct bt_mesh_comp *model_handler_init(void)
{
k_work_init_delayable(&get_data_work, get_data);
k_work_schedule(&get_data_work, K_MSEC(GET_DATA_INTERVAL));
return ∁
}
pm.c
#include "pm.h"
#include <zephyr/device.h>
#include <zephyr/pm/pm.h>
#include <zephyr/pm/device.h>
#include <zephyr/bluetooth/mesh.h>
// void set_pm_state()
// {
// struct pm_state_info info =
// {
// .exit_latency_us = 0,
// .min_residency_us = 0,
// .state = PM_STATE_SUSPEND_TO_RAM,
// .substate_id = 0,
// };
// pm_device_action_run(CPU_ID, &info);
// }
void pre_sleep()
{
bt_mesh_prov_disable(BT_MESH_PROV_GATT | BT_MESH_PROV_ADV); // disabling provisioning bearer
bt_mesh_suspend(); // turn off mesh
}
void post_sleep()
{
bt_mesh_resume(); // turn on mesh
bt_mesh_prov_enable(BT_MESH_PROV_GATT | BT_MESH_PROV_ADV); // enabling provisioning bearer
}
config
# # Copyright (c) 2020 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # CONFIG_NCS_SAMPLES_DEFAULTS=y # Deferred logging helps improve LPN power consumption # when friendship is established. CONFIG_LOG_MODE_DEFERRED=y # General configuration CONFIG_NCS_APPLICATION_BOOT_BANNER_STRING="Mesh Sensor Observer" #CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 在后面加了个大的 CONFIG_FLASH=y CONFIG_FLASH_MAP=y # Flash shell module uses 8k of RAM for testing buffers, disable to save RAM CONFIG_FLASH_SHELL=n CONFIG_NVS=y CONFIG_NVS_LOOKUP_CACHE=y CONFIG_SETTINGS=y CONFIG_SETTINGS_NVS_NAME_CACHE=y CONFIG_HWINFO=y CONFIG_DK_LIBRARY=y CONFIG_PM_SINGLE_IMAGE=y CONFIG_PM_PARTITION_SIZE_SETTINGS_STORAGE=0x8000 CONFIG_SOC_FLASH_NRF_PARTIAL_ERASE=y CONFIG_CBPRINTF_FP_SUPPORT=y # Bluetooth configuration CONFIG_BT=y CONFIG_BT_DEVICE_NAME="Mesh Sensor Observer" CONFIG_BT_L2CAP_TX_BUF_COUNT=8 CONFIG_BT_OBSERVER=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_SETTINGS=y # Disable unused Bluetooth features CONFIG_BT_CTLR_LE_ENC=n CONFIG_BT_PHY_UPDATE=n CONFIG_BT_CTLR_CHAN_SEL_2=n CONFIG_BT_CTLR_MIN_USED_CHAN=n CONFIG_BT_CTLR_PRIVACY=n # Bluetooth Mesh configuration CONFIG_BT_MESH=y CONFIG_BT_MESH_RELAY=y CONFIG_BT_MESH_FRIEND=y CONFIG_BT_MESH_TX_SEG_MAX=24 CONFIG_BT_MESH_RX_SEG_MAX=16 CONFIG_BT_MESH_PB_GATT=y CONFIG_BT_MESH_GATT_PROXY=y CONFIG_BT_MESH_PROXY_USE_DEVICE_NAME=y CONFIG_BT_MESH_DK_PROV=y CONFIG_BT_MESH_SUBNET_COUNT=2 CONFIG_BT_MESH_APP_KEY_COUNT=3 CONFIG_BT_MESH_MODEL_KEY_COUNT=3 CONFIG_BT_MESH_CRPL=32 CONFIG_BT_MESH_MSG_CACHE_SIZE=64 CONFIG_BT_MESH_SHELL=y # Bluetooth Mesh models CONFIG_BT_MESH_SENSOR_CLI=y CONFIG_LOG_BACKEND_RTT=n #我加的我加的 CONFIG_BT_NUS=y # CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_BT_EXT_ADV=y CONFIG_BT_EXT_ADV_MAX_ADV_SET=9 # CONFIG_BT_BUF_ACL_RX_SIZE=27 # CONFIG_BT_BUF_ACL_TX_SIZE=27 # CONFIG_BT_BUF_ACL_TX_COUNT=10 # CONFIG_BT_BUF_EVT_RX_COUNT=10 # CONFIG_BT_BUF_EVT_DISCARDABLE_SIZE=58 # CONFIG_HEAP_MEM_POOL_SIZE=4096 # CONFIG_MAIN_STACK_SIZE=2048 # CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096 CONFIG_BT_ID_MAX=9 CONFIG_BT_MAX_CONN=9 CONFIG_BT_BUF_CMD_TX_COUNT=30 #为了调试加的 CONFIG_LOG=y #CONFIG_LOG_DEFAULT_LEVEL=4
Thank you for your time!


