Como conectar a pena nRF9160 a uma instância de mosquito auto-hospedada

Crie uma nova gota

  • Escolha o FreeBSD 12.1 com UFS.

Crie uma gota do FreeBSD 12.1 com o UFS

  • Escolha a instância de US $ 5. Isso geralmente é mais do que suficiente.

Selecione o nível de gota

  • Certifique-se de importar sua chave pública. Caso contrário, você não poderá usar imediatamente o login sem senha.

Escolha o método de autenticação

  • Bata nesse verde Criar gota e vamos colocar esse programa na estrada.

Botão Criar gota

Para que os certificados funcionem com o Mosquitto, você precisará definir um domínio para apontar para o seu endereço IP do VPS. Um registro CNAME ou A funciona. Se você não souber como fazer isso, Aqui está um bom guia. Observe qual (sub) domínio você usou. Vamos precisar daqui a pouco …

Instale o Mosquitto

Eu corro meus servidores dentro de uma prisão do FreeBSD usando Bastilha. Neste tutorial, ignoraremos a parte da prisão e focaremos no funcionamento do nRF9160 Feather.

  • Você deve estar configurado com uma instância do Digital Ocean (ou similar) usando o FreeBSD. Se você ainda não fez isso, volte para o Onde hospedar? seção.
  • Em seguida, para instalar mosquitto na sua gota, corra pkg install mosquitto. Se você estiver executando algo diferente do FreeBSD, este comando pode ser diferente. apt-get install mosquitto funciona em sistemas baseados no Debian. Se você deseja os repositórios mais atualizados, execute sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa antecipadamente. Aqui está a aparência da saída completa do FreeBSD:

$ pkg install mosquitto
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:12:amd64/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
[mosquitto] Installing pkg-1.14.6...
[mosquitto] Extracting pkg-1.14.6: 100%
Updating FreeBSD repository catalogue...
[mosquitto] Fetching meta.conf: 100%    163 B   0.2kB/s    00:01
[mosquitto] Fetching packagesite.txz: 100%    6 MiB   6.6MB/s    00:01
Processing entries: 100%
FreeBSD repository update completed. 31943 packages processed.
All repositories are up to date.
Updating database digests format: 100%
The following 4 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        c-ares: 1.16.1
        ca_root_nss: 3.55
        e2fsprogs-libuuid: 1.45.6
        mosquitto: 1.6.7

Number of packages to be installed: 4

The process will require 2 MiB more space.
682 KiB to be downloaded.

Proceed with this action? [y/N]: y
[mosquitto] [1/4] Fetching mosquitto-1.6.7.txz: 100%  226 KiB 231.1kB/s    00:01
[mosquitto] [2/4] Fetching ca_root_nss-3.55.txz: 100%  285 KiB 291.5kB/s    00:01
[mosquitto] [3/4] Fetching e2fsprogs-libuuid-1.45.6.txz: 100%   34 KiB  34.7kB/s    00:01
[mosquitto] [4/4] Fetching c-ares-1.16.1.txz: 100%  138 KiB 140.9kB/s    00:01
Checking integrity... done (0 conflicting)
[mosquitto] [1/4] Installing ca_root_nss-3.55...
[mosquitto] [1/4] Extracting ca_root_nss-3.55: 100%
[mosquitto] [2/4] Installing e2fsprogs-libuuid-1.45.6...
[mosquitto] [2/4] Extracting e2fsprogs-libuuid-1.45.6: 100%
[mosquitto] [3/4] Installing c-ares-1.16.1...
[mosquitto] [3/4] Extracting c-ares-1.16.1: 100%
[mosquitto] [4/4] Installing mosquitto-1.6.7...
===> Creating users
Using existing user 'nobody'.
[mosquitto] [4/4] Extracting mosquitto-1.6.7: 100%
=====
Message from ca_root_nss-3.55:

--
FreeBSD does not, and can not warrant that the certification authorities
whose certificates are included in this package have in any way been
audited for trustworthiness or RFC 3647 compliance.

Assessment and verification of trust is the complete responsibility of the
system administrator.

This package installs symlinks to support root certificates discovery by
default for software that uses OpenSSL.

This enables SSL Certificate Verification by client software without manual
intervention.

If you prefer to do this manually, replace the following symlinks with
either an empty file or your site-local certificate bundle.

  * /etc/ssl/cert.pem
  * /usr/local/etc/ssl/cert.pem
  * /usr/local/openssl/cert.pem
=====
Message from mosquitto-1.6.7:

--
The mosquitto MQTT Python driver is now provided by net/py-paho-mqtt

Toda a configuração do pacote instalado vive em /usr/local/etc/mosquitto/. Precisamos editar mosquitto.conf nessa pasta para usar certificados. Aqui está o que parece:

# Daemon configuration
pid_file /var/run/mosquitto.pid
user nobody

# Port to use for the default listener.
port 8885

# At least one of cafile or capath must be defined.
cafile /root/pki/ca.crt

# Path to the PEM encoded server certificate.
certfile /root/pki/issued/mosquitto.crt

# Path to the PEM encoded keyfile.
keyfile /root/pki/private/mosquitto.key

# Path to CRL file
#crlfile /root/pki/crl.pem

# Each client has their own cert
require_certificate true
use_identity_as_username true

# listener port-number [ip address/host name]
listener 1883
protocol mqtt

# listener port-number [ip address/host name]
# listener 8080
# protocol websockets

# =================================================================
# Logging
# =================================================================
log_dest syslog

# Types of messages to log.
log_type all
#log_type warning
# websockets_log_level 127

# -----------------------------------------------------------------
# Default authentication and topic access control
# -----------------------------------------------------------------
# password_file /usr/local/etc/mosquitto/pwfile

Antes de podermos iniciar o servidor, precisamos provisionar alguns certificados RSA. Chegaremos a isso na próxima etapa.

Certs de Provisão

Você pode usar easy-rsa para gerar um servidor CA e certificados de cliente. (Essas instruções vêm de este guia.) Para produção, você deve gerar suas chaves e certificados em uma máquina offline. Dessa forma, suas chaves privadas estarão seguras se o seu servidor se tornar um destino.

Primeiro, instale easy-rsa:

$ pkg install easy-rsa
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        easy-rsa: 3.0.7

Number of packages to be installed: 1

44 KiB to be downloaded.

Proceed with this action? [y/N]: y
[mosquitto] [1/1] Fetching easy-rsa-3.0.7.txz: 100%   44 KiB  44.8kB/s    00:01
Checking integrity... done (0 conflicting)
[mosquitto] [1/1] Installing easy-rsa-3.0.7...
[mosquitto] [1/1] Extracting easy-rsa-3.0.7: 100%

Então vamos começar o processo de criação do certificado:

$ easyrsa init-pki

Note: using Easy-RSA configuration from: /usr/local/share/easy-rsa/vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /root/pki
$
$ easyrsa build-ca

Note: using Easy-RSA configuration from: /usr/local/share/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d-freebsd  10 Sep 2019

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus (2 primes)
......................+++++
..................................................................................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:testserver.jaredwolff.com

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/root/pki/ca.crt

Nota: Você será solicitado a fornecer uma senha no build-ca degrau. Mantenha essa senha à mão.

Para gerar um certificado de servidor, use:

$ easyrsa gen-req mosquitto nopass

Note: using Easy-RSA configuration from: /usr/local/share/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d-freebsd  10 Sep 2019
Generating a RSA private key
...............+++++
........................................+++++
writing new private key to '/root/pki/easy-rsa-82720.X2NVQ0/tmp.akOxhO'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [mosquitto]:testserver.jaredwolff.com

Keypair and certificate request completed. Your files are:
req: /root/pki/reqs/mosquitto.req
key: /root/pki/private/mosquitto.key
$
$ easyrsa sign-req server mosquitto

Note: using Easy-RSA configuration from: /usr/local/share/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d-freebsd  10 Sep 2019

You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:

subject=
    commonName                = testserver.jaredwolff.com

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /root/pki/easy-rsa-82744.hyuGzt/tmp.lZHLEH
Enter pass phrase for /root/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'testserver.jaredwolff.com'
Certificate is to be certified until Nov  3 01:12:53 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /root/pki/issued/mosquitto.crt

Você será solicitado a fornecer o Nome comum (ou seja, o nome do servidor) e a senha do certificado da CA na etapa acima. Importante: a Nome comum precisa corresponder ao nome de domínio do seu servidor! (Lembre-se, escrevemos isso antes?)

Para gerar o certificado nRF9160, use:

$ easyrsa gen-req nrf9160 nopass batch
$ easyrsa sign-req client nrf9160 batch

Siga o mesmo procedimento anterior. A única diferença é que estamos gerando um cliente cert em vez de um servidor cert.

