diff --git a/.clang-format b/.clang-format index aed95cb185e3234dfcbabe698448c75ae5c9042c..dc61d49012e2e6eadb57ddc5630e79ae309292a6 100644 --- a/.clang-format +++ b/.clang-format @@ -1,196 +1,63 @@ - -# 语言: 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 +--- +Language: Cpp +BasedOnStyle: LLVM + +AccessModifierOffset: -4 + +AlignAfterOpenBracket: DontAlign +AlignEscapedNewlinesLeft: true +# AlignOperands: true +AlignTrailingComments: true + +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false + +AlwaysBreakAfterDefinitionReturnType: false +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false + +# BinPackArguments: false +# BinPackParameters: true + +BreakBeforeBinaryOperators: false +BreakBeforeBraces: Custom +BraceWrapping: { AfterFunction: true } +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: true + +ColumnLimit: 80 + +ContinuationIndentWidth: 4 + +DerivePointerAlignment: false #XXX +DisableFormat: false +ExperimentalAutoDetectBinPacking: false #XXX +ForEachMacros: [ LIST_FOREACH, SIMPLEQ_FOREACH, CIRCLEQ_FOREACH, TAILQ_FOREACH, TAILQ_FOREACH_REVERSE, HT_FOREACH ] + +IndentCaseLabels: false +IndentFunctionDeclarationAfterType: false +IndentWidth: 4 +IndentWrappedFunctionNames: false + +KeepEmptyLinesAtTheStartOfBlocks: true +MaxEmptyLinesToKeep: 2 + +PointerAlignment: Right #XXX + +# SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +Standard: Cpp03 +TabWidth: 4 +UseTab: Always +SortIncludes: false +... diff --git "a/Lora\346\212\200\346\234\257_png.md" "b/Lora\346\212\200\346\234\257_png.md" index 6d3c3adca1aee5fe19155c28ad129819ccef79e8..53a2ff6d7a41b035b73cdec91d9c1018308b11b2 100644 --- "a/Lora\346\212\200\346\234\257_png.md" +++ "b/Lora\346\212\200\346\234\257_png.md" @@ -28,8 +28,7 @@ ChirpStack Concentratord 是一个基于 Semtech 硬件抽象层的开源 LoRa(W ## 4.1 配置步骤图 ![alt text](figures/Schematic_image.png) -**网关内运行进程** -(技术人员需要关注.) +一般在烧写镜像完成后,上电就会自动启动,技术人员需要关注。 ```shell ps aux|grep -E 'opt|leo|app|scada|redis' # 没有顺序 @@ -47,84 +46,9 @@ ps aux|grep -E 'opt|leo|app|scada|redis' /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) +## 步骤1. 配置Lora网关 -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必须指向服务器 +主要目的是配置平台地址,服务IP必须指向服务器 1) 配置方法一 /opt/leo_lora/global_conf.json @@ -147,7 +71,9 @@ servers=[ 记住网关UUID,第二步使用。 -2. 添加网关UUID +## 步骤2. 配置NS平台,添加网关和设备、协议 +添加网关: + http://121.40.51.33:7777/#/organizations/1/gateways 在页面添加网关,将网关UUID填入,服务器模板、网关模板。 @@ -155,7 +81,9 @@ http://121.40.51.33:7777/#/organizations/1/gateways 网关模板确认通道匹配。 ![alt text](figures/gateway_image.png) -### 4.3.3 验证 +添加设备: + +### 验证 尽量选择方法二,方法一由技术人员特殊情况使用。 1) 验证方法一: @@ -169,11 +97,13 @@ 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设备 +## 步骤3. 调试Lora设备并添加设备 -### 4.4.1 准备工作 +### 准备工作 需要知道Lora设备以下信息,一般在设备标签上有: - DevEUI, Lora模块二维码上有 +- APPKEY, 用AT命令设置,NS平台要保持一致 +- APPEUI, 用AT命令设置 - LoRaWAN MAC版本,1.0.2 - 区域参数修订版本, B @@ -211,39 +141,169 @@ http://121.40.51.33:7777/#/organizations/1/gateways [15:29:45.500]发→◇AT+APPSKEY? [15:29:45.536]收←◆+APPSKEY:00000000000000000000000000000000 ``` -![alt text](figures/image_config.png) -### 4.4.1 配置设备 +### Lora设备调试 -**下面按一下步骤获取相关参数:** +要保证仪表正确连接到Lora模块 +#### 1) Lora模块入网调试 +系统一上电就会自动进行入网和时间同步, 如果没有入网成功,按下面的步骤调试。 +首先是要保证APPKEY, DEVEUI两个参数正确。 -查询是否是OTAA方式: -```bash -[15:35:23.943]发→◇AT+OTAA? -□ -[15:35:23.965]收←◆+OTAA:1 +可以使用AT+APPKEY?, AT+DEVEUI? 命令查看。也可以使用AT+SYSINFO? 查看整体信息。 + +AT+SYSINFO? +```shell +/****************************************************************************************************** +softwareVersion = DTU_LORAWAN1.1_CN470_V1.0.0 +DevEui:A5 14 17 05 00 00 00 04 +AppEui:00 00 00 00 00 00 00 07 +AppKey:01 02 03 04 05 06 07 08 01 02 03 04 05 06 07 08 +channel:0x0000 0xff00 0x0000 0x0000 0x0000 0x0000 +COM:9600, E, 8, 1 + + + +-----------Device Attributes---------- +9: attrId = 1, attrCmd = [ADDR 03 REG 00 02 CRC] + + +[14:10:05.165]收←◆ + +-----------Device Model---------- +0: modelId = 3, attrId = 1, models[<8]:--------------------- + 0: acqType = 3, regAddr = [00 00], dataOffset = 3, dataLength = 4 + + + +-----------Devices---------- +0: modelId = 3, devAddr = 61 +/****************************************************************************************************** +OK ``` -返回1表明是OTAA方式, 0表示ABP方式。 +上面的设备协议等信息初始时是没有的。 -**OTAA方式激活**(必须执行,否则无法入网): + +如果确认DEVEUI,APPKEY都是正确的,那么可以查看系统状态。 +AT+STATUS? ```shell -AT+OTAA=1 # 激活方式 -AT+JOIN=OTAA,a514160b00000432,0000000000000007,01020304050607080102030405060708 #激活命令,会触发JOIN 入网操作, 后面的值依次是DEVEUI, APPEUI,APPKEY +[14:59:45.841]发→◇AT+STATUS? +[14:59:45.862]收←◆Status = 146 +txRuning = 0, txSuccess = 1, txFailed = 0, Joining = 0, JoinSucess = 1, JoinFailed = 0,linkCheck = 0, deviceTiming = 0, deviceTime = 1, mutexState = 0, rs485SampleFirst = 0 +OK ``` -激活之后,进入applications->Devices->选择你添加的设备->激活: -![Alt text](figures/image-2.png) +可以看到当前的状态,再做进一步调试。主要查看JoinSucess, deviceTime, 这两个值应该都为1, 才算是完全正常的。 -查询并设置参数,主要关注DEVEUI,APPKEY: -```bash -# 一般参数 -[16:10:41.256]发→◇AT+CLASS? -[16:10:41.280]收←◆+CLASS:0 # 表示CLASS A +#### 2) 设置485串口参数 + +```shell +# 先查看串口参数 +[08:53:09.861]发→◇AT+COM? +[08:53:10.107]收←◆COM: 9600,E,8,1 + +# 设置 +[08:53:09.861]发→◇AT+COM=9600,E,8,1 +[08:53:10.107]收←◆COM: 9600,E,8,1 +[08:53:10.107]收←◆OK +``` + +**串口设置要重启才能生效。** + +#### 3) 调试采集命令 + +```shell +[08:53:09.861]发→◇AT+DEBUG=61,03,00,00,00,02,CRC +Serial Send:61 03 00 00 00 02 CD AB +[14:33:11.830]收←◆Serial Receive:61 03 04 3F 61 47 AE 75 B3 +[08:53:10.107]收←◆OK +``` +CRC 为CRC16校验方式, 还支持CHK。 暂时不支持其他校验方式。 + +#### 4) 测试采集数据上传 + +```shell +[14:11:05.832]发→◇AT+ACQ=61,03,00,00,00,02,CRC +[14:11:05.857]收←◆Serial Send:61 03 00 00 00 02 CD AB +[14:11:07.465]收←◆Serial Receive:61 03 04 3F 61 47 AE 75 B3 +App_LoRa_Proto_SendNomalData:00 01 9d f7 c9 e5 9a 00 00 00 02 09 61 03 04 3f 61 47 ae 75 b3 f7 c6 +UpLoad frame 4 being processed +Tx, Power: 17, Freq: 476300000, DR: 4, len: 36, duration 144 +MacHdr major:0 rfu:0 mtype:4 +fCtrl rfu:0 Adr:1 AdrAckReq:0 fCtrl.Bits.Ack:0 +Send Success +OK +``` +看到Send Success 表面发送成功。也可以去NS页面确认。 + +这个功能也适合给NS平台主动采集使用,命令透传。 也就是NS平台下发AT+ACQ=61,03,00,00,00,02,CRC, 需要将其做字符串转换成 [BASE64编码https://base64.us/#](https://base64.us/#)。通过平台下发。 + +上传的指令格式: |设备类型(2B)|时间(8B)|长度(1B)|透传指令|CRC(2B) + + +**透传方式到此为止, 下面的可以不管。如果是主动上传,需要按下面配置协议和设备** -[16:11:31.641]发→◇AT+ADR? -[16:11:31.663]收←◆+ADR:0 # ADR不使能,需要使能 +#### 5) 添加协议 -[16:15:45.310]发→◇AT+ADR=1 -[16:15:45.519]收←◆OK +基本格式: AT+ATTR=attrID,CMD[<16,[ADDR],[REG],[CRC]] + +attrID 自已定义,最好所有设备保持一致。方便平台区分。CMD 为协议的命令格式,地址、寄存器(或点位)、校验方式可以ADDR,REG,CRC等代替。 + +比如,配置MODBUS协议,attrId为3. +```shell +[14:11:05.832]发→◇AT+ATTR=3,ADDR,03,REG,00,02,CRC +[14:11:07.465]收←◆OK +``` + +可以,使用AT+ATTR? 或AT+SYSINFO?查看已配置的协议 +```shell +[15:16:44.361]发→◇AT+ATTR? +[15:16:44.369]收←◆Attribute: + +-----------Device Attributes---------- +9: attrId = 3, attrCmd = [ADDR 03 REG 00 02 CRC] +OK +``` +可以看到,目前总共配置了一条协议,attrId 为3, 用于协议模版关联。 + +#### 6) 添加协议模版,定义采集数据 + +基本格式: AT+MODEL=[ADD|DEL|UPDATE] modelID,attrId,{acqType,regLen,regAddr,dataOffset,dataLen} +支持增加(ADD)、更新(UPDATE)、删除模版(DEL). +modelID: 模版的ID +attrId: 关联协议ID +{}: 大括号内定义采集类型、寄存器地址、和采集完的指令中数据的偏移和长度。 +acqType 应保证所有平台统一,方便线上统一处理。 + +```shell +[15:18:38.625]发→◇AT+MODEL=ADD,3,3,{3,2,00,00,3,4} +[15:18:38.637]收←◆OK ``` +上面表示添加一个modelID 为3, attrID 为3, 采集类型为3, 寄存器地址长度为2, 寄存器地址为00 00, 数据在采集完的指令中的偏移为3, 长度为4. + +大括号可以支持多个,但不超过8个。 + + +可以查看当前有没有已添加的采集模版。 + +```shell +[15:18:38.625]发→◇AT+MODEL? +[15:18:38.637]收←◆ + +-----------Device Model---------- +0: modelId = 3, attrId = 3, models[<8]:--------------------- + 0: acqType = 3, regAddr = [00 00], dataOffset = 3, dataLength = 4 +OK +``` + +#### 7) 添加设备 + +基本格式: AT+DEVICE=devIndex,modelId,devAddr[<8] + +devIndex: 设备索引,0~31, 因此最多支持32个设备。如果索引所在的设备已经存在,就替换原来的。 +modelID: 协议模板的ID, 关联具体的协议。 +devAddr 设备地址, 输16进制值。比如电表设备地址97, 因输入61 十六进制,地址长度不超过8字节。 + +#### 8) 设置采集周期,也是上传周期 + +AT+DUTY=300 单位秒。 diff --git a/README.md b/README.md index 4b444e0d71d6e9a6a7e79fe420ffa91aef67bd2b..953111dcbf9a8de7272111c7cc2896869c82fc5e 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ sudo chmod a+x /usr/bin/repo ```shell repo init -u http://git.leotechnology.cn/leo-iot/manifest.git -b develop --no-repo-verify +repo sync -c repo forall -c 'git lfs pull' ``` @@ -87,4 +88,5 @@ 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 + +雷优物联网平台:https://app.leotechnology.cn, leiyou leiyou2024