Resumo:
O formulário add device (adicionado em #573) atualmente não está compondo campos com base em restrições (exceto para seleção ABP / OTAA). Por exemplo, ele pode ocultar os campos que são relevantes apenas para Versões LoRaWAN específicas ou renomear campos de acordo (por exemplo NwkSKey
vs. FNwkSIntKey
).
Por que nós precisamos disso?
Para melhor UX, evite entradas defeituosas
O que já existe?
O formulário add device, com campos condicionais baseados em OTAA/ABP
O que está faltando?
Verificações e restrições mais sofisticadas aplicadas ao formulário, evitando entradas defeituosas
Meio Ambiente:
Console no navegador
Como você se propõe a implementar isso?
É provável que se conecte a eventos de alteração de campo e componha campos de acordo
Você pode fazer isso sozinho e enviar um Pull Request?
sim.
O principal problema com a implementação atual da forma do dispositivo é que tudo está acoplado. Isso faz com que
Proponho implementar o formulário do dispositivo como o formulário de várias etapas. Isso pode ser algo assim:
Essa abordagem aborda todas as questões mencionadas acima:
Join EUI
para App EUI
para a versão lorawan 1.0.x
.Os dispositivos de edição podem ser implementados como uma pilha de acordeões:
Onde cada acordeão se expande com uma forma autônoma.
Além do formulário do dispositivo, podemos usar o assistente para o formulário de inscrição também para:
cc @kschiffer @johanstokking @htdvisser
Parece bom para mim, especialmente se pudermos agrupar campos para componentes em uma etapa. Dessa forma, podemos simplesmente pular/desabilitar etapas quando um componente não estiver disponível.
Referenciando https://github.com/TheThingsNetwork/lorawan-stack/issues/1234 também; mesmo que JS esteja disponível, o usuário pode pular os campos JS.
Eu vim com esse diagrama:
Cada nó é um passo
Parece complicado, mas a implementação atual tem um espaço de estado ainda maior em relação à validação/submissão/geração de máscara de campo/etc.
Considere o diagrama como uma proposta inicial para iniciar a discussão.
Acho que isso é um bom começo.
E algumas pequenas coisas:
DevEUI
não é proibido para dispositivos ABP (pode ser definido opcionalmente)NwkKey
, apenas AppKey
FNwkSIntKey
chama-se NwkSKey
(para o usuário)NwkKey
ou AppKey
Sim, ótimo começo.
- Talvez o fluxo fosse melhor se o Join Server viesse primeiro.
Eu concordo com isto. Se o modo de ativação for OTAA e o cluster JS estiver ativado, na página JS os usuários terão a opção de inserir chaves raiz e armazená-las no cluster JS. (se eles desabilitarem isso, o NS usa a pesquisa JS, assim como quando não há JS no cluster habilitado)
multicast bool
e supports_join bool
. Existem 3 opções possíveis, pois multicast && supports_join
não é válido.frequency_plan
-> frequency_plan_id
resets_f_cnt
é opcional, false
por padrão.
FNwkSIntKey
deve ser apresentado como NwkKey
apenas para <1.1
FNwkSIntKey
está faltando nas configurações ABP NS para >= 1.1multicast
só precisam AppSKey
- o NS não precisa de nenhuma chave para que os dispositivos multicast
funcionem, apenas AS@htdvisser
Talvez o fluxo fosse melhor se o Join Server viesse primeiro.
Por quê?
Uma coisa importante que ainda não fizemos nenhum progresso é o pré-preenchimento de campos de modelos de dispositivos no repositório de dispositivos #263. Acho que isso poderia realmente simplificar o processo para implantações de produção.
Para mim, parece fora do escopo desta questão
Um DevEUI não é proibido para dispositivos ABP (pode ser definido opcionalmente)
Queremos configurá-lo para dispositivos ABP também? Eu diria que quanto menos campos tivermos, melhor. No entanto, é necessário que possamos adicioná-lo.
FNwkSIntKey é chamado NwkSKey (para o usuário)
Portanto, o rótulo deve ser NwkSKey
para 1.0.xe 1.1.x ? Aqui está o que temos atm no console:
- Os dispositivos LoRaWAN 1.0.x não possuem uma NwkKey, apenas uma AppKey
- O servidor de aplicativos não obtém a NwkKey ou AppKey
Corrigido 👌
@johanstokking
Se o modo de ativação for OTAA e o cluster JS estiver ativado, na página JS os usuários terão a opção de inserir chaves raiz e armazená-las no cluster JS. (se eles desabilitarem isso, o NS usa a pesquisa JS, assim como quando não há JS no cluster habilitado).
Então, isso é apenas uma questão de permitir que os usuários ignorem a etapa de envio do servidor de ingresso? Nenhum pedido para js?
Em relação a https://github.com/TheThingsNetwork/lorawan-stack/issues/1134 , você também poderia especificar onde esses campos pertencem no diagrama?
@rvolosatovs
Modo de ativação" está em carga útil - em seu diagrama corresponde a 2 campos na verdade - multicast bool e support_join bool. Existem 3 opções possíveis, pois multicast && support_join não é válido.
Só para esclarecer:
supports_join=true
- OTAAsupports_join=false
- ABPmulticast=true && **no** supports_join
- multicastresets_f_cnt é opcional, false por padrão.
Eu acho que ainda é bom mostrá-lo aos usuários. Deve permitir que os usuários o configurem para dispositivos multicast?
FNwkSIntKey deve ser apresentado como NwkKey apenas para <1.1
Você quer dizer NwkSKey
?
plano_frequência -> plano_frequência_id
FNwkSIntKey está ausente nas configurações de ABP NS para >= 1.1
Corrigido 👌
Diagrama atualizado:
@htdvisser
Talvez o fluxo fosse melhor se o Join Server viesse primeiro.
Por quê?
Sim, estou voltando sobre isso; Acho que faz mais sentido inserir versões MAC antes de inserir chaves. Então estou apoiando o fluxo atual. Se a versão MAC for inserida (quando o NS estiver habilitado), não precisamos pedir NwkKey
já que é 1.1.x.
Uma coisa importante que ainda não fizemos nenhum progresso é o pré-preenchimento de campos de modelos de dispositivos no repositório de dispositivos #263. Acho que isso poderia realmente simplificar o processo para implantações de produção.
Para mim, parece fora do escopo desta questão
Está fora do escopo mesmo.
Um DevEUI não é proibido para dispositivos ABP (pode ser definido opcionalmente)
Queremos configurá-lo para dispositivos ABP também? Eu diria que quanto menos campos tivermos, melhor. No entanto, é necessário que possamos adicioná-lo.
Sim, queremos pedir opcionalmente. Quanto mais informações de identificação tivermos sobre os dispositivos finais, melhor. Também é necessário em roaming passivo com estado. A razão pela qual não forçamos os usuários a inserir o DevEUI é porque, se não houver DevEUI, não queremos que os usuários insiram valores falsos.
FNwkSIntKey é chamado NwkSKey (para o usuário)
Portanto, o rótulo deve ser
NwkSKey
para 1.0.xe 1.1.x ? Aqui está o que temos atm no console:
É NwkSKey
para 1.0.xe FNwkSIntKey
para 1.1.x.
Se o modo de ativação for OTAA e o cluster JS estiver ativado, na página JS os usuários terão a opção de inserir chaves raiz e armazená-las no cluster JS. (se eles desabilitarem isso, o NS usa a pesquisa JS, assim como quando não há JS no cluster habilitado).
Então, isso é apenas uma questão de permitir que os usuários ignorem a etapa de envio do servidor de ingresso? Nenhum pedido para js?
De fato.
Um exemplo é um dispositivo com modem da Semtech que utiliza o Semtech Join Server. Só precisamos conhecer EUIs nesse caso.
Em relação ao nº 1134, você também poderia especificar onde esses campos pertencem no diagrama?
Eles pertencem à etapa JS; esses campos para ir JS, se o JS estiver habilitado no cluster e se o usuário quiser provisionar os dispositivos no JS.
Esses campos são opcionais.
Só para esclarecer:
supports_join=true
- OTAAsupports_join=false
- ABPmulticast=true && **no** supports_join
- multicast
Isso está correto?
Estritamente:
supports_join
!supports_join && !multicast
multicast
Inválido é supports_join && multicast
, mas isso é (ou deveria ser) validado em NS.
resets_f_cnt é opcional, false por padrão.
Eu acho que ainda é bom mostrá-lo aos usuários. Deve permitir que os usuários o configurem para dispositivos multicast?
Não, isso não é para multicast. resets_f_cnt
refere-se a uplink, mas não há uplink em multicast.
FNwkSIntKey deve ser apresentado como NwkKey apenas para <1.1
Você quer dizer
NwkSKey
?
Deve ser NwkSKey
fato.
@bafonins , veja a resposta de @johanstokking .
Em relação a multicast
- o endereço do dispositivo também é necessário
DevEUI
a dispositivos abp/multicastDevice Address
a dispositivos multicastEndereço do dispositivo ainda ausente nas configurações do servidor de rede do dispositivo multicast
Endereço do dispositivo ainda ausente nas configurações do servidor de rede do dispositivo multicast
Atualizado 👌
Multicast pode ser 1.0.xe 1.1.x. A inserção das informações da sessão ( DevAddr
e chaves) é a mesma para multicast e ABP.
Também resets_join_nonces
pode ser definido em JS com 1.1.x
A divisão da criação do dispositivo é definitivamente necessária e uma boa maneira de aproximar o fluxo e a implementação dos requisitos do back-end, reduzindo a complexidade para o usuário.
Alguns pensamentos e desafios que vejo:
Complexidade desnecessária no js sdk para criação/atualização/exclusão em lote, bem como lógica de reversão de criação
Acho que a funcionalidade do SDK para dividir e mesclar solicitações de dispositivos ainda é bastante valiosa, mesmo que não a usemos nesse caso
@johanstokking para dispositivos multicast NS só precisa de SNwkSIntKey
em 1.1 para cálculo de MIC. FNwkSIntKey
e NwkSEncKey
, na verdade, não devem ter permissão para definir IMO.
- Devemos adicionar funcionalidade para abortar todo o fluxo, resultando na exclusão de quaisquer entradas de registro que já tenham sido criadas.
- Da mesma forma, ir para a etapa anterior precisa colocar o formulário em "modo de atualização" (deve ser relativamente fácil, pois os endpoints são os mesmos, exceto o IS)
Eu não acho que deveríamos estar criando nada antes de clicar em Finish ou algo assim. Ir e voltar no assistente e fechar a janela do navegador não deve resultar em dispositivos semi-criados.
- Um problema que vejo é que a etapa do Application Server é muito superficial (isso provavelmente mudará mais tarde?)
Adicionaremos a configuração para os pacotes de aplicativos aqui (ou seja, configuração multicast remota, transferência de blocos de dados fragmentados, opções de modem Semtech, etc). Então, sim, é superficial agora, mas será estendido.
- Uma solução pode ser mesclar a etapa AS e JS, já que ambas são bastante diretas e não interdependentes. Eu percebo que isso vai contra a separação por componente, mas acho que isso simplificaria todo o fluxo com uma abstração razoável. Especialmente porque não comunicamos nenhuma conexão com os respectivos componentes da pilha nas etapas.
Para o nosso futuro eu recomendaria mantê-los separados. Além disso, combiná-los torna a renderização dessas páginas condicionada à disponibilidade do componente, o que adiciona complexidade a um fluxo já complexo.
Dependendo da configuração da pilha, podemos acabar com um assistente que tem apenas uma ou duas etapas, que é um antipadrão para assistentes.
- Para o caso de apenas uma etapa, podemos simplesmente ocultar/remover o aspecto do assistente
- Para dois passos, acho que temos que conviver com o problema 🤷♂
Deve-se considerar que a solução do assistente aumentará bastante o _time-to-complete_ para a história do usuário
- Isso pode se tornar um problema em situações em que muitos dispositivos precisam ser criados manualmente, embora apresentemos recursos de criação em lote para este caso de uso e a CLI/script também possa ajudar nessas situações
- Ainda assim, considere a diferença com a criação do dispositivo do console V2 e como os usuários podem perceber essa mudança
A separação de componentes e os cenários de implantação flexíveis são uma das principais mudanças em comparação com a V2, portanto, faz todo o sentido que isso seja efetivo no Console V3.
De fato, para criar grandes quantidades de dispositivos, as pessoas devem usar APIs e CLI de qualquer maneira.
Não existe cenário com um passo, são sempre pelo menos dois passos.
Que tal renderizar guias em vez de páginas? Dessa forma, ainda é uma página, mas as coisas são facilmente acessíveis sem ir e voltar em etapas.
@johanstokking
Eu não acho que deveríamos estar criando nada antes de clicar em Finish ou algo assim.
Se fizermos a solicitação real apenas na última etapa, isso significa que faríamos 3-4 solicitações. Como lidamos com erros retornados por diferentes componentes? Lidando com isso, navegando o usuário para a etapa/redefinição de armazenamento com erro/etc. é complexo. É por isso que sugiro enviar valores em todas as etapas, pois todas as etapas sucessivas podem contar com valores enviados como válidos.
Ir e voltar no assistente e fechar a janela do navegador não deve resultar em dispositivos semi-criados.
Sou contra permitir que os usuários editem dados no assistente (para as etapas que resultam no envio). Mb, apenas campos opcionais que são armazenados em um único componente (e nenhum outro componente precisa deles), digamos name
, description
. Caso contrário, lidar com isso se torna bastante complicado.
@kschiffer
Dependendo da configuração da pilha, podemos acabar com um assistente que tem apenas uma ou duas etapas, que é um antipadrão para assistentes.
Bem, estamos abertos a soluções alternativas. Alguma proposição?
Se fizermos a solicitação real apenas na última etapa, isso significa que faríamos 3-4 solicitações. Como lidamos com erros retornados por diferentes componentes? Lidando com isso, navegando o usuário para a etapa/redefinição de armazenamento com erro/etc. é complexo. É por isso que sugiro enviar valores em todas as etapas, pois todas as etapas sucessivas podem contar com valores enviados como válidos.
OK. Tudo bem, desde que o Console possa lidar com dispositivos que estão em ER, mas não podem ser encontrados em JS/NS/AS porque essa etapa falhou ou o usuário fechou a guia ou algo assim.
Sou contra permitir que os usuários editem dados no assistente (para as etapas que resultam no envio). Mb, apenas campos opcionais que são armazenados em um único componente (e nenhum outro componente precisa deles), digamos
name
,description
. Caso contrário, lidar com isso se torna bastante complicado.
O que você quer dizer?
Observe que o AS, por exemplo, não precisa de nenhum campo, apenas precisa que o dispositivo exista. Portanto, se o AS estiver lá, mesmo que o usuário não insira nenhum valor para AS, ele ainda deve criar um dispositivo (vazio) no AS.
O que você quer dizer?
Desculpe. Isso foi para a sugestão do @kschiffer :
Da mesma forma, ir para a etapa anterior precisa colocar o formulário em "modo de atualização" (deve ser relativamente fácil, pois os endpoints são os mesmos, exceto o IS)
Ir e voltar no assistente e fechar a janela do navegador não deve resultar em dispositivos semi-criados.
Eu consideraria isso como uma melhoria futura. Por enquanto, podemos apenas mostrar uma notificação ao usuário sobre o fluxo incompleto. Posteriormente, o usuário pode editar/excluir o dispositivo na página de configurações gerais.
Bem, estamos abertos a soluções alternativas. Alguma proposição?
Bem, eu acho que dada a _edge-casiness_ desta situação em particular, está tudo bem viver com este problema. Sua redação sugere que eu não deveria expressar preocupações sem soluções propostas, mas gosto de dar aos outros a oportunidade de apresentar algumas se não conseguir encontrar imediatamente nenhuma.
Sou contra permitir que os usuários editem dados no assistente (para as etapas que resultam no envio). Mb, apenas campos opcionais que são armazenados em um único componente (e nenhum outro componente precisa deles), digamos
name
,description
. Caso contrário, lidar com isso se torna bastante complicado.
Isso romperia novamente com as práticas recomendadas para o padrão de assistente. Os usuários provavelmente desejarão revisar ou simplesmente inspecionar campos anteriores, especialmente porque eles são interdependentes. Concordo em não incluir essa funcionalidade inicialmente, mas ela deve ser adicionada eventualmente (como em: monitorado em um problema).
Caso contrário, lidar com isso se torna bastante complicado.
De um modo geral, a necessidade de implementar uma lógica de frontend complexa não deve afetar nosso compromisso com o UX.
Eu consideraria isso como uma melhoria futura. Por enquanto, podemos apenas mostrar uma notificação ao usuário sobre o fluxo incompleto. Posteriormente, o usuário pode editar/excluir o dispositivo na página de configurações gerais.
Não é o ideal, mas é aceitável para mim, desde que melhoremos isso eventualmente.
Conforme discutido offline, aqui está a proposta inicial;
ids
name
description
attributes
lorawan_version
lorawan_phy_version
Configurações LoRaWAN
lorawan_version
(obrigatório)lorawan_phy_version
(obrigatório)supports_join
definido se o modo de ativação for OTAA (obrigatório)multicast
definido se o modo de ativação for multicastsupports_class_b
supports_class_c
frequency_plan_id
(obrigatório)mac_settings.supports_32_bit_f_cnt
mac_settings.factory_preset_frequencies
mac_settings.ping_slot_data_rate_index.value
mac_settings.ping_slot_frequency
mac_settings.ping_slot_periodicity.value
mac_settings.rx2_data_rate_index.value
min_frequency
max_frequency
session.dev_addr
session.keys.session_key_id
session.keys.f_nwk_s_int_key.key
- obrigatóriosession.keys.s_nwk_s_int_key.key
(se LW >= 1.1.0) - obrigatóriosession.keys.nwk_s_enc_key.key
(se LW >= 1.1.0) - obrigatóriosession.keys.app_s_key.key
- obrigatóriosession.last_conf_f_cnt_down
session.last_n_f_cnt_down
mac_settings.resets_f_cnt
session.last_f_cnt_up
- isso é necessário para segurançaSe NS no cluster: Campos se o modo de ativação for ABP ou OTAA
mac_settings.adr_margin
mac_settings.class_b_timeout
mac_settings.class_c_timeout
mac_settings.desired_adr_ack_delay_exponent.value
mac_settings.desired_adr_ack_limit_exponent.value
mac_settings.desired_max_duty_cycle.value
mac_settings.desired_rx1_data_rate_offset
mac_settings.desired_rx1_delay.value
mac_settings.desired_rx2_data_rate_index.value
mac_settings.desired_rx2_frequency
mac_settings.max_duty_cycle.value
mac_settings.rx1_data_rate_offset
mac_settings.rx1_delay.value
mac_settings.status_count_periodicity
mac_settings.status_time_periodicity
mac_settings.supports_32_bit_f_cnt
mac_settings.use_adr
Isso configura o dispositivo em NS e AS (se estiver em cluster). Se tivermos um dispositivo OTAA, não temos nada para definir no AS neste momento, mas eu ainda pediria consistência
payload_formatters
root_keys.root_key_id
root_keys.app_key.key
root_keys.nwk_key.key
(se LW >= 1.1.0)resets_join_nonces
home_net_id
network_server_kek_label
application_server_kek_label
application_server_id
Aqui, eu usaria uma abordagem com guias, basicamente com etapas do assistente como guias.
A chave aqui é isso;
ids
, supports_join
, multicast
são somente leiturasupports_join
!supports_join && !multicast
!supports_join && multicast
(embora multicast
deva ser suficiente)Alguns casos de uso para suporte na atualização de dispositivos:
lorawan_version
e lorawan_phy_version
(isso altera as restrições)root_keys != nil
), mas não estão expostas ( root_keys.app_key == null
etc). O usuário deve ser capaz de deixar as chaves raiz intactasAcho que https://github.com/TheThingsNetwork/lorawan-stack/issues/579#issuecomment -525719408 já contém tudo o que é necessário para o NS.
Acho que todos os mac_settings
devem estar disponíveis para serem configurados para todos os dispositivos não multicast.
Para dispositivos multicast, apenas o seguinte faz sentido:
Talvez algumas coisas para esclarecer
Crio:
supports_class_b
?Atualizar:
true
ou redefinir o estado do dispositivo no NSCoisas gerais:
Se estamos falando de campos de nível superior:
https://github.com/TheThingsNetwork/lorawan-stack/blob/375c82cc068bbadb72b887e25631f8f2dc03a366/api/end_device.proto#L395 -L418 este pedaço inteiro pertence ao NS (mas nem todos são necessários)
m{in,ax}_frequency
não se aplica a multicast
@rvolosatovs
Acho que #579 (comentário) já contém tudo o que é necessário para NS.
Acho que todos os
mac_settings
devem estar disponíveis para serem configurados para todos os dispositivos não multicast.
Para dispositivos multicast, apenas o seguinte faz sentido:
Um dos problemas com essa questão é a quantidade de informações escondidas nos comentários.
Você pode adicionar _exatamente_ os campos nos lugares certos? Tudo bem se você copiar toda a minha lista de marcadores, então trabalhamos gradualmente nisso até que tenhamos uma versão final.
@htdvisser
- Configurações Gerais
uma. Quando criamos o dispositivo no ER, não definimos os endereços NS/AS/JS. Atualizamos o registro de ER quando o dispositivo é definido neles? E se estivermos usando um JS externo?
Acho que devemos atualizar os endereços quando definirmos os dispositivos em AS/NS/JS.
b. Armazenamos o modo de ativação no ER?
Não, não temos campo para isso no momento, não precisamos muito e isso cria espaço para inconsistências.
c. Armazenamos as versões phy/mac no ER?
Não, consulte a documentação da API. Novamente, não vejo necessidade e isso cria espaço para inconsistências.
uma. Que tal
supports_class_b
?
Sim, acho que devemos adicionar isso, pendente #19. @rvolosatovs inclua isso em uma versão atualizada, se relevante.
- Configurações do aplicativo
uma. Sim, isso pode significar que configuramos o dispositivo no AS duas vezes
Sim, isso não dói
Atualizar:
- Modo de ativação: seria muito mais fácil se armazenássemos isso no ER
Sim, mas não tenho certeza se devemos ir para a facilidade e se isso se aplica totalmente. Precisamos tê-lo disponível no caminho quente.
Além disso, só seria fácil se pudéssemos começar do zero. No entanto, precisamos ser compatíveis com versões anteriores, adicionando heurística quando lorawan_version
não estiver em ER, introduzindo obtenções condicionais de NS etc.
- Nós apenas olhamos para os endereços 404 ou também para os endereços NS/AS/JS no ER?
Só podemos obter um 404 se houver um endereço definido, caso contrário, não há nada para obter. Devemos interpretar ambos como "não nesse registro". Não podemos errar aqui (como fizemos antes), exatamente pelo motivo de que a criação em IS e AS/NS/JS não acontece ao mesmo tempo, e os usuários devem conseguir recuperar inconsistências criadas pelo Console.
- Acho que seria bom poder excluir um registro NS/AS/JS individual, por exemplo, ao alterar "JS externo" para
true
ou redefinir o estado do dispositivo no NS
Sim, vamos fazer isso mais tarde
- _"JS externo é onde o JS não está no mesmo cluster que o NS"_: Acho que isso deveria ser algo como "join_server_address não é o mesmo que o endereço JS na configuração do console"
Sim, essa é realmente a maneira de verificar isso. join_server_address
também pode estar vazio, usando interoperabilidade.
@bafonins você ainda tem a fonte do gráfico?
Já que muito trabalho foi feito para construir isso, acho que devemos apenas atualizá-lo para torná-lo completo para ter uma representação clara?
Também podemos trabalhar na atualização da parte NS offline para não atrapalhar a discussão aqui.
Atualizei o gráfico com todos os campos NS possíveis
Os campos em vermelho são obrigatórios
@rvolosatovs , nosso objetivo é definir o fluxo e os campos que estamos apresentando no Console ao criar e atualizar dispositivos.
Como tal,
mac_state.lorawan_version
mac_state.ping_slot_periodicity
através do CLI por enquantosupports_class_b
, supports_class_c
e mac_state.device_class
; que faz parte do create, que faz parte do update, como um se relaciona com o outro?0
)mac_settings
e mac_state.desired_parameters
; @htdvisser você pode pensar junto aqui?Alterei a ordem em https://github.com/TheThingsNetwork/lorawan-stack/issues/579#issuecomment -553347858. Por favor, trabalhe de forma incremental nessa lista.
Você pode adicionar exatamente os campos nos lugares certos?
Eu respondi a esta pergunta - ou seja, apresentei todos os campos, que podem ser configurados e devem ser configurados no NS. Ou pelo menos foi assim que entendi sua pergunta.
Em relação ao que deve estar no console, tudo mac_state
provavelmente só deve ser configurável através do CLI, no entanto, podemos exigir isso para dispositivos ABP/multicast e/ou dispositivos OTAA, que estão sendo registrados com uma sessão existente e, daí o estado MAC.
Vou atualizar seu comentário.
Não devemos mudar contadores individuais; um botão "redefinir contadores de quadros" faria (que afaik pode ser uma ação separada, como temos no console V2, que é definir os contadores para 0)
Precisamos ser capazes de definir contadores de quadros de downlink para ABP e multicast - caso contrário, o NS não poderá enviar downlinks
Para contadores de quadros de uplink também são muito úteis do ponto de vista de segurança para ABP
Atualizar dispositivo
Aqui, eu usaria uma abordagem com guias, basicamente com etapas do assistente como guias.
Vamos usar a abordagem de acordeão aqui, conforme apresentado no primeiro comentário de @bafonins :
Isso nos dará menos problemas com o espaço horizontal e permite distinguir modos com os botões Edit
/ Create
.
@rvolosatovs
Precisamos ser capazes de definir contadores de quadros de downlink para ABP e multicast - caso contrário, o NS não poderá enviar downlinks
Para contadores de quadros de uplink também são muito úteis do ponto de vista de segurança para ABP
Se isso é simples, podemos fazê-lo. Na verdade, duas/três caixas de entrada podem ser mais simples do que um botão de reset que aciona uma ação específica.
Em relação ao que deve estar no console, tudo
mac_state
provavelmente só deve ser configurável através do CLI, no entanto, podemos exigir isso para dispositivos ABP/multicast e/ou dispositivos OTAA, que estão sendo registrados com uma sessão existente e, daí o estado MAC.
Eu entendo. Acho que devemos separar "dispositivos ABP novos e redefinidos" de "dispositivos ABP existentes que já estiveram em uma rede".
O primeiro deve estar completo, então deve incluir alguns mac_state
(ou seja, frequências de redefinição de fábrica, atraso RX1, configurações RX2, etc.), mas não mac_state.desired_parameters
.
O último deve ser feito via migração e podemos adicionar as configurações de ajuste fino posteriormente no Console; por enquanto CLI deve ser usado.
Obrigado por atualizar
Configurações LoRaWAN
- Se NS no cluster: Campos
mac_settings.factory_preset_frequencies
mac_settings.ping_slot_data_rate_index.value
mac_settings.ping_slot_frequency
mac_settings.ping_slot_periodicity.value
mac_settings.rx2_data_rate_index.value
Estes são necessários para OTAA? Isso não é apenas para ABP e Multicast?
@johanstokking
Configurações LoRaWAN
- Se NS no cluster: Campos
mac_settings.factory_preset_frequencies
mac_settings.ping_slot_data_rate_index.value
mac_settings.ping_slot_frequency
mac_settings.ping_slot_periodicity.value
mac_settings.rx2_data_rate_index.value
Estes são necessários para OTAA? Isso não é apenas para ABP e Multicast?
Todas as configurações de MAC são opcionais por design.
O único caso em que estes são "obrigatórios" são os dispositivos multicast de classe B, devido às especificidades da operação de classe B.
Além disso, é provável que factory_preset_frequencies
seja necessário para o ABP para obter melhores resultados, mas nada impede que o dispositivo OTAA tenha esse conjunto.
Todas as configurações de MAC são opcionais por design.
O único caso em que estes são "obrigatórios" são os dispositivos multicast de classe B, devido às especificidades da operação de classe B.
OK
Além disso, é provável que
factory_preset_frequencies
seja necessário para o ABP para obter melhores resultados, mas nada impede que o dispositivo OTAA tenha esse conjunto.
É ineficaz para OTAA; as frequências de junção padrão são exigidas por especificação, e os canais entram por meio de comandos join-accept e MAC. Não deve haver configuração fora de banda de frequências predefinidas para dispositivos OTAA.
@bafonins você pode dar uma atualização de status e linha do tempo sobre este problema?
Para app_s_key
e skip_payload_crypto
, aqui está;
skip_payload_crypto
do dispositivo final. Se true
, AS não executa criptografia e descriptografia de carga útilskip_payload_crypto
no nível do aplicativo (via Link, como formatadores de carga útil), que tem precedência sobre a configuração do dispositivo finalapp_s_key
no AS, mas pode ser encapsulado, ou seja, session.keys.app_s_key.key
não está definido (mas encrypted_key
e kek_label
estão definidos)app_s_key
criptografado como está para os clientesskip_payload_crypto
estiver definido true
(no dispositivo final ou no link do aplicativo), não se preocupe com app_s_key
: desative-o, não se importe