Depois de concluído, precisaremos de alguns arquivos. Aqui está uma lista completa:

Para o seu servidor Mosquitto

  • /root/pki/ca.crt
  • /root/pki/private/mosquitto.key
  • /root/pki/issued/mosquitto.crt

Para a sua pena nRF9160

  • /root/pki/ca.crt
  • /root/pki/private/nrf9160.key
  • /root/pki/issued/nrf9160.crt

Se você estiver usando a configuração acima, ela já está apontando para os certificados do servidor. Tudo o que temos a fazer agora é começar mosquitto!

$ service mosquitto start
Cannot 'start' mosquitto. Set mosquitto_enable to YES in /etc/rc.conf or use 'onestart' instead of 'start'.

Se você receber um erro sobre mosquitto_enable basta executar:

$ sysrc mosquitto_enable=YES
$ service mosquitto start
Starting mosquitto.

Isso permite mosquitto para iniciar quando o sistema iniciar.

Agora, verifique se mosquitto está sendo executado usando ps aux:


$ ps aux
USER     PID %CPU %MEM   VSZ  RSS TT  STAT STARTED    TIME COMMAND
root   82401  0.0  0.2 11472 2424  -  SsJ  01:02   0:00.00 /usr/sbin/syslogd -ss
root   82457  0.0  0.2 11408 2284  -  IsJ  01:02   0:00.00 /usr/sbin/cron -J 60 -s
nobody 82900  0.0  0.6 16352 6212  -  SsJ  01:17   0:00.02 /usr/local/sbin/mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf -d
root   82488  0.0  0.3 12096 2848  0  IJ   01:02   0:00.01 login [pam] (login)
root   82489  0.0  0.3 13092 3504  0  SJ   01:02   0:00.03 -csh (csh)
root   82902  0.0  0.3 11704 2540  0  R+J  01:17   0:00.00 ps aux

Agora que temos um servidor carregado e funcionando, vamos colocar o firmware em funcionamento.

Bits de firmware

Lidar com certificados no nRF9160 Feather é um processo de duas etapas. A primeira etapa é carregar os certificados usando o at_client firmware. O segundo é carregar o mqtt_simple biblioteca com suporte TLS adicional. Vamos abordar os assuntos primeiro.

Programa at_client primeiro

Mude os diretórios para ncs/nrf/samples/nrf9160/at_client/ e inicie uma nova construção:

$ west build -b circuitdojo_feather_nrf9160ns -p

Em seguida, atualize para a sua placa usando:

$ west flash --erase
$ nrfjprog -r

Precisamos desta amostra em seu quadro para a próxima etapa.

Adicionar certificados ao dispositivo

Para instalar nossos novos certificados, precisamos do nRF Connect Desktop instalado. Você pode fazer o download indo aqui.

Você também precisará de uma versão personalizada do Monitor de link LTE. Você pode obter a versão modificada em docs.jaredwolff.com.

Primeiro, instale o aplicativo nRF Connect Desktop. Em seguida, copie o arquivo .tgz do LTE Link Monitor para %USERPROFILE%.nrfconnect-appslocal (no Windows) ou $HOME/.nrfconnect-apps/local (no Linux / macOS). Aqui está um exemplo de onde ele está no Windows:

Feche e abra novamente o nRF Connect Desktop (se estiver aberto).

Então clique Abrir ao lado da versão v1.1.1 do LTE Link Monitor. Também terá local escrito por baixo.

Em seguida, vamos lançá-lo!

Depois de abrir a porta, pressione o botão Redefinir. Certifique-se de desligar Solicitações automáticas.

Em seguida, na caixa de comando, envie AT + CFUN = 4. Isso desligará o modem para que esteja pronto para fazer o upload de certificados. Você pode correr AT + CFUN? para confirmar seu modem nesse modo.

Abra o gerenciador de certificados.

Certifique-se de definir a etiqueta de segurança. Nesse caso, estou usando 1234. Esse é um identificador importante que você precisará mais tarde. Faça o que quiser, mas eu evitaria usar 16842753. Essa é a tag padrão para a NRF Cloud. Você não quer perder seus certificados nRF Cloud!

Copie e cole o conteúdo do seu ca.crt, nrf9160.crt e nrf9160.key nas caixas (nessa ordem). Você pode obter facilmente os certificados usando cat no Unix / Linux:

