如何通过http get和post传输json文件来控制联网的电源插座

电子说

1.2w人已加入

描述

步骤1:REST JSON Http(s)协议

这部分是技术性的,但是请耐心等待。如果我没有解释这部分,那么您将难以理解我们将在节点RED中发送的json文件中的值。

适用于每个输出(电源插座)的操作:

在所有M2M协议中,NETIO电源插座使用的动作都可以应用于单个输出。例如,可以将“切换”或“短路”动作写入任何输出。

但是,Action变量只能用于写入值,而不能用于读取当前插座状态。

这些是可以应用于每个输出的操作:

0 =关闭输出(关闭)

1 =打开输出(打开)

2 =短时间关闭输出(短关闭)

3 =短时间关闭输出(短打开)

4 =输出从一关闭状态到另一个(切换)

5 =输出状态不变(不变)

6 =忽略

示例– JSON文件切换输出编号。 1:

{

“输出”:[{

“ ID”:1,

“操作”:4

}]

}

ID-此数字表示我们将使用的输出

操作-此部分是操作输出将生成(例如1(打开输出))

步骤2:流

HTTP

现在是主要部分。这就是节点红色环境的样子。

我们已经导入了URL API流(您看到的项目。稍后我将向您展示如何导入流和该项目)该项目包括两部分:

NETIO AN30(JSON REST API)流程

仪表板(您可以通过其操作程序的图形界面)

步骤3:仪表板

HTTP

这是此可指导的node-RED中的仪表板的外观。

此项目的仪表板分为四个部分:

设备状态-显示设备信息,例如型号, mac地址或固件版本。

(POST)控制输出1-包含5个控制输出1的按钮。每个按钮执行不同的操作

(GET)O1-O4输出状态-此部分显示每个按钮的当前状态从您的设备输出。

设备管理-在这一部分中,您可以找到各种图表,它们显示了NETIO 4Aall设备中的当前计量值

第4步:导入流(项目,脚本等)

HTTP

在菜单(右上角)中,选择“导入”,然后选择“剪贴板”。

然后,将下面的文本复制到指定的字段,然后单击“导入”。

安装缺少的节点

节点已加载到选定的流程。可能会显示一条错误消息,其中包含正在导入但尚未安装在Node-RED中的节点列表。在这种情况下,需要安装缺少的节点。

如果缺少节点,请在菜单中选择“管理调色板”,单击“安装并查找并安装您缺少的节点。”

导入文本:

