疯狂吐槽mqtt组件,使用mqtt的需要注意

2019-11-5 16:30 [复制链接] 46 1008

准备使用mqtt开发产品,于是先进行mqtt组件的评估,例子跑起来没问题,但是例子跑完读了下源码,目测出几个严重的问题,该组件基本不能商用。现将问题列举如下:4 [: m: r; p% E2 {- y, y
1.mqtt发送是通过pipe或udp回环方式,udp方式没什么问题,但是要多使用一个回环网卡,多少令人不爽。
3 C& t8 \/ u6 C' P$ a# G2 r2.pipe模式下,就有严重问题了。mqtt消息发布时,如果消息大小大于pipe容量,则消息会被截断,前一部分会正常发送,后一部分找不pipe的mqtt头部,会发送不成功。对于一个消息,要么发布失败,要么发布成功,截断发送显然是不合理的。当然pipe是阻塞模式的,不会丢弃数据,所有发送数据都放入了pipe里,但因为容量限制会被截断。
- Z" t& F3 `! L/ V3.pipe模式下,如果发布消息过快,那么pipe接收数据可能会将2个消息合并为一个发送,这显然就是严重的错误了。这2个消息可能都是不同的主题,他擅自合并。要解决的话,只能每条消息写入pipe的话增加头尾和长度,读出来的时候头尾和长度的整包读出来在发送。
2 P, F% o' S! g4 \  M4.不能忍受的是因为使用pipe或者udp要发布一个消息,数据要来回多拷贝4次,大家可以去读源码看。
. ]. l" @2 }# u4 S1 h! ^5.mqtt组件写的只支持Qos1,但是事实上并未对MQTT ACK做处理,他只是等待信号量,保证pipe拿走数据,并且已经通过网络发走,发送成功失败与否都没做处理,这谈不上Qos1。
) P# a1 j8 A0 s8 I3 e    鉴于以上问题,mqtt组件根本无法实际商用,本人已经重写,近期会重新上传一个能够商业应用的mqtt组件。, b! Y$ y! L; i  j! P

