主要流程:
与http server:
- 随机生成passcode,通过passcode和product key向httpserver发送ReqRegister消息,等待httpserver返回DID
- 收到DID后,发送ReqProvision消息给httpserver,等待httpserver返回:(1)第三方云信息(2)mqtt broker信息(3)ntp时间
- 开启mqtt状态机及收发
- 检查是否有OTA固件需要进行升级,如有,则执行OTA流程(通过http)
与mqtt broker:
- 使用DID和passcode作为username和password向mqtt broker发起注册
- 注册成功后,WGAgent会向broker订阅三个topic,分别为:
(1)ser2cli_noti。暂时未用
(2)ser2cli_res。用于OTA推送、在线client数量的订阅
(3)app2dev。APP发送给设备的控制消息 - 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获取数据。
- 随机生成passcode,通过passcode和product key向httpserver发送ReqRegister消息,等待httpserver返回DID
- 收到DID后,发送ReqProvision消息给httpserver,等待httpserver返回:(1)第三方云信息(2)mqtt broker信息(3)ntp时间
- 开启mqtt状态机及收发
- 检查是否有OTA固件需要进行升级,如有,则执行OTA流程(通过http)
m2m数据
- 使用DID和passcode作为username和password向mqtt broker发起注册
- 注册成功后,WGAgent会向broker订阅三个topic,分别为:
(1)ser2cli_noti。暂时未用
(2)ser2cli_res。用于OTA推送、在线client数量的订阅
(3)app2dev。APP发送给设备的控制消息 - mqtt数据接收
dealPacket
查看是否有数据需要发送给:MCU、broker以及局域网APP。
在通过broker发送数据给APP时,publish的topic是dev2app
串口数据格式
串口数据格式:
head(0xffff) | len(2B) | cmd(1B) | sn(1B) | flag(2B) | payload(xB) | checksum(1B) |
---|