Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

162 linhas
5.9 KiB

  1. # Copyright 2021 John-Mark Gurney.
  2. #
  3. # Redistribution and use in source and binary forms, with or without
  4. # modification, are permitted provided that the following conditions
  5. # are met:
  6. # 1. Redistributions of source code must retain the above copyright
  7. # notice, this list of conditions and the following disclaimer.
  8. # 2. Redistributions in binary form must reproduce the above copyright
  9. # notice, this list of conditions and the following disclaimer in the
  10. # documentation and/or other materials provided with the distribution.
  11. #
  12. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  13. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  14. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  15. # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  16. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  17. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  18. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  19. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  20. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  21. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  22. # SUCH DAMAGE.
  23. #
  24. .if $(.OBJDIR) == $(.CURDIR)
  25. .error Need to set MAKEOBJDIR.
  26. .endif
  27. PLATFORM != uname -s
  28. .if $(PLATFORM) == "Darwin"
  29. SOEXT=dylib
  30. .else
  31. .error Unsupported platform: $(PLATFORM)
  32. .endif
  33. PROGS = lora.gw lora.irr
  34. SRCS.lora.gw = main.c
  35. SRCS.lora.gw+= $(SRCS.NODE151)
  36. SRCS.lora.gw+= $(SRCS.USB_CDC)
  37. SRCS.lora.gw+= $(SRCS.USB)
  38. SRCS.lora.irr = irr_main.c
  39. SRCS.lora.irr+= comms.c
  40. SRCS.lora.irr+= $(STROBE_SRCS)
  41. SRCS.lora.irr+= $(SRCS.NODE151)
  42. CFLAGS+= -I$(.CURDIR)
  43. CFLAGS+= -g
  44. #CFLAGS+= -DNDEBUG
  45. CFLAGS+= -I$(.OBJDIR) # for shared_key.h
  46. WITH_STROBE=yes
  47. # XXX - bsd.mkopt.mk only allows an option to have one upstream, I want
  48. # more.
  49. WITH_HAL_INIT=yes
  50. WITH_SX1276=yes
  51. WITH_NODE151=yes
  52. WITH_USB_CDC=yes
  53. .include <mk/boards.mk>
  54. CFLAGS+= -Werror -Wall
  55. LIBSYOTE_TEST_SRCS= comms.c strobe.c x25519.c
  56. LIBSYOTE_TEST_OBJS= $(LIBSYOTE_TEST_SRCS:C/.c$/.no/)
  57. LIBSYOTE_TEST = libsyote_test.$(SOEXT)
  58. $(LIBSYOTE_TEST): $(LIBSYOTE_TEST_OBJS)
  59. $(CC) -shared -o $@ $(.ALLSRC)
  60. DEPENDS = .test_deps
  61. # Temporarily disabled as OpenOCD can't program EEPROM on the STM32L1.
  62. # This could be used to add the data to flash.
  63. rng_save.c: Makefile
  64. ( echo '#include <strobe_rng_init.h>'; \
  65. echo 'const rng_word_t rng_save[roundup(32, sizeof(rng_word_t)) / sizeof(rng_word_t)] __attribute__ ((section (".eeprom"))) = {'; \
  66. dd if=/dev/random bs=32 count=1 | hexdump -e '4/4 " %3u," "\n"'; \
  67. echo '};' \
  68. ) > $@ || (rm $@ && false)
  69. .test_deps: $(LIBSYOTE_TEST_SRCS)
  70. $(CC) $(CFLAGS) $(.ALLSRC) -MM | sed -e 's/\.o:/\.no:/' > $@ || (rm -f $@ && false)
  71. .PHONY: runtests
  72. runtests: Makefile syote_comms.py lora.py loraserv.py multicast.py $(LIBSYOTE_TEST) $(LIBSYOTE_TEST_SRCS)
  73. ls $(.ALLSRC) | entr sh -c '(cd $(.CURDIR) && $(MAKE) $(.MAKEFLAGS) $(LIBSYOTE_TEST)) && ((PYTHONPATH="$(.CURDIR)" python3 -m coverage run -m unittest lora multicast loraserv syote_comms && coverage report --omit=$(.CURDIR)/p/\* -m -i) 2>&1 | head -n 30)'
  74. .if empty(IRR_KEY) && exists($(.CURDIR)/.irr_key)
  75. IRR_KEY!= cat $(.CURDIR)/.irr_key
  76. .endif
  77. .PHONY: irrigation_key
  78. irrigation_key:
  79. @LANG=C tr -c -d a-zA-Z0-9 < /dev/urandom | dd bs=1 of=$(.CURDIR)/.irr_key count=32 2>/dev/null
  80. @echo 'Irrgation key created and put into .irr_key.'
  81. # make this a phony target so it's always run
  82. # dependancies will only be made when it's updated
  83. .PHONY: $(.OBJDIR)/shared_key.h
  84. $(.OBJDIR)/shared_key.h:
  85. @if [ "$(IRR_KEY)" = "" ]; then echo 'Must provide IRR_KEY make variable or have a non-empty file ".irr_key".'; false; fi
  86. @echo 'static uint8_t shared_key[] = {' $$(python3 -c 'import sys; print(", ".join(str(x) for x in sys.argv[1].encode("utf-8")))' $(IRR_KEY) ) "};" > shared_key.h.tmp
  87. @echo 'static struct pktbuf shared_key_buf = (struct pktbuf){ .pkt = shared_key, .pktlen = sizeof shared_key, };' >> shared_key.h.tmp
  88. (cmp shared_key.h.tmp shared_key.h >/dev/null 2>&1 && rm shared_key.h.tmp) || mv shared_key.h.tmp shared_key.h
  89. # hard coded dependancy for when "make depend" has not been run.
  90. irr_main.o: $(.OBJDIR)/shared_key.h
  91. .include <mk/mu.progs.mk>
  92. ########################################################
  93. # External Source Code #
  94. ########################################################
  95. STROBE_NAME = strobe
  96. STROBE_REPO = https://git.code.sf.net/p/strobe/code
  97. STROBE_BRANCH = master
  98. LORAMAC_NAME = loramac
  99. LORAMAC_REPO = https://github.com/Lora-net/LoRaMac-node.git
  100. LORAMAC_BRANCH = master
  101. .for module in STROBE LORAMAC
  102. .PHONY: init-$($(module)_NAME)
  103. init-$($(module)_NAME):
  104. cd $(.CURDIR) && git subtree add -P $($(module)_NAME) --squash $($(module)_REPO) $($(module)_BRANCH)
  105. .PHONY: update-$($(module)_NAME)
  106. update-$($(module)_NAME):
  107. cd $(.CURDIR) && git subtree pull -P $($(module)_NAME) --squash $($(module)_REPO) $($(module)_BRANCH)
  108. .endfor
  109. ########################################################
  110. # Diagrams #
  111. ########################################################
  112. # imported from fbsdembdev
  113. #
  114. # Uses Graph Easy to convert to ASCII art:
  115. # https://github.com/ironcamel/Graph-Easy
  116. .SUFFIXES: .getxt .diag .html
  117. .getxt.diag: box.sh
  118. graph-easy < $< | sh $(.CURDIR)/box.sh > $@
  119. .diag.html:
  120. (cat $<; echo; echo '<!-- Markdeep: --><style class="fallback">body{visibility:hidden;white-space:pre;font-family:monospace}</style><script src="markdeep.min.js" charset="utf-8"></script><script src="https://casual-effects.com/markdeep/latest/markdeep.min.js" charset="utf-8"></script><script>window.alreadyProcessedMarkdeep||(document.body.style.visibility="visible")</script>') > $@
  121. DIAG?=diag
  122. test-diag:
  123. ls $(.CURDIR)/box.sh $(.CURDIR)/$(DIAG).getxt $(.CURDIR)/Makefile | entr sh -c 'cd $(.CURDIR) && $(MAKE) $(.MAKEFLAGS) $(DIAG).diag && cat $(.OBJDIR)/$(DIAG).diag'