Initial upload
This commit is contained in:
parent
c2db6ee4b6
commit
f238dc3f0f
630
LICENSE
630
LICENSE
|
@ -1,201 +1,429 @@
|
|||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
LICENSE
|
||||
|
||||
Copyright 2018 Oliver Brandmueller <ob@sysadm.in>
|
||||
Copyright 2018 Klaus Wilting <verkehrsrot@arcor.de>
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
NOTICE:
|
||||
Parts of the source files in this repository are made available under different licenses,
|
||||
listed below. Refer to each individual source file for more details.
|
||||
|
||||
------------------------------------------------------------------------------------------------
|
||||
antenna.cpp
|
||||
|
||||
Parts of antenna.cpp were derived or taken from
|
||||
|
||||
https://github.com/pycom/pycom-micropython-sigfox/blob/master/esp32/util/antenna.c
|
||||
|
||||
under this Licence:
|
||||
|
||||
Copyright (c) 2016, Pycom Limited.
|
||||
|
||||
This software is licensed under the GNU GPL version 3 or any
|
||||
later version, with permitted additional terms. For more information
|
||||
see the Pycom Licence v1.0 document supplied with this file, or
|
||||
available at https://www.pycom.io/opensource/licensing
|
||||
|
||||
------------------------------------------------------------------------------------------------
|
||||
wifisniffer.cpp
|
||||
|
||||
Parts of wifisniffer.cpp were derived or taken from
|
||||
|
||||
* Copyright (c) 2017, Łukasz Marcin Podkalicki <lpodkalicki@gmail.com>
|
||||
* ESP32/016 WiFi Sniffer
|
||||
* https://github.com/lpodkalicki/blog/tree/master/esp32/016_wifi_sniffer
|
||||
|
||||
under this License:
|
||||
|
||||
" Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS"
|
||||
|
||||
------------------------------------------------------------------------------------------------
|
||||
src/lorawan.cpp and /lib/arduino-lmic-1.5.0-<...>
|
||||
|
||||
Parts of lorawan.cpp, and the arduino lmic library, which is included in the /lib directory of this
|
||||
repository, were derived or taken from
|
||||
|
||||
Arduino-LMIC Library
|
||||
TTN OTAA Example
|
||||
https://github.com/matthijskooijman/arduino-lmic/blob/master/examples/ttn-otaa/
|
||||
|
||||
under this Licence:
|
||||
|
||||
"License
|
||||
Most source files in this repository are made available under the Eclipse Public License v1.0. The examples which use a more liberal license. Some of the AES code is available under the LGPL. Refer to each individual source file for more details."
|
||||
|
||||
------------------------------------------------------------------------------------------------
|
||||
blecount.cpp
|
||||
|
||||
Parts of blecount.cpp were derived or taken from
|
||||
|
||||
nkolban esp32 snippets
|
||||
BLE Scan
|
||||
https://github.com/nkolban/esp32-snippets/tree/master/cpp_utils/tests/BLETests/Arduino/BLE_scan
|
||||
|
||||
under this Licence:
|
||||
|
||||
" Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS"
|
||||
|
||||
------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -0,0 +1,165 @@
|
|||
# Paxcounter
|
||||
Wifi & Bluetooth driven, LoRaWAN enabled, battery powered mini ESP32 Paxcounter
|
||||
built on cheap ESP32 boards
|
||||
|
||||
<img src="img/Paxcounter_GIF.gif">
|
||||
|
||||
Check out Wiki in this git repo for additional information on suitable hardware:
|
||||
https://github.com/cyberman54/Paxcounter/wiki
|
||||
|
||||
# Hardware
|
||||
|
||||
Currently supported IoT boards:
|
||||
- Heltec LoRa-32
|
||||
- TTGOv2
|
||||
- Pycom LoPy
|
||||
- Pycom LoPy4
|
||||
|
||||
Target platform must be selected in [platformio.ini](https://github.com/cyberman54/Paxcounter/blob/master/platformio.ini).
|
||||
Hardware dependent settings (pinout etc.) are stored in board files in /hal directory.
|
||||
|
||||
# Building
|
||||
|
||||
Use <A HREF="https://platformio.org/">PlatformIO</A> with your preferred IDE for development and building this code.
|
||||
|
||||
Before compiling the code, create file loraconf.h in the /src directory from the template [loraconf.sample.h](https://github.com/cyberman54/Paxcounter/blob/master/src/loraconf.sample.h) and populate it with your personal APPEUI und APPKEY for the LoRaWAN network. Only OTAA join is supported, not ABP. The DEVEUI will be derived from the device's MAC adress during device startup and is shown as well on the device's display (if it has one) as on the serial console for copying it to your LoRaWAN network server settings. If you enter a DEVEUI in loraconf.h it will be used instead.
|
||||
|
||||
# Legal note
|
||||
|
||||
**Depending on your country's laws it may be illegal to sniff wireless networks for MAC addresses. Please check and respect your country's laws before using this code!**
|
||||
|
||||
(e.g. US citizens check [Section 18 U.S. Code § 2511](https://www.law.cornell.edu/uscode/text/18/2511) and [discussion](https://github.com/schollz/howmanypeoplearearound/issues/4) on this)
|
||||
|
||||
(e.g. UK citizens check [Data Protection Act 1998](https://ico.org.uk/media/1560691/wi-fi-location-analytics-guidance.pdf) and [this case](https://www.cbsnews.com/news/uk-bars-trash-cans-from-tracking-people-with-wi-fi/))
|
||||
|
||||
Disclosure: The Paxcounter code stores scanned MAC adresses in the device's RAM, and keeps it in RAM temporary for a configurable scan cycle time (default 240 seconds). After each scan cycle the collected MAC data is erased from RAM. MAC data never is transferred to the LoRaWAN network. No kind of tracking and no persistent storing of MAC data or timestamps on the device and no other kind of analytics than counting is implemented in this code. Wireless networks are not touched by this code, but MAC adresses from wireless devices as well within as not within wireless networks, regardless if encrypted or unencrypted, are made visible and scanned by this code. The same applies to Bluetooth MACs, if the bluetooth option in the code is enabled.
|
||||
|
||||
# Payload format description
|
||||
|
||||
FPort1:
|
||||
|
||||
byte 1: 16-bit Wifi counter, MSB
|
||||
byte 2: 16-bit Wifi counter, LSB
|
||||
byte 3: 16-bit BLE counter, MSB
|
||||
byte 4: 16-bit BLE counter, LSB
|
||||
|
||||
FPort2:
|
||||
|
||||
see remote command set
|
||||
|
||||
# Remote command set
|
||||
|
||||
The device listenes for remote control commands on LoRaWAN Port 2.
|
||||
Each command is followed by exactly one parameter.
|
||||
Multiple command/parameter pairs can be concatenated and sent in one single payload downlink.
|
||||
|
||||
Note: all settings are stored in NVRAM and will be reloaded when device starts. To reset device to factory settings press button (if device has one), or send remote command 09 02 09 00 unconfirmed(!) once.
|
||||
|
||||
0x01 set Wifi scan RSSI limit
|
||||
|
||||
1 ... 255 used for wifi scan radius (greater values increase wifi scan radius, values 50...110 make sense)
|
||||
0 = Wifi rssi limiter disabled [default]
|
||||
|
||||
0x02 set counter mode
|
||||
|
||||
0 = cyclic unconfirmed, mac counter reset after each wifi scan cycle, data is sent only once [default]
|
||||
1 = cumulative counter, mac counter is never reset
|
||||
2 = cyclic confirmed, like 0 but data is resent until confirmation by network received
|
||||
|
||||
0x03 set screen saver mode
|
||||
|
||||
0 = screen saver off [default]
|
||||
1 = screen saver on
|
||||
|
||||
0x04 set display on/off
|
||||
|
||||
0 = display off
|
||||
1 = display on [default]
|
||||
|
||||
0x05 set LoRa spread factor
|
||||
|
||||
7 ... 12 [default: 9]
|
||||
|
||||
0x06 set LoRa TXpower
|
||||
|
||||
2 ... 15 [default: 15]
|
||||
|
||||
0x07 set LoRa Adaptive Data Rate mode
|
||||
|
||||
0 = ADR off
|
||||
1 = ADR on [default]
|
||||
|
||||
note: set ADR to off, if device is moving, set to on, if not.
|
||||
|
||||
0x08 do nothing
|
||||
|
||||
useful to clear pending commands from LoRaWAN server quere, or to check RSSI on device
|
||||
|
||||
0x09 reset functions
|
||||
|
||||
0 = restart device
|
||||
1 = reset MAC counter to zero
|
||||
2 = reset device to factory settings
|
||||
|
||||
0x0A set Wifi scan cycle timer
|
||||
|
||||
0 ... 255 duration of a wifi scan cycle in seconds/2
|
||||
e.g. 120 -> 1 cycle runs for 240 seconds
|
||||
|
||||
0x0B set Wifi channel switch interval timer
|
||||
|
||||
0 ... 255 timeout for scanning 1 wifi channel in seconds/100
|
||||
e.g. 50 -> each channel is scanned for 0,5 seconds
|
||||
|
||||
0x0C set BLE scan cycle timer
|
||||
|
||||
0 ... 255 duration of a BLE scan cycle in seconds
|
||||
e.g. 30 -> 1 cycle runs for 30 seconds
|
||||
|
||||
0x0D set BLE scan mode
|
||||
|
||||
0 = disabled [default]
|
||||
1 = enabled
|
||||
|
||||
0x80 get device configuration
|
||||
|
||||
device answers with it's current configuration:
|
||||
|
||||
byte 1: Lora SF (7..12)
|
||||
byte 2: Lora TXpower (2..15)
|
||||
byte 3: Lora ADR (1=on, 0=off)
|
||||
byte 4: Screensaver status (1=on, 0=off)
|
||||
byte 5: Display status (1=on, 0=off)
|
||||
byte 6: Counter mode (0=cyclic unconfirmed, 1=cumulative, 2=cyclic confirmed)
|
||||
bytes 7-8: RSSI limiter threshold value (negative)
|
||||
byte 9: Wifi scan cycle duration in seconds/2 (0..255)
|
||||
byte 10: Wifi channel switch interval in seconds/100 (0..255)
|
||||
byte 11: BLE scan cycle duration in seconds (0..255)
|
||||
byte 12: BLE scan mode (1=on, 0=0ff)
|
||||
bytes 13-22: Software version (ASCII format)
|
||||
|
||||
0x81 get device uptime
|
||||
|
||||
bytes 1-7: Uptime in seconds (little endian format)
|
||||
|
||||
# License
|
||||
|
||||
Copyright 2018 Oliver Brandmueller <ob@sysadm.in>
|
||||
|
||||
Copyright 2018 Klaus Wilting <verkehrsrot@arcor.de>
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
NOTICE:
|
||||
Parts of the source files in this repository are made available under different licenses,
|
||||
see file <A HREF="https://github.com/cyberman54/Paxcounter/blob/master/LICENSE">LICENSE.txt</A> in this repository. Refer to each individual source file for more details.
|
Binary file not shown.
After Width: | Height: | Size: 4.8 MiB |
Binary file not shown.
After Width: | Height: | Size: 3.0 MiB |
|
@ -0,0 +1,365 @@
|
|||
Arduino-LMIC library
|
||||
====================
|
||||
This repository contains the IBM LMIC (LoraMAC-in-C) library, slightly
|
||||
modified to run in the Arduino environment, allowing using the SX1272,
|
||||
SX1276 tranceivers and compatible modules (such as some HopeRF RFM9x
|
||||
modules).
|
||||
|
||||
This library mostly exposes the functions defined by LMIC, it makes no
|
||||
attempt to wrap them in a higher level API that is more in the Arduino
|
||||
style. To find out how to use the library itself, see the examples, or
|
||||
see the PDF file in the doc subdirectory.
|
||||
|
||||
This library requires Arduino IDE version 1.6.6 or above, since it
|
||||
requires C99 mode to be enabled by default.
|
||||
|
||||
Installing
|
||||
----------
|
||||
To install this library:
|
||||
|
||||
- install it using the Arduino Library manager ("Sketch" -> "Include
|
||||
Library" -> "Manage Libraries..."), or
|
||||
- download a zipfile from github using the "Download ZIP" button and
|
||||
install it using the IDE ("Sketch" -> "Include Library" -> "Add .ZIP
|
||||
Library..."
|
||||
- clone this git repository into your sketchbook/libraries folder.
|
||||
|
||||
For more info, see https://www.arduino.cc/en/Guide/Libraries
|
||||
|
||||
Features
|
||||
--------
|
||||
The LMIC library provides a fairly complete LoRaWAN Class A and Class B
|
||||
implementation, supporting the EU-868 and US-915 bands. Only a limited
|
||||
number of features was tested using this port on Arduino hardware, so be
|
||||
careful when using any of the untested features.
|
||||
|
||||
What certainly works:
|
||||
- Sending packets uplink, taking into account duty cycling.
|
||||
- Encryption and message integrity checking.
|
||||
- Receiving downlink packets in the RX2 window.
|
||||
- Custom frequencies and datarate settings.
|
||||
- Over-the-air activation (OTAA / joining).
|
||||
|
||||
What has not been tested:
|
||||
- Receiving downlink packets in the RX1 window.
|
||||
- Receiving and processing MAC commands.
|
||||
- Class B operation.
|
||||
|
||||
If you try one of these untested features and it works, be sure to let
|
||||
us know (creating a github issue is probably the best way for that).
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
A number of features can be configured or disabled by editing the
|
||||
`config.h` file in the library folder. Unfortunately the Arduino
|
||||
environment does not offer any way to do this (compile-time)
|
||||
configuration from the sketch, so be careful to recheck your
|
||||
configuration when you switch between sketches or update the library.
|
||||
|
||||
At the very least, you should set the right type of transceiver (SX1272
|
||||
vs SX1276) in config.h, most other values should be fine at their
|
||||
defaults.
|
||||
|
||||
Supported hardware
|
||||
------------------
|
||||
This library is intended to be used with plain LoRa transceivers,
|
||||
connecting to them using SPI. In particular, the SX1272 and SX1276
|
||||
families are supported (which should include SX1273, SX1277, SX1278 and
|
||||
SX1279 which only differ in the available frequencies, bandwidths and
|
||||
spreading factors). It has been tested with both SX1272 and SX1276
|
||||
chips, using the Semtech SX1272 evaluation board and the HopeRF RFM92
|
||||
and RFM95 boards (which supposedly contain an SX1272 and SX1276 chip
|
||||
respectively).
|
||||
|
||||
This library contains a full LoRaWAN stack and is intended to drive
|
||||
these Transceivers directly. It is *not* intended to be used with
|
||||
full-stack devices like the Microchip RN2483 and the Embit LR1272E.
|
||||
These contain a transceiver and microcontroller that implements the
|
||||
LoRaWAN stack and exposes a high-level serial interface instead of the
|
||||
low-level SPI transceiver interface.
|
||||
|
||||
This library is intended to be used inside the Arduino environment. It
|
||||
should be architecture-independent, so it should run on "normal" AVR
|
||||
arduinos, but also on the ARM-based ones, and some success has been seen
|
||||
running on the ESP8266 board as well. It was tested on the Arduino Uno,
|
||||
Pinoccio Scout, Teensy LC and 3.x, ESP8266, Arduino 101.
|
||||
|
||||
This library an be quite heavy, especially if the fairly small ATmega
|
||||
328p (such as in the Arduino Uno) is used. In the default configuration,
|
||||
the available 32K flash space is nearly filled up (this includes some
|
||||
debug output overhead, though). By disabling some features in `config.h`
|
||||
(like beacon tracking and ping slots, which are not typically needed),
|
||||
some space can be freed up. Some work is underway to replace the AES
|
||||
encryption implementation, which should free up another 8K or so of
|
||||
flash in the future, making this library feasible to run on a 328p
|
||||
microcontroller.
|
||||
|
||||
Connections
|
||||
-----------
|
||||
To make this library work, your Arduino (or whatever Arduino-compatible
|
||||
board you are using) should be connected to the transceiver. The exact
|
||||
connections are a bit dependent on the transceiver board and Arduino
|
||||
used, so this section tries to explain what each connection is for and
|
||||
in what cases it is (not) required.
|
||||
|
||||
Note that the SX1272 module runs at 3.3V and likely does not like 5V on
|
||||
its pins (though the datasheet is not say anything about this, and my
|
||||
transceiver did not obviously break after accidentally using 5V I/O for
|
||||
a few hours). To be safe, make sure to use a level shifter, or an
|
||||
Arduino running at 3.3V. The Semtech evaluation board has 100 ohm resistors in
|
||||
series with all data lines that might prevent damage, but I would not
|
||||
count on that.
|
||||
|
||||
### Power
|
||||
The SX127x transceivers need a supply voltage between 1.8V and 3.9V.
|
||||
Using a 3.3V supply is typical. Some modules have a single power pin
|
||||
(like the HopeRF modules, labeled 3.3V) but others expose multiple power
|
||||
pins for different parts (like the Semtech evaluation board that has
|
||||
`VDD_RF`, `VDD_ANA` and `VDD_FEM`), which can all be connected together.
|
||||
Any *GND* pins need to be connected to the Arduino *GND* pin(s).
|
||||
|
||||
### SPI
|
||||
The primary way of communicating with the transceiver is through SPI
|
||||
(Serial Peripheral Interface). This uses four pins: MOSI, MISO, SCK and
|
||||
SS. The former three need to be directly connected: so MOSI to MOSI,
|
||||
MISO to MISO, SCK to SCK. Where these pins are located on your Arduino
|
||||
varies, see for example the "Connections" section of the [Arduino SPI
|
||||
documentation](SPI).
|
||||
|
||||
The SS (slave select) connection is a bit more flexible. On the SPI
|
||||
slave side (the transceiver), this must be connect to the pin
|
||||
(typically) labeled *NSS*. On the SPI master (Arduino) side, this pin
|
||||
can connect to any I/O pin. Most Arduinos also have a pin labeled "SS",
|
||||
but this is only relevant when the Arduino works as an SPI slave, which
|
||||
is not the case here. Whatever pin you pick, you need to tell the
|
||||
library what pin you used through the pin mapping (see below).
|
||||
|
||||
[SPI]: https://www.arduino.cc/en/Reference/SPI
|
||||
|
||||
### DIO pins
|
||||
The DIO (digitial I/O) pins on the transceiver board can be configured
|
||||
for various functions. The LMIC library uses them to get instant status
|
||||
information from the transceiver. For example, when a LoRa transmission
|
||||
starts, the DIO0 pin is configured as a TxDone output. When the
|
||||
transmission is complete, the DIO0 pin is made high by the transceiver,
|
||||
which can be detected by the LMIC library.
|
||||
|
||||
The LMIC library needs only access to DIO0, DIO1 and DIO2, the other
|
||||
DIOx pins can be left disconnected. On the Arduino side, they can
|
||||
connect to any I/O pin, since the current implementation does not use
|
||||
interrupts or other special hardware features (though this might be
|
||||
added in the feature, see also the "Timing" section).
|
||||
|
||||
In LoRa mode the DIO pins are used as follows:
|
||||
* DIO0: TxDone and RxDone
|
||||
* DIO1: RxTimeout
|
||||
|
||||
In FSK mode they are used as follows::
|
||||
* DIO0: PayloadReady and PacketSent
|
||||
* DIO2: TimeOut
|
||||
|
||||
Both modes need only 2 pins, but the tranceiver does not allow mapping
|
||||
them in such a way that all needed interrupts map to the same 2 pins.
|
||||
So, if both LoRa and FSK modes are used, all three pins must be
|
||||
connected.
|
||||
|
||||
The pins used on the Arduino side should be configured in the pin
|
||||
mapping in your sketch (see below).
|
||||
|
||||
### Reset
|
||||
The transceiver has a reset pin that can be used to explicitely reset
|
||||
it. The LMIC library uses this to ensure the chip is in a consistent
|
||||
state at startup. In practice, this pin can be left disconnected, since
|
||||
the transceiver will already be in a sane state on power-on, but
|
||||
connecting it might prevent problems in some cases.
|
||||
|
||||
On the Arduino side, any I/O pin can be used. The pin number used must
|
||||
be configured in the pin mapping (see below).
|
||||
|
||||
### RXTX
|
||||
The transceiver contains two separate antenna connections: One for RX
|
||||
and one for TX. A typical transceiver board contains an antenna switch
|
||||
chip, that allows switching a single antenna between these RX and TX
|
||||
connections. Such a antenna switcher can typically be told what
|
||||
position it should be through an input pin, often labeled *RXTX*.
|
||||
|
||||
The easiest way to control the antenna switch is to use the *RXTX* pin
|
||||
on the SX127x transceiver. This pin is automatically set high during TX
|
||||
and low during RX. For example, the HopeRF boards seem to have this
|
||||
connection in place, so they do not expose any *RXTX* pins and the pin
|
||||
can be marked as unused in the pin mapping.
|
||||
|
||||
Some boards do expose the antenna switcher pin, and sometimes also the
|
||||
SX127x *RXTX* pin. For example, the SX1272 evaluation board calls the
|
||||
former *FEM_CTX* and the latter *RXTX*. Again, simply connecting these
|
||||
together with a jumper wire is the easiest solution.
|
||||
|
||||
Alternatively, or if the SX127x *RXTX* pin is not available, LMIC can be
|
||||
configured to control the antenna switch. Connect the antenna switch
|
||||
control pin (e.g. *FEM_CTX* on the Semtech evaluation board) to any I/O
|
||||
pin on the Arduino side, and configure the pin used in the pin map (see
|
||||
below). It is not entirely clear why would *not* want the transceiver to
|
||||
control the antenna directly, though.
|
||||
|
||||
### Pin mapping
|
||||
As described above, most connections can use arbitrary I/O pins on the
|
||||
Arduino side. To tell the LMIC library about these, a pin mapping struct
|
||||
is used in the sketch file.
|
||||
|
||||
For example, this could look like this:
|
||||
|
||||
lmic_pinmap lmic_pins = {
|
||||
.nss = 6,
|
||||
.rxtx = LMIC_UNUSED_PIN,
|
||||
.rst = 5,
|
||||
.dio = {2, 3, 4},
|
||||
};
|
||||
|
||||
The names refer to the pins on the transceiver side, the numbers refer
|
||||
to the Arduino pin numbers (to use the analog pins, use constants like
|
||||
`A0`). For the DIO pins, the three numbers refer to DIO0, DIO1 and DIO2
|
||||
respectively. Any pins that are not needed should be specified as
|
||||
`LMIC_UNUSED_PIN`. The nss and dio0 pin is required, the others can
|
||||
potentially left out (depending on the environments and requirements,
|
||||
see the notes above for when a pin can or cannot be left out).
|
||||
|
||||
The name of this struct must always be `lmic_pins`, which is a special name
|
||||
recognized by the library.
|
||||
|
||||
#### LoRa Nexus by Ideetron
|
||||
This board uses the following pin mapping:
|
||||
|
||||
const lmic_pinmap lmic_pins = {
|
||||
.nss = 10,
|
||||
.rxtx = LMIC_UNUSED_PIN,
|
||||
.rst = LMIC_UNUSED_PIN, // hardwired to AtMega RESET
|
||||
.dio = {4, 5, 7},
|
||||
};
|
||||
|
||||
Examples
|
||||
--------
|
||||
This library currently provides three examples:
|
||||
|
||||
- `ttn-abp.ino` shows a basic transmission of a "Hello, world!" message
|
||||
using the LoRaWAN protocol. It contains some frequency settings and
|
||||
encryption keys intended for use with The Things Network, but these
|
||||
also correspond to the default settings of most gateways, so it
|
||||
should work with other networks and gateways as well. This example
|
||||
uses activation-by-personalization (ABP, preconfiguring a device
|
||||
address and encryption keys), and does not employ over-the-air
|
||||
activation.
|
||||
|
||||
Reception of packets (in response to transmission, using the RX1 and
|
||||
RX2 receive windows is also supported).
|
||||
|
||||
- `ttn-otaa.ino` also sends a "Hello, world!" message, but uses over
|
||||
the air activation (OTAA) to first join a network to establish a
|
||||
session and security keys. This was tested with The Things Network,
|
||||
but should also work (perhaps with some changes) for other networks.
|
||||
|
||||
- `raw.ino` shows how to access the radio on a somewhat low level,
|
||||
and allows to send raw (non-LoRaWAN) packets between nodes directly.
|
||||
This is useful to verify basic connectivity, and when no gateway is
|
||||
available, but this example also bypasses duty cycle checks, so be
|
||||
careful when changing the settings.
|
||||
|
||||
Timing
|
||||
------
|
||||
Unfortunately, the SX127x tranceivers do not support accurate
|
||||
timekeeping themselves (there is a sequencer that is *almost* sufficient
|
||||
for timing the RX1 and RX2 downlink windows, but that is only available
|
||||
in FSK mode, not in LoRa mode). This means that the microcontroller is
|
||||
responsible for keeping track of time. In particular, it should note
|
||||
when a packet finished transmitting, so it can open up the RX1 and RX2
|
||||
receive windows at a fixed time after the end of transmission.
|
||||
|
||||
This timing uses the Arduino `micros()` timer, which has a granularity
|
||||
of 4μs and is based on the primary microcontroller clock. For timing
|
||||
events, the tranceiver uses its DIOx pins as interrupt outputs. In the
|
||||
current implementation, these pins are not handled by an actual
|
||||
interrupt handler, but they are just polled once every LMIC loop,
|
||||
resulting in a bit inaccuracy in the timestamping. Also, running
|
||||
scheduled jobs (such as opening up the receive windows) is done using a
|
||||
polling approach, which might also result in further delays.
|
||||
|
||||
Fortunately, LoRa is a fairly slow protocol and the timing of the
|
||||
receive windows is not super critical. To synchronize transmitter and
|
||||
receiver, a preamble is first transmitted. Using LoRaWAN, this preamble
|
||||
consists of 8 symbols, of which the receiver needs to see 4 symbols to
|
||||
lock on. The current implementation tries to enable the receiver for 5
|
||||
symbol times at 1.5 symbol after the start of the receive window,
|
||||
meaning that a inacurracy of plus or minus 2.5 symbol times should be
|
||||
acceptable.
|
||||
|
||||
At the fastest LoRa setting supported by the tranceiver (SF5BW500) a
|
||||
single preamble symbol takes 64μs, so the receive window timing should
|
||||
be accurate within 160μs (for LoRaWAN this is SF7BW250, needing accuracy
|
||||
within 1280μs). This is certainly within a crystal's accuracy, but using
|
||||
the internal oscillator is probably not feasible (which is 1% - 10%
|
||||
accurate, depending on calibration). This accuracy should also be
|
||||
feasible with the polling approach used, provided that the LMIC loop is
|
||||
run often enough.
|
||||
|
||||
It would be good to properly review this code at some point, since it
|
||||
seems that in some places some offsets and corrections are applied that
|
||||
might not be appropriate for the Arduino environment. So if reception is
|
||||
not working, the timing is something to have a closer look at.
|
||||
|
||||
The LMIC library was intended to connect the DIO pins to interrupt
|
||||
lines and run code inside the interrupt handler. However, doing this
|
||||
opens up an entire can of worms with regard to doing SPI transfers
|
||||
inside interrupt routines (some of which is solved by the Arduino
|
||||
`beginTransaction()` API, but possibly not everything). One simpler
|
||||
alternative could be to use an interrupt handler to just store a
|
||||
timestamp, and then do the actual handling in the main loop (this
|
||||
requires modifications of the library to pass a timestamp to the LMIC
|
||||
`radio_irq_handler()` function).
|
||||
|
||||
An even more accurate solution could be to use a dedicated timer with an
|
||||
input capture unit, that can store the timestamp of a change on the DIO0
|
||||
pin (the only one that is timing-critical) entirely in hardware.
|
||||
Unfortunately, timer0, as used by Arduino's `millis()` and `micros()`
|
||||
functions does not seem to have an input capture unit, meaning a
|
||||
separate timer is needed for this.
|
||||
|
||||
If the main microcontroller does not have a crystal, but uses the
|
||||
internal oscillator, the clock output of the transceiver (on DIO5) could
|
||||
be usable to drive this timer instead of the main microcontroller clock,
|
||||
to ensure the receive window timing is sufficiently accurate. Ideally,
|
||||
this would use timer2, which supports asynchronous mode (e.g. running
|
||||
while the microcontroller is sleeping), but that timer does not have an
|
||||
input capture unit. Timer1 has one, but it seems it will stop running
|
||||
once the microcontroller sleeps. Running the microcontroller in idle
|
||||
mode with a slower clock might be feasible, though. Instead of using the
|
||||
main crystal oscillator of the transceiver, it could be possible to use
|
||||
the transceiver's internal RC oscillator (which is calibrated against
|
||||
the transceiver crystal), or to calibrate the microcontroller internal
|
||||
RC oscillator using the transceiver's clkout. However, that datasheet is
|
||||
a bit vague on the RC oscillator's accuracy and how to use it exactly
|
||||
(some registers seem to be FSK-mode only), so this needs some
|
||||
experiments.
|
||||
|
||||
Downlink datarate
|
||||
-----------------
|
||||
Note that the datarate used for downlink packets in the RX2 window
|
||||
defaults to SF12BW125 according to the specification, but some networks
|
||||
use different values (iot.semtech.com and The Things Network both use
|
||||
SF9BW). When using personalized activate (ABP), it is your
|
||||
responsibility to set the right settings, e.g. by adding this to your
|
||||
sketch (after calling `LMIC_setSession`). `ttn-abp.ino` already does
|
||||
this.
|
||||
|
||||
LMIC.dn2Dr = DR_SF9;
|
||||
|
||||
When using OTAA, the network communicates the RX2 settings in the
|
||||
join accept message, but the LMIC library does not currently process
|
||||
these settings. Until that is solved (see issue #20), you should
|
||||
manually set the RX2 rate, *after* joining (see the handling of
|
||||
`EV_JOINED` in the `ttn-otaa.ino` for an example.
|
||||
|
||||
License
|
||||
-------
|
||||
Most source files in this repository are made available under the
|
||||
Eclipse Public License v1.0. The examples which use a more liberal
|
||||
license. Some of the AES code is available under the LGPL. Refer to each
|
||||
individual source file for more details.
|
Binary file not shown.
|
@ -0,0 +1,4 @@
|
|||
DISCLAIMER:
|
||||
Please note that the software is provided AS IS and we cannot
|
||||
provide support for optimizations, adaptations, integration,
|
||||
ports to other platforms or device drivers!
|
|
@ -0,0 +1,28 @@
|
|||
==============================================================================
|
||||
LMIC VERSION 1.4 (17-Mar-2015)
|
||||
-------------------------------
|
||||
|
||||
- changed API: inverted port indicator flag in LMIC.txrxFlags
|
||||
(now TXRX_PORT, previously TXRX_NOPORT)
|
||||
|
||||
- fixed offset OFF_CFLIST constant
|
||||
|
||||
- changed CRC-16 algorithm for beacons to CCITT(XMODEM) polynomial
|
||||
|
||||
- fixed radio driver (low data rate optimization for SF11+SF12 only for BW125)
|
||||
|
||||
- fixed timer rollover handling in job queue
|
||||
|
||||
==============================================================================
|
||||
LMIC VERSION 1.5 (8-May-2015)
|
||||
------------------------------
|
||||
|
||||
- fixed condition in convFreq()
|
||||
|
||||
- fixed freq*100 bug and freq==0 bug for CFList
|
||||
|
||||
- fixed TX scheduling bug
|
||||
|
||||
- better support for GNU compiler toolchain
|
||||
|
||||
==============================================================================
|
|
@ -0,0 +1,162 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2015 Matthijs Kooijman
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to anyone
|
||||
* obtaining a copy of this document and accompanying files,
|
||||
* to do whatever they want with them without any restriction,
|
||||
* including, but not limited to, copying, modification and redistribution.
|
||||
* NO WARRANTY OF ANY KIND IS PROVIDED.
|
||||
*
|
||||
* This example transmits data on hardcoded channel and receives data
|
||||
* when not transmitting. Running this sketch on two nodes should allow
|
||||
* them to communicate.
|
||||
*******************************************************************************/
|
||||
|
||||
#include <lmic.h>
|
||||
#include <hal/hal.h>
|
||||
#include <SPI.h>
|
||||
|
||||
#if !defined(DISABLE_INVERT_IQ_ON_RX)
|
||||
#error This example requires DISABLE_INVERT_IQ_ON_RX to be set. Update \
|
||||
config.h in the lmic library to set it.
|
||||
#endif
|
||||
|
||||
// How often to send a packet. Note that this sketch bypasses the normal
|
||||
// LMIC duty cycle limiting, so when you change anything in this sketch
|
||||
// (payload length, frequency, spreading factor), be sure to check if
|
||||
// this interval should not also be increased.
|
||||
// See this spreadsheet for an easy airtime and duty cycle calculator:
|
||||
// https://docs.google.com/spreadsheets/d/1voGAtQAjC1qBmaVuP1ApNKs1ekgUjavHuVQIXyYSvNc
|
||||
#define TX_INTERVAL 2000
|
||||
|
||||
// Pin mapping
|
||||
const lmic_pinmap lmic_pins = {
|
||||
.nss = 6,
|
||||
.rxtx = LMIC_UNUSED_PIN,
|
||||
.rst = 5,
|
||||
.dio = {2, 3, 4},
|
||||
};
|
||||
|
||||
|
||||
// These callbacks are only used in over-the-air activation, so they are
|
||||
// left empty here (we cannot leave them out completely unless
|
||||
// DISABLE_JOIN is set in config.h, otherwise the linker will complain).
|
||||
void os_getArtEui (u1_t* buf) { }
|
||||
void os_getDevEui (u1_t* buf) { }
|
||||
void os_getDevKey (u1_t* buf) { }
|
||||
|
||||
void onEvent (ev_t ev) {
|
||||
}
|
||||
|
||||
osjob_t txjob;
|
||||
osjob_t timeoutjob;
|
||||
static void tx_func (osjob_t* job);
|
||||
|
||||
// Transmit the given string and call the given function afterwards
|
||||
void tx(const char *str, osjobcb_t func) {
|
||||
os_radio(RADIO_RST); // Stop RX first
|
||||
delay(1); // Wait a bit, without this os_radio below asserts, apparently because the state hasn't changed yet
|
||||
LMIC.dataLen = 0;
|
||||
while (*str)
|
||||
LMIC.frame[LMIC.dataLen++] = *str++;
|
||||
LMIC.osjob.func = func;
|
||||
os_radio(RADIO_TX);
|
||||
Serial.println("TX");
|
||||
}
|
||||
|
||||
// Enable rx mode and call func when a packet is received
|
||||
void rx(osjobcb_t func) {
|
||||
LMIC.osjob.func = func;
|
||||
LMIC.rxtime = os_getTime(); // RX _now_
|
||||
// Enable "continuous" RX (e.g. without a timeout, still stops after
|
||||
// receiving a packet)
|
||||
os_radio(RADIO_RXON);
|
||||
Serial.println("RX");
|
||||
}
|
||||
|
||||
static void rxtimeout_func(osjob_t *job) {
|
||||
digitalWrite(LED_BUILTIN, LOW); // off
|
||||
}
|
||||
|
||||
static void rx_func (osjob_t* job) {
|
||||
// Blink once to confirm reception and then keep the led on
|
||||
digitalWrite(LED_BUILTIN, LOW); // off
|
||||
delay(10);
|
||||
digitalWrite(LED_BUILTIN, HIGH); // on
|
||||
|
||||
// Timeout RX (i.e. update led status) after 3 periods without RX
|
||||
os_setTimedCallback(&timeoutjob, os_getTime() + ms2osticks(3*TX_INTERVAL), rxtimeout_func);
|
||||
|
||||
// Reschedule TX so that it should not collide with the other side's
|
||||
// next TX
|
||||
os_setTimedCallback(&txjob, os_getTime() + ms2osticks(TX_INTERVAL/2), tx_func);
|
||||
|
||||
Serial.print("Got ");
|
||||
Serial.print(LMIC.dataLen);
|
||||
Serial.println(" bytes");
|
||||
Serial.write(LMIC.frame, LMIC.dataLen);
|
||||
Serial.println();
|
||||
|
||||
// Restart RX
|
||||
rx(rx_func);
|
||||
}
|
||||
|
||||
static void txdone_func (osjob_t* job) {
|
||||
rx(rx_func);
|
||||
}
|
||||
|
||||
// log text to USART and toggle LED
|
||||
static void tx_func (osjob_t* job) {
|
||||
// say hello
|
||||
tx("Hello, world!", txdone_func);
|
||||
// reschedule job every TX_INTERVAL (plus a bit of random to prevent
|
||||
// systematic collisions), unless packets are received, then rx_func
|
||||
// will reschedule at half this time.
|
||||
os_setTimedCallback(job, os_getTime() + ms2osticks(TX_INTERVAL + random(500)), tx_func);
|
||||
}
|
||||
|
||||
// application entry point
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
Serial.println("Starting");
|
||||
#ifdef VCC_ENABLE
|
||||
// For Pinoccio Scout boards
|
||||
pinMode(VCC_ENABLE, OUTPUT);
|
||||
digitalWrite(VCC_ENABLE, HIGH);
|
||||
delay(1000);
|
||||
#endif
|
||||
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
|
||||
// initialize runtime env
|
||||
os_init();
|
||||
|
||||
// Set up these settings once, and use them for both TX and RX
|
||||
|
||||
#if defined(CFG_eu868)
|
||||
// Use a frequency in the g3 which allows 10% duty cycling.
|
||||
LMIC.freq = 869525000;
|
||||
#elif defined(CFG_us915)
|
||||
LMIC.freq = 902300000;
|
||||
#endif
|
||||
|
||||
// Maximum TX power
|
||||
LMIC.txpow = 27;
|
||||
// Use a medium spread factor. This can be increased up to SF12 for
|
||||
// better range, but then the interval should be (significantly)
|
||||
// lowered to comply with duty cycle limits as well.
|
||||
LMIC.datarate = DR_SF9;
|
||||
// This sets CR 4/5, BW125 (except for DR_SF7B, which uses BW250)
|
||||
LMIC.rps = updr2rps(LMIC.datarate);
|
||||
|
||||
Serial.println("Started");
|
||||
Serial.flush();
|
||||
|
||||
// setup initial job
|
||||
os_setCallback(&txjob, tx_func);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// execute scheduled jobs and events
|
||||
os_runloop_once();
|
||||
}
|
|
@ -0,0 +1,226 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to anyone
|
||||
* obtaining a copy of this document and accompanying files,
|
||||
* to do whatever they want with them without any restriction,
|
||||
* including, but not limited to, copying, modification and redistribution.
|
||||
* NO WARRANTY OF ANY KIND IS PROVIDED.
|
||||
*
|
||||
* This example sends a valid LoRaWAN packet with payload "Hello,
|
||||
* world!", using frequency and encryption settings matching those of
|
||||
* the The Things Network.
|
||||
*
|
||||
* This uses ABP (Activation-by-personalisation), where a DevAddr and
|
||||
* Session keys are preconfigured (unlike OTAA, where a DevEUI and
|
||||
* application key is configured, while the DevAddr and session keys are
|
||||
* assigned/generated in the over-the-air-activation procedure).
|
||||
*
|
||||
* Note: LoRaWAN per sub-band duty-cycle limitation is enforced (1% in
|
||||
* g1, 0.1% in g2), but not the TTN fair usage policy (which is probably
|
||||
* violated by this sketch when left running for longer)!
|
||||
*
|
||||
* To use this sketch, first register your application and device with
|
||||
* the things network, to set or generate a DevAddr, NwkSKey and
|
||||
* AppSKey. Each device should have their own unique values for these
|
||||
* fields.
|
||||
*
|
||||
* Do not forget to define the radio type correctly in config.h.
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#include <lmic.h>
|
||||
#include <hal/hal.h>
|
||||
#include <SPI.h>
|
||||
|
||||
// LoRaWAN NwkSKey, network session key
|
||||
// This is the default Semtech key, which is used by the early prototype TTN
|
||||
// network.
|
||||
static const PROGMEM u1_t NWKSKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C };
|
||||
|
||||
// LoRaWAN AppSKey, application session key
|
||||
// This is the default Semtech key, which is used by the early prototype TTN
|
||||
// network.
|
||||
static const u1_t PROGMEM APPSKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C };
|
||||
|
||||
// LoRaWAN end-device address (DevAddr)
|
||||
static const u4_t DEVADDR = 0x03FF0001 ; // <-- Change this address for every node!
|
||||
|
||||
// These callbacks are only used in over-the-air activation, so they are
|
||||
// left empty here (we cannot leave them out completely unless
|
||||
// DISABLE_JOIN is set in config.h, otherwise the linker will complain).
|
||||
void os_getArtEui (u1_t* buf) { }
|
||||
void os_getDevEui (u1_t* buf) { }
|
||||
void os_getDevKey (u1_t* buf) { }
|
||||
|
||||
static uint8_t mydata[] = "Hello, world!";
|
||||
static osjob_t sendjob;
|
||||
|
||||
// Schedule TX every this many seconds (might become longer due to duty
|
||||
// cycle limitations).
|
||||
const unsigned TX_INTERVAL = 60;
|
||||
|
||||
// Pin mapping
|
||||
const lmic_pinmap lmic_pins = {
|
||||
.nss = 6,
|
||||
.rxtx = LMIC_UNUSED_PIN,
|
||||
.rst = 5,
|
||||
.dio = {2, 3, 4},
|
||||
};
|
||||
|
||||
void onEvent (ev_t ev) {
|
||||
Serial.print(os_getTime());
|
||||
Serial.print(": ");
|
||||
switch(ev) {
|
||||
case EV_SCAN_TIMEOUT:
|
||||
Serial.println(F("EV_SCAN_TIMEOUT"));
|
||||
break;
|
||||
case EV_BEACON_FOUND:
|
||||
Serial.println(F("EV_BEACON_FOUND"));
|
||||
break;
|
||||
case EV_BEACON_MISSED:
|
||||
Serial.println(F("EV_BEACON_MISSED"));
|
||||
break;
|
||||
case EV_BEACON_TRACKED:
|
||||
Serial.println(F("EV_BEACON_TRACKED"));
|
||||
break;
|
||||
case EV_JOINING:
|
||||
Serial.println(F("EV_JOINING"));
|
||||
break;
|
||||
case EV_JOINED:
|
||||
Serial.println(F("EV_JOINED"));
|
||||
break;
|
||||
case EV_RFU1:
|
||||
Serial.println(F("EV_RFU1"));
|
||||
break;
|
||||
case EV_JOIN_FAILED:
|
||||
Serial.println(F("EV_JOIN_FAILED"));
|
||||
break;
|
||||
case EV_REJOIN_FAILED:
|
||||
Serial.println(F("EV_REJOIN_FAILED"));
|
||||
break;
|
||||
case EV_TXCOMPLETE:
|
||||
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
|
||||
if (LMIC.txrxFlags & TXRX_ACK)
|
||||
Serial.println(F("Received ack"));
|
||||
if (LMIC.dataLen) {
|
||||
Serial.println(F("Received "));
|
||||
Serial.println(LMIC.dataLen);
|
||||
Serial.println(F(" bytes of payload"));
|
||||
}
|
||||
// Schedule next transmission
|
||||
os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
|
||||
break;
|
||||
case EV_LOST_TSYNC:
|
||||
Serial.println(F("EV_LOST_TSYNC"));
|
||||
break;
|
||||
case EV_RESET:
|
||||
Serial.println(F("EV_RESET"));
|
||||
break;
|
||||
case EV_RXCOMPLETE:
|
||||
// data received in ping slot
|
||||
Serial.println(F("EV_RXCOMPLETE"));
|
||||
break;
|
||||
case EV_LINK_DEAD:
|
||||
Serial.println(F("EV_LINK_DEAD"));
|
||||
break;
|
||||
case EV_LINK_ALIVE:
|
||||
Serial.println(F("EV_LINK_ALIVE"));
|
||||
break;
|
||||
default:
|
||||
Serial.println(F("Unknown event"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void do_send(osjob_t* j){
|
||||
// Check if there is not a current TX/RX job running
|
||||
if (LMIC.opmode & OP_TXRXPEND) {
|
||||
Serial.println(F("OP_TXRXPEND, not sending"));
|
||||
} else {
|
||||
// Prepare upstream data transmission at the next possible time.
|
||||
LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
|
||||
Serial.println(F("Packet queued"));
|
||||
}
|
||||
// Next TX is scheduled after TX_COMPLETE event.
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Starting"));
|
||||
|
||||
#ifdef VCC_ENABLE
|
||||
// For Pinoccio Scout boards
|
||||
pinMode(VCC_ENABLE, OUTPUT);
|
||||
digitalWrite(VCC_ENABLE, HIGH);
|
||||
delay(1000);
|
||||
#endif
|
||||
|
||||
// LMIC init
|
||||
os_init();
|
||||
// Reset the MAC state. Session and pending data transfers will be discarded.
|
||||
LMIC_reset();
|
||||
|
||||
// Set static session parameters. Instead of dynamically establishing a session
|
||||
// by joining the network, precomputed session parameters are be provided.
|
||||
#ifdef PROGMEM
|
||||
// On AVR, these values are stored in flash and only copied to RAM
|
||||
// once. Copy them to a temporary buffer here, LMIC_setSession will
|
||||
// copy them into a buffer of its own again.
|
||||
uint8_t appskey[sizeof(APPSKEY)];
|
||||
uint8_t nwkskey[sizeof(NWKSKEY)];
|
||||
memcpy_P(appskey, APPSKEY, sizeof(APPSKEY));
|
||||
memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY));
|
||||
LMIC_setSession (0x1, DEVADDR, nwkskey, appskey);
|
||||
#else
|
||||
// If not running an AVR with PROGMEM, just use the arrays directly
|
||||
LMIC_setSession (0x1, DEVADDR, NWKSKEY, APPSKEY);
|
||||
#endif
|
||||
|
||||
#if defined(CFG_eu868)
|
||||
// Set up the channels used by the Things Network, which corresponds
|
||||
// to the defaults of most gateways. Without this, only three base
|
||||
// channels from the LoRaWAN specification are used, which certainly
|
||||
// works, so it is good for debugging, but can overload those
|
||||
// frequencies, so be sure to configure the full frequency range of
|
||||
// your network here (unless your network autoconfigures them).
|
||||
// Setting up channels should happen after LMIC_setSession, as that
|
||||
// configures the minimal channel set.
|
||||
// NA-US channels 0-71 are configured automatically
|
||||
LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
|
||||
LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI); // g-band
|
||||
LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
|
||||
LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
|
||||
LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
|
||||
LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
|
||||
LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
|
||||
LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
|
||||
LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI); // g2-band
|
||||
// TTN defines an additional channel at 869.525Mhz using SF9 for class B
|
||||
// devices' ping slots. LMIC does not have an easy way to define set this
|
||||
// frequency and support for class B is spotty and untested, so this
|
||||
// frequency is not configured here.
|
||||
#elif defined(CFG_us915)
|
||||
// NA-US channels 0-71 are configured automatically
|
||||
// but only one group of 8 should (a subband) should be active
|
||||
// TTN recommends the second sub band, 1 in a zero based count.
|
||||
// https://github.com/TheThingsNetwork/gateway-conf/blob/master/US-global_conf.json
|
||||
LMIC_selectSubBand(1);
|
||||
#endif
|
||||
|
||||
// Disable link check validation
|
||||
LMIC_setLinkCheckMode(0);
|
||||
|
||||
// TTN uses SF9 for its RX2 window.
|
||||
LMIC.dn2Dr = DR_SF9;
|
||||
|
||||
// Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library)
|
||||
LMIC_setDrTxpow(DR_SF7,14);
|
||||
|
||||
// Start job
|
||||
do_send(&sendjob);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
os_runloop_once();
|
||||
}
|
|
@ -0,0 +1,173 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to anyone
|
||||
* obtaining a copy of this document and accompanying files,
|
||||
* to do whatever they want with them without any restriction,
|
||||
* including, but not limited to, copying, modification and redistribution.
|
||||
* NO WARRANTY OF ANY KIND IS PROVIDED.
|
||||
*
|
||||
* This example sends a valid LoRaWAN packet with payload "Hello,
|
||||
* world!", using frequency and encryption settings matching those of
|
||||
* the The Things Network.
|
||||
*
|
||||
* This uses OTAA (Over-the-air activation), where where a DevEUI and
|
||||
* application key is configured, which are used in an over-the-air
|
||||
* activation procedure where a DevAddr and session keys are
|
||||
* assigned/generated for use with all further communication.
|
||||
*
|
||||
* Note: LoRaWAN per sub-band duty-cycle limitation is enforced (1% in
|
||||
* g1, 0.1% in g2), but not the TTN fair usage policy (which is probably
|
||||
* violated by this sketch when left running for longer)!
|
||||
|
||||
* To use this sketch, first register your application and device with
|
||||
* the things network, to set or generate an AppEUI, DevEUI and AppKey.
|
||||
* Multiple devices can use the same AppEUI, but each device has its own
|
||||
* DevEUI and AppKey.
|
||||
*
|
||||
* Do not forget to define the radio type correctly in config.h.
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#include <lmic.h>
|
||||
#include <hal/hal.h>
|
||||
#include <SPI.h>
|
||||
|
||||
// This EUI must be in little-endian format, so least-significant-byte
|
||||
// first. When copying an EUI from ttnctl output, this means to reverse
|
||||
// the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3,
|
||||
// 0x70.
|
||||
static const u1_t PROGMEM APPEUI[8]={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}
|
||||
|
||||
// This should also be in little endian format, see above.
|
||||
static const u1_t PROGMEM DEVEUI[8]={ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}
|
||||
|
||||
// This key should be in big endian format (or, since it is not really a
|
||||
// number but a block of memory, endianness does not really apply). In
|
||||
// practice, a key taken from ttnctl can be copied as-is.
|
||||
// The key shown here is the semtech default key.
|
||||
static const u1_t PROGMEM APPKEY[16] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C };
|
||||
void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY, 16);}
|
||||
|
||||
static uint8_t mydata[] = "Hello, world!";
|
||||
static osjob_t sendjob;
|
||||
|
||||
// Schedule TX every this many seconds (might become longer due to duty
|
||||
// cycle limitations).
|
||||
|