| /* |
| * Copyright (c) 2023 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/bluetooth/bluetooth.h> |
| #include <zephyr/bluetooth/uuid.h> |
| |
| #define SERVICE_DATA_LEN 9 |
| #define SERVICE_UUID 0xfcd2 /* BTHome service UUID */ |
| #define IDX_TEMPL 4 /* Index of lo byte of temp in service data*/ |
| #define IDX_TEMPH 5 /* Index of hi byte of temp in service data*/ |
| |
| #define ADV_PARAM BT_LE_ADV_PARAM(BT_LE_ADV_OPT_USE_IDENTITY, \ |
| BT_GAP_ADV_SLOW_INT_MIN, \ |
| BT_GAP_ADV_SLOW_INT_MAX, NULL) |
| |
| |
| static uint8_t service_data[SERVICE_DATA_LEN] = { |
| BT_UUID_16_ENCODE(SERVICE_UUID), |
| 0x40, |
| 0x02, /* Temperature */ |
| 0xc4, /* Low byte */ |
| 0x00, /* High byte */ |
| 0x03, /* Humidity */ |
| 0xbf, /* 50.55% low byte*/ |
| 0x13, /* 50.55% high byte*/ |
| }; |
| |
| static struct bt_data ad[] = { |
| BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR), |
| BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1), |
| BT_DATA(BT_DATA_SVC_DATA16, service_data, ARRAY_SIZE(service_data)) |
| }; |
| |
| static void bt_ready(int err) |
| { |
| if (err) { |
| printk("Bluetooth init failed (err %d)\n", err); |
| return; |
| } |
| |
| printk("Bluetooth initialized\n"); |
| |
| /* Start advertising */ |
| err = bt_le_adv_start(ADV_PARAM, ad, ARRAY_SIZE(ad), NULL, 0); |
| if (err) { |
| printk("Advertising failed to start (err %d)\n", err); |
| return; |
| } |
| } |
| |
| int main(void) |
| { |
| int err; |
| int temp = 0; |
| |
| printk("Starting BTHome sensor template\n"); |
| |
| /* Initialize the Bluetooth Subsystem */ |
| err = bt_enable(bt_ready); |
| if (err) { |
| printk("Bluetooth init failed (err %d)\n", err); |
| return 0; |
| } |
| |
| for (;;) { |
| /* Simulate temperature from 0C to 25C */ |
| service_data[IDX_TEMPH] = (temp * 100) >> 8; |
| service_data[IDX_TEMPL] = (temp * 100) & 0xff; |
| if (temp++ == 25) { |
| temp = 0; |
| } |
| err = bt_le_adv_update_data(ad, ARRAY_SIZE(ad), NULL, 0); |
| if (err) { |
| printk("Failed to update advertising data (err %d)\n", err); |
| } |
| k_sleep(K_MSEC(BT_GAP_ADV_SLOW_INT_MIN)); |
| } |
| return 0; |
| } |