[{"data":1,"prerenderedAt":846},["ShallowReactive",2],{"wiki-page-/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa":3,"wiki-doc-items-/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa":801,"language-switcher-data-/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa":830,"wiki-i18n-paths-/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa":845},{"id":4,"title":5,"body":6,"canonicalPath":782,"chapter":783,"chapterSort":784,"date":785,"description":35,"docI18nKey":786,"docKey":787,"docRoot":788,"docTitle":789,"extension":790,"i18nKey":791,"isBlogPost":792,"isWikiDoc":80,"isWikiIndex":792,"layout":793,"legacyPath":793,"locale":794,"localeSlug":795,"meta":796,"navigation":80,"path":782,"seo":797,"sourcePath":798,"sourceStem":791,"stem":799,"wikiDepth":60,"__hash__":800},"content/_i18n/en-us/wiki/2021-09-16-OpenWrt编译教学/ch3-插件开发.md","Plugin development",{"type":7,"value":8,"toc":779},"minimark",[9,14,26,36,40,49,415,424,541,546,549,564,775],[10,11,13],"h3",{"id":12},"the-source-code-of-a-plugin-is-composed-of-files-openwrt-plugins-generally-use-an-mvc-structure","The source code of a plugin is composed of files. OpenWrt plugins generally use an \"MVC\" structure:",[15,16,17],"ol",{},[18,19,20,21,25],"li",{},"Configuration file\nLocated at ",[22,23,24],"code",{},"/etc/config/*",":",[27,28,33],"pre",{"className":29,"code":31,"language":32},[30],"language-text","config server\noption username ''\noption password ''\n","text",[22,34,31],{"__ignoreMap":35},"",[37,38,39],"p",{},"Two pending input configurations have been generated in the sample file. A form page is now needed to manage them.",[15,41,43],{"start":42},2,[18,44,45,46,25],{},"CBI file\nGenerally located in the directory ",[22,47,48],{},"/usr/lib/lua/luci/model/cbi/*.lua",[27,50,54],{"className":51,"code":52,"language":53,"meta":35,"style":35},"language-lua shiki shiki-themes github-light github-dark","require(\"luci.sys\")\n\n-- 页面标题和描述\nm = Map(\"bargo\", translate(\"Bargo Client\"), translate(\"Configure Bargo client, Powered By Sinchie.\"))\n\n-- 读取配置文件\ns = m:section(TypedSection, \"server\", \"\")\ns.addremove = false\ns.anonymous = true\n\n-- 是否启用的选择框\nenable = s:option(Flag, \"enable\", translate(\"Enable\"))\n-- 映射我们的配置到输入框\nusername = s:option(Value, \"username\", translate(\"Username\"))\npass = s:option(Value, \"password\", translate(\"Password\"))\npass.password = true\n\n-- 如果点击了保存按钮\nlocal apply = luci.http.formvalue(\"cbi.apply\")\nif apply then\n    -- 这里是调用我们自己的程序脚本，后面会讲怎么来写这个脚本\n    io.popen(\"/etc/init.d/bargo restart > /dev/null &\")\nend\n\nreturn m\n","lua",[22,55,56,76,82,89,131,136,142,172,187,200,205,211,244,250,281,311,324,329,335,365,376,382,395,401,406],{"__ignoreMap":35},[57,58,61,65,69,73],"span",{"class":59,"line":60},"line",1,[57,62,64],{"class":63},"sj4cs","require",[57,66,68],{"class":67},"sVt8B","(",[57,70,72],{"class":71},"sZZnC","\"luci.sys\"",[57,74,75],{"class":67},")\n",[57,77,78],{"class":59,"line":42},[57,79,81],{"emptyLinePlaceholder":80},true,"\n",[57,83,85],{"class":59,"line":84},3,[57,86,88],{"class":87},"sJ8bj","-- 页面标题和描述\n",[57,90,92,95,99,102,104,107,110,113,115,118,121,123,125,128],{"class":59,"line":91},4,[57,93,94],{"class":67},"m ",[57,96,98],{"class":97},"szBVR","=",[57,100,101],{"class":63}," Map",[57,103,68],{"class":67},[57,105,106],{"class":71},"\"bargo\"",[57,108,109],{"class":67},", ",[57,111,112],{"class":63},"translate",[57,114,68],{"class":67},[57,116,117],{"class":71},"\"Bargo Client\"",[57,119,120],{"class":67},"), ",[57,122,112],{"class":63},[57,124,68],{"class":67},[57,126,127],{"class":71},"\"Configure Bargo client, Powered By Sinchie.\"",[57,129,130],{"class":67},"))\n",[57,132,134],{"class":59,"line":133},5,[57,135,81],{"emptyLinePlaceholder":80},[57,137,139],{"class":59,"line":138},6,[57,140,141],{"class":87},"-- 读取配置文件\n",[57,143,145,148,150,154,156,159,162,165,167,170],{"class":59,"line":144},7,[57,146,147],{"class":67},"s ",[57,149,98],{"class":97},[57,151,153],{"class":152},"sScJk"," m",[57,155,25],{"class":67},[57,157,158],{"class":63},"section",[57,160,161],{"class":67},"(TypedSection, ",[57,163,164],{"class":71},"\"server\"",[57,166,109],{"class":67},[57,168,169],{"class":71},"\"\"",[57,171,75],{"class":67},[57,173,175,178,181,184],{"class":59,"line":174},8,[57,176,177],{"class":67},"s.",[57,179,180],{"class":152},"addremove",[57,182,183],{"class":97}," =",[57,185,186],{"class":63}," false\n",[57,188,190,192,195,197],{"class":59,"line":189},9,[57,191,177],{"class":67},[57,193,194],{"class":152},"anonymous",[57,196,183],{"class":97},[57,198,199],{"class":63}," true\n",[57,201,203],{"class":59,"line":202},10,[57,204,81],{"emptyLinePlaceholder":80},[57,206,208],{"class":59,"line":207},11,[57,209,210],{"class":87},"-- 是否启用的选择框\n",[57,212,214,217,219,222,224,227,230,233,235,237,239,242],{"class":59,"line":213},12,[57,215,216],{"class":67},"enable ",[57,218,98],{"class":97},[57,220,221],{"class":152}," s",[57,223,25],{"class":67},[57,225,226],{"class":63},"option",[57,228,229],{"class":67},"(Flag, ",[57,231,232],{"class":71},"\"enable\"",[57,234,109],{"class":67},[57,236,112],{"class":63},[57,238,68],{"class":67},[57,240,241],{"class":71},"\"Enable\"",[57,243,130],{"class":67},[57,245,247],{"class":59,"line":246},13,[57,248,249],{"class":87},"-- 映射我们的配置到输入框\n",[57,251,253,256,258,260,262,264,267,270,272,274,276,279],{"class":59,"line":252},14,[57,254,255],{"class":67},"username ",[57,257,98],{"class":97},[57,259,221],{"class":152},[57,261,25],{"class":67},[57,263,226],{"class":63},[57,265,266],{"class":67},"(Value, ",[57,268,269],{"class":71},"\"username\"",[57,271,109],{"class":67},[57,273,112],{"class":63},[57,275,68],{"class":67},[57,277,278],{"class":71},"\"Username\"",[57,280,130],{"class":67},[57,282,284,287,289,291,293,295,297,300,302,304,306,309],{"class":59,"line":283},15,[57,285,286],{"class":67},"pass ",[57,288,98],{"class":97},[57,290,221],{"class":152},[57,292,25],{"class":67},[57,294,226],{"class":63},[57,296,266],{"class":67},[57,298,299],{"class":71},"\"password\"",[57,301,109],{"class":67},[57,303,112],{"class":63},[57,305,68],{"class":67},[57,307,308],{"class":71},"\"Password\"",[57,310,130],{"class":67},[57,312,314,317,320,322],{"class":59,"line":313},16,[57,315,316],{"class":67},"pass.",[57,318,319],{"class":152},"password",[57,321,183],{"class":97},[57,323,199],{"class":63},[57,325,327],{"class":59,"line":326},17,[57,328,81],{"emptyLinePlaceholder":80},[57,330,332],{"class":59,"line":331},18,[57,333,334],{"class":87},"-- 如果点击了保存按钮\n",[57,336,338,341,344,346,349,352,355,358,360,363],{"class":59,"line":337},19,[57,339,340],{"class":97},"local",[57,342,343],{"class":67}," apply ",[57,345,98],{"class":97},[57,347,348],{"class":67}," luci.",[57,350,351],{"class":152},"http",[57,353,354],{"class":67},".",[57,356,357],{"class":63},"formvalue",[57,359,68],{"class":67},[57,361,362],{"class":71},"\"cbi.apply\"",[57,364,75],{"class":67},[57,366,368,371,373],{"class":59,"line":367},20,[57,369,370],{"class":97},"if",[57,372,343],{"class":67},[57,374,375],{"class":97},"then\n",[57,377,379],{"class":59,"line":378},21,[57,380,381],{"class":87},"    -- 这里是调用我们自己的程序脚本，后面会讲怎么来写这个脚本\n",[57,383,385,388,390,393],{"class":59,"line":384},22,[57,386,387],{"class":63},"    io.popen",[57,389,68],{"class":67},[57,391,392],{"class":71},"\"/etc/init.d/bargo restart > /dev/null &\"",[57,394,75],{"class":67},[57,396,398],{"class":59,"line":397},23,[57,399,400],{"class":97},"end\n",[57,402,404],{"class":59,"line":403},24,[57,405,81],{"emptyLinePlaceholder":80},[57,407,409,412],{"class":59,"line":408},25,[57,410,411],{"class":97},"return",[57,413,414],{"class":67}," m\n",[15,416,417],{"start":84},[18,418,419,420,423],{},"controller file\nGenerally located in the system's ",[22,421,422],{},"/usr/lib/lua/luci/controller/*.lua",", after creating the controller file, you can create a menu entry in the web interface. The script structure is as follows:",[27,425,427],{"className":51,"code":426,"language":53,"meta":35,"style":35},"-- module 名称\nmodule(\"luci.controller.bargo\", package.seeall)\n\nfunction index()\n    -- 4 个参数介绍\n    -- 1.后台访问路径 admin/services/bargo \n    -- 2.target 动作（call, template, cbi）call 是调用自定义函数，template 调用 html 模板，cbi 调用 openwrt 的公共表单页面\n    -- 3.菜单名称 \n    -- 4.排序\n    entry({\"admin\", \"services\", \"bargo\"}, cbi(\"bargo\"), _(\"Bargo Client\"), 1)\nend\n",[22,428,429,434,451,455,466,471,476,481,486,491,537],{"__ignoreMap":35},[57,430,431],{"class":59,"line":60},[57,432,433],{"class":87},"-- module 名称\n",[57,435,436,439,441,444,446,449],{"class":59,"line":42},[57,437,438],{"class":63},"module",[57,440,68],{"class":67},[57,442,443],{"class":71},"\"luci.controller.bargo\"",[57,445,109],{"class":67},[57,447,448],{"class":63},"package.seeall",[57,450,75],{"class":67},[57,452,453],{"class":59,"line":84},[57,454,81],{"emptyLinePlaceholder":80},[57,456,457,460,463],{"class":59,"line":91},[57,458,459],{"class":97},"function",[57,461,462],{"class":152}," index",[57,464,465],{"class":67},"()\n",[57,467,468],{"class":59,"line":133},[57,469,470],{"class":87},"    -- 4 个参数介绍\n",[57,472,473],{"class":59,"line":138},[57,474,475],{"class":87},"    -- 1.后台访问路径 admin/services/bargo \n",[57,477,478],{"class":59,"line":144},[57,479,480],{"class":87},"    -- 2.target 动作（call, template, cbi）call 是调用自定义函数，template 调用 html 模板，cbi 调用 openwrt 的公共表单页面\n",[57,482,483],{"class":59,"line":174},[57,484,485],{"class":87},"    -- 3.菜单名称 \n",[57,487,488],{"class":59,"line":189},[57,489,490],{"class":87},"    -- 4.排序\n",[57,492,493,496,499,502,504,507,509,511,514,517,519,521,523,526,528,530,532,535],{"class":59,"line":202},[57,494,495],{"class":63},"    entry",[57,497,498],{"class":67},"({",[57,500,501],{"class":71},"\"admin\"",[57,503,109],{"class":67},[57,505,506],{"class":71},"\"services\"",[57,508,109],{"class":67},[57,510,106],{"class":71},[57,512,513],{"class":67},"}, ",[57,515,516],{"class":63},"cbi",[57,518,68],{"class":67},[57,520,106],{"class":71},[57,522,120],{"class":67},[57,524,525],{"class":63},"_",[57,527,68],{"class":67},[57,529,117],{"class":71},[57,531,120],{"class":67},[57,533,534],{"class":63},"1",[57,536,75],{"class":67},[57,538,539],{"class":59,"line":207},[57,540,400],{"class":97},[542,543,545],"h5",{"id":544},"create-the-build-file-makefile","Create the build file Makefile",[37,547,548],{},"To create an OpenWRT compilation Makefile, follow these steps:",[15,550,551,554,557],{},[18,552,553],{},"Install the OpenWRT SDK and set up environment variables.",[18,555,556],{},"Create a new folder in any directory to store your application code.",[18,558,559,560,563],{},"In this directory, create the ",[22,561,562],{},"Makefile"," file and fill in the corresponding content according to the following structure:",[27,565,569],{"className":566,"code":567,"language":568,"meta":35,"style":35},"language-makefile shiki shiki-themes github-light github-dark","\n# 这是注释，可以忽略或者修改\n\ninclude $(TOPDIR)/rules.mk # 引入OpenWRT编译规则\nPKG_NAME:=myapp # 应用程序的名称，建议使用小写字母和数字组合\nPKG_VERSION:=1.0 # 应用程序的版本号\nPKG_RELEASE:=1 # 应用程序的发行版本号\n\ninclude $(INCLUDE_DIR)/package.mk # 引入OpenWRT中提供的软件包模板\ndefine Package/myapp # 描述应用程序的信息\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=My Application\n  DEPENDS:=+libopenssl +libcurl +libjson-c \nendef\n\ndefine Package/myapp/description # 描述应用程序功能和用途\n My Application is a simple program that does something useful.\nendef\n\ndefine Build/Prepare # 准备构建应用程序所需的源码和资源\n\n# 此处可以添加自定义命令，用于准备应用程序的源码和资源\nendef\n\ndefine Build/Configure # 配置应用程序的编译选项\n\n# 此处可以添加自定义命令，用于配置应用程序的编译选项\nendef\n\ndefine Build/Compile # 编译应用程序的源码\n\n# 此处可以添加自定义命令，用于编译应用程序的源码\nendef\n\ndefine Package/myapp/install # 安装应用程序所需的文件和目录\n$(INSTALL_DIR) $(1)/usr/bin # 创建安装目录\n$(INSTALL_BIN) $(PKG_BUILD_DIR)/myapp $(1)/usr/bin/ # 安装二进制文件\nendef\n\n$(eval $(call BuildPackage,myapp)) # 构建软件包并注册到OpenWRT中\n","makefile",[22,570,571,575,580,584,589,594,599,604,608,613,618,623,628,633,638,643,647,652,657,661,665,670,674,679,683,687,693,698,704,709,714,720,725,731,736,741,747,753,759,764,769],{"__ignoreMap":35},[57,572,573],{"class":59,"line":60},[57,574,81],{"emptyLinePlaceholder":80},[57,576,577],{"class":59,"line":42},[57,578,579],{},"# 这是注释，可以忽略或者修改\n",[57,581,582],{"class":59,"line":84},[57,583,81],{"emptyLinePlaceholder":80},[57,585,586],{"class":59,"line":91},[57,587,588],{},"include $(TOPDIR)/rules.mk # 引入OpenWRT编译规则\n",[57,590,591],{"class":59,"line":133},[57,592,593],{},"PKG_NAME:=myapp # 应用程序的名称，建议使用小写字母和数字组合\n",[57,595,596],{"class":59,"line":138},[57,597,598],{},"PKG_VERSION:=1.0 # 应用程序的版本号\n",[57,600,601],{"class":59,"line":144},[57,602,603],{},"PKG_RELEASE:=1 # 应用程序的发行版本号\n",[57,605,606],{"class":59,"line":174},[57,607,81],{"emptyLinePlaceholder":80},[57,609,610],{"class":59,"line":189},[57,611,612],{},"include $(INCLUDE_DIR)/package.mk # 引入OpenWRT中提供的软件包模板\n",[57,614,615],{"class":59,"line":202},[57,616,617],{},"define Package/myapp # 描述应用程序的信息\n",[57,619,620],{"class":59,"line":207},[57,621,622],{},"  SECTION:=net\n",[57,624,625],{"class":59,"line":213},[57,626,627],{},"  CATEGORY:=Network\n",[57,629,630],{"class":59,"line":246},[57,631,632],{},"  TITLE:=My Application\n",[57,634,635],{"class":59,"line":252},[57,636,637],{},"  DEPENDS:=+libopenssl +libcurl +libjson-c \n",[57,639,640],{"class":59,"line":283},[57,641,642],{},"endef\n",[57,644,645],{"class":59,"line":313},[57,646,81],{"emptyLinePlaceholder":80},[57,648,649],{"class":59,"line":326},[57,650,651],{},"define Package/myapp/description # 描述应用程序功能和用途\n",[57,653,654],{"class":59,"line":331},[57,655,656],{}," My Application is a simple program that does something useful.\n",[57,658,659],{"class":59,"line":337},[57,660,642],{},[57,662,663],{"class":59,"line":367},[57,664,81],{"emptyLinePlaceholder":80},[57,666,667],{"class":59,"line":378},[57,668,669],{},"define Build/Prepare # 准备构建应用程序所需的源码和资源\n",[57,671,672],{"class":59,"line":384},[57,673,81],{"emptyLinePlaceholder":80},[57,675,676],{"class":59,"line":397},[57,677,678],{},"# 此处可以添加自定义命令，用于准备应用程序的源码和资源\n",[57,680,681],{"class":59,"line":403},[57,682,642],{},[57,684,685],{"class":59,"line":408},[57,686,81],{"emptyLinePlaceholder":80},[57,688,690],{"class":59,"line":689},26,[57,691,692],{},"define Build/Configure # 配置应用程序的编译选项\n",[57,694,696],{"class":59,"line":695},27,[57,697,81],{"emptyLinePlaceholder":80},[57,699,701],{"class":59,"line":700},28,[57,702,703],{},"# 此处可以添加自定义命令，用于配置应用程序的编译选项\n",[57,705,707],{"class":59,"line":706},29,[57,708,642],{},[57,710,712],{"class":59,"line":711},30,[57,713,81],{"emptyLinePlaceholder":80},[57,715,717],{"class":59,"line":716},31,[57,718,719],{},"define Build/Compile # 编译应用程序的源码\n",[57,721,723],{"class":59,"line":722},32,[57,724,81],{"emptyLinePlaceholder":80},[57,726,728],{"class":59,"line":727},33,[57,729,730],{},"# 此处可以添加自定义命令，用于编译应用程序的源码\n",[57,732,734],{"class":59,"line":733},34,[57,735,642],{},[57,737,739],{"class":59,"line":738},35,[57,740,81],{"emptyLinePlaceholder":80},[57,742,744],{"class":59,"line":743},36,[57,745,746],{},"define Package/myapp/install # 安装应用程序所需的文件和目录\n",[57,748,750],{"class":59,"line":749},37,[57,751,752],{},"$(INSTALL_DIR) $(1)/usr/bin # 创建安装目录\n",[57,754,756],{"class":59,"line":755},38,[57,757,758],{},"$(INSTALL_BIN) $(PKG_BUILD_DIR)/myapp $(1)/usr/bin/ # 安装二进制文件\n",[57,760,762],{"class":59,"line":761},39,[57,763,642],{},[57,765,767],{"class":59,"line":766},40,[57,768,81],{"emptyLinePlaceholder":80},[57,770,772],{"class":59,"line":771},41,[57,773,774],{},"$(eval $(call BuildPackage,myapp)) # 构建软件包并注册到OpenWRT中\n",[776,777,778],"style",{},"html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":35,"searchDepth":42,"depth":42,"links":780},[781],{"id":12,"depth":84,"text":13},"/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa","3",3000000,"2021-09-16","wiki/2021-09-16-openwrt-bian-yi-jiao-xue","en-us:2021-09-16-openwrt-bian-yi-jiao-xue","/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue","OpenWrt编译教学","md","wiki/2021-09-16-OpenWrt编译教学/ch3-插件开发",false,null,"en-US","en-us",{},{"title":5,"description":35},"/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa","_i18n/en-us/wiki/2021-09-16-OpenWrt编译教学/ch3-插件开发","MltJsEz2n9JKegxiO4d3hL5_pRXY1_OF4GFm3QK8-lk",[802,807,813,814,820,826],{"path":803,"stem":804,"title":805,"date":785,"chapter":534,"chapterSort":806,"docKey":787,"docRoot":788,"docTitle":789,"isWikiDoc":80,"isWikiIndex":792},"/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch1-bian-yi-huan-jing-zhun-bei","_i18n/en-us/wiki/2021-09-16-OpenWrt编译教学/ch1-编译环境准备","Preparing the compilation environment",1000000,{"path":808,"stem":809,"title":810,"date":785,"chapter":811,"chapterSort":812,"docKey":787,"docRoot":788,"docTitle":789,"isWikiDoc":80,"isWikiIndex":792},"/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch2-ge-xing-hua-pei-zhi","_i18n/en-us/wiki/2021-09-16-OpenWrt编译教学/ch2-个性化配置","Personalized Configuration","2",2000000,{"path":782,"stem":799,"title":5,"date":785,"chapter":783,"chapterSort":784,"docKey":787,"docRoot":788,"docTitle":789,"isWikiDoc":80,"isWikiIndex":792},{"path":815,"stem":816,"title":817,"date":785,"chapter":818,"chapterSort":819,"docKey":787,"docRoot":788,"docTitle":789,"isWikiDoc":80,"isWikiIndex":792},"/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch4-bu-chong-gong-ju","_i18n/en-us/wiki/2021-09-16-OpenWrt编译教学/ch4-补充工具","Supplementary Tools","4",4000000,{"path":821,"stem":822,"title":823,"date":785,"chapter":824,"chapterSort":825,"docKey":787,"docRoot":788,"docTitle":789,"isWikiDoc":80,"isWikiIndex":792},"/en-us/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch5-qi-ta-can-kao-zi-liao-tian-jia-usb-he-ying-pan-ge-shi-hai-you-wang-ka-jiao-cheng","_i18n/en-us/wiki/2021-09-16-OpenWrt编译教学/ch5-其他参考资料添加USB和硬盘格式还有网卡教程：","Other references added: USB and hard drive formatting, plus network card tutorial:","5",5000000,{"path":788,"stem":827,"title":828,"date":785,"chapter":793,"chapterSort":829,"docKey":787,"docRoot":788,"docTitle":789,"isWikiDoc":80,"isWikiIndex":80},"_i18n/en-us/wiki/2021-09-16-OpenWrt编译教学/index","OpenWrt Compilation Tutorial",0,{"variants":831},[832,833,836,839,842],{"path":782,"localeSlug":795,"i18nKey":791},{"path":834,"localeSlug":835,"i18nKey":791},"/zh-hant/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa","zh-hant",{"path":837,"localeSlug":838,"i18nKey":791},"/zh-hk/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa","zh-hk",{"path":840,"localeSlug":841,"i18nKey":791},"/zh-tw/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa","zh-tw",{"path":843,"localeSlug":844,"i18nKey":791},"/zh-cn/wiki/2021-09-16-openwrt-bian-yi-jiao-xue/ch3-cha-jian-kai-fa","zh-cn",[782,798,834,798,837,798,840,798,843,798],1780671823472]