diff --git a/api/proto/api/device_profile.proto b/api/proto/api/device_profile.proto index fd555240..dcebe234 100644 --- a/api/proto/api/device_profile.proto +++ b/api/proto/api/device_profile.proto @@ -240,11 +240,15 @@ message DeviceProfile { // from the device (if requested). uint32 class_b_timeout = 16; - // Class-B ping-slots per beacon period. + // Class-B ping-slot periodicity. // Valid options are: 0 - 7. // - // The actual number of ping-slots per beacon period equals to 2^k. - uint32 class_b_ping_slot_nb_k = 17; + // Number of ping-slots per beacon-period: + // pingNb = 2^(7-periodicity) + // + // Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec + // Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec + uint32 class_b_ping_slot_periodicity = 17; // Class-B ping-slot DR. uint32 class_b_ping_slot_dr = 18; diff --git a/api/proto/api/device_profile_template.proto b/api/proto/api/device_profile_template.proto index e12aab7a..f3641c9a 100644 --- a/api/proto/api/device_profile_template.proto +++ b/api/proto/api/device_profile_template.proto @@ -117,11 +117,15 @@ message DeviceProfileTemplate { // This is the maximum time ChirpStack will wait to receive an acknowledgement from the device (if requested). uint32 class_b_timeout = 18; - // Class-B ping-slots per beacon period. + // Class-B ping-slot periodicity (only for Class-B). // Valid options are: 0 - 7. // - // The actual number of ping-slots per beacon period equals to 2^k. - uint32 class_b_ping_slot_nb_k = 19; + // Number of ping-slots per beacon-period: + // pingNb = 2^(7-periodicity) + // + // Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec + // Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec + uint32 class_b_ping_slot_periodicity = 19; // Class-B ping-slot DR. uint32 class_b_ping_slot_dr = 20; diff --git a/api/proto/api/fuota.proto b/api/proto/api/fuota.proto index 4dd28fd9..fe56eb2c 100644 --- a/api/proto/api/fuota.proto +++ b/api/proto/api/fuota.proto @@ -104,7 +104,14 @@ message FuotaDeployment { uint32 multicast_dr = 7; // Multicast ping-slot period (Class-B only). - uint32 multicast_class_b_ping_slot_nb_k = 8; + // Valid options are: 0 - 7. + // + // Number of ping-slots per beacon-period: + // pingNb = 2^(7-periodicity) + // + // Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec + // Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec + uint32 multicast_class_b_ping_slot_periodicity = 8; // Multicast frequency (Hz). uint32 multicast_frequency = 9; diff --git a/api/proto/api/multicast_group.proto b/api/proto/api/multicast_group.proto index a732a2b1..62ae6757 100644 --- a/api/proto/api/multicast_group.proto +++ b/api/proto/api/multicast_group.proto @@ -165,15 +165,15 @@ message MulticastGroup { // Frequency (Hz). uint32 frequency = 11; - // Ping-slot period (only for Class-B). - // Deprecated: use class_b_ping_slot_nb_k. - uint32 class_b_ping_slot_period = 12; - - // Class-B ping-slots per beacon period (only for Class-B). - // Valid options are: 0 - 7; + // Class-B ping-slot periodicity (only for Class-B). + // Valid options are: 0 - 7. // - // The actual number of ping-slots per beacon period equals to 2^k. - uint32 class_b_ping_slot_nb_k = 14; + // Number of ping-slots per beacon-period: + // pingNb = 2^(7-periodicity) + // + // Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec + // Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec + uint32 class_b_ping_slot_periodicity = 14; // Scheduling type (only for Class-C). MulticastGroupSchedulingType class_c_scheduling_type = 13; diff --git a/api/rust/proto/chirpstack/api/device_profile.proto b/api/rust/proto/chirpstack/api/device_profile.proto index fd555240..dcebe234 100644 --- a/api/rust/proto/chirpstack/api/device_profile.proto +++ b/api/rust/proto/chirpstack/api/device_profile.proto @@ -240,11 +240,15 @@ message DeviceProfile { // from the device (if requested). uint32 class_b_timeout = 16; - // Class-B ping-slots per beacon period. + // Class-B ping-slot periodicity. // Valid options are: 0 - 7. // - // The actual number of ping-slots per beacon period equals to 2^k. - uint32 class_b_ping_slot_nb_k = 17; + // Number of ping-slots per beacon-period: + // pingNb = 2^(7-periodicity) + // + // Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec + // Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec + uint32 class_b_ping_slot_periodicity = 17; // Class-B ping-slot DR. uint32 class_b_ping_slot_dr = 18; diff --git a/api/rust/proto/chirpstack/api/device_profile_template.proto b/api/rust/proto/chirpstack/api/device_profile_template.proto index e12aab7a..f3641c9a 100644 --- a/api/rust/proto/chirpstack/api/device_profile_template.proto +++ b/api/rust/proto/chirpstack/api/device_profile_template.proto @@ -117,11 +117,15 @@ message DeviceProfileTemplate { // This is the maximum time ChirpStack will wait to receive an acknowledgement from the device (if requested). uint32 class_b_timeout = 18; - // Class-B ping-slots per beacon period. + // Class-B ping-slot periodicity (only for Class-B). // Valid options are: 0 - 7. // - // The actual number of ping-slots per beacon period equals to 2^k. - uint32 class_b_ping_slot_nb_k = 19; + // Number of ping-slots per beacon-period: + // pingNb = 2^(7-periodicity) + // + // Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec + // Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec + uint32 class_b_ping_slot_periodicity = 19; // Class-B ping-slot DR. uint32 class_b_ping_slot_dr = 20; diff --git a/api/rust/proto/chirpstack/api/fuota.proto b/api/rust/proto/chirpstack/api/fuota.proto index 4dd28fd9..fe56eb2c 100644 --- a/api/rust/proto/chirpstack/api/fuota.proto +++ b/api/rust/proto/chirpstack/api/fuota.proto @@ -104,7 +104,14 @@ message FuotaDeployment { uint32 multicast_dr = 7; // Multicast ping-slot period (Class-B only). - uint32 multicast_class_b_ping_slot_nb_k = 8; + // Valid options are: 0 - 7. + // + // Number of ping-slots per beacon-period: + // pingNb = 2^(7-periodicity) + // + // Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec + // Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec + uint32 multicast_class_b_ping_slot_periodicity = 8; // Multicast frequency (Hz). uint32 multicast_frequency = 9; diff --git a/api/rust/proto/chirpstack/api/multicast_group.proto b/api/rust/proto/chirpstack/api/multicast_group.proto index a732a2b1..62ae6757 100644 --- a/api/rust/proto/chirpstack/api/multicast_group.proto +++ b/api/rust/proto/chirpstack/api/multicast_group.proto @@ -165,15 +165,15 @@ message MulticastGroup { // Frequency (Hz). uint32 frequency = 11; - // Ping-slot period (only for Class-B). - // Deprecated: use class_b_ping_slot_nb_k. - uint32 class_b_ping_slot_period = 12; - - // Class-B ping-slots per beacon period (only for Class-B). - // Valid options are: 0 - 7; + // Class-B ping-slot periodicity (only for Class-B). + // Valid options are: 0 - 7. // - // The actual number of ping-slots per beacon period equals to 2^k. - uint32 class_b_ping_slot_nb_k = 14; + // Number of ping-slots per beacon-period: + // pingNb = 2^(7-periodicity) + // + // Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec + // Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec + uint32 class_b_ping_slot_periodicity = 14; // Scheduling type (only for Class-C). MulticastGroupSchedulingType class_c_scheduling_type = 13; diff --git a/chirpstack/migrations_postgres/2025-06-05-100843_align_class_b_ping_slot_naming/down.sql b/chirpstack/migrations_postgres/2025-06-05-100843_align_class_b_ping_slot_naming/down.sql new file mode 100644 index 00000000..63b5eec1 --- /dev/null +++ b/chirpstack/migrations_postgres/2025-06-05-100843_align_class_b_ping_slot_naming/down.sql @@ -0,0 +1,8 @@ +alter table fuota_deployment + rename column multicast_class_b_ping_slot_periodicity to multicast_class_b_ping_slot_nb_k; + +alter table multicast_group + rename column class_b_ping_slot_periodicity to class_b_ping_slot_nb_k; + +alter table device_profile_template + rename column class_b_ping_slot_periodicity to class_b_ping_slot_nb_k; diff --git a/chirpstack/migrations_postgres/2025-06-05-100843_align_class_b_ping_slot_naming/up.sql b/chirpstack/migrations_postgres/2025-06-05-100843_align_class_b_ping_slot_naming/up.sql new file mode 100644 index 00000000..c82d39df --- /dev/null +++ b/chirpstack/migrations_postgres/2025-06-05-100843_align_class_b_ping_slot_naming/up.sql @@ -0,0 +1,8 @@ +alter table device_profile_template + rename column class_b_ping_slot_nb_k to class_b_ping_slot_periodicity; + +alter table multicast_group + rename column class_b_ping_slot_nb_k to class_b_ping_slot_periodicity; + +alter table fuota_deployment + rename column multicast_class_b_ping_slot_nb_k to multicast_class_b_ping_slot_periodicity; diff --git a/chirpstack/migrations_sqlite/2025-06-05-110620_align_class_b_ping_slot_naming/down.sql b/chirpstack/migrations_sqlite/2025-06-05-110620_align_class_b_ping_slot_naming/down.sql new file mode 100644 index 00000000..63b5eec1 --- /dev/null +++ b/chirpstack/migrations_sqlite/2025-06-05-110620_align_class_b_ping_slot_naming/down.sql @@ -0,0 +1,8 @@ +alter table fuota_deployment + rename column multicast_class_b_ping_slot_periodicity to multicast_class_b_ping_slot_nb_k; + +alter table multicast_group + rename column class_b_ping_slot_periodicity to class_b_ping_slot_nb_k; + +alter table device_profile_template + rename column class_b_ping_slot_periodicity to class_b_ping_slot_nb_k; diff --git a/chirpstack/migrations_sqlite/2025-06-05-110620_align_class_b_ping_slot_naming/up.sql b/chirpstack/migrations_sqlite/2025-06-05-110620_align_class_b_ping_slot_naming/up.sql new file mode 100644 index 00000000..c82d39df --- /dev/null +++ b/chirpstack/migrations_sqlite/2025-06-05-110620_align_class_b_ping_slot_naming/up.sql @@ -0,0 +1,8 @@ +alter table device_profile_template + rename column class_b_ping_slot_nb_k to class_b_ping_slot_periodicity; + +alter table multicast_group + rename column class_b_ping_slot_nb_k to class_b_ping_slot_periodicity; + +alter table fuota_deployment + rename column multicast_class_b_ping_slot_nb_k to multicast_class_b_ping_slot_periodicity; diff --git a/chirpstack/src/api/device_profile.rs b/chirpstack/src/api/device_profile.rs index ede887e2..86699476 100644 --- a/chirpstack/src/api/device_profile.rs +++ b/chirpstack/src/api/device_profile.rs @@ -94,7 +94,7 @@ impl DeviceProfileService for DeviceProfile { class_b_params: if req_dp.supports_class_b { Some(fields::ClassBParams { timeout: req_dp.class_b_timeout as u16, - ping_slot_nb_k: req_dp.class_b_ping_slot_nb_k as u8, + ping_slot_periodicity: req_dp.class_b_ping_slot_periodicity as u8, ping_slot_dr: req_dp.class_b_ping_slot_dr as u8, ping_slot_freq: req_dp.class_b_ping_slot_freq, }) @@ -205,7 +205,7 @@ impl DeviceProfileService for DeviceProfile { supports_class_b: dp.supports_class_b, supports_class_c: dp.supports_class_c, class_b_timeout: class_b_params.timeout as u32, - class_b_ping_slot_nb_k: class_b_params.ping_slot_nb_k as u32, + class_b_ping_slot_periodicity: class_b_params.ping_slot_periodicity as u32, class_b_ping_slot_dr: class_b_params.ping_slot_dr as u32, class_b_ping_slot_freq: class_b_params.ping_slot_freq as u32, class_c_timeout: class_c_params.timeout as u32, @@ -350,7 +350,7 @@ impl DeviceProfileService for DeviceProfile { class_b_params: if req_dp.supports_class_b { Some(fields::ClassBParams { timeout: req_dp.class_b_timeout as u16, - ping_slot_nb_k: req_dp.class_b_ping_slot_nb_k as u8, + ping_slot_periodicity: req_dp.class_b_ping_slot_periodicity as u8, ping_slot_dr: req_dp.class_b_ping_slot_dr as u8, ping_slot_freq: req_dp.class_b_ping_slot_freq, }) diff --git a/chirpstack/src/api/device_profile_template.rs b/chirpstack/src/api/device_profile_template.rs index 33e4f122..0f82e37b 100644 --- a/chirpstack/src/api/device_profile_template.rs +++ b/chirpstack/src/api/device_profile_template.rs @@ -60,7 +60,7 @@ impl DeviceProfileTemplateService for DeviceProfileTemplate { supports_class_b: req_dp.supports_class_b, supports_class_c: req_dp.supports_class_c, class_b_timeout: req_dp.class_b_timeout as i32, - class_b_ping_slot_nb_k: req_dp.class_b_ping_slot_nb_k as i32, + class_b_ping_slot_periodicity: req_dp.class_b_ping_slot_periodicity as i32, class_b_ping_slot_dr: req_dp.class_b_ping_slot_dr as i16, class_b_ping_slot_freq: req_dp.class_b_ping_slot_freq as i64, class_c_timeout: req_dp.class_c_timeout as i32, @@ -132,7 +132,7 @@ impl DeviceProfileTemplateService for DeviceProfileTemplate { supports_class_b: dp.supports_class_b, supports_class_c: dp.supports_class_c, class_b_timeout: dp.class_b_timeout as u32, - class_b_ping_slot_nb_k: dp.class_b_ping_slot_nb_k as u32, + class_b_ping_slot_periodicity: dp.class_b_ping_slot_periodicity as u32, class_b_ping_slot_dr: dp.class_b_ping_slot_dr as u32, class_b_ping_slot_freq: dp.class_b_ping_slot_freq as u32, class_c_timeout: dp.class_c_timeout as u32, @@ -201,7 +201,7 @@ impl DeviceProfileTemplateService for DeviceProfileTemplate { supports_class_b: req_dp.supports_class_b, supports_class_c: req_dp.supports_class_c, class_b_timeout: req_dp.class_b_timeout as i32, - class_b_ping_slot_nb_k: req_dp.class_b_ping_slot_nb_k as i32, + class_b_ping_slot_periodicity: req_dp.class_b_ping_slot_periodicity as i32, class_b_ping_slot_dr: req_dp.class_b_ping_slot_dr as i16, class_b_ping_slot_freq: req_dp.class_b_ping_slot_freq as i64, class_c_timeout: req_dp.class_c_timeout as i32, diff --git a/chirpstack/src/api/fuota.rs b/chirpstack/src/api/fuota.rs index 344004d1..531acb6f 100644 --- a/chirpstack/src/api/fuota.rs +++ b/chirpstack/src/api/fuota.rs @@ -63,7 +63,8 @@ impl FuotaService for Fuota { .multicast_class_c_scheduling_type() .from_proto(), multicast_dr: req_dp.multicast_dr as i16, - multicast_class_b_ping_slot_nb_k: req_dp.multicast_class_b_ping_slot_nb_k as i16, + multicast_class_b_ping_slot_periodicity: req_dp.multicast_class_b_ping_slot_periodicity + as i16, multicast_frequency: req_dp.multicast_frequency as i64, multicast_timeout: req_dp.multicast_timeout as i16, unicast_max_retry_count: req_dp.unicast_max_retry_count as i16, @@ -138,7 +139,8 @@ impl FuotaService for Fuota { .to_proto() .into(), multicast_dr: dp.multicast_dr as u32, - multicast_class_b_ping_slot_nb_k: dp.multicast_class_b_ping_slot_nb_k as u32, + multicast_class_b_ping_slot_periodicity: dp.multicast_class_b_ping_slot_periodicity + as u32, multicast_frequency: dp.multicast_frequency as u32, multicast_timeout: dp.multicast_timeout as u32, unicast_max_retry_count: dp.unicast_max_retry_count as u32, @@ -217,7 +219,8 @@ impl FuotaService for Fuota { .multicast_class_c_scheduling_type() .from_proto(), multicast_dr: req_dp.multicast_dr as i16, - multicast_class_b_ping_slot_nb_k: req_dp.multicast_class_b_ping_slot_nb_k as i16, + multicast_class_b_ping_slot_periodicity: req_dp.multicast_class_b_ping_slot_periodicity + as i16, multicast_frequency: req_dp.multicast_frequency as i64, multicast_timeout: req_dp.multicast_timeout as i16, unicast_max_retry_count: req_dp.unicast_max_retry_count as i16, diff --git a/chirpstack/src/api/multicast.rs b/chirpstack/src/api/multicast.rs index 7f760ef8..1eae2a10 100644 --- a/chirpstack/src/api/multicast.rs +++ b/chirpstack/src/api/multicast.rs @@ -61,14 +61,7 @@ impl MulticastGroupService for MulticastGroup { .to_string(), dr: req_mg.dr as i16, frequency: req_mg.frequency as i64, - class_b_ping_slot_nb_k: if req_mg.class_b_ping_slot_period != 0 { - // For backwards compatibility. - (req_mg.class_b_ping_slot_period / 32) - .checked_ilog2() - .unwrap_or_default() - } else { - req_mg.class_b_ping_slot_nb_k - } as i16, + class_b_ping_slot_periodicity: req_mg.class_b_ping_slot_periodicity as i16, class_c_scheduling_type: req_mg.class_c_scheduling_type().from_proto(), ..Default::default() }; @@ -121,8 +114,7 @@ impl MulticastGroupService for MulticastGroup { .into(), dr: mg.dr as u32, frequency: mg.frequency as u32, - class_b_ping_slot_period: (1 << (mg.class_b_ping_slot_nb_k as u32)) * 32, - class_b_ping_slot_nb_k: mg.class_b_ping_slot_nb_k as u32, + class_b_ping_slot_periodicity: mg.class_b_ping_slot_periodicity as u32, class_c_scheduling_type: mg.class_c_scheduling_type.to_proto().into(), }), created_at: Some(helpers::datetime_to_prost_timestamp(&mg.created_at)), @@ -168,14 +160,7 @@ impl MulticastGroupService for MulticastGroup { .to_string(), dr: req_mg.dr as i16, frequency: req_mg.frequency as i64, - class_b_ping_slot_nb_k: if req_mg.class_b_ping_slot_period != 0 { - // For backwards compatibility. - (req_mg.class_b_ping_slot_period / 32) - .checked_ilog2() - .unwrap_or_default() - } else { - req_mg.class_b_ping_slot_nb_k - } as i16, + class_b_ping_slot_periodicity: req_mg.class_b_ping_slot_periodicity as i16, class_c_scheduling_type: req_mg.class_c_scheduling_type().from_proto(), ..Default::default() }) @@ -606,7 +591,7 @@ pub mod test { group_type: api::MulticastGroupType::ClassC.into(), dr: 3, frequency: 868300000, - class_b_ping_slot_nb_k: 1, + class_b_ping_slot_periodicity: 1, class_c_scheduling_type: api::MulticastGroupSchedulingType::GpsTime.into(), ..Default::default() }), @@ -636,8 +621,7 @@ pub mod test { group_type: api::MulticastGroupType::ClassC.into(), dr: 3, frequency: 868300000, - class_b_ping_slot_nb_k: 1, - class_b_ping_slot_period: 64, + class_b_ping_slot_periodicity: 1, class_c_scheduling_type: api::MulticastGroupSchedulingType::GpsTime.into(), }), get_resp.get_ref().multicast_group @@ -659,8 +643,7 @@ pub mod test { group_type: api::MulticastGroupType::ClassB.into(), dr: 2, frequency: 868200000, - class_b_ping_slot_nb_k: 2, - class_b_ping_slot_period: 0, + class_b_ping_slot_periodicity: 2, class_c_scheduling_type: api::MulticastGroupSchedulingType::Delay.into(), }), }, @@ -688,8 +671,7 @@ pub mod test { group_type: api::MulticastGroupType::ClassB.into(), dr: 2, frequency: 868200000, - class_b_ping_slot_nb_k: 2, - class_b_ping_slot_period: 128, + class_b_ping_slot_periodicity: 2, class_c_scheduling_type: api::MulticastGroupSchedulingType::Delay.into(), }), get_resp.get_ref().multicast_group diff --git a/chirpstack/src/applayer/fuota/flow.rs b/chirpstack/src/applayer/fuota/flow.rs index d3b8f15b..3c550853 100644 --- a/chirpstack/src/applayer/fuota/flow.rs +++ b/chirpstack/src/applayer/fuota/flow.rs @@ -149,7 +149,9 @@ impl Flow { group_type: self.fuota_deployment.multicast_group_type.clone(), frequency: self.fuota_deployment.multicast_frequency, dr: self.fuota_deployment.multicast_dr, - class_b_ping_slot_nb_k: self.fuota_deployment.multicast_class_b_ping_slot_nb_k, + class_b_ping_slot_periodicity: self + .fuota_deployment + .multicast_class_b_ping_slot_periodicity, class_c_scheduling_type: self.fuota_deployment.multicast_class_c_scheduling_type, ..Default::default() }) @@ -577,7 +579,7 @@ impl Flow { time_out_periodicity: multicastsetup::v1::McClassBSessionReqPayloadTimeOutPeriodicity { time_out: self.fuota_deployment.multicast_timeout as u8, - periodicity: self.fuota_deployment.multicast_class_b_ping_slot_nb_k + periodicity: self.fuota_deployment.multicast_class_b_ping_slot_periodicity as u8, }, dl_frequ: self.fuota_deployment.multicast_frequency as u32, @@ -619,7 +621,7 @@ impl Flow { time_out_periodicity: multicastsetup::v2::McClassBSessionReqPayloadTimeOutPeriodicity { time_out: self.fuota_deployment.multicast_timeout as u8, - periodicity: self.fuota_deployment.multicast_class_b_ping_slot_nb_k + periodicity: self.fuota_deployment.multicast_class_b_ping_slot_periodicity as u8, }, dl_frequ: self.fuota_deployment.multicast_frequency as u32, diff --git a/chirpstack/src/cmd/import_legacy_lorawan_devices_repository.rs b/chirpstack/src/cmd/import_legacy_lorawan_devices_repository.rs index d0da5be6..f189c6e5 100644 --- a/chirpstack/src/cmd/import_legacy_lorawan_devices_repository.rs +++ b/chirpstack/src/cmd/import_legacy_lorawan_devices_repository.rs @@ -265,7 +265,7 @@ async fn import_device( supports_class_b: prof.supports_class_b, supports_class_c: prof.supports_class_c, class_b_timeout: prof.class_b_timeout as i32, - class_b_ping_slot_nb_k: match prof.ping_slot_period { + class_b_ping_slot_periodicity: match prof.ping_slot_period { 128 => 7, 64 => 6, 32 => 5, diff --git a/chirpstack/src/cmd/import_lorawan_device_profiles.rs b/chirpstack/src/cmd/import_lorawan_device_profiles.rs index 1590acb6..08947665 100644 --- a/chirpstack/src/cmd/import_lorawan_device_profiles.rs +++ b/chirpstack/src/cmd/import_lorawan_device_profiles.rs @@ -94,7 +94,7 @@ pub struct ProfileAbp { #[derive(Default, Deserialize)] pub struct ProfileClassB { pub timeout_secs: usize, - pub ping_slot_nb_k: usize, + pub ping_slot_periodicity: usize, pub ping_slot_dr: usize, pub ping_slot_freq: usize, } @@ -239,7 +239,7 @@ async fn handle_profile( supports_class_b: profile_conf.profile.supports_class_b, supports_class_c: profile_conf.profile.supports_class_c, class_b_timeout: profile_conf.profile.class_b.timeout_secs as i32, - class_b_ping_slot_nb_k: profile_conf.profile.class_b.ping_slot_nb_k as i32, + class_b_ping_slot_periodicity: profile_conf.profile.class_b.ping_slot_periodicity as i32, class_b_ping_slot_dr: profile_conf.profile.class_b.ping_slot_dr as i16, class_b_ping_slot_freq: profile_conf.profile.class_b.ping_slot_freq as i64, class_c_timeout: profile_conf.profile.class_c.timeout_secs as i32, diff --git a/chirpstack/src/maccommand/reset.rs b/chirpstack/src/maccommand/reset.rs index c1548cdc..6ff4ff81 100644 --- a/chirpstack/src/maccommand/reset.rs +++ b/chirpstack/src/maccommand/reset.rs @@ -80,7 +80,7 @@ pub mod test { class_b_params: Some(fields::ClassBParams { ping_slot_dr: 2, ping_slot_freq: 868100000, - ping_slot_nb_k: 1, + ping_slot_periodicity: 6, timeout: 0, }), ..Default::default() diff --git a/chirpstack/src/storage/device_profile.rs b/chirpstack/src/storage/device_profile.rs index aae8ce4a..58bfa3b0 100644 --- a/chirpstack/src/storage/device_profile.rs +++ b/chirpstack/src/storage/device_profile.rs @@ -110,7 +110,7 @@ impl DeviceProfile { if let Some(class_b_params) = &self.class_b_params { ds.class_b_ping_slot_dr = class_b_params.ping_slot_dr as u32; ds.class_b_ping_slot_freq = class_b_params.ping_slot_freq; - ds.class_b_ping_slot_nb = 1 << class_b_params.ping_slot_nb_k as u32; + ds.class_b_ping_slot_nb = 1 << (7 - class_b_params.ping_slot_periodicity) as u32; } if let Some(relay_params) = &self.relay_params { diff --git a/chirpstack/src/storage/device_profile_template.rs b/chirpstack/src/storage/device_profile_template.rs index 6d082137..da9aed1a 100644 --- a/chirpstack/src/storage/device_profile_template.rs +++ b/chirpstack/src/storage/device_profile_template.rs @@ -37,7 +37,7 @@ pub struct DeviceProfileTemplate { pub supports_class_b: bool, pub supports_class_c: bool, pub class_b_timeout: i32, - pub class_b_ping_slot_nb_k: i32, + pub class_b_ping_slot_periodicity: i32, pub class_b_ping_slot_dr: i16, pub class_b_ping_slot_freq: i64, pub class_c_timeout: i32, @@ -100,7 +100,7 @@ impl Default for DeviceProfileTemplate { supports_class_b: false, supports_class_c: false, class_b_timeout: 0, - class_b_ping_slot_nb_k: 0, + class_b_ping_slot_periodicity: 0, class_b_ping_slot_dr: 0, class_b_ping_slot_freq: 0, class_c_timeout: 0, @@ -169,7 +169,8 @@ pub async fn upsert(dp: DeviceProfileTemplate) -> Result Result for AbpParams { #[cfg_attr(feature = "sqlite", diesel(sql_type = Text))] pub struct ClassBParams { pub timeout: u16, - pub ping_slot_nb_k: u8, + #[serde(alias = "ping_slot_nb_k")] + pub ping_slot_periodicity: u8, pub ping_slot_dr: u8, pub ping_slot_freq: u32, } diff --git a/chirpstack/src/storage/fuota.rs b/chirpstack/src/storage/fuota.rs index 7d619853..bcefba03 100644 --- a/chirpstack/src/storage/fuota.rs +++ b/chirpstack/src/storage/fuota.rs @@ -33,7 +33,7 @@ pub struct FuotaDeployment { pub multicast_group_type: String, pub multicast_class_c_scheduling_type: fields::MulticastGroupSchedulingType, pub multicast_dr: i16, - pub multicast_class_b_ping_slot_nb_k: i16, + pub multicast_class_b_ping_slot_periodicity: i16, pub multicast_frequency: i64, pub multicast_timeout: i16, pub multicast_session_start: Option>, @@ -68,7 +68,7 @@ impl Default for FuotaDeployment { multicast_group_type: "".into(), multicast_class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY, multicast_dr: 0, - multicast_class_b_ping_slot_nb_k: 0, + multicast_class_b_ping_slot_periodicity: 0, multicast_frequency: 0, multicast_timeout: 0, multicast_session_start: None, @@ -222,8 +222,8 @@ pub async fn update_deployment(d: FuotaDeployment) -> Result Result { match d.multicast_group_type.as_ref() { "B" => { // Calculate number of ping-slots per beacon period. - let nb_ping_slots = 1 << (d.multicast_class_b_ping_slot_nb_k as usize); + let nb_ping_slots = 1 << (7 - d.multicast_class_b_ping_slot_periodicity as usize); // Calculate number of beacon-periods needed. // One beacon period is added as the first ping-slot might be in the next beacon-period. @@ -1221,7 +1221,7 @@ mod test { name: "Class-B - 1 / beacon period - 15 fragments".into(), deployment: FuotaDeployment { multicast_group_type: "B".into(), - multicast_class_b_ping_slot_nb_k: 0, + multicast_class_b_ping_slot_periodicity: 7, fragmentation_fragment_size: 10, fragmentation_redundancy_percentage: 50, payload: vec![0; 100], @@ -1234,7 +1234,7 @@ mod test { name: "Class-B - 1 / beacon period - 16 fragments".into(), deployment: FuotaDeployment { multicast_group_type: "B".into(), - multicast_class_b_ping_slot_nb_k: 0, + multicast_class_b_ping_slot_periodicity: 7, fragmentation_fragment_size: 10, fragmentation_redundancy_percentage: 60, payload: vec![0; 100], @@ -1247,7 +1247,7 @@ mod test { name: "Class-B - 16 / beacon period - 16 fragments".into(), deployment: FuotaDeployment { multicast_group_type: "B".into(), - multicast_class_b_ping_slot_nb_k: 4, + multicast_class_b_ping_slot_periodicity: 3, fragmentation_fragment_size: 10, fragmentation_redundancy_percentage: 60, payload: vec![0; 100], @@ -1260,7 +1260,7 @@ mod test { name: "Class-B - 16 / beacon period - 17 fragments".into(), deployment: FuotaDeployment { multicast_group_type: "B".into(), - multicast_class_b_ping_slot_nb_k: 4, + multicast_class_b_ping_slot_periodicity: 3, fragmentation_fragment_size: 10, fragmentation_redundancy_percentage: 70, payload: vec![0; 100], diff --git a/chirpstack/src/storage/gateway.rs b/chirpstack/src/storage/gateway.rs index 38636381..1a0acc1b 100644 --- a/chirpstack/src/storage/gateway.rs +++ b/chirpstack/src/storage/gateway.rs @@ -619,7 +619,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_nb_k: 1, + class_b_ping_slot_periodicity: 1, ..Default::default() }) .await diff --git a/chirpstack/src/storage/multicast.rs b/chirpstack/src/storage/multicast.rs index 75d68673..3ce56446 100644 --- a/chirpstack/src/storage/multicast.rs +++ b/chirpstack/src/storage/multicast.rs @@ -33,7 +33,7 @@ pub struct MulticastGroup { pub group_type: String, pub dr: i16, pub frequency: i64, - pub class_b_ping_slot_nb_k: i16, + pub class_b_ping_slot_periodicity: i16, pub class_c_scheduling_type: fields::MulticastGroupSchedulingType, } @@ -64,7 +64,7 @@ impl Default for MulticastGroup { group_type: "".into(), dr: 0, frequency: 0, - class_b_ping_slot_nb_k: 0, + class_b_ping_slot_periodicity: 0, class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY, } } @@ -167,7 +167,7 @@ pub async fn update(mg: MulticastGroup) -> Result { multicast_group::group_type.eq(&mg.group_type), multicast_group::dr.eq(&mg.dr), multicast_group::frequency.eq(&mg.frequency), - multicast_group::class_b_ping_slot_nb_k.eq(&mg.class_b_ping_slot_nb_k), + multicast_group::class_b_ping_slot_periodicity.eq(&mg.class_b_ping_slot_periodicity), multicast_group::class_c_scheduling_type.eq(&mg.class_c_scheduling_type), )) .get_result(&mut get_async_db_conn().await?) @@ -429,7 +429,7 @@ pub async fn enqueue( match mg.group_type.as_ref() { "B" => { // get ping nb - let ping_nb = 1 << mg.class_b_ping_slot_nb_k as usize; + let ping_nb = 1 << (7 - mg.class_b_ping_slot_periodicity) as usize; // get max. gps epoch time. let res: Option = @@ -746,7 +746,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_nb_k: 1, + class_b_ping_slot_periodicity: 1, ..Default::default() }) .await @@ -759,7 +759,7 @@ pub mod test { // update mg.name = "test-mg-updated".into(); mg.group_type = "B".into(); - mg.class_b_ping_slot_nb_k = 4; + mg.class_b_ping_slot_periodicity = 4; mg = update(mg).await.unwrap(); let mg_get = get(&mg.id.into()).await.unwrap(); assert_eq!(mg, mg_get); @@ -884,7 +884,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_nb_k: 1, + class_b_ping_slot_periodicity: 1, ..Default::default() }) .await @@ -942,7 +942,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_nb_k: 1, + class_b_ping_slot_periodicity: 1, ..Default::default() }) .await @@ -1002,7 +1002,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_nb_k: 1, + class_b_ping_slot_periodicity: 1, class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY, ..Default::default() }) diff --git a/chirpstack/src/storage/schema_postgres.rs b/chirpstack/src/storage/schema_postgres.rs index f605e5d0..e08de34d 100644 --- a/chirpstack/src/storage/schema_postgres.rs +++ b/chirpstack/src/storage/schema_postgres.rs @@ -153,7 +153,7 @@ diesel::table! { supports_class_b -> Bool, supports_class_c -> Bool, class_b_timeout -> Int4, - class_b_ping_slot_nb_k -> Int4, + class_b_ping_slot_periodicity -> Int4, class_b_ping_slot_dr -> Int2, class_b_ping_slot_freq -> Int8, class_c_timeout -> Int4, @@ -201,7 +201,7 @@ diesel::table! { #[max_length = 20] multicast_class_c_scheduling_type -> Varchar, multicast_dr -> Int2, - multicast_class_b_ping_slot_nb_k -> Int2, + multicast_class_b_ping_slot_periodicity -> Int2, multicast_frequency -> Int8, multicast_timeout -> Int2, multicast_session_start -> Nullable, @@ -295,7 +295,7 @@ diesel::table! { group_type -> Bpchar, dr -> Int2, frequency -> Int8, - class_b_ping_slot_nb_k -> Int2, + class_b_ping_slot_periodicity -> Int2, #[max_length = 20] class_c_scheduling_type -> Varchar, } diff --git a/chirpstack/src/storage/schema_sqlite.rs b/chirpstack/src/storage/schema_sqlite.rs index 2022b714..017cf772 100644 --- a/chirpstack/src/storage/schema_sqlite.rs +++ b/chirpstack/src/storage/schema_sqlite.rs @@ -133,7 +133,7 @@ diesel::table! { supports_class_b -> Bool, supports_class_c -> Bool, class_b_timeout -> Integer, - class_b_ping_slot_nb_k -> Integer, + class_b_ping_slot_periodicity -> Integer, class_b_ping_slot_dr -> SmallInt, class_b_ping_slot_freq -> BigInt, class_c_timeout -> Integer, @@ -178,7 +178,7 @@ diesel::table! { multicast_group_type -> Text, multicast_class_c_scheduling_type -> Text, multicast_dr -> SmallInt, - multicast_class_b_ping_slot_nb_k -> SmallInt, + multicast_class_b_ping_slot_periodicity -> SmallInt, multicast_frequency -> BigInt, multicast_timeout -> SmallInt, multicast_session_start -> Nullable, @@ -266,7 +266,7 @@ diesel::table! { group_type -> Text, dr -> SmallInt, frequency -> BigInt, - class_b_ping_slot_nb_k -> SmallInt, + class_b_ping_slot_periodicity -> SmallInt, class_c_scheduling_type -> Text, } } diff --git a/chirpstack/src/test/multicast_test.rs b/chirpstack/src/test/multicast_test.rs index 60593400..e52679a0 100644 --- a/chirpstack/src/test/multicast_test.rs +++ b/chirpstack/src/test/multicast_test.rs @@ -86,7 +86,7 @@ async fn test_multicast() { group_type: "C".into(), dr: 3, frequency: 868300000, - class_b_ping_slot_nb_k: 0, + class_b_ping_slot_periodicity: 0, ..Default::default() }) .await diff --git a/ui/src/views/device-profile-templates/DeviceProfileTemplateForm.tsx b/ui/src/views/device-profile-templates/DeviceProfileTemplateForm.tsx index 32a8e3e7..001af110 100644 --- a/ui/src/views/device-profile-templates/DeviceProfileTemplateForm.tsx +++ b/ui/src/views/device-profile-templates/DeviceProfileTemplateForm.tsx @@ -70,7 +70,7 @@ function DeviceProfileTemplateForm(props: IProps) { // class-b dp.setSupportsClassB(v.supportsClassB); dp.setClassBTimeout(v.classBTimeout); - dp.setClassBPingSlotNbK(v.classBPingSlotNbK); + dp.setClassBPingSlotPeriodicity(v.classBPingSlotPeriodicity); dp.setClassBPingSlotDr(v.classBPingSlotDr); dp.setClassBPingSlotFreq(v.classBPingSlotFreq); @@ -351,7 +351,7 @@ function DeviceProfileTemplateForm(props: IProps) { - + Every second Every 2 seconds