机智云GAgent源码(Linux版本)笔记

主要流程:

与http server:

  1. 随机生成passcode,通过passcode和product key向httpserver发送ReqRegister消息,等待httpserver返回DID
  2. 收到DID后,发送ReqProvision消息给httpserver,等待httpserver返回:(1)第三方云信息(2)mqtt broker信息(3)ntp时间
  3. 开启mqtt状态机及收发
  4. 检查是否有OTA固件需要进行升级,如有,则执行OTA流程(通过http)

与mqtt broker:

  1. 使用DID和passcode作为username和password向mqtt broker发起注册
  2. 注册成功后,WGAgent会向broker订阅三个topic,分别为:
    (1)ser2cli_noti。暂时未用
    (2)ser2cli_res。用于OTA推送、在线client数量的订阅
    (3)app2dev。APP发送给设备的控制消息
  3. mqtt数据接收

GAgent主要结构体:

/* global context, or gagent context */
typedef struct gagentcontext_t
{
    modeinfo minfo;  /*mqtt broker信息*/
    runtimeinfo rtinfo;  /*运行时信息,包括txbuf和rxbuf等*/
    /* mcuinfo mcui; */
    XPG_MCU mcu;
    /* webserver ws; */
    webserver ws;
    /* lanserver ls; */
    lanserver ls;
    trans_mcuotainfo tmcu;
    /* logman lm; */
    gconfig gc;  /*WiFi的配置信息,包括连接路由器的SSID和密码、ServerIp和m2mIP(mqttbroker)、固件版本号*/
}gcontext, *pgcontext;

main()

GAgent_Init( &pgContextData );
GAgent_dumpInfo( pgContextData );
while(1)
{
    GAgent_Tick( pgContextData );
    GAgent_SelectFd( pgContextData,1,0 );

    GAgent_Lan_Handle( pgContextData, pgContextData->rtinfo.Rxbuf , GAGENT_BUF_LEN );
    GAgent_Local_Handle( pgContextData, pgContextData->rtinfo.Rxbuf, GAGENT_BUF_LEN );
    GAgent_Cloud_Handle( pgContextData, pgContextData->rtinfo.Rxbuf, GAGENT_BUF_LEN );
}

初始化

void GAgent_Init( pgcontext *pgc )
{
GAgent_NewVar( pgc ); /申请内存,用于结构体gcontext。该结构体是GAgent所需的全部信息的结构体/
GAgent_DevInit( *pgc ); /基于device的初始化,Linux只需要处理SIGPIPE信号量/
GAgent_loglevelSet(-1);

/*初始化全局结构体GAgent,申请txbuf和rxbuf、从文件中读取配置信息*/
GAgent_VarInit( pgc ); 

GAgent_LocalInit( *pgc );/*发送消息给MCU,从MCU处获取MCU的信息(MCU软硬件版本号、串口协议版本号等)*/
GAgent_LANInit(*pgc);/*局域网接口初始化*/
GAgent_WiFiInit( *pgc );

}

时钟处理 GAgent_Tick

    GAgent_DevTick(); 
    GAgent_CloudTick( pgc,dTime );  /*每小时向httpserver发送get方法,更新mqtt broket;发送mqtt heartbeat*/
    GAgent_LocalTick( pgc,dTime );/*向MCU发送心跳,检查与MCU的连接状态*/
    GAgent_LanTick( pgc,dTime );
    GAgent_WiFiEventTick( pgc,dTime );/*根据WiFi状态变化进行相应处理(AP、STATION模式变化;与路由器连接通断变化;云端连接状态变化)*/
    GAgent_RefreshIPTick( pgc,dTime ); /*DNS更新,定期通过DNS获取httpserver和mqtt broker的IP地址*/
    GAgent_BigDataTick( pgc ); /*从MCU获取大文件*/

监听socket

包括:

与httpserver的连接:http_socketid;
与mqtt broker的连接:m2m_socketid;
与MCU的串口连接:uart_fd;
局域网server:tcpServerFd
udpServerFd
设备 webserver:tcpWebConfigFd(80端口)
第三方云连接:udp3rdCloudFd

云端数据处理 GAgent_Cloud_Handle

    GAgent_Cloud_GetPacket
        dealPacket(pgc, Rxbuf);        
        Cloud_ClearClientAttrs(pgc, &pgc->rtinfo.waninfo.srcAttrs);
        clearChannelAttrs(pgc);

httpserver数据

先处理httpserver数据GAgent_Cloud_GetPacket从httpserver或者mqtt broker获取数据。

  1. 随机生成passcode,通过passcode和product key向httpserver发送ReqRegister消息,等待httpserver返回DID
  2. 收到DID后,发送ReqProvision消息给httpserver,等待httpserver返回:(1)第三方云信息(2)mqtt broker信息(3)ntp时间
  3. 开启mqtt状态机及收发
  4. 检查是否有OTA固件需要进行升级,如有,则执行OTA流程(通过http)

m2m数据

  1. 使用DID和passcode作为username和password向mqtt broker发起注册
  2. 注册成功后,WGAgent会向broker订阅三个topic,分别为:
    (1)ser2cli_noti。暂时未用
    (2)ser2cli_res。用于OTA推送、在线client数量的订阅
    (3)app2dev。APP发送给设备的控制消息
  3. mqtt数据接收

dealPacket

查看是否有数据需要发送给:MCU、broker以及局域网APP。
在通过broker发送数据给APP时,publish的topic是dev2app

串口数据格式

串口数据格式:

head(0xffff)len(2B)cmd(1B)sn(1B)flag(2B)payload(xB)checksum(1B)

状态转移图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值