[ {“ id”:“ 56b9510c.98c6f”,“ type”:“ tab”,“ label”:“ NETIO AN30(REST JSON)”,“ disabled”:false,“ info”:“”},{“ id” :“ 6a66b637.da1558”,“类型”:“ http请求”,“ z”:“ 56b9510c.98c6f”,“名称”:“ HTTP请求(POST)”,“方法”:“ POST”,“ ret”:名为 “txt”, “URL”: “http://netio-4All.netio-products.com:8080/netio.json”, “TLS”: “”, “×”:430, “Y”:100,”电线 “:[[” 9cc48ba4.233128 “]]},{” ID “:” 9cc48ba4.233128“ , “类型”: “调试”, “Z”: “56b9510c.98c6f”, “姓名”: “”, “活性”:真 “tosidebar”:真 “控制台”:假 “tostatus”:假, “完成”: “有效载荷”, “×”:630, “Y”:100, “线”:[] },{“ id”:“ aa32bf8.f83704”,“ type”:“ http request”,“ z”:“ 56b9510c.98c6f”,“ name”:“ HTTP Request(GET)”,“ method”:“ GET “ ”沤“: ”TXT“, ”URL“: ”http://netio-4All.netio-products.com:8080/netio.json“, ”TLS“: ”“, ”X“:520,” Y “:240,” 线 “:[[” 23bf436c.8d90bc “]]},{” ID “:” 23bf436c.8d90bc “ ”类型“: ”JSON“, ”Z“: ”56b9510c.98c6f“,” name“:” JSON Parse“,” pr operty “:” 有效载荷 “ ”动作“: ”“, ”漂亮“:假, ”ד:710, ”Y“:240, ”线“:[[ ”3481543c.05cefc“]]},{” ID “:” 3481543c.05cefc“,”类型“:”功能“,” z“:” 56b9510c.98c6f“,”名称“:”功能“,” func“:” msg.Model = msg.payload.Agent.Model ; \ nmsg.Version = msg.payload.Agent.Version; \ nmsg.Time = msg.payload.Agent.Time; \ nmsg.JSONVersion = msg.payload.Agent.JSONVer; \ nmsg.SerialNumber = msg.payload.Agent .SerialNumber; \ n \ ntry {msg.Voltage = msg.payload.GlobalMeasure.Voltage} \ n catch(err1){msg.Voltage = 0;} \ ntry {msg.Frequency = msg.payload.GlobalMeasure.Frequency} \ n catch(err2){msg.Frequency = 0;} \ ntry {msg.TotalCurrent = msg.payload.GlobalMeasure.TotalCurrent/1000} \ n catch(err3){msg.TotalCurrent = 0;} \ ntry {msg.OverallPowerFactor = msg.payload.GlobalMeasure.OverallPowerFactor} \ n catch(err4){msg.OverallPowerFactor = 0;} \ ntry {msg.TotalLoad = msg.payload.GlobalMeasure.TotalLoad} \ n catch(err5){msg.TotalLoad = 0 ;} \ n \ nmsg.O1_State = msg.payload.Outputs [0] .State; \ nmsg.O2_State = msg.payload.Outputs [1] .State; \ nms g.O3_State = msg.payload.Outputs [2] .State; \ nmsg.O4_State = msg.payload.Outputs [3] .State; \ n \ nif(msg.O1_State)msg.O1_Color = \“#09ef28 \” ; \ n其他msg.O1_Color = \“橙色\”; \ nif(msg.O2_State)msg.O2_Color = \“#09ef28 \”; \ n其他msg.O2_Color = \“橙色\”; \ nif(msg。 O3_State)msg.O3_Color = \“#09ef28 \”; \ n其他msg.O3_Color = \“ Orange \”; \ nif(msg.O4_State)msg.O4_Color = \“#09ef28 \”; \ n其他msg.O4_Color = \“橙色\”; \ n \ n返回msg;“,”输出“:1,” noerr“:0,” x“:860,” y“:240,”电线“:[[”“ d764a23a.3c531” ]]},{ “ID”: “76fd06c4.0f36f8”, “类型”: “UI_TEXT”, “Z”: “56b9510c.98c6f”, “基团”: “470e04a4.87c72c”, “命令”:1,”宽度“:0,”高度“:0,”名称“:” NETIO模型“,”标签“:” NETIO模型:“,”格式“:” {{msg.Model}}“,”布局“:”行-center “ ”ד:660, ”Y“:360, ”线“:[]},{ ”ID“: ”8345c1eb.4a0e6“, ”类型“: ”UI_TEXT“, ”Z“:” 56b9510c。 98c6f“,” group“:” 470e04a4.87c72c“,” order“:2,” width“:0,” height“:0,” name“:”“,” label“:” Model Firmware“,” format“ : “{{msg.Version}}”, “布局”: “行中心”, “×”:660, “Y”:400, “线”:[]},{ “ID”:“7ed7e52e.27477c “ ”类型“:” ui_t ext“,” z“:” 56b9510c.98c6f“,” group“:” 470e04a4.87c72c“,” order“:3,” width“:0,” height“:0,” name“:”序列号“, “ label”:“序列号”,“格式”:“ {{msg.SerialNumber}}”,“ layout”:“ col-center”,“ x”:660,“ y”:440,“ wires”:[ ]},{ “ID”: “4852076c.3868e8”, “类型”: “UI_TEXT”, “Z”: “56b9510c.98c6f”, “基团”: “470e04a4.87c72c”, “命令”:4“,宽度“:0,”高度“:0,”名称“:” JSON版本“,”标签“:” JSON版本:“,”格式“:” {{msg.JSONVersion}}“,”布局“:”行-中心 “ ”ד:660, ”Y“:480, ”线“:[]},{ ”ID“: ”7472ee86.79bc3“, ”类型“: ”ui_gauge“, ”Z“:” 56b9510c.98c6f “,”名称“:”当前(设备)“,”组“:” a7539552.a04768“,”订单“:4,”宽度“:0,”高度“:0,” gtype“:”量规“,” title“:” Current({{msg.Model}})“,” label“:” A“,” format“:” {{msg.TotalCurrent}}“,” min“:0,” max“:” 100 “ ”色彩“:[ ”#00b500“, ”#e6e600“, ”#ca3838“], ”SEG1“: ”“, ”SEG2“: ”“, ”ד:300, ”Y“:400,” wire“:[]},{” id“:” 3068d819.5ff718“,” type“:” ui_gauge“,” z“:” 56b9510c.98c6f“,” name“:”总体功率因数“,” group“: “ a7539552.a04768”,“顺序”:3,“宽度”:0,“高度”:0,“ gtype”:“量规”,“标题”:“总功率因数” “标签”: “”, “格式”: “{{msg.OverallPowerFactor}}”, “分钟”:0, “最大”: “1”, “色彩”:[ “#00b500”, “#e6e600” , “#ca3838”], “SEG1”: “”, “SEG2”: “”, “×”:320, “Y”:440, “线”:[]},{ “ID”:“323990ed.14cf5 ”, “类型”: “ui_gauge”, “Z”: “56b9510c.98c6f”, “名称”: “电压”, “基团”: “a7539552.a04768”, “命令”:6, “宽度”:0, “高度”:0, “GTYPE”: “计”, “标题”: “电压”, “标签”: “V”, “格式”: “{{msg.Voltage}}”, “分钟”:0, “最大”: “500”, “色彩”:[ “#00b500”, “#e6e600”, “#ca3838”], “SEG1”: “”, “SEG2”: “”, “×”:280,” Y “:480,” 线 “:[]},{” ID “:” 3e88e47a.74d26c”, “类型”: “ui_gauge”, “Z”: “56b9510c.98c6f”, “姓名”: “频率”, “基团”: “a7539552.a04768”, “命令”:5 “宽度”:0, “高度”:0, “GTYPE”: “计”, “标题”: “频率”, “标签”:“赫兹”, “格式”: “{{msg.Frequency}}”, “分钟”:0, “最大”: “100”, “色彩”:[ “#00b500”, “#e6e600”, “#ca3838”] “SEG1”: “”, “SEG2”: “”, “×”:290, “Y”:520, “线”:[]},{ “ID”: “9b0f772f.e0fc58”, “类型”: “ ui_chart”,“ z”:“ 56b9510c.98c6f”,“ name”:“当前图表(设备)”,“ group”:“ a7539552.a04768”,“ order”:2,“ width”:0,“ height “:0,”标签“:”当前“,”图表类型“:”行“,”传奇“:” t芸香”, “xformat”: “HH:MM”, “内插”: “线性”, “无数据”: “”, “点”:假 “YMIN”: “0”, “YMAX”: “32”, “removeOlder”:1, “removeOlderPoints”: “”, “removeOlderUnit”: “60”, “切断”:0, “useOneColor”:假, “色彩”:[ “#FF0000”, “#aec7e8”,“# ff7f0e”, “#2ca02c”, “#98df8a”, “#0000a0”, “#ff9896”, “#9467bd”, “#c5b0d5”], “useOldStyle”:假, “×”:320, “Y”: 360,“ wires”:[[],[]]},{“ id”:“ 51626bea.79f244”,“ type”:“ link in”,“ z”:“ 56b9510c.98c6f”,“ name”:“ ”, “链接”:[ “d764a23a.3c531”]中, “x”:75, “Y”:400, “线”:[[ “7472ee86.79bc3”, “3068d819.5ff718”, “323990ed.14cf5”, “ 3e88e47a.74d26c”,“ 3567a4c0.0ee3cc”,“ c3c29296.4505d”]]}},{“ id”:“ d764a23a.3c531”,“ type”:“ link out”,“ z”:“ 56b9510c.98c6f” , “姓名”: “链接”, “链接”:[ “51626bea.79f244”, “57f3c961.d9b3e8”, “bda11677.919808”]中, “x”:955, “Y”:240, “线”:[ ]},{“ id”:“ bda11677.919808”,“ type”:“ link in”,“ z”:“ 56b9510c.98c6f”,“ name”:“”,“ links”:[“ d764a23a.3c531” ]中, “x”:495, “Y”:440, “线”:[[ “76fd06c4.0f36f8”, “8345c1eb.4a0e6”, “7ed7e52e.27477c”, “4852076c.3868e8”]]},{“ID “:” 3567a4c0.0ee3cc “ ”类型“: ”功能“, ”Z“:” 56b9510c.98c6f “,”名称“:”当前图表“,”功能“:” msg.payload = msg.TotalCurrent; \ nreturn msg;“,”输出“:1,” noerr“:0,” x“:160,” y “:300,” 线 “:[[” 9b0f772f.e0fc58 “]]},{” ID “:” c3c29296.4505d “ ”类型“: ”ui_gauge“, ”Z“: ”56b9510c.98c6f“,” 名称“:”“,” group“:” a7539552.a04768“,” order“:1,” width“:0,” height“:0,” gtype“:” gage“:” gage“,” title“:” Total Load“, “标签”: “W”, “格式”: “{{msg.TotalLoad}}”, “分钟”:0, “最大值”: “10000”, “色彩”:[ “#00b500”, “#e6e600” , “#ca3838”], “SEG1”: “”, “SEG2”: “”, “×”:290, “Y”:560, “线”:[]},{ “ID”:“ded04c51.0b31e “,” type“:” inject“,” z“:” 56b9510c.98c6f“,” name“:” 1 Second Repeat“,” topic“:”“,” payload“:”“,” payloadType“:” date “ ”重复“: ”1“, ”crontab的“: ”“, ”一次“:假 ”onceDelay“: ”1“, ”ד:310, ”Y“:240, ”线“:[[” aa32bf8.f83704“]]}},{” id“:” 763762d6.d52dec“,” type“:” ui_button“,” z“:” 56b9510c.98c6f“,” name“:”输出1 = ON“,”组“:” ab94b758.4be768“,”顺序“:1,”宽度“:0,”高度“:0,” passthru“:false,”标签“:”输出1 = ON“,”工具提示“:”“, “颜色”: “”, “BGCOLOR”: “”, “图标”: “”, “有效载荷”: “{\” 输出\ “:[{\” ID \ “:1,\” 操作\“:1 }]}”, “载荷类型”: “JSON” , “主题”: “”, “×”:100, “Y”:40, “线”:[[ “6a66b637.da1558”]]},{ “ID”: “3930df24.761ab”, “类型”: “ ui_button”,“ z”:“ 56b9510c.98c6f”,“ name”:“输出1 = OFF”,“ group”:“ ab94b758.4be768”,“ order”:2,“ width”:0,“ height” :0,“ passthru”:false,“ label”:“输出1 = OFF”,“ tooltip”:“”,“ color”:“”,“ bgcolor”:“”,“ icon”:“”,“有效载荷“:”{\ “输出\”:[{\ “ID \”:1,\ “操作\”:0}]}”, “载荷类型”: “JSON”, “主题”: “”, “×” :100, “Y”:80, “线”:[[ “6a66b637.da1558”]]},{ “ID”: “3f0ec8e0.d39668”, “类型”: “ui_button”, “Z”:“56b9510c。 98c6f“,” name“:”输出1 =短ON“,” group“:” ab94b758.4be768“,” order“:3,” width“:0,” height“:0,” passthru“:false,” label“:”输出1 =短ON“,” tooltip“:”“,” color“:”“,” bgcolor“:”“,” icon“:”“,”有效载荷“:” {\“ Outputs \” :[{\ “ID \”:1,\ “操作\”:3}]}”, “载荷类型”: “JSON”, “主题”: “”, “×”:120, “Y”:120, “线”:[[ “6a66b637.da1558”]]},{ “ID”: “26a70e42.0b8e12”, “类型”: “ui_button”, “Z”: “56b9510c.98c6f”, “姓名”:“输出1 =短路关“,”组“:” ab94b758.4be768“,”顺序“:4,”宽度“:0,”高度“:0,”通过“:false,”标签“:”输出1 =短路关(雷斯塔RT)”, “提示”: “”, “色彩”: “”, “BGCOLOR”: “”, “图标”: “”, “有效载荷”: “{\” 输出\ “:[{\” ID \ “:1,\” 操作\ “:4}]}”, “载荷类型”: “JSON”, “主题”: “”, “×”:120, “Y”:160, “线”:[[” 6a66b637.da1558“]]},{” id“:” 4b19bca6.15d3f4“,” type“:” ui_button“,” z“:” 56b9510c.98c6f“,” name“:”输出1 =切换“,”组“:” ab94b758.4be768“,”订单“:5,”宽度“:0,”高度“:0,” passthru“:false,”标签“:”输出1 =切换“,”工具提示“:”“, “颜色”: “”, “BGCOLOR”: “”, “图标”: “”, “有效载荷”: “{\” 输出\ “:[{\” ID \ “:1,\” 操作\“:2 }]} “ ”载荷类型“: ”JSON“, ”主题“: ”“, ”ד:110, ”Y“:200, ”线“:[[ ”6a66b637.da1558“]]},{” ID “:” 57f3c961.d9b3e8“,” type“:”链接输入“,” z“:” 56b9510c.98c6f“,”名称“:”“,”链接“:[” d764a23a.3c531“],” x“: 795, “Y”:420, “线”:[[ “33465792.5b26e8”, “26696a86.9322d6”, “7c1508d2.f869a8”, “c6c0aad.141fa58”]]},{ “ID”: “33465792.5b26e8”, “类型”: “UI_TEXT”, “Z”: “56b9510c.98c6f”, “基团”: “a5e4e892.40d1b8”, “命令”:1, “宽度”: “0”, “高度”: “0” 时, “ name”:“ O1状态”,“ label”:“ O1 =”,“ format”:“ {{msg.O1_State}}”,“ layout”:“行中心”,“ x”:920,“ y “:360,” 线 “:[]},{” ID “:” 26 696a86.9322d6” , “类型”: “UI_TEXT”, “Z”: “56b9510c.98c6f”, “基团”: “a5e4e892.40d1b8”, “命令”:2 “宽度”: “0”, “高度” :“ 0”,“名称”:“ O2状态”,“标签”:“ O2 =”,“格式”:“ {{msg.O2_State}}”,“布局”:“行中心”,“ x” :920, “Y”:400, “线”:[]},{ “ID”: “7c1508d2.f869a8”, “类型”: “UI_TEXT”, “Z”: “56b9510c.98c6f”, “基团”: “ a5e4e892.40d1b8”,“订单”:3,“宽度”:“ 0”,“高度”:“ 0”,“名称”:“ O3状态”,“标签”:“ O3 =”,“格式”: “ {{msg.O3_State}}”,“布局”:“行中心”,“ x”:920,“ y”:440,“电线”:[]},{“ id”:“ c6c0aad.141fa58” “类型”: “UI_TEXT”, “Z”: “56b9510c.98c6f”, “基团”: “a5e4e892.40d1b8”, “命令”:4 “宽度”: “0”, “高度”: “0” ,“名称”:“ O4状态”,“标签”:“ O4 =”,“格式”:“ {{msg.O4_State}}”,“布局”:“行中心”,“ x”:920,“ y“:480,” wires“:[]},{” id“:” 470e04a4.87c72c“,” type“:” ui_group“,” z“:”“,” name“:”设备状态“,”标签“:” 23994b37.39eb44“ , “订单”:1, “DISP”:真, “宽度”: “6”, “崩溃”:假},{ “ID”: “a7539552.a04768”, “类型”: “ ui_group”,“ z”:“”,“名称”:“设备管理”,“标签”:“ 23994b37.39eb44”,“订单”:4,“显示”:true,“宽度”:“ 6”, “崩溃”:假的},{“ id”:“ ab94b758.4be768”,“ type”:“ ui_group”,“ z”:“”,“ name”:“控制输出1”,“ tab”:“ 23994b37.39eb44”,“ order “:2,” DISP “:真,” 宽度 “:” 6” , “崩溃”:假},{ “ID”: “a5e4e892.40d1b8”, “类型”: “ui_group”, “Z”: “” ,“名称”:“ O1-O4输出状态”,“标签”:“ 23994b37.39eb44”,“订单”:3,“显示”:true,“宽度”:“ 6”,“折叠”:false}, {“ id”:“ 23994b37.39eb44”,“ type”:“ ui_tab”,“ z”:“”,“ name”:“ NETIO AN30(REST JSON)”,“ icon”:“ dashboard”,“ order” :2,“ disabled”:false,“ hidden”:false}]

第5步:它们如何协同工作

HTTP

该流程基本上分为两部分:POST和GET。

POST:写入O1

在仪表板中创建了五个按钮流将显示在仪表板中。

单击仪表板中的Output 1 = ON按钮后,有效负载将设置为netio.json文件,该文件指定输出和操作(为每个按钮定义)。

HTTP请求(POST)块将netio.json文件作为请求发送到IP地址。

服务器响应(状态)作为输出返回。

Msg.payload块显示HTTP请求(POST)的结果。

GET:从O1 – O4读取

“ 1秒重复”块以一秒为周期激活HTTP请求(GET)块,该块随后将netio.json作为GET请求发送,并返回具有套接字状态的完整JSON文件如从服务器收到的。

JSON解析块将JSON文件从HTTP请求(GET)块转换为JSON对象,以便可以操纵JSON文件中的属性。

Function块接受JSON对象的各个部分,并将其转换为msg对象的属性,以供以后使用。

“当前图表”块将msg.payload设置为msg对象的msg.TotalCurrent属性,因为后续的“当前图表(设备)”块只能显示msg.payload值。

然后跟随各种输出节点,以便在仪表板中显示从JSON对象获取的msg对象的选定属性。

该msg对象和msg.payload

对于一个简单明了的说明,请参见此处:

http://www.steves-internet-guide.com/node-red-mess 。..

步骤6:HTTP POST和GET

HTTP

HTTP

HTTP请求(POST)

此节点发送一个netio.json命令文件作为HTTP请求(POST),以控制NETIO 4All设备。

HTTP请求(GET)

此节点发送一个HTTP请求(GET)并返回状态响应。

预先填写的地址指向NETIO 4All在线演示,您可以在其中测试连接而无需在桌面上安装NETIO设备。

http://netio-4all.netio-products.com

可以在这些节点中设置自己的IP地址。但是,在HTTP请求节点,POST和GET中都需要更改IP。

步骤7:按钮节点

HTTP

HTTP

单击按钮节点会生成一条包含netio.json文件(右图)的消息,然后通过http post节点将其发送到netio智能电源插座。

步骤8:功能节点

HTTP

HTTP

功能节点是一个特殊的节点,可以编写自定义JavaScript函数。

在此指令中,该函数从已解析的JSON文件(现在为JSON对象)中选择值,并将其分配给msg对象的属性。

代码分为四个部分:

将值从JSON对象分配给msg对象的各个属性

在联网电源插座不支持全局测量的情况下的错误处理

网络电源插座不支持全局值的测量,Node-RED将显示错误,因为此功能离子将找不到各自的特性,例如msg.payload.GlobalMeasure.Voltage,因为它不会出现在JSON对象中。在这种情况下,味精对象的属性,例如msg.Voltage设置为0,并且捕获了错误。

分配输出状态值

根据输出状态设置显示的输出状态值的颜色

步骤9:JSON节点和注入节点

HTTP

HTTP

JSON节点

JSON节点解析JSON文件并将其转换为JSON对象。/p》

作为服务器对GET请求的响应,HTTP Request节点返回一个JSON文件,其中包含NETIO 4x设备的当前状态,但它只是一个文本文件,因此为了与数据,则需要将JSON文件解析为JSON对象。

注入节点

每秒钟,此节点都会激活HTTP请求节点,该节点发送一个GET请求。

因此,仪表板中的值将以一秒钟的时间更新

步骤10:文本节点和调试节点

HTTP

HTTP

文本节点

显示一个仪表板中的文本字段。在此指令中,文本节点显示电流,电压,型号,固件版本或JSON版本。

标签显示在仪表板中,名称是节点流中显示的节点名称。 -RED。

调试节点

显示消息有效载荷。

步骤11:图表节点

HTTP

HTTP

此节点根据有效载荷值在仪表板中绘制当前图表。

此节点可以

因此仅使用 绘制图表。

因此,功能节点用于将msg.payload设置为需要显示的值。

p》

msg.payload = msg.TotalCurrent;

步骤12:仪表节点和链接节点

HTTP

HTTP

仪表节点

此节点将仪表部件添加到仪表板。

在此指令中,每个仪表都可视化了味精对象的一个属性:电压[V],电流[A],频率[Hz]和总真实功率因数(TPF)。

链接节点

链接入节点和链接出节点就像隧道一样工作。 msg.payload到达链接输入节点,然后离开链接输出节点。

我用它使流程更清晰,更易于阅读。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分