BLE: Add service UUID to advertisement, remove descriptors to save space
This commit is contained in:
parent
059f47df56
commit
3213667eea
2 changed files with 16 additions and 8 deletions
|
|
@ -59,6 +59,9 @@ Enable UART I/O protocol according to [docs/uart-protocol.md](./docs/uart-protoc
|
||||||
Enable BLE I/O protocol according to [docs/ble-protocol.md](./docs/ble-protocol.md).
|
Enable BLE I/O protocol according to [docs/ble-protocol.md](./docs/ble-protocol.md).
|
||||||
Enabling `denm` feature or `cam` feature is recommended, otherwise no data will be received.
|
Enabling `denm` feature or `cam` feature is recommended, otherwise no data will be received.
|
||||||
|
|
||||||
|
Note: When changing the set of supported messages on the BLE interface, you may need to turn bluetooth off and on again on your client device.
|
||||||
|
Otherwise the client may not re-scan the service's characteristics and still use the previous set of characteristics.
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|
|
||||||
21
src/ble.rs
21
src/ble.rs
|
|
@ -56,7 +56,7 @@ struct CITSEvents {
|
||||||
raw_notify: [u8; io::msg::RawNotify::PROTO_SIZE],
|
raw_notify: [u8; io::msg::RawNotify::PROTO_SIZE],
|
||||||
|
|
||||||
#[cfg(feature = "cam")]
|
#[cfg(feature = "cam")]
|
||||||
#[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "CAM", read, value = "RawMsgRx proto msg", type = &'static str)]
|
// #[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "CAM", read, value = "RawMsgRx proto msg", type = &'static str)]
|
||||||
#[characteristic(uuid = "c0b70001-d4f4-4003-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
|
#[characteristic(uuid = "c0b70001-d4f4-4003-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
|
||||||
cam_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
|
cam_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
|
||||||
#[cfg(feature = "cam")]
|
#[cfg(feature = "cam")]
|
||||||
|
|
@ -65,7 +65,7 @@ struct CITSEvents {
|
||||||
cam_event: [u8; io::msg::CamEvent::PROTO_SIZE],
|
cam_event: [u8; io::msg::CamEvent::PROTO_SIZE],
|
||||||
|
|
||||||
#[cfg(feature = "denm")]
|
#[cfg(feature = "denm")]
|
||||||
#[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "DENM", read, value = "RawMsgRx proto msg", type = &'static str)]
|
// #[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "DENM", read, value = "RawMsgRx proto msg", type = &'static str)]
|
||||||
#[characteristic(uuid = "c0b70001-d4f4-4005-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
|
#[characteristic(uuid = "c0b70001-d4f4-4005-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
|
||||||
denm_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
|
denm_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
|
||||||
#[cfg(feature = "denm")]
|
#[cfg(feature = "denm")]
|
||||||
|
|
@ -74,11 +74,11 @@ struct CITSEvents {
|
||||||
denm_event: [u8; io::msg::DenmEvent::PROTO_SIZE],
|
denm_event: [u8; io::msg::DenmEvent::PROTO_SIZE],
|
||||||
|
|
||||||
#[cfg(feature = "spat")]
|
#[cfg(feature = "spat")]
|
||||||
#[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "MAPEM", read, value = "RawMsgRx proto msg", type = &'static str)]
|
// #[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "MAPEM", read, value = "RawMsgRx proto msg", type = &'static str)]
|
||||||
#[characteristic(uuid = "c0b70001-d4f4-4007-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
|
#[characteristic(uuid = "c0b70001-d4f4-4007-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
|
||||||
mapem_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
|
mapem_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
|
||||||
#[cfg(feature = "spat")]
|
#[cfg(feature = "spat")]
|
||||||
#[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "SPATEM", read, value = "RawMsgRx proto msg", type = &'static str)]
|
// #[descriptor(uuid = descriptors::MEASUREMENT_DESCRIPTION, name = "SPATEM", read, value = "RawMsgRx proto msg", type = &'static str)]
|
||||||
#[characteristic(uuid = "c0b70001-d4f4-4008-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
|
#[characteristic(uuid = "c0b70001-d4f4-4008-ada8-f99a02ee315c", read, value = [0u8; io::msg::RawMsgRx::PROTO_SIZE])]
|
||||||
spatem_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
|
spatem_raw: [u8; io::msg::RawMsgRx::PROTO_SIZE],
|
||||||
}
|
}
|
||||||
|
|
@ -143,8 +143,10 @@ pub async fn run(
|
||||||
|
|
||||||
let _ = embassy_futures::join::join(ble_task(runner), async {
|
let _ = embassy_futures::join::join(ble_task(runner), async {
|
||||||
loop {
|
loop {
|
||||||
match advertise("ESP32 C-ITS", &mut peripheral, &server).await {
|
match advertise(&mut peripheral, &server).await {
|
||||||
Ok(conn) => {
|
Ok(conn) => {
|
||||||
|
info!("BLE: New client connected");
|
||||||
|
|
||||||
// set up tasks when the connection is established to a central, so they don't run when no one is connected.
|
// set up tasks when the connection is established to a central, so they don't run when no one is connected.
|
||||||
let a = gatt_events_task(&server, &conn);
|
let a = gatt_events_task(&server, &conn);
|
||||||
let b = publishing_task(&server, &conn);
|
let b = publishing_task(&server, &conn);
|
||||||
|
|
@ -158,7 +160,7 @@ pub async fn run(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
panic!("BLE ADV: fatal error {e:?}");
|
panic!("BLE ADV: fatal error: {e:?}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -183,15 +185,18 @@ pub fn update(payload: BleSendable) {
|
||||||
|
|
||||||
/// Create an advertiser to use to connect to a BLE Central, and wait for it to connect.
|
/// Create an advertiser to use to connect to a BLE Central, and wait for it to connect.
|
||||||
async fn advertise<'values, 'server, C: Controller>(
|
async fn advertise<'values, 'server, C: Controller>(
|
||||||
name: &'values str,
|
|
||||||
peripheral: &mut Peripheral<'values, C, DefaultPacketPool>,
|
peripheral: &mut Peripheral<'values, C, DefaultPacketPool>,
|
||||||
server: &'server Server<'values>,
|
server: &'server Server<'values>,
|
||||||
) -> Result<GattConnection<'values, 'server, DefaultPacketPool>, BleHostError<C::Error>> {
|
) -> Result<GattConnection<'values, 'server, DefaultPacketPool>, BleHostError<C::Error>> {
|
||||||
let mut advertiser_data = [0; 35];
|
let mut advertiser_data = [0; 35];
|
||||||
|
let service_uuid = Uuid::from(0xc0b7_0000_d4f4_4000_ada8_f99a_02ee_315c_u128)
|
||||||
|
.as_raw()
|
||||||
|
.try_into()
|
||||||
|
.unwrap();
|
||||||
let len = AdStructure::encode_slice(
|
let len = AdStructure::encode_slice(
|
||||||
&[
|
&[
|
||||||
AdStructure::Flags(LE_GENERAL_DISCOVERABLE | BR_EDR_NOT_SUPPORTED),
|
AdStructure::Flags(LE_GENERAL_DISCOVERABLE | BR_EDR_NOT_SUPPORTED),
|
||||||
AdStructure::CompleteLocalName(name.as_bytes()),
|
AdStructure::ServiceUuids128(&[service_uuid]),
|
||||||
],
|
],
|
||||||
&mut advertiser_data[..],
|
&mut advertiser_data[..],
|
||||||
)?;
|
)?;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue