diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000000000000000000000000000000000000..aed95cb185e3234dfcbabe698448c75ae5c9042c --- /dev/null +++ b/.clang-format @@ -0,0 +1,196 @@ + +# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto +Language: Cpp +BasedOnStyle: LLVM +# 访问说明符(public、private等)的偏移 +AccessModifierOffset: -2 +# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行) +AlignAfterOpenBracket: Align +# 连续赋值时,对齐所有等号 +AlignConsecutiveAssignments: false +# 连续声明时,对齐所有声明的变量名 +AlignConsecutiveDeclarations: false + +AlignEscapedNewlines: Right + +# 左对齐逃脱换行(使用反斜杠换行)的反斜杠 +#AlignEscapedNewlinesLeft: true +# 水平对齐二元和三元表达式的操作数 +AlignOperands: true +# 对齐连续的尾随的注释 +AlignTrailingComments: true + +# 允许函数声明的所有参数在放在下一行 +AllowAllParametersOfDeclarationOnNextLine: false +# 允许短的块放在同一行 +AllowShortBlocksOnASingleLine: true +# 允许短的case标签放在同一行 +AllowShortCaseLabelsOnASingleLine: false +# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All +AllowShortFunctionsOnASingleLine: Empty +# 允许短的if语句保持在同一行 +AllowShortIfStatementsOnASingleLine: false +# 允许短的循环保持在同一行 +AllowShortLoopsOnASingleLine: false + +# 总是在定义返回类型后换行(deprecated) +AlwaysBreakAfterDefinitionReturnType: None +# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), +# AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义) +AlwaysBreakAfterReturnType: None +# 总是在多行string字面量前换行 +AlwaysBreakBeforeMultilineStrings: false +# 总是在template声明后换行 +AlwaysBreakTemplateDeclarations: false +# false表示函数实参要么都在同一行,要么都各自一行 +BinPackArguments: true +# false表示所有形参要么都在同一行,要么都各自一行 +BinPackParameters: false +# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效 +BraceWrapping: + # class定义后面 + AfterClass: false + # 控制语句后面 + AfterControlStatement: false + # enum定义后面 + AfterEnum: false + # 函数定义后面 + AfterFunction: true + # 命名空间定义后面 + AfterNamespace: false + # ObjC定义后面 + AfterObjCDeclaration: false + # struct定义后面 + AfterStruct: false + # union定义后面 + AfterUnion: false + + AfterExternBlock: false + # catch之前 + BeforeCatch: false + # else之前 + BeforeElse: false + # 缩进大括号 + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true + +# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行) +BreakBeforeBinaryOperators: None +# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似), +# Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似), +# Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom +# 注:这里认为语句块也属于函数 +BreakBeforeBraces: Custom +# 在三元运算符前换行 +BreakBeforeTernaryOperators: false + +# 在构造函数的初始化列表的逗号前换行 +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +# 每行字符的限制,0表示没有限制 +ColumnLimit: 120 +# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +# 构造函数的初始化列表要么都在同一行,要么都各自一行 +ConstructorInitializerAllOnOneLineOrOnePerLine: false +# 构造函数的初始化列表的缩进宽度 +ConstructorInitializerIndentWidth: 4 +# 延续的行的缩进宽度 +ContinuationIndentWidth: 4 +# 去除C++11的列表初始化的大括号{后和}前的空格 +Cpp11BracedListStyle: true +# 继承最常用的指针和引用的对齐方式 +DerivePointerAlignment: false +# 关闭格式化 +DisableFormat: false +# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental) +ExperimentalAutoDetectBinPacking: false +# 需要被解读为foreach循环而不是函数调用的宏 +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +# 对#include进行排序,匹配了某正则表达式的#include拥有对应的优先级,匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前), +# 可以定义负数优先级从而保证某些#include永远在最前面 +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +# 缩进case标签 +IndentCaseLabels: true + +IndentPPDirectives: AfterHash +# 缩进宽度 +IndentWidth: 4 +# 函数返回类型换行时,缩进函数声明或函数定义的函数名 +IndentWrappedFunctionNames: false +# 保留在块开始处的空行 +KeepEmptyLinesAtTheStartOfBlocks: false +# 开始一个块的宏的正则表达式 +MacroBlockBegin: '' +# 结束一个块的宏的正则表达式 +MacroBlockEnd: '' +# 连续空行的最大数量 +MaxEmptyLinesToKeep: 1 +# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All +NamespaceIndentation: Inner +# 使用ObjC块时缩进宽度 +ObjCBlockIndentWidth: 4 +# 在ObjC的@property后添加一个空格 +ObjCSpaceAfterProperty: false +# 在ObjC的protocol列表前添加一个空格 +ObjCSpaceBeforeProtocolList: true + + +# 在call(后对函数调用换行的penalty +PenaltyBreakBeforeFirstCallParameter: 19 +# 在一个注释中引入换行的penalty +PenaltyBreakComment: 300 +# 第一次在<<前换行的penalty +PenaltyBreakFirstLessLess: 120 +# 在一个字符串字面量中引入换行的penalty +PenaltyBreakString: 1000 +# 对于每个在行字符数限制之外的字符的penalty +PenaltyExcessCharacter: 1000000 +# 将函数的返回类型放到它自己的行的penalty +PenaltyReturnTypeOnItsOwnLine: 60 + +# 指针和引用的对齐: Left, Right, Middle +PointerAlignment: Left +# 允许重新排版注释 +ReflowComments: true +# 允许排序#include +SortIncludes: true + +# 在C风格类型转换后添加空格 +SpaceAfterCStyleCast: false + +SpaceAfterTemplateKeyword: true + +# 在赋值运算符之前添加空格 +SpaceBeforeAssignmentOperators: true +# 开圆括号之前添加一个空格: Never, ControlStatements, Always +SpaceBeforeParens: ControlStatements +# 在空的圆括号中添加空格 +SpaceInEmptyParentheses: false +# 在尾随的评论前添加的空格数(只适用于//) +SpacesBeforeTrailingComments: 2 +# 在尖括号的<后和>前添加空格 +SpacesInAngles: false +# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格 +SpacesInContainerLiterals: false +# 在C风格类型转换的括号中添加空格 +SpacesInCStyleCastParentheses: false +# 在圆括号的(后和)前添加空格 +SpacesInParentheses: false +# 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响 +SpacesInSquareBrackets: false +# 标准: Cpp03, Cpp11, Auto +Standard: Auto +# tab宽度 +TabWidth: 4 +# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always +UseTab: Never \ No newline at end of file diff --git "a/Lora\346\212\200\346\234\257_png.md" "b/Lora\346\212\200\346\234\257_png.md" index 112e397547f93a17cb5e8e2ae3b8490286c0f210..6d3c3adca1aee5fe19155c28ad129819ccef79e8 100644 --- "a/Lora\346\212\200\346\234\257_png.md" +++ "b/Lora\346\212\200\346\234\257_png.md" @@ -1,182 +1,249 @@ -# 1. 简要说明 -## 1.1 -## 1.2 专有名词 -|名称|翻译|介绍| -|---|---|---| -|ChirpStack Concentratord|集中器|ChirpStack Concentratord 是一个开源的 LoRa 集中器守护进程。它提供了一个基于 ZeroMQ 的 API,该 API 可以被一个或多个(转发器)应用程序用来与网关硬件进行交互。| -|ChirpStack MQTT Forwarder|MQTT转发器|ChirpStack MQTT Forwarder 是一个开源的 Protobuf 或 JSON MQTT 数据包转发器,它可以使用 Semtech UDP 数据包转发器或 ChirpStack Concentratord 作为网关后端。它旨在安装在每个网关上。| -|ChirpStack Gateway Bridge|ChirpStack网关桥接器|ChirpStack Gateway Bridge 是一个开源的桥梁,它将从 Semtech UDP 数据包转发器或 Semtech Basic Station 接收到的消息转换为 MQTT。它可以安装在网关上,也可以部署在云端。| -|ChirpStack|ChirpStack|ChirpStack 是一个开源的 LoRaWAN 网络服务器,可用于设置私有或公共的 LoRaWAN 网络| -|MQTT Broker||MQTT Broker是MQTT协议中的消息代理服务器,负责接收客户端(MQTT Client)发布的消息,并根据客户端的订阅关系,将消息转发给相应的订阅者| - -## 1.3 参考 -[https://github.com/chirpstack/chirpstack-docs](https://github.com/chirpstack/chirpstack-docs) - -# 2. 技术架构 -以MQTT broker为中心, 可以以不同方式与网关建立连接。主要有一下几种情况: -![alt text](figures/struct_image.png) - -# 3. ChirpStack Concentratord(ChirpStack集中器) - -## 3.1 介绍 -ChirpStack Concentratord 是一个基于 Semtech 硬件抽象层的开源 LoRa(WAN) 集中器守护进程。它提供了一个基于 ZeroMQ 的 API,该 API 可以被一个或多个应用程序用来与网关硬件进行交互。通过将硬件特定实现抽象到一个单独的守护进程中,并通过基于 ZeroMQ 的 API 暴露出来,数据包转发应用程序可以完全与网关硬件解耦。这也使得多个应用程序能够同时与网关硬件进行交互成为可能。例如,多个数据包转发器可以将数据转发到不同的 LoRaWAN 网络服务器。 -## 3.2 架构例子 -![alt text](figures/demo_image.png) - -# 4. 项目实施 - -## 4.1 配置步骤图 -![alt text](figures/Schematic_image.png) - -## 4.1 网关内进程 - -一般在烧写镜像完成后,上电就会自动启动,技术人员需要关注。 -```shell -ps aux|grep -E 'opt|leo|app|scada|redis' -# 没有顺序 -/etc/init.d/feed_watchdog.sh -/opt/scada/scada -# /opt/bridge/apps -/opt/webconfig/webconfig -/home/leo/leo_ns/leo-application-server -c /home/leo/leo_ns/leo-application-server.toml -/home/leo/leo_ns/leo-gateway-bridge -c /home/leo/leo_ns/leo-gateway-bridge.toml -/home/leo/leo_ns/leo-network-server -c /home/leo/leo_ns/leo-network-server.toml -/home/leo/leo_lora/lora_pkt_fwd -c /home/leo/leo_lora/global_conf.json -/usr/bin/redis-server 127.0.0.1:6379 -/usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf - -/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf -``` - -## 4.3 连接网关 -### 4.3.1 准备工作 - -必须安装packet-forwarder and the ChirpStack Gateway Bridge, 即: -```shell -/opt/leo_ns/leo-gateway-bridge -c /opt/leo_ns/leo-gateway-bridge.toml -/opt/leo_lora/lora_pkt_fwd -c /opt/leo_lora/global_conf.json -``` -### 4.3.2 配置网关 - -1. 配置平台地址,服务IP必须指向服务器 - -1) 配置方法一 -/opt/leo_lora/global_conf.json -```toml -# Generic MQTT authentication. -[integration.mqtt.auth.generic] -# MQTT servers. -# -# Configure one or multiple MQTT server to connect to. Each item must be in -# the following format: scheme://host:port where scheme is tcp, ssl or ws. -servers=[ - "tcp://121.40.51.33:1883", -] -``` - 2) 配置方法二 -通过网页配置: https://网关IP:8080 -![https://网关IP:8080](figures/image.png) - -上下行端口默认为1700。 - -记住网关UUID,第二步使用。 - -2. 添加网关UUID -http://121.40.51.33:7777/#/organizations/1/gateways - -在页面添加网关,将网关UUID填入,服务器模板、网关模板。 -服务器模板应该确认服务器地址正确。 -网关模板确认通道匹配。 -![alt text](figures/gateway_image.png) - -### 4.3.3 验证 -尽量选择方法二,方法一由技术人员特殊情况使用。 - -1) 验证方法一: -```bash -mosquitto_sub -v -t "+/gateway/#" -``` - -2) 验证方法二: -打开 -http://121.40.51.33:7777/#/organizations/1/gateways -查看,Last seen, 如果是Never表示还未连接上,如果是 a few seconds ago表示已经连接上了。 -![Alt text](figures/image-1.png) - -## 4.4 连接Lora设备 - -### 4.4.1 准备工作 -需要知道Lora设备以下信息,一般在设备标签上有: -- DevEUI, Lora模块二维码上有 -- LoRaWAN MAC版本,1.0.2 -- 区域参数修订版本, B - -两种激活方式,二选一(目前只支持OTAA方式): - -|激活方式 |描述 |所需参数| -|---|---|---| -|OTAA|模块通过加入网络(JOIN)操作,来获得网络安全密钥| DevEUI、AppEUI、AppKey,同时设置为OTAA激活方式。| -|ABP|模块本地已经保存网络会话密钥、应用加密密钥等,可以加入指定的 LoRaWAN 服务器 |DevAddr 、 NwkSkey 、 AppSkey,同时设置为 ABP激活| - -表格中参数不需要用户填写,由服务器分配,并由网关发命令设置到Lora设备。 - -**获取相关参数, DEVEUI,APPEUI,APPKEY, 激活设备时需要。** - -通过串口工具发送命令获取: -串口配置: 19200 N 8 1 -```shell -# OTAA 所需的参数 -[15:16:44.732]发→◇AT+DEVEUI? -[15:16:44.766]收←◆+DEVEUI:a514160b00000432 - -[15:25:45.748]发→◇AT+APPEUI? -[15:25:45.782]收←◆+APPEUI:0000000000000000 - -[15:26:03.033]发→◇AT+APPKEY? -[15:26:03.069]收←◆+APPKEY:01020304050607080102030405060708 - -# 下面是ABP方式所需的参数 -[15:28:51.587]发→◇AT+DEVADDR? -[15:28:51.617]收←◆+DEVADDR:00000000 - -[15:29:34.019]发→◇AT+NWKSKEY? -[15:29:34.055]收←◆+NWKSKEY:00000000000000000000000000000000 - -[15:29:45.500]发→◇AT+APPSKEY? -[15:29:45.536]收←◆+APPSKEY:00000000000000000000000000000000 -``` - -### 4.4.1 配置设备 - -**下面按一下步骤获取相关参数:** - - - -查询是否是OTAA方式: -```bash -[15:35:23.943]发→◇AT+OTAA? -□ -[15:35:23.965]收←◆+OTAA:1 -``` -返回1表明是OTAA方式, 0表示ABP方式。 - -**OTAA方式激活**(必须执行,否则无法入网): -```shell -AT+OTAA=1 # 激活方式 -AT+JOIN=OTAA,a514160b00000432,0000000000000007,01020304050607080102030405060708 #激活命令,会触发JOIN 入网操作, 后面的值依次是DEVEUI, APPEUI,APPKEY -``` -激活之后,进入applications->Devices->选择你添加的设备->激活: -![Alt text](figures/image-2.png) - -查询并设置参数,主要关注DEVEUI,APPKEY: -```bash -# 一般参数 -[16:10:41.256]发→◇AT+CLASS? -[16:10:41.280]收←◆+CLASS:0 # 表示CLASS A - -[16:11:31.641]发→◇AT+ADR? -[16:11:31.663]收←◆+ADR:0 # ADR不使能,需要使能 - -[16:15:45.310]发→◇AT+ADR=1 -[16:15:45.519]收←◆OK -``` +# 1. 简要说明 +## 1.1 架构 +## 1.2 专有名词 +|名称|翻译|介绍| +|---|---|---| +|ChirpStack Concentratord|集中器|ChirpStack Concentratord 是一个开源的 LoRa 集中器守护进程。它提供了一个基于 ZeroMQ 的 API,该 API 可以被一个或多个(转发器)应用程序用来与网关硬件进行交互。| +|ChirpStack MQTT Forwarder|MQTT转发器|ChirpStack MQTT Forwarder 是一个开源的 Protobuf 或 JSON MQTT 数据包转发器,它可以使用 Semtech UDP 数据包转发器或 ChirpStack Concentratord 作为网关后端。它旨在安装在每个网关上。| +|ChirpStack Gateway Bridge|ChirpStack网关桥接器|ChirpStack Gateway Bridge 是一个开源的桥梁,它将从 Semtech UDP 数据包转发器或 Semtech Basic Station 接收到的消息转换为 MQTT。它可以安装在网关上,也可以部署在云端。| +|ChirpStack|ChirpStack|ChirpStack 是一个开源的 LoRaWAN 网络服务器,可用于设置私有或公共的 LoRaWAN 网络| +|MQTT Broker|消息中转|MQTT Broker是MQTT协议中的消息代理服务器,负责接收客户端(MQTT Client)发布的消息,并根据客户端的订阅关系,将消息转发给相应的订阅者| + +## 1.3 参考 +[https://github.com/chirpstack/chirpstack-docs](https://github.com/chirpstack/chirpstack-docs) + +# 2. 技术架构 +以MQTT broker为中心, 可以以不同方式与网关建立连接。主要有一下几种情况: +![alt text](figures/struct_image.png) + +# 3. ChirpStack Concentratord(ChirpStack集中器) + +## 3.1 介绍 +ChirpStack Concentratord 是一个基于 Semtech 硬件抽象层的开源 LoRa(WAN) 集中器守护进程。它提供了一个基于 ZeroMQ 的 API,该 API 可以被一个或多个应用程序用来与网关硬件进行交互。通过将硬件特定实现抽象到一个单独的守护进程中,并通过基于 ZeroMQ 的 API 暴露出来,数据包转发应用程序可以完全与网关硬件解耦。这也使得多个应用程序能够同时与网关硬件进行交互成为可能。例如,多个数据包转发器可以将数据转发到不同的 LoRaWAN 网络服务器。 +## 3.2 架构例子 +![alt text](figures/demo_image.png) + +# 4. 项目实施 + +## 4.1 配置步骤图 +![alt text](figures/Schematic_image.png) + +**网关内运行进程** +(技术人员需要关注.) +```shell +ps aux|grep -E 'opt|leo|app|scada|redis' +# 没有顺序 +/etc/init.d/feed_watchdog.sh +/opt/scada/scada +# /opt/bridge/apps +/opt/webconfig/webconfig +/opt/leo_ns/leo-application-server -c /opt/leo_ns/leo-application-server.toml +/opt/leo_ns/leo-gateway-bridge -c /opt/leo_ns/leo-gateway-bridge.toml +/opt/leo_ns/leo-network-server -c /opt/leo_ns/leo-network-server.toml +/opt/leo_lora/lora_pkt_fwd -c /opt/leo_lora/global_conf.json +/usr/bin/redis-server 127.0.0.1:6379 +/usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf + +/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf +``` + +## 4.2 配置Lora设备 +1. 烧写 + 工具: TremoProgrammer_v0.8 + 串口波特率:921600 + 串口接线LOG_RX,LOG_TX,GND,接好后,重新上电即可开始烧写。 + ![alt text](figures/d0c24fe52279566c9535cad3c1d705f.jpg) + +2. 配置设备参数 +需要知道Lora设备以下信息,一般在设备标签上有: +- DevEUI, Lora模块二维码上有,但是设备实际值可能不一致 +- APPKEY, 用AT命令获取 +- LoRaWAN MAC版本,1.0.2 +- 区域参数修订版本, B + +**按下面方法获取相关参数, DEVEUI,APPEUI,APPKEY** + +通过串口工具发送命令获取: +串口配置: 115200 N 8 1 + +通过串口工具发送以下命令获取参数: +```shell +# OTAA 所需的参数 +[15:16:44.732]发→◇AT+DEVEUI? +[15:16:44.766]收←◆+DEVEUI:a514160b00000432 + +# 如果与二维码上不一致,需要设置进去 +[15:16:44.732]发→◇AT+DEVEUI=a514160b00000432 +[15:16:44.766]收←◆OK + +# APPEUI +[15:25:45.748]发→◇AT+APPEUI? +[15:25:45.782]收←◆+APPEUI:0000000000000000 + +[15:26:03.033]发→◇AT+APPKEY? +[15:26:03.069]收←◆+APPKEY:01020304050607080102030405060708 + +# 下面是ABP方式所需的参数,目前不支持,下面参数可以忽略 +[15:28:51.587]发→◇AT+DEVADDR? +[15:28:51.617]收←◆+DEVADDR:00000000 + +[15:29:34.019]发→◇AT+NWKSKEY? +[15:29:34.055]收←◆+NWKSKEY:00000000000000000000000000000000 + +[15:29:45.500]发→◇AT+APPSKEY? +[15:29:45.536]收←◆+APPSKEY:00000000000000000000000000000000 +``` +将DEVEUI,APPKEY记住,需要填到NS平台。 + +设置采集周期: + +```shell +#获取当前采集周期, 单位秒 +[17:13:44.657]发→◇AT+DUTY? +[17:13:44.676]收←◆AtCommandBuf = AT+DUTY? ++DUTY:100 + +# 设置采集周期为300秒一次 +[17:13:44.657]发→◇AT+DUTY=300 +[17:13:44.676]收←◆OK +``` + +配置采集指令: +```shell +[10:53:52.886]发→◇AT+ATTR=1,0,300,0,300,100,97,3,0,2,0,4 +[10:53:53.389]收←◆OK +``` +3. +## 4.3 连接网关 +### 4.3.1 准备工作 + +必须安装packet-forwarder and the ChirpStack Gateway Bridge, 即: +```shell +/opt/leo_ns/leo-gateway-bridge -c /opt/leo_ns/leo-gateway-bridge.toml +/opt/leo_lora/lora_pkt_fwd -c /opt/leo_lora/global_conf.json +``` +### 4.3.2 配置网关 + +1. 配置平台地址,服务IP必须指向服务器 + +1) 配置方法一 +/opt/leo_lora/global_conf.json +```toml +# Generic MQTT authentication. +[integration.mqtt.auth.generic] +# MQTT servers. +# +# Configure one or multiple MQTT server to connect to. Each item must be in +# the following format: scheme://host:port where scheme is tcp, ssl or ws. +servers=[ + "tcp://121.40.51.33:1883", +] +``` + 2) 配置方法二 +通过网页配置: https://网关IP:8080 +![https://网关IP:8080](figures/image.png) + +上下行端口默认为1700。 + +记住网关UUID,第二步使用。 + +2. 添加网关UUID +http://121.40.51.33:7777/#/organizations/1/gateways + +在页面添加网关,将网关UUID填入,服务器模板、网关模板。 +服务器模板应该确认服务器地址正确。 +网关模板确认通道匹配。 +![alt text](figures/gateway_image.png) + +### 4.3.3 验证 +尽量选择方法二,方法一由技术人员特殊情况使用。 + +1) 验证方法一: +```bash +mosquitto_sub -v -t "+/gateway/#" +``` + +2) 验证方法二: +打开 +http://121.40.51.33:7777/#/organizations/1/gateways +查看,Last seen, 如果是Never表示还未连接上,如果是 a few seconds ago表示已经连接上了。 +![Alt text](figures/image-1.png) + +## 4.4 连接Lora设备 + +### 4.4.1 准备工作 +需要知道Lora设备以下信息,一般在设备标签上有: +- DevEUI, Lora模块二维码上有 +- LoRaWAN MAC版本,1.0.2 +- 区域参数修订版本, B + +两种激活方式,二选一(目前只支持OTAA方式): + +|激活方式 |描述 |所需参数| +|---|---|---| +|OTAA|模块通过加入网络(JOIN)操作,来获得网络安全密钥| DevEUI、AppEUI、AppKey,同时设置为OTAA激活方式。| +|ABP|模块本地已经保存网络会话密钥、应用加密密钥等,可以加入指定的 LoRaWAN 服务器 |DevAddr 、 NwkSkey 、 AppSkey,同时设置为 ABP激活| + +表格中参数不需要用户填写,由服务器分配,并由网关发命令设置到Lora设备。 + +**获取相关参数, DEVEUI,APPEUI,APPKEY, 激活设备时需要。** + +通过串口工具发送命令获取: +串口配置: 19200 N 8 1 +```shell +# OTAA 所需的参数 +[15:16:44.732]发→◇AT+DEVEUI? +[15:16:44.766]收←◆+DEVEUI:a514160b00000432 + +[15:25:45.748]发→◇AT+APPEUI? +[15:25:45.782]收←◆+APPEUI:0000000000000000 + +[15:26:03.033]发→◇AT+APPKEY? +[15:26:03.069]收←◆+APPKEY:01020304050607080102030405060708 + +# 下面是ABP方式所需的参数 +[15:28:51.587]发→◇AT+DEVADDR? +[15:28:51.617]收←◆+DEVADDR:00000000 + +[15:29:34.019]发→◇AT+NWKSKEY? +[15:29:34.055]收←◆+NWKSKEY:00000000000000000000000000000000 + +[15:29:45.500]发→◇AT+APPSKEY? +[15:29:45.536]收←◆+APPSKEY:00000000000000000000000000000000 +``` +![alt text](figures/image_config.png) + +### 4.4.1 配置设备 + +**下面按一下步骤获取相关参数:** + + + +查询是否是OTAA方式: +```bash +[15:35:23.943]发→◇AT+OTAA? +□ +[15:35:23.965]收←◆+OTAA:1 +``` +返回1表明是OTAA方式, 0表示ABP方式。 + +**OTAA方式激活**(必须执行,否则无法入网): +```shell +AT+OTAA=1 # 激活方式 +AT+JOIN=OTAA,a514160b00000432,0000000000000007,01020304050607080102030405060708 #激活命令,会触发JOIN 入网操作, 后面的值依次是DEVEUI, APPEUI,APPKEY +``` +激活之后,进入applications->Devices->选择你添加的设备->激活: +![Alt text](figures/image-2.png) + +查询并设置参数,主要关注DEVEUI,APPKEY: +```bash +# 一般参数 +[16:10:41.256]发→◇AT+CLASS? +[16:10:41.280]收←◆+CLASS:0 # 表示CLASS A + +[16:11:31.641]发→◇AT+ADR? +[16:11:31.663]收←◆+ADR:0 # ADR不使能,需要使能 + +[16:15:45.310]发→◇AT+ADR=1 +[16:15:45.519]收←◆OK +``` diff --git a/README.md b/README.md index 3eaa30db7e6db6b258424b3e42372779ebe248c1..4b444e0d71d6e9a6a7e79fe420ffa91aef67bd2b 100644 --- a/README.md +++ b/README.md @@ -1,182 +1,90 @@ -# 1. 简要说明 -## 1.1 架构 -## 1.2 专有名词 -|名称|翻译|介绍| -|---|---|---| -|ChirpStack Concentratord|集中器|ChirpStack Concentratord 是一个开源的 LoRa 集中器守护进程。它提供了一个基于 ZeroMQ 的 API,该 API 可以被一个或多个(转发器)应用程序用来与网关硬件进行交互。| -|ChirpStack MQTT Forwarder|MQTT转发器|ChirpStack MQTT Forwarder 是一个开源的 Protobuf 或 JSON MQTT 数据包转发器,它可以使用 Semtech UDP 数据包转发器或 ChirpStack Concentratord 作为网关后端。它旨在安装在每个网关上。| -|ChirpStack Gateway Bridge|ChirpStack网关桥接器|ChirpStack Gateway Bridge 是一个开源的桥梁,它将从 Semtech UDP 数据包转发器或 Semtech Basic Station 接收到的消息转换为 MQTT。它可以安装在网关上,也可以部署在云端。| -|ChirpStack|ChirpStack|ChirpStack 是一个开源的 LoRaWAN 网络服务器,可用于设置私有或公共的 LoRaWAN 网络| -|MQTT Broker|消息中转|MQTT Broker是MQTT协议中的消息代理服务器,负责接收客户端(MQTT Client)发布的消息,并根据客户端的订阅关系,将消息转发给相应的订阅者| - -## 1.3 参考 -[https://github.com/chirpstack/chirpstack-docs](https://github.com/chirpstack/chirpstack-docs) - -# 2. 技术架构 -以MQTT broker为中心, 可以以不同方式与网关建立连接。主要有一下几种情况: -![alt text](figures/struct_image.png) - -# 3. ChirpStack Concentratord(ChirpStack集中器) - -## 3.1 介绍 -ChirpStack Concentratord 是一个基于 Semtech 硬件抽象层的开源 LoRa(WAN) 集中器守护进程。它提供了一个基于 ZeroMQ 的 API,该 API 可以被一个或多个应用程序用来与网关硬件进行交互。通过将硬件特定实现抽象到一个单独的守护进程中,并通过基于 ZeroMQ 的 API 暴露出来,数据包转发应用程序可以完全与网关硬件解耦。这也使得多个应用程序能够同时与网关硬件进行交互成为可能。例如,多个数据包转发器可以将数据转发到不同的 LoRaWAN 网络服务器。 -## 3.2 架构例子 -![alt text](figures/demo_image.png) - -# 4. 项目实施 - -## 4.1 配置步骤图 -![alt text](figures/Schematic_image.png) - -## 4.1 网关内进程 - -一般在烧写镜像完成后,上电就会自动启动,技术人员需要关注。 -```shell -ps aux|grep -E 'opt|leo|app|scada|redis' -# 没有顺序 -/etc/init.d/feed_watchdog.sh -/opt/scada/scada -# /opt/bridge/apps -/opt/webconfig/webconfig -/opt/leo_ns/leo-application-server -c /opt/leo_ns/leo-application-server.toml -/opt/leo_ns/leo-gateway-bridge -c /opt/leo_ns/leo-gateway-bridge.toml -/opt/leo_ns/leo-network-server -c /opt/leo_ns/leo-network-server.toml -/opt/leo_lora/lora_pkt_fwd -c /opt/leo_lora/global_conf.json -/usr/bin/redis-server 127.0.0.1:6379 -/usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf - -/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf -``` - -## 4.3 连接网关 -### 4.3.1 准备工作 - -必须安装packet-forwarder and the ChirpStack Gateway Bridge, 即: -```shell -/opt/leo_ns/leo-gateway-bridge -c /opt/leo_ns/leo-gateway-bridge.toml -/opt/leo_lora/lora_pkt_fwd -c /opt/leo_lora/global_conf.json -``` -### 4.3.2 配置网关 - -1. 配置平台地址,服务IP必须指向服务器 - -1) 配置方法一 -/opt/leo_lora/global_conf.json -```toml -# Generic MQTT authentication. -[integration.mqtt.auth.generic] -# MQTT servers. -# -# Configure one or multiple MQTT server to connect to. Each item must be in -# the following format: scheme://host:port where scheme is tcp, ssl or ws. -servers=[ - "tcp://121.40.51.33:1883", -] -``` - 2) 配置方法二 -通过网页配置: https://网关IP:8080 -![https://网关IP:8080](figures/image.png) - -上下行端口默认为1700。 - -记住网关UUID,第二步使用。 - -2. 添加网关UUID -http://121.40.51.33:7777/#/organizations/1/gateways - -在页面添加网关,将网关UUID填入,服务器模板、网关模板。 -服务器模板应该确认服务器地址正确。 -网关模板确认通道匹配。 -![alt text](figures/gateway_image.png) - -### 4.3.3 验证 -尽量选择方法二,方法一由技术人员特殊情况使用。 - -1) 验证方法一: -```bash -mosquitto_sub -v -t "+/gateway/#" -``` - -2) 验证方法二: -打开 -http://121.40.51.33:7777/#/organizations/1/gateways -查看,Last seen, 如果是Never表示还未连接上,如果是 a few seconds ago表示已经连接上了。 -![Alt text](figures/image-1.png) - -## 4.4 连接Lora设备 - -### 4.4.1 准备工作 -需要知道Lora设备以下信息,一般在设备标签上有: -- DevEUI, Lora模块二维码上有 -- LoRaWAN MAC版本,1.0.2 -- 区域参数修订版本, B - -两种激活方式,二选一(目前只支持OTAA方式): - -|激活方式 |描述 |所需参数| -|---|---|---| -|OTAA|模块通过加入网络(JOIN)操作,来获得网络安全密钥| DevEUI、AppEUI、AppKey,同时设置为OTAA激活方式。| -|ABP|模块本地已经保存网络会话密钥、应用加密密钥等,可以加入指定的 LoRaWAN 服务器 |DevAddr 、 NwkSkey 、 AppSkey,同时设置为 ABP激活| - -表格中参数不需要用户填写,由服务器分配,并由网关发命令设置到Lora设备。 - -**获取相关参数, DEVEUI,APPEUI,APPKEY, 激活设备时需要。** - -通过串口工具发送命令获取: -串口配置: 19200 N 8 1 -```shell -# OTAA 所需的参数 -[15:16:44.732]发→◇AT+DEVEUI? -[15:16:44.766]收←◆+DEVEUI:a514160b00000432 - -[15:25:45.748]发→◇AT+APPEUI? -[15:25:45.782]收←◆+APPEUI:0000000000000000 - -[15:26:03.033]发→◇AT+APPKEY? -[15:26:03.069]收←◆+APPKEY:01020304050607080102030405060708 - -# 下面是ABP方式所需的参数 -[15:28:51.587]发→◇AT+DEVADDR? -[15:28:51.617]收←◆+DEVADDR:00000000 - -[15:29:34.019]发→◇AT+NWKSKEY? -[15:29:34.055]收←◆+NWKSKEY:00000000000000000000000000000000 - -[15:29:45.500]发→◇AT+APPSKEY? -[15:29:45.536]收←◆+APPSKEY:00000000000000000000000000000000 -``` - -### 4.4.1 配置设备 - -**下面按一下步骤获取相关参数:** - - - -查询是否是OTAA方式: -```bash -[15:35:23.943]发→◇AT+OTAA? -□ -[15:35:23.965]收←◆+OTAA:1 -``` -返回1表明是OTAA方式, 0表示ABP方式。 - -**OTAA方式激活**(必须执行,否则无法入网): -```shell -AT+OTAA=1 # 激活方式 -AT+JOIN=OTAA,a514160b00000432,0000000000000007,01020304050607080102030405060708 #激活命令,会触发JOIN 入网操作, 后面的值依次是DEVEUI, APPEUI,APPKEY -``` -激活之后,进入applications->Devices->选择你添加的设备->激活: -![Alt text](figures/image-2.png) - -查询并设置参数,主要关注DEVEUI,APPKEY: -```bash -# 一般参数 -[16:10:41.256]发→◇AT+CLASS? -[16:10:41.280]收←◆+CLASS:0 # 表示CLASS A - -[16:11:31.641]发→◇AT+ADR? -[16:11:31.663]收←◆+ADR:0 # ADR不使能,需要使能 - -[16:15:45.310]发→◇AT+ADR=1 -[16:15:45.519]收←◆OK -``` +# 代码下载 +1. 准备工作 +- 需要Ubuntu 18.0以上的系统。 +- 安装了Python3.8.0以上的版本 + +2. 第一次下载代码需要下载repo工具 + +```shell +sudo curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o /usr/bin/repo +sudo chmod a+x /usr/bin/repo +``` + +2. 下载代码, master表示分支 + +```shell +repo init -u http://git.leotechnology.cn/leo-iot/manifest.git -b develop --no-repo-verify +repo forall -c 'git lfs pull' +``` + +3. 编译环境 +```shell +buildtools/env_setup.py +``` + +# 代码编译 + +```shell +./build.sh --product-name=DTU +# 如果没有修改CMakeLists.txt 可以加上 --skip-cmake +``` +整个编译过程包括cmake, make + +参数: +--product-name: 产品名称,即vendor下面的目录 +--jobs: 多少线程同时编译,默认4 +--skip-cmake: 跳过cmake过程 + +编译结果在out/DTU/ 下面。 + +# 提交代码 +单个仓用git提交即可。每次修改应该对应一个issue, 在gitee仓库创建issue,会有一个issue编号, +提交代码时关联issue即可。 + +例如,创建了issue https://gitee.com/leo-iot/DTU/issues/IAEUJN +```shell +git commit -a -s -m "#IAEUJN 移植CMake编译" +git push origin_iot develop +``` +在解决问题过程中,可以把过程写到issue评论区,方便大家共同参考。 + +# 代码框图 +![alt text](figures/framework.png) + +# Lora技术 + +参考 [Lora架构与实施方案](Lora技术_png.md) + +chirpstack :[chirpstack技术文档](https://www.chirpstack.io/docs/) + +# 老版本记录 +sudo ./build.sh + +sudo ./build.sh -m pack_rootfs + +sudo ./build.sh pack + +# 进入 + +sudo ./mount.sh -m ubuntu/ + +sudo make PRODUCT=G4 + +# Lora烧录 +使用Tero programer +烧写波特率: 921600 +调试波特率: 115200 + +COM通信: +波特率:19200 + +# 烧录开发板 + +GW_M1000_D00FF +密码: 20232023 + +ssh root@192.168.201.1 leo2023 + +http://192.168.110.14:8080/#/home +用户名:admin, 密码:leo2023 +雷优物联网平台:https://app.leotechnology.cn, leiyou leiyou2024 \ No newline at end of file diff --git a/chirpstack-docs/src/chirpstack-concentratord/index.md b/chirpstack-docs/src/chirpstack-concentratord/index.md index 270695dbee61685bafdf51b04b7cd7c4efe98c86..325703b616235208c37606e4e7b85b4b27adb215 100644 --- a/chirpstack-docs/src/chirpstack-concentratord/index.md +++ b/chirpstack-docs/src/chirpstack-concentratord/index.md @@ -21,7 +21,7 @@ Semtech HALs: ## Architecture example -```dot process +```dot digraph G { node [shape=record,fontsize="10"]; edge [fontsize="10"]; diff --git a/figures/d0c24fe52279566c9535cad3c1d705f.jpg b/figures/d0c24fe52279566c9535cad3c1d705f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edbb18a96179e4a4926af685490bd9f4ac0f15e7 Binary files /dev/null and b/figures/d0c24fe52279566c9535cad3c1d705f.jpg differ diff --git a/figures/framework.png b/figures/framework.png new file mode 100644 index 0000000000000000000000000000000000000000..e61fb035731b5b23d90f91c1d600ec629a6d88bf Binary files /dev/null and b/figures/framework.png differ diff --git a/figures/image_config.png b/figures/image_config.png new file mode 100644 index 0000000000000000000000000000000000000000..bd74467be8a115960158dbdafdfbeda41be975c6 Binary files /dev/null and b/figures/image_config.png differ