robe.zhang 发表于 2024-11-18 18:35:52

【米尔-MYD-LR3568-GK开发板--试用评测】G.阿里云客户端分析

阿里云客户端,笔者使用过一次,上次用作网关,这次用作客户端

阿里云客户端源码分析:
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/200918xdjoijdm8xjikxm7.png)
`175 行先实现 struct aiot_sysdep_portfile_t 变量 g_aiot_sysdep_portfile 中的接口`!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201008o61lkl9u55y66866.png)

详细接口实现如下:就是阿里云客户端调用的平台级接口,用 linux 平台接口实现阿里云客户端接口
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201020p4omdbdrm93lpb24.png)
`把自己移植实现的接口保存到变量g_origin_portfile中,网络接口重新定后的变量g_aiot_portfile 保存为 g_sysdep_portfile`
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201050d2zaxyp4agp9pbi7.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201052ytgn12yznt9pm32t.png)
分析网络接口重定向

!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201055w37wn699wo3wjo76.png)

还是对 g_origin_portfile 的封装
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201125e3eqhsqrv0w3y6z7.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201128d86hizwzvwl6wsgk.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201132ahhhghym9n23h2tg.png)
重定向好处是,添加平台无关,客户端又需要的功能
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201155xwp7dgw7ja77wkdo.png)

!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201157u6mbjwdbzsz0608n.png)

继续分析核心代码:
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201209mf4iu9edxkco5990.png)
`aiot_mqtt_init 检查移植的接口,申请 mqtt_handle 内存,初始化mqtt_handle`
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201252gp5chdppapmbphca.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201256qwdvd9xfdvfezzxm.png)
继续初始化mqtt_handle

!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201307gc0vg0zkisnm1d30.png)
初始化了两个函数 recv_handler 和 event_handler
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201327n0oty25nen5***f.png)
recv_handler接收到订阅的消息,处理函数。阿里云向开发板下发的消息,在这里处理和实现

!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201343q0ceavaauzc3fafs.png)
event_handler是阿里云客户端自身事件的处理函数,和业务无关
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201356bwyo33zqjp4ha0n3.png)
继续分析核心代码:
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201404whieykw30j3s31cc.png)
连接服务器:
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201412z10040nwz45eu0j2.png)

事件通知:
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201424vr4fsus8yamjge81.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201426ckqlalprhhk4rhuq.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201431esdda5umgr5vq5ds.png)
继续分析核心代码:创建两个进程,进入死循环
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201439xi6etupqz6b6p6bx.png)
demo_mqtt_process_thread 进程是个系循环,每秒处理一次数据
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201453dr9o0ayf570ot3az.png)
处理心跳,qos,事件处理
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201501xqhbczqyfcu1zc8f.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201504cmu8huvekmaeumuu.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201507w7imbqkqbhzgqmeb.png)
接受进程aiot_mqtt_recv 接收到消息,解析消息
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201521qpstr3f3khmk3rai.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201525pzf2etfrvo222r32.png)
根据不同的消息类型,调用不同函数处理
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201532c84fb2yii344pbji.png)
`_core_mqtt_subunsuback_handler 保存数据,调 mqtt_handle->recv_handler 处理,mqtt_handle->recv_handler 上面分析过,处理阿里云下发的指令`
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201554hs5r0bsgcggjkkch.png)
死循环后面代码不会执行,不用继续分析了

以上是阿里云客户端整体框架,层次很清晰,其实就是 mqtt 的物联网客户端。

有一点不太彻底的是 pthread\_create 函数,还是和平台相关的接口,没有完全剥离,比如想移植到 freertos 平台,是要用 prvCreateTask 来实现pthread\_create的功能

在分析两个使用到的函数:1,sub 订阅消息函数
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201615pxhcm65xaf2m4m47.png)
验证消息有效,插入列表
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201623oj805dzbbe7jyd1j.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201627sp1ndvnmdl4l4w24.png)
插入列表完事,并没有真正去接受消息。往上翻也有这个列表mqtt_handle->sub_list,独立进程遍历这个列表有消息调用。完美闭环。

2,pub 发布消息函数
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201706nf7nahr41efpannw.png)
调用 _core_mqtt_write 发布消息
!(//m.qjumbo.com/forum/data/attachment/forum/202411/17/201720t779wu842aga3kqf.png)

要实现业务,调用 pub 发布上行数据,调用 sub 订阅后,往 recv_handler 添加下行命令的处理函数。即可实现阿里云到开发板双向通信。

以上框架梳理清晰,稍后实现自己业务时思路和逻辑就清晰了。

页: [1]
查看完整版本: 【米尔-MYD-LR3568-GK开发板--试用评测】G.阿里云客户端分析

Baidu
map