' w; [- g$ m" p- ]
% |2 I+ X8 D. n% Q. h. J( n4 ?
7 |* c1 \9 t" `5 C
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-11-5 16:33:44 | 显示全部楼层
期待大佬的 PR
使用道具 举报 回复
发表于 2019-11-5 16:37:47 | 显示全部楼层
本帖最后由 aozima 于 2019-11-5 16:40 编辑
  M, b6 g( o- n9 S' n) K0 t+ P+ E1 g+ o/ m4 t- Q% {6 r
楼主说得对,楼主V5,点个赞!
使用道具 举报 回复
发表于 2019-11-5 16:39:04 | 显示全部楼层
先确认下问题,描述是否有误,是否是真实存在的问题!也欢迎吐槽本人
使用道具 举报 回复
发表于 2019-11-6 08:56:16 | 显示全部楼层
膜拜大佬,期待大佬的PR
使用道具 举报 回复
发表于 2019-11-6 09:18:31 | 显示全部楼层
膜拜大佬!
使用道具 举报 回复
发表于 2019-11-6 10:17:21 | 显示全部楼层
膜拜大佬!
使用道具 举报 回复
发表于 2019-11-8 14:33:53 | 显示全部楼层
膜拜大佬!
使用道具 举报 回复
发表于 2019-11-8 15:34:55 | 显示全部楼层
大神,膜拜大佬!
使用道具 举报 回复
发表于 2019-11-8 16:48:22 | 显示全部楼层
RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主说的pipe问题,需要竞争的资源肯定是要互斥操作的,如果官方没实现这个机制,那真是解释不通了……而缓存大小,这个需要根据自己项目来综合考虑;ACK机制自己在业务层实现;
使用道具 举报 回复
发表于 2019-11-9 09:22:26 | 显示全部楼层
sean 发表于 2019-11-8 16:48
$ P* q. Y: a: K5 m+ X, URTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主 ...

* c6 f. F; p2 g  ?" h这么说就有点以偏概全了
使用道具 举报 回复
发表于 2019-11-9 11:19:01 | 显示全部楼层
最近用mqtt在项目上 也出来很多问题 等待大佬的仓库
使用道具 举报 回复
发表于 2019-11-9 11:45:32 | 显示全部楼层
sean 发表于 2019-11-8 16:48
3 Q. o% _6 }& }6 m+ h, R% \RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主 ...

) k( q" j* u0 }* ?: \RTT 的装机量都超过两亿台了
使用道具 举报 回复
发表于 2019-11-10 23:57:43 | 显示全部楼层
的确有很多不合理的东西,所以我用啊里的在改造 改成我们公司商业用途
使用道具 举报 回复
发表于 2019-11-11 08:45:14 | 显示全部楼层
只适合学习,这个确实有些以偏概全了。
' M6 u  g2 h- F4 {4 j$ G
" X/ Y5 ?7 y* Z5 ^" {mqtt这里用pipe方式,是因为不是太好处理并行收发的问题。目前这样的问题,或许是pipe用法的不对,或者例如说只传递过去指针可能更合理。不过pipe确实是类似于stream的模式,能发的就都先发了。
" C: O+ w, d+ L* I3 N/ b5 ?$ q9 c/ u, n$ f& A4 z$ p) @7 p
另外RT-Thread中有不合理的地方大家可以多提提,RTT也一直在持续进化中,RTT平台本身会遵循“小而美”的原则来小心谨慎添加 & 更改代码、功能。而在维护好RTT平台本身的情况下,也会优先处理好核心软件包的事情。不过对软件包这边确实会相对松些,因为也希望大家多多参与,把自己的想法、组件分享出来,所以基本上任何社区开发者的任何软件包都可以提、添加到软件包索引中。
使用道具 举报 回复
发表于 2019-11-11 11:52:22 | 显示全部楼层
期待大佬的PR,使用RTT这么多年,内核一直很稳定,没出过问题,组件是近几年刚发展起来的,有些许问题,需要大家一起完善
使用道具 举报 回复
发表于 2019-11-11 12:06:59 | 显示全部楼层
bernard 发表于 2019-11-11 08:452 v6 i2 v6 ~# ~' `+ m' j( \
只适合学习,这个确实有些以偏概全了。# U1 x" N  k0 H7 Y' y# w) U

# W/ K) d$ W8 W0 Nmqtt这里用pipe方式,是因为不是太好处理并行收发的问题。目前这样 ...
* t) ^# `: F1 h7 M3 ~. X
快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针对stm32的库更新问题,针对log的输出问题,makemenuconfig配置问题,这些当你实际来使用的时候,你会发现问题不是一点点的多……
9 X  x* w* t: [' I% M# I& o3 V吐槽不是想说系统不好,只是希望不要光将虚头的东西,多做点实际的,号称可以使用menuconfig界面轻松配置,log系统多么完善易使用,系统多么容易裁剪……这些东西说出来好听,但是实际拿来用却不是那么回事,实在是大跌眼镜!
使用道具 举报 回复
发表于 2019-11-11 12:09:45 | 显示全部楼层
yqiu 发表于 2019-11-9 11:455 ~9 q" Z: l3 _
RTT 的装机量都超过两亿台了

% [* i" N" O6 g" f7 t装机量多更应该把一些基本的东西而且已知的不合理的东西改掉了……现在看来并不是这么回事……
使用道具 举报 回复
发表于 2019-11-11 15:03:14 | 显示全部楼层
sean 发表于 2019-11-11 12:06
3 I1 y' _: k% P% n0 |9 ]/ H$ S, ^快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针 ...

' k7 P' h+ S1 n! @$ b* u发展的过程中出现一些问题也是必然的。快10年了,但不能否认RTT是一款稳定的系统,否则也不会有这么多人使用。
$ m2 e) S) U% u8 ^
# V: t" E1 C: R" d, l; }, y7 t如果说有很多修改的,做为一份开源中立的系统,没能合并在一起,是悲哀的(我不希望给大家的感受是:中国的一个人是一条龙,合在一起是一条虫,真的)。我在做这个系统之初,就希望它开源开放,让它应用得更多更广,而不是依赖我的力量。git上的PR永远都是打开的,可以多提补丁、建议,在遵循“小而美”,不会干扰到其他组件代码或其他BSP代码的前提下,都欢迎。2 J. t  G$ `& h8 |0 J

; I5 M+ A) c* astm32的库更新,这部分是跟着ST的步伐走,也是一种无奈。太多人吐槽 HAL 不好用了……这个能怎么说,是跳坑了,还是趟坑了?不过stm32新BSP用的人还是更多,比原来的好很多。原来的stm32 bsp,驱动不全,问题也挺多,现在都得到长足的改观。, P2 Y% l7 w' D& [
8 G7 V8 X* X3 g
log输出问题,poll?指的是什么?rt_kprintf?或者ulog系统?rt_kprintf实现得简陋些,但是却是在中断中可用的非常好的一种方式。要异步,不poll,请看ulog,而且ulog可以对接不同的后端,同步或异步方式都很灵活。
! F. |/ k9 V: ^6 V7 [
8 j+ V- a, H7 V' D8 y# Vmenuconfig,这个是什么问题?没发现有什么问题,RTT平台(也就是RTT每次发布的代码,不包括软件包)的Kconfig一直在完善中,软件包则有些超出我们的管辖范围了。确实也会面临到一些问题,例如查找一个配置项不容易;英文的文本描述信息等。所以在这点上,我们期望通过图形化界面的配置器来解决<什么时候有?那还请想像下,把Kconfig翻成图形化配置的并且好用的,这个工作量啊>。
3 l9 O  U) M9 ]' B$ B7 Z" F& X4 h9 k( O7 d
如果说都是虚头的东西,我也不会在这里回复你,还投入很多时间到代码,到社区中,直接删帖就好了。希望大家多吐槽,我们以及您一起多来完善,改观。
使用道具 举报 回复
发表于 2019-11-12 12:14:59 | 显示全部楼层
bernard 发表于 2019-11-11 15:035 [+ v$ H7 m# ]1 l
发展的过程中出现一些问题也是必然的。快10年了,但不能否认RTT是一款稳定的系统,否则也不会有这么多人 ...

1 r$ K( X. o- d& _$ ]! e  h谢谢超级版主的关注!
$ ^( b* G( _( N3 X- J
% R) o& ?  v/ P' D/ G5 A吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支持国产的态度来的!吐槽也只是希望社区能把系统做的更好更方便使用,如果本人有能力也会提交一些PR的……
' I+ F1 v$ K+ r3 c/ I# M
6 G4 Q9 i0 x$ f7 E' m至于ulog的输出,我大概看了下底层的源码:
% l# q6 \, K) r% M0 [+ i
1 i7 o6 ^" T/ ~虽然ulog支持多后台模式输出,但是在调用串口输出的时候还是使用轮询的方式发送,虽然是异步处理,但是串口的这种发送方式还是没有DMA的方式效率高,中断发送的话如果log数据较大,对于实时系统来说也是不小的开销……本人尝试修改log发送为DMA发送,可能能力有限,还没有成功……5 d$ ]0 U. H' l: M

( }  ~( \5 @  d* O, B至于menuconfig这块,做好了确实工作量巨大,需要社区成员慢慢提交pr集成起来,如果menuconfig上集成了MCU选项,然后自动导入相关HAL或者扳机支持,只需修改类似设备树概念的板级信息,那么menuconfig就又大进一步了;
" u0 n9 H& V- }& u& F
' k# S0 R- t! E8 Y1 M希望RTT越做越好,本人也会持续关注,最近在尽力移植到项目中,吐槽不少,有些可能过于夸大问题,望见谅!
使用道具 举报 回复
发表于 2019-11-13 10:04:51 | 显示全部楼层
大佬,你的MQTT组件上传了吗
使用道具 举报 回复
发表于 2019-11-13 10:06:16 | 显示全部楼层
大佬,你的组件上传了吗
使用道具 举报 回复
发表于 2019-11-13 10:30:38 | 显示全部楼层
光吐槽只应是第一步,下一步要贡献正能量,让rtt能完善更强大才时真正有意义的事情!
使用道具 举报 回复
发表于 2019-11-13 11:29:30 | 显示全部楼层
sean 发表于 2019-11-12 12:14
; D3 w2 N" L6 ?: {% y谢谢超级版主的关注!3 k$ R: C% t$ D/ S5 T2 a

" s3 f3 z# A) p吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支 ...
& m. W/ ?7 }4 {* C* Q
RTT好像快要发布自己的IDE了,这个可选MCU的功能到时候会不会支持,可以期待一下。
使用道具 举报 回复
发表于 2019-11-14 09:16:39 | 显示全部楼层
sean 发表于 2019-11-11 12:06
( F& M6 [- ]: C9 i' T快10年了吧,很多都是虚头的东西拿出来给别人看,但是仔细往深了挖掘就会发现并不适合用来做项目,比如针 ...
5 F! k7 n2 ?  B% [
我想问,你真的有用心去研究使用rtt吗,碎片化的开发方式搞惯了吧
使用道具 举报 回复
发表于 2019-11-14 10:13:55 | 显示全部楼层
看完这里的评论,内心五味陈杂,说说自己的感受。; w3 U0 @. P% u/ c7 X/ T7 J
) m8 b! v1 u9 z" `
一个 RTOS 的核心就是系统调度,以及多任务的互斥与通讯,只要这些是稳定的,那么整个项目就有了基本的确定性。
: D$ i0 H: U2 I3 E  M' n; m
+ P3 V$ F9 I: _后面,增加了异常处理,日志系统,各种组件,设备框架,驱动框架,第三方软件包,那么为什么会增加这些东西?
7 N, p$ n$ D, F1 l% J5 u1 Z3 s, m0 g+ t0 |2 M
我想,出发点就是为了开发更简单。3 T  ^2 ?% e0 i# ~- `6 f
0 C9 \+ H) e) S+ A% m" A
嵌入式开发真的是太碎片化了,不同的芯片,不同的硬件,不同的系统资源,不同的应用方式(中断、DMA),等等,这些都会因为不同的业务,不同的硬件,导致不一样的软件需求。
/ W: A- g/ p2 Z4 ^. ^( v9 n! z8 ?
为了能够让碎片化的代码有那么一丝丝的重用性和确定性,RTT 抽象了设备框架、驱动框架,并将基本需求抽象为组件(如日志组件 ulog、网络组件 SAL)。这些努力,都是希望更多的代码复用,希望能够一次开发多处应用。) f2 f& r* ^+ x
6 o  m( b- j3 ^% s7 X6 [/ }( [
关于 menuconfig。每一块嵌入式代码模块都或多或少存在一些配置,要么是平台适配,要么是功能设置,要么就是资源配置。这些自定义的内容放到哪里,怎么样才能让软件开箱即用,又能让用户自由配置,灵活裁剪?我想 menuconfig 已经是非常有效的解决方式,以至于标准化的 Linux 依旧使用这种方式。为了让配置更简单,开发者用起来没那么难受,从该代码配置走向 menuconfig 的命令行界面,再到后面 IDE 里的可视化图形界面配置,这每一步都是为了简化开发者工作。但,不要妄想着自己啥都不用做了。作为项目代码开发维护者,你应当清除每一个功能组件的依赖关系,因为配置工具并不知道谁依赖谁,工具只能简化操作,并不能替代操作。
7 @/ y! ]# B; Q! P; H
: `7 }: P$ f. `最后,RTT 提供的是通用代码,所有的组件、软件包都可能仅仅适应一定的场合,并不能全业务场景适用,即使是高级语言,也无法解决这个问题,不然哪来的性能优化与运维(尽管 RTT 在努力减少这部分工作)。当然,我们每一个人可能都是某个领域的大佬,如果你在应用 RTT 相关代码的时候,当它不能满足你的需求,或者它本身设计存在问题,如果你不能忍受,那就动手优化(就像这个帖子的作者一样)。( D8 R; u+ k, C2 F
使用道具 举报 回复
发表于 2019-11-14 18:53:29 | 显示全部楼层
新写的组件已经提交,等合并了大家就可以用了。为了和以前的区分,我命名为mymqtt。函数名和以前的paho-mqtt保持兼容,但是为方便应用,也增加了一些函数,比如判断连接是否断开的。
使用道具 举报 回复
发表于 2019-11-14 19:42:52 | 显示全部楼层
gnail092 发表于 2019-11-13 10:04+ s6 [7 l1 p0 N
大佬,你的MQTT组件上传了吗

. X* X: s; f2 ]% j/ L3 J( y# F已经上传了哈,等待合并
使用道具 举报 回复
发表于 2019-11-14 23:24:38 | 显示全部楼层
熊大的头像用的骑扫把的小姐姐?
使用道具 举报 回复
发表于 2019-11-14 23:29:17 | 显示全部楼层
海神出马 一个顶仨
使用道具 举报 回复
发表于 2019-11-15 08:35:55 | 显示全部楼层
hichard 发表于 2019-11-14 18:53" ^: ~% N( Z/ A- N
新写的组件已经提交,等合并了大家就可以用了。为了和以前的区分,我命名为mymqtt。函数名和以前的paho-mqt ...
' c" b% }: _  H* ]% j: w4 c
膜拜大佬
使用道具 举报 回复
发表于 2019-11-15 09:15:59 | 显示全部楼层
hichard 发表于 2019-11-14 19:42$ a" e2 h) [2 L" X
已经上传了哈,等待合并
% ~! E. D( ?. o# o) s
厉害,已经 star
使用道具 举报 回复
发表于 2019-11-15 10:29:51 | 显示全部楼层
不管37  21  我已经移植上我的板卡了。 不管怎么样 先感谢楼主一波
使用道具 举报 回复
发表于 2019-11-15 11:01:34 | 显示全部楼层
注意有个keepalive_count, 这个以前的组件没有。以前的组件mqtt keepalive一次心跳收不到就断开连接,这太暴力了,在4G网络,TCP数据延迟一分钟都是可能发生的。因此,加了这个参数,这么多次心跳没应答才断开连接。
使用道具 举报 回复
发表于 2019-11-15 11:36:24 | 显示全部楼层
sean 发表于 2019-11-12 12:14+ ?$ c6 B, A' I0 y
谢谢超级版主的关注!3 Y% ^# }5 O! @' q9 M' F4 l% i
3 ~% h# b* Q2 j- B5 \) a' y5 P
吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支 ...
2 _, H! o/ a; n% x  A' b' r
“log发送为DMA发送”# n" ^, u: h5 p9 I$ H

% w6 f1 u" v, p, E% M; I5 l这个与 ulog 没有关系,ulog 的后端支持的是不同设备,最常见的是 console 设备
0 W7 J# T$ `. E" ~! j* t5 G$ g( T
2 R$ G4 h) E& l( iulog->backend->console->serial device
' E+ M2 B' O: I4 \5 T  D$ A, \: h1 v* t, a1 \- @6 l# B. |* ]4 R) H
而这个 console 设备具体是个 中断串口,还是 DMA 串口,是你配置实现的问题5 q. N* t- {/ F, F: _
3 C" ]- |: |' @/ n4 n7 F
可以多关注一些设备方面的介绍
使用道具 举报 回复
发表于 2019-11-15 14:59:56 | 显示全部楼层
static int send_packet(mqtt_client *c, void *buf, int length)
0 T- w, b2 F+ d) ^开启TLS时ret未定义
# q- @3 ~/ _( e$ r; a  b1 Cstatic int net_connect(mqtt_client *c)' ?- R4 k8 G5 r( z# m; S
开启TLS时uri未定义
使用道具 举报 回复
发表于 2019-11-15 15:13:00 | 显示全部楼层
sean 发表于 2019-11-12 12:14. n" P, y3 ?  o0 i6 V
谢谢超级版主的关注!4 d: o0 j" F) `0 m& |
) d! w& n0 w6 E; U) ?" U; x- r* C# G7 A
吐槽归吐槽,并没有贬低这个系统的意思,本人也是刚接触RTT这个国产系统,秉着支 ...

3 d: e" f- q7 e: _9 O: k  e% lulog这个说得太业余了,
  W: O2 O: w& X$ u) m! ?3 g/ ^: w
在多任务系统中,同步、异步都是相对的。ulog这种方式,你只要在backend端实现个异步模式就好。ulog好就好在,前端和后端是分离的,这样灵活的大了很多。在这样灵活度情况下,还保持了小巧的资源占用,这个难能可贵
使用道具 举报 回复
发表于 2019-11-15 15:28:53 | 显示全部楼层
sean 发表于 2019-11-8 16:48, K; l/ }# r8 D) V
RTT确实只适合作学习用……比如日志系统,居然还是轮询发送……这对于项目开发来说简直无法接受……而楼主 ...

' y* \% v: L' P: k! z$ v7 u确实有点偏激了
使用道具 举报 回复
发表于 2019-11-16 10:42:52 | 显示全部楼层
cychen 发表于 2019-11-15 14:595 e% F% S! u( ^! i/ a' k  }: F5 I2 E! v, e/ P
static int send_packet(mqtt_client *c, void *buf, int length)! u' H  R9 p9 w
开启TLS时ret未定义, l0 B; f& }: V3 p( J: a
static int net_conn ...
. {2 [. x& O# \
已修复,请更新latest即可
使用道具 举报 回复
发表于 2019-11-17 20:26:24 | 显示全部楼层
hichard 发表于 2019-11-16 10:42
: v- K4 U. j: r) w& U- ]$ G已修复,请更新latest即可

- H- w8 ]/ ^2 i& u/ gWHAT?     无任何代码添加到项目中  
使用道具 举报 回复
发表于 2019-11-18 09:42:43 | 显示全部楼层
hichard 发表于 2019-11-16 10:42
( i; e7 r/ j, r3 R已修复,请更新latest即可
( |3 v9 ~5 ^% q
其实我想问下,怎么加进EVN菜单里面 没显示出mymqtt 我是下你的源码然后加进工程里面的。EVN中不出现
使用道具 举报 回复
发表于 2019-11-18 11:28:01 | 显示全部楼层
cychen 发表于 2019-11-18 09:421 F/ Y5 E% s* r, f3 u6 F
其实我想问下,怎么加进EVN菜单里面 没显示出mymqtt 我是下你的源码然后加进工程里面的。EVN中不出现 ...

8 R- I- R5 Q  ]4 o! senv里面执行命令pkgs --upgrade9 L& J( u6 k# b  I
就会有的
使用道具 举报 回复
发表于 2019-11-20 10:14:51 | 显示全部楼层
windows都天天在更新,有问题是正常的
使用道具 举报 回复
发表于 2019-11-21 09:15:47 | 显示全部楼层
sjj430 发表于 2019-11-20 10:14
* E/ ]1 I7 L7 F  u; _windows都天天在更新,有问题是正常的

, x; x3 C: a9 @( V5 ?7 iwindows有问题不是我们也应该有问题的借口!我系统出的每一款产品,都可以从安装使用到最后停用,使用5年以上,都没有一点点的维护成本!
使用道具 举报 回复
发表于 2019-11-25 23:22:38 | 显示全部楼层
首先顶一下楼主,虽然没实际使用过mqtt,但是在潘多拉开发板上运行了一下,确实有很多问题,有新的mqtt软件包提交真的是太好了。- g$ p8 |; V: U" v
使用道具 举报 回复
发表于 2019-12-1 19:20:19 来自手机 | 显示全部楼层
新的mqtt支持tls或者ssl加密么?准备学习下
使用道具 举报 回复
发表于 2019-12-2 10:42:36 | 显示全部楼层
hejiang177 发表于 2019-12-1 19:20* N. j/ M* A; R; _
新的mqtt支持tls或者ssl加密么?准备学习下

3 t5 N1 p$ S7 r. B! J& x4 F# z新的老的都支持的。这个从第一版最开始都是支持的
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表