$ cat cat.crt
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgIUDLkBxLLQO9wosNDtA7E9qvqHOxMwDQYJKoZIhvcNAQEL
BQAwJDEiMCAGA1UEAwwZdGVzdHNlcnZlci5qYXJlZHdvbGZmLmNvbTAeFw0yMDA3
MzEwMTExNDJaFw0zMDA3MjkwMTExNDJaMCQxIjAgBgNVBAMMGXRlc3RzZXJ2ZXIu
amFyZWR3b2xmZi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3
de1v8k+FXzY/Im7Z2YKS7wwbBRft5CUxqP1sdYJgMvheS9LhFufk81URZ0lHD9pK
aNPxU1UEmnLvVDTGLJ+YAmMH08xn17FS1R1UVPYzi2ouwqRM2pR9EStsSlP9Zj44
1MsdizABnnlkZndUVLL/gjc4cNsNncMLBSEbsz6b5WzhtAGg3rOpdAxSSblZVSFw
bquCgg5hb2NUzy+JxGtUIsE5d6CxTDdSs4Z3FK/RRYjmCG6qsaya4N5W35yf8h5O
StfKRecl3kq2kCnWa6P+lErG4wuxIBtMkgz2zV+zd1tz4aHXxSdoZTqLz7dTVbFA
zEVnKD+ZReBG+4fwUL6rAgMBAAGjgZ4wgZswHQYDVR0OBBYEFIvdGnjrxRPzvXQi
7XJ70LzpZSOjMF8GA1UdIwRYMFaAFIvdGnjrxRPzvXQi7XJ70LzpZSOjoSikJjAk
MSIwIAYDVQQDDBl0ZXN0c2VydmVyLmphcmVkd29sZmYuY29tghQMuQHEstA73Ciw
0O0DsT2q+oc7EzAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0B
AQsFAAOCAQEAIzz1nSSDkPueNPlADRYMDOMFNkxoKA+gRXwDVa7y39As7IZp7Fqr
KAH79U1XtGyDlt6FPKTvDJ7jtd4y8auIGVQO7z3AG9pVU1imIWZHoIqgBUCEhsjp
uMxD23kRCX5kd9dsmF9WOGGxb4kkMv83Rh2rCONQmvnozuI3fJv2ZFX/ORoADGLP
OPSJPl11x+2rxPxiLi+T8RyzDh3DwqnPVsSnbRWV7hosaN0ip/cbnSTaIul9mbCY
ID6qm9leqlY/gha9aZfg+tv1Lm6PT6o8Pzek2VeDoIS5YERBMOwV84hQrZjV3vIE
jT6y663HGsl7KvqVaWdV3fM6Cr7f0QdR5A==
-----END CERTIFICATE-----

Você precisará de tudo, desde -----BEGIN CERTIFICATE----- para -----END CERTIFICATE-----

Verifica a Registro área para mais detalhes. Se tudo correu bem, deve-se dizer que seus certificados foram atualizados.

Usando o exemplo mqtt_simple

Nós estaremos usando o mqtt_simple amostra no repositório nRF Connect SDK. O caminho completo é: ncs/nrf/samples/nrf9160/mqtt_simple. Precisamos fazer algumas edições para adicionar compatibilidade TLS completa. Todos os arquivos estão dentro do mqtt_simple diretório.

Primeiro, teremos que atualizar o proj.conf Arquivo. Veja as diferenças destacadas:

o # Set the PDP Context A seção é especialmente importante se você estiver usando um cartão SIM com holograma (incluído com o nRF9160 Feather). Se você estiver usando um SIM que não precisa dele, não precisará desta seção.

Adote seu CONFIG_MQTT_BROKER_HOSTNAME ao seu nome de host (configurado no início deste guia).

Você também precisará adicionar essas linhas em KConfig:

config SEC_TAG
	int "Security tag to use for the connection"
	default 1234

config PEER_VERIFY
	int "Peer verify parameter for mqtt_client"
	default 1
	help
			Set to 0 for VERIFY_NONE, 1 for VERIFY_OPTIONAL, and 2 for VERIFY_REQUIRED.

Finalmente, em main, adicione este bloco ao topo do seu arquivo:

#if defined(CONFIG_MQTT_LIB_TLS)
static sec_tag_t sec_tag_list[] = { CONFIG_SEC_TAG };
#endif /* defined(CONFIG_MQTT_LIB_TLS) */

