astarte-platform / astarte-device-sdk-elixir Goto Github PK
View Code? Open in Web Editor NEWAstarte Elixir Device SDK
License: Apache License 2.0
Astarte Elixir Device SDK
License: Apache License 2.0
It should suffice to add {:depth, 10}
here.
10 is the default that OpenSSL uses and it should avoid errors for common cases (Erlang's default of 1 is too restrictive for our usecase).
The device should be able to handle incoming object aggregated interfaces
The current API is clunky, it was designed when we had less Elixir experience and it shows. Probably the best way to provide an handler is just to pass a fun (or some number of funs), with optional extra arguments.
That should cover all usecases, and it will provide maximum flexibility since it will make no assumptions about the handler being a GenServer that needs to be started.
We can also provide an option that determines if the handler is called in a separate task (default) so that it doesn't block the MQTT connection process or it's executed synchronously (pro: it can "deny" the ack of a message by crashing).
wait_for_connection
is blocking as the request uses the default :infinity
timeout.
Allowing for finite timeouts will increase the flexibility of device-sdk.
This depends on astarte-platform/astarte-client-elixir#24 since it currently doesn't support come APIs which are needed here
Tortoise development to have come to an halt (temporary or not). Tortoise311 was forked from it and it's actively developed. We should start using that for the SDK.
The InterfaceProvider
passed to Device.start_link
is used to initialize the interfaces to a known state, but from there it should be possible to allow adding/removing interfaces dynamically to the Device (that should resend its introspection everytime one of these changes happen).
Since we accept a great deal of options in Device.start_link/1
, it could be beneficial to use NimbleOptions to both validate and document them
Example of crash log:
17:31:54.454 [error] GenStateMachine {Astarte.Device.Registry, {"rbinotest", "AfjOYrR4QiKCjrJ1QzEF-A"}} terminating
** (MatchError) no match of right hand side value: {:error, :unknown_connection}
(astarte_device 1.0.0-dev) lib/astarte_device.ex:459: Astarte.Device.connected/3
(stdlib 3.11) gen_statem.erl:1159: :gen_statem.loop_state_callback/11
(stdlib 3.11) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
State: {:connected, %Astarte.Device.Data{broker_url: "mqtts://localhost:8883/", client_id: "rbinotest/AfjOYrR4QiKCjrJ1QzEF-A", credential_storage_mod: Astarte.Device.InMemoryStorage, credential_storage_state: %{certificate: "-----BEGIN CERTIFICATE-----\nMIID0zCCA3igAwIBAgIUEVXeppdjm6v2YyqMIL0RWBTA274wCgYIKoZIzj0EAwIw\ndDELMAkGA1UEBhMCSVQxDTALBgNVBAgTBE5vbmUxDjAMBgNVBAcTBU1pbGFuMRUw\nEwYDVQQKEwxBc3RhcnRlIFVzZXIxFTATBgNVBAsTDElvVCBEaXZpc2lvbjEYMBYG\nA1UEAxMPQXN0YXJ0ZSBSb290IENBMB4XDTIwMDUyNTE1MjcwMFoXDTIwMDgyNDIx\nMjcwMFowKzEpMCcGA1UEAxMgcmJpbm90ZXN0L0Fmak9ZclI0UWlLQ2pySjFRekVG\nLUEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDAUY7xJctVp7XN/TH/\nppJYvpHhV+ZW2Ijpu8nUI6jHvxu8aBV0jEGpeLJwMwBwTUpCLb2YrR4H9VGz3VXb\nqqS9/2lQ1qMjzUweKEOAjm8iNqovMWxjuVWLy36uf2w/hQ95/ZGlYDGh/GAj6lkL\ne9x6mJgMpBHbUHcuMBPuZ4dhtRU9vGApm8WOdL4hs9MEp/vTjtvr85vYCipOxMPp\nMIJMEeETcFelpIaVyMh0CqT5sGNWhghN+9gHZc/+1ROg8vIekbY4PHo9Zh5FZOk0\nFxPexQTZCB6QLaOi+nnUeiPmmy/wpGl5IKPz+uIy+VjH3IYpmElVPUuGWzZLpiuH\naYyaYTYIX7O2jrAcAREdz+jAdos7tt936Doe6o/yVyIaSAl1eoKMVdMAn8sv/0BO\nbYCKrKxjyrpWt3bFd9C4sFns9XAkdHv+4l6ba7ZgpHfBrgYwFH9hSV1Sttz9splJ\nZnbDN4BK7SQ5lkFwrvs5gzZgNiTIMeLSzK/TFG1u8ICs0ZGMLJ8Bgis7t3tspVdC\nmteWn1TiiZgaLDGfGjvK4pnA6GniWyE5P8FsbSx3qsAqUzGEvgYZcMnQYPY9IEQP\n7d9LMZVEACdCCta8sZZgpuR1n0hdOHZXBV3XlNs6T//m/5zgIPQZl2miY0YDzebH\n3PclN/UsE+3WVVR1Suf6l6BrcQIDAQABo2YwZDAOBgNVHQ8BAf8EBAMCAYYwEgYD\nVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUzCTNhc42wA/ex2EuNvZH0PxDH54w\nHwYDVR0jBBgwFoAU8lvXyVo7OWmjrrRSz3skxmP0t/0wCgYIKoZIzj0EAwIDSQAw\nRgIhALcW/pwbP25CKUhChlN8VcXWIQDL66FxdsNzJzy/2JCvAiEA65+MkNwp3Zdv\npWyVBf0UYGhbVUFTHnQKno0Z57rSn0c=\n-----END CERTIFICATE-----\n", csr: "-----BEGIN CERTIFICATE REQUEST-----\nMIIEcDCCAlgCAQAwKzEpMCcGA1UEAwwgcmJpbm90ZXN0L0Fmak9ZclI0UWlLQ2py\nSjFRekVGLUEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDAUY7xJctV\np7XN/TH/ppJYvpHhV+ZW2Ijpu8nUI6jHvxu8aBV0jEGpeLJwMwBwTUpCLb2YrR4H\n9VGz3VXbqqS9/2lQ1qMjzUweKEOAjm8iNqovMWxjuVWLy36uf2w/hQ95/ZGlYDGh\n/GAj6lkLe9x6mJgMpBHbUHcuMBPuZ4dhtRU9vGApm8WOdL4hs9MEp/vTjtvr85vY\nCipOxMPpMIJMEeETcFelpIaVyMh0CqT5sGNWhghN+9gHZc/+1ROg8vIekbY4PHo9\nZh5FZOk0FxPexQTZCB6QLaOi+nnUeiPmmy/wpGl5IKPz+uIy+VjH3IYpmElVPUuG\nWzZLpiuHaYyaYTYIX7O2jrAcAREdz+jAdos7tt936Doe6o/yVyIaSAl1eoKMVdMA\nn8sv/0BObYCKrKxjyrpWt3bFd9C4sFns9XAkdHv+4l6ba7ZgpHfBrgYwFH9hSV1S\nttz9splJZnbDN4BK7SQ5lkFwrvs5gzZgNiTIMeLSzK/TFG1u8ICs0ZGMLJ8Bgis7\nt3tspVdCmteWn1TiiZgaLDGfGjvK4pnA6GniWyE5P8FsbSx3qsAqUzGEvgYZcMnQ\nYPY9IEQP7d9LMZVEACdCCta8sZZgpuR1n0hdOHZXBV3XlNs6T//m/5zgIPQZl2mi\nY0YDzebH3PclN/UsE+3WVVR1Suf6l6BrcQIDAQABoAAwDQYJKoZIhvcNAQELBQAD\nggIBAB6+CKtg9um5/h1qqpC+wRYU7ud9opTuD0h36XSQFlAcCFGe4b4gtkTAp9Nl\ndEEutskuJgSOoWG+y1d0uYyJvLfeRy6J+XqVOFf+7zOcd3FQrONo4+r3FUjEcuT7\nFuTA0XvVKQ76CKoaamNS25QopeVojnOa7ncL05JJbP2Mc6eVCVr5+LYbrL7DVuva\nkZnffAyPMr4SdQ4/OOM5EU4/kCMJgpZHnTTL0xa27Uwh2KlDgh9kRpjjKpYNSlma\ngvhgeVYCEvyNHxNSZe8fYUlyMrX41L3nerbDVNrBrMWuH9UJEeqVHR93FP6b8cBk\nsSxQh6yg1dgibdw9D0cPdmrC7S86FEqu/mZHl1xSxD7sjp9MhOTDt/ajlmDwzU2M\n8ieDrm6sQg0ANNaHEP6S+/Pzy7xGjh4fpdhghGyN0olazQ8PHq2+XF+Hb8TLAQIT\ngaG2AfJXk1OjoHdZ0e7C5czLtNOeNA7PqB3+EjYruuyLmh7Kq1pXXo8ceZA/GyIh\nWV6XN5oFYyqx7BCWtEWG5isJ1+L1cFGnWg/y2YANZ3eYfhAmUaRiriIFpifKmnS4\nq48DdqekpfRa9rE+c0ZD+Hnf4koMlZ8djFkAbXTGv2gT51GalN7SPrhM2x6T2wFP\negNl3+p2Ft16crUyWw3mBa2GTV0hrvXW8357Nq7E60n0s7fQ\n-----END CERTIFICATE REQUEST-----\n\n", private_key: "-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----\n\n"}, credentials_secret: "PQFR/VS8ExXHCcYbAobCrCU0a6X8IUAkaCAk6fQmJw8=", device_id: "AfjOYrR4QiKCjrJ1QzEF-A", handler_pid: #PID<0.333.0>, ignore_ssl_errors: true, interface_provider_mod: Astarte.Device.FilesystemInterfaceProvider, interface_provider_state: %{"org.astarte-platform.ServerAggregateValues" => %Astarte.Core.Interface{aggregate: nil, aggregation: :object, description: nil, doc: nil, interface_id: <<92, 179, 152, 135, 131, 76, 149, 246, 13, 31, 226, 223, 174, 215, 42, 30>>, interface_name: nil, major_version: 0, mappings: [%Astarte.Core.Mapping{allow_unset: false, database_retention_policy: :no_ttl, database_retention_ttl: nil, description: nil, doc: nil, endpoint: "/prefix/guaranteed", endpoint_id: <<61, 50, 159, 18, 17, 71, 159, 56, 176, 254, 34, 87, 111, 102, 78, 203>>, expiry: 0, explicit_timestamp: false, interface_id: <<92, 179, 152, 135, 131, 76, 149, 246, 13, 31, 226, 223, 174, 215, 42, 30>>, path: nil, reliability: :guaranteed, retention: :discard, type: nil, value_type: :double}, %Astarte.Core.Mapping{allow_unset: false, database_retention_policy: :no_ttl, databa (truncated)
** (EXIT from #PID<0.328.0>) shell process exited with reason: an exception was raised:
** (MatchError) no match of right hand side value: {:error, :unknown_connection}
(astarte_device 1.0.0-dev) lib/astarte_device.ex:459: Astarte.Device.connected/3
(stdlib 3.11) gen_statem.erl:1159: :gen_statem.loop_state_callback/11
(stdlib 3.11) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
_build
to cachemix format --check-formatted
to test-ci
config/ci.exs
with just use Mix.Config
to be able to use ci
as env.dialyzex
dep and configure it to use local directory for PLTs in ci
envmix:test-dialyzer
job to test
stage, runs mix dialyzer
in ci
env.As TSL1.2 is becoming obsolete (also removed from OTP23), we should add eventual TLS version errors handling to the ignore_ssl_errors
flag
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.