Em seguida, adicione este bloco a client_init debaixo #if defined(CONFIG_MQTT_LIB_TLS)

  struct mqtt_sec_config *tls_config = &client->transport.tls.config;

	client->transport.type = MQTT_TRANSPORT_SECURE;

	tls_config->peer_verify = CONFIG_PEER_VERIFY;
	tls_config->cipher_count = 0;
	tls_config->cipher_list = NULL;
	tls_config->sec_tag_count = ARRAY_SIZE(sec_tag_list);
	tls_config->sec_tag_list = sec_tag_list;
	tls_config->hostname = CONFIG_MQTT_BROKER_HOSTNAME;

As alterações devem ficar assim:

Então construa com:

$ west build -b circuitdojo_feather_nrf9160ns -p

Por fim, faça o flash usando west flash:

$ west flash --erase
$ nrfjprog -r

Abra o terminal serial e verifique novamente se o nRF9160 Feather está conectado. Você também pode usar o LTE Link Monitor para ver seu progresso também (exemplo abaixo).

Muitas das informações acima vieram de Nórdicopost sobre o assunto.

Enviando uma mensagem

Estamos quase lá! Você configurou o nRF9160 Feather para conectar-se ao Mosquitto usando certificados gerados automaticamente. A última parte está conectando outro dispositivo para verificar se o nRF9160 Feather responde a uma mensagem.

Eu criei um novo conjunto de certificados para esse fim. Eu liguei para eles test.

$ easyrsa gen-req test nopass batch
$ easyrsa sign-req client test batch

Copiei-os para minha área de trabalho usando o CyberDuck (um ótimo cliente SFTP visual):

Você também pode usar algo como scp se você estiver confiante em suas habilidades de transferência de arquivos de linha de comando. Em seguida, abra um terminal e execute:

mosquitto_sub --cafile ca.crt --cert test.crt --key test.key -q 1 -d -h testserver.jaredwolff.com -p 8885 -t "/my/publish/topic" &
mosquitto_pub --cafile ca.crt --cert test.crt --key test.key -q 1 -d -h testserver.jaredwolff.com -p 8885 -t "/my/subscribe/topic" -m "hello there"

Você deve ver uma saída como esta:

$ mosquitto_sub --cafile ca.crt --cert test.crt --key test.key -q 1 -d -h testserver.jaredwolff.com -p 8885 -t "/my/publish/topic" &
$ mosquitto_pub --cafile ca.crt --cert test.crt --key test.key -q 1 -d -h testserver.jaredwolff.com -p 8885 -t "/my/subscribe/topic" -m "hello there"
Client mosq-CczskQKzMKdtTo4O4s sending CONNECT
Client mosq-CczskQKzMKdtTo4O4s received CONNACK (0)
Client mosq-CczskQKzMKdtTo4O4s sending PUBLISH (d0, q1, r0, m1, '/my/subscribe/topic', ... (11 bytes))
Client mosq-CczskQKzMKdtTo4O4s received PUBACK (Mid: 1, RC:0)
Client mosq-CczskQKzMKdtTo4O4s sending DISCONNECT
MacBook-Pro:Downloads jaredwolff$ Client mosq-qK8tMlJk0Qri4Z7jUo sending PINGREQ
Client mosq-qK8tMlJk0Qri4Z7jUo received PINGRESP
MacBook-Pro:Downloads jaredwolff$ Client mosq-qK8tMlJk0Qri4Z7jUo received PUBLISH (d0, q0, r0, m0, '/my/publish/topic', ... (11 bytes))
hello there

Booyah! Você tem uma conexão ativa de trabalho com o seu próprio servidor Mosquitto.

Conclusão

Chegamos ao fim! Neste ponto da publicação, você deve ter um servidor Mosquitto em execução e um nRF9160 conectado. Agora você pode usar suas habilidades recém-encontradas para adicionar mais dispositivos às suas implantações e muito mais.

Se você ainda não teve a chance de jogar com o nRF9160, consulte o nRF9160 Feather. Possui o nRF9160 LTE-M, NB IoT + GPS Combo da Nordic Semiconductor, além de fonte de alimentação flexível, flash externo e desligamento por baixa energia.

Ah, e eu mencionei que é 100% open source? Saiba mais verificando a campanha em Lançamento do GroupGets e Hackster. 🎉

Parte superior da pena nRF9160

Lado inferior da pena nRF9160

Crédito da foto para as pessoas incríveis em GroupGets!

Você pode ler este artigo e muitas outras coisas boas em jaredwolff.com.