# atr415_gateway_decoder **Repository Path**: zouchuan/atr415_gateway_decoder ## Basic Information - **Project Name**: atr415_gateway_decoder - **Description**: atr415_gateway_decoder - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-08-06 - **Last Updated**: 2024-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ATR413_415_gateway #### 介绍 基于国产芯片雅特力AT32F413、AT32F415的打造的 集 合宙Air724 和 芯讯通A7670C 以及 CH9120以太网 等网络模块于一体的多功能网关 目前业务添加了modbus主机和从机的功能,通过MQTT与平台通讯 #### 软件架构 宇宙无敌状态机框架,超越苹果微软 #### 版本更新/修改说明 V1.0 使用__attribute__定义shell命令,减少内存占用。添加命令可使用 CMD_EXPORT(cmd) 函数 完成 DHCP 通过配置参数开关的功能 V1.1 加入心跳包,设备启动第一次联网成功发送一条注册包(设备id+设备校验) 修复调试口模式切换的漏洞 提高 app_network 和 module_CH9120 可移植性 分包大小可配置,shell添加通用响应,便于上位机识别配置结果 V1.2 编写 远程升级工作流程图.xmind 初步兼容终端升级协议(非电信终端升级协议,是魔豆改版蓝牙升级协议) 解决升级程序内的版本号长度问题 添加升级结果上报功能 加长 网口模块错误连续重试时间间隔 解决缓存区太小的问题,添加SDIO驱动,开始添加FATFS文件 解决fatfs部分漏洞,添加MQTT库文件 初步完成串口升级 初步完成升级判断子设备升级还是网关升级程序 初步完成子设备boot升级程序 APP地址统一改成 0x08005000 子设备升级过程中的APP程序 软件版本,硬件版本,设备类型,设备地址都从flash内读取,升级交互APP版本号可变。需要由APP写入。 fatfs兼容W25Q128 时钟频率 72->192M ,初步兼容MASS USB,需要兼容SPIM外部flash 完成USB操作片内flash,可正常格式化 添加固件升级合并文件,升级数据包发送添加1秒延时的任务 V1.3 存储器参数使用宏定义,USB对应的存储器切换使用宏定义 shell传参使用**argv,以空格隔开解析 shell添加文件系统操作指令 ls cp mv rm ... 简化shell命令说明 subset_boot和app的升级程序内New_version_notification添加硬件版本和设备地址校验错误时(subset_boot还会校验app_dev_type) 上报UPDATE_ERROR V1.4 网口透传波特率改成57600,解决网络->串口丢包问题 BK_APP_ADDR 从 0*1024 -> 8*1024 ,解决升级烧录问题。远程升级完成 V1.5 宏定义flash地址分布,串口输出地址分布图 初步添加Air724驱动 工程添加多目标编译,F413开发板和F415网关板,添加USB OTG驱动程序,完成Fatf和USB的联通,问题是USB读取到只有7M 为了联通USB和fatfs读取外部flash,需要将扇区大小4096 改成 512 来操作,因为fatfs用4096会死机 添加mk命令 shell程序优化。子设备boot添加新版本通知校验版本不一致 重启停止升级机制 解决air724驱动的错误 完善USB和FatFS使用外部flash的W25Q128配置宏,解决只偏移128K的漏洞。USB容量调整至14.97MB 去掉USB驱动扇区数*8的漏洞 降低4K RAM占用:EN25QXX_BUFFE[4096] -> EN25QXX_BUFFER=DataPool_Get(4096) 优化程序框架,使用module分类网络模组程序 F413 添加RTC驱动程序,415添加报错未解决 V1.6 完成air724驱动程序 规范化AT网络层接口函数传参 修改AT读取结果匹配程序 使其可以更快匹配指定结果 添加at_device,at_client驱动 at_device设备添加自动初始化表功能,修复死机bug,优化at_client串口接收机制 优化客户端初始化函数参数和结构 添加at_app_network驱动 添加连接步骤 ch9120添加RESET引脚操作 兼容控制器工程,未测试 解决串口到网口数据乱码问题 V1.7 兼容控制器工程,测试后还有连接断开的问题 V1.8 完善boot内烧录测试功能,添加数据写入读取校验,boot版本号升到V1.0.2 shell处理函数从中断搬到主循环内执行, func_dirtran_exec内 设透传超时 2000->1000 func_dirtran_exec内,没有收到子设备响应,也没到超时,直接清除上位机下发的数据,为了下次只下发最新数据到子设备 解决服务器主动断开后在开启,设备重复连接2次的问题 V1.9 添加独立看门狗 控制器程序修改子设备长时间未回复处理机制 网关线路板GW000A02打板回来 修改CFG0引脚,添加415RBT7编译目标 网络断开重连接步骤修改 修复更换415RB后flash只有128K导致出现升级失败的问题(OLD_APP_SIZE 200->100, BK_APP_SIZE 200->100) 解决AT模块初始化失败导致串口shell无法执行的问题(连接失败导致无法修改连接地址的问题,解决办法:设定初始化前等待的时间) 为了使用cjson修改堆栈大小:Heap_Size EQU 0x00000200 --> Heap_Size EQU 0x00001000 V2.0 尝试添加 USE_MASTER_GATEWAY 业务 完成MQTT接收荷载处理 理解上位机协议 添加上位机协议解析框架 添加modbus主模式发送函数 添加开关控制命令 分开主机读 写命令 完成小部分 json转modbus 程序 解决订阅主题的小问题 需要解决从机应答结果 回复问题 V2.1 完成平台下发数据 (从接收 到处理 到控制 到应答) 4个流程框架 协议 解析搜索函数添加应答搜索功能 修改get_poll_ack_result函数,使用指针方式获取轮询HR结果 完成部分协议解析和回复功能 修改NET_USART_TX_BUF_SIZE和MODULE_SEND_MAX_SIZE 550->850,因为时控应答平台至少800字节 注释g_func_modbus_master1 节省450字节RAM 完成星期光控无法上报800字节信息体的问题 协议对接,协议修改 需要完成轮询上报,需要解决轮询250个HR和电流参数达到252 HR的冲突 NET_USART_TX_BUF_SIZE 850->1200 SEND_BUFF_SIZE 850->1200 解决上报轮询数据的问题 优化主题订阅过程 优化应答主题生成 修改多路状态填充程序 初步添加读透传器程序框架 添加多步协议校验 V2.2 需要讨论并定制MQTT升级协议 雷达get_read_hr_result去掉+1,modbus下发改成宏定义 订阅完所有主题后再添加接收回调 V2.3 添加http下载固件的程序 at_client 解决at返回的命令尾缀识别问题 解决http下载包乱序导致的升级失败问题 添加重连接操作 添加MQTT升级指令 根据使用的网络自动裁剪升级程序 V2.4 去掉校验 addr对应的从机是否存在 这个步骤,为了兼容升级指令下发 主动上报的升级结果里去掉id,因为设备无法自己生成 http升级耗时: 5s 切换网络 80s 下载固件(300ms一分包) 5s 刷机 一共需要90s 使用自定程序解析http的body数据段,减小code占用 无需上报升级结果,在上线主题发布当前版本即可 修改http升级流程,提升升级速度。升级模式无需重启设备,直接切换网络进行升级 解决升级过程中重连接执行 AT+CIPSRIP=0 失败的问题 V2.5 boot升级1.0.3 去掉所有printf GPIO_Remap_USART1 重映射串口1,将串口1作为从机253 将HR1[100]固定大小为100个 修改读取指令的起始地址从0开始 添加读取从机exec_read_slv_state函数,通过数组下标实现替换Switch 从机253收到hr修改数据后,通过配置表获取对应类型,读取该地址对应类型的设备 使用高12位作为通道使能 mqtt的index漏洞修复 V2.6 AT_APP_NETWORK_T的ip使用数组,解决指针错误导致连接失败的问题 完成MQTT批量操作程序 解决iccid读取失败的问题 MQTT添加连接丢失的重连操作 APP_F413工程 修改RAM大小为64K EXTEND_SRAM_64K APP_F413工程 修改Heap_Siz大小:0x00000400 => 0x00001000 为了后兼容cJSON 添加上线主题,校时解析程序 扩大主题buff空间 30->40 mqtt下发开关操作成功,app_control_step_wait_ctrl_resp内添加100ms延时 因为修改状态后需要给从机反应时间 再读取状态才能成功 添加参数下发配置,添加串口波特率重配置, 添加 从机状态改变 数据上报 (253数据上报) 解决file_path直接赋值导致升级出错的问题 添加串口波特率可通过网络下发修改 清除事件位,解决前一个应答结果 导致现在直接应答成功的问题 MQTT数据接收手动添加结束符:data[len]=0; 使用SET_MQTT_LOGIN_INFO命令 从应用层配置mqtt登录参数 去掉app_control_step_wait_ctrl_resp 内的delay_ms(100),提高响应平台的时间 V2.7 添加MQTT队列操作前备份 添加MQTT队列 添加地址对应类型主题下发,处理 第一条轮询读取错误的原因是:调试数据输出在总线上,导致数据异常 修改exec_read_slv_state实现流程 开启心跳包功能 修复current_para配置数据偏移漏洞 修复多个小漏洞 V2.8 修复json拼包函数漏洞(上报的json数据后面多了一个, 导致onenet平台直接断开连接) 合宙4G模块air724 完成mqtt连接 完成onenet平台对接 解决air724的mqtt遗嘱问题 芯讯通A7670C连接onenet必须使用MQTTS协议,因为password占用130字节,将shell接收换成改大130字节,password空间改成130字节 经纬度 阈值 配置添加小数点 get_read_hr_result获取gis的hd不+1,为了拿到gis_enable和时区,添加漏加的字段 光敏使能 最高位作为通道光敏功能使能 解决光敏设置应答数据错误 解决gis下发的小数点导致数组越界死机的问题 时控下发交换高低字节 电流参数改成小数点上报 加入子设备 每300秒 批量校时(地址0xff) 修复status漏洞 经纬度 时区,添加负数处理 去掉at_app_network内的NET_BUFF_SIZE 节省0.5K内存 网络发送搬到at_app_network_step_run内执行,app_control只发送事件位 使用宏定开关USB功能 北向协议添加雷达功能 V2.9 升级添加重连接步骤 添加“继电器”设备,“时控”设备更名为“多功能”设备, 设备类型修改为 0:时控(多功能) 1:调光 2:继电器 3:雷达(平台不下发该类型) 修改程序内HR结构,control程序结构大幅修改 关闭芯讯通模块的MQTT UTF8校验,使之可以发送hex数据包 解决合宙模组匹配表的+MSUB:在+RECEIVE,前导致的http下载升级包失败死机的问题 修改调光下发 V3.0 去掉shell_printf,去掉获取shell输入源 shell处理搬到中断内执行,通过宏:SHELL_RUN_IN_IRQ 修改 缩短at_module_Air724内AT指令执行延时 轮询上报过程中,如果接收到平台数据下发,将暂停轮询上报,优先处理平台下发的数据,处理结束,再回复轮询上报 V3.1 ccos移植成功,基本功能已经正常,需要关闭微库,printf自己实现, 死等2.3秒改成 收到设备响应就不等了(成功) 添加串口命令设置模块的 时、分 解决时控timing多路下发 死机问题 设备校时间隔使用 adj_time_tm 253上报添加硬延时 hard_delay_ms(200); hard_delay_ms(100); MODBUS_SLV_HR_NB 忘记分配雷达的22个HR空间问题 收到253上报,直到从机停止上报500ms后再 读取一次 (或许可以去掉 hard_delay_ms(200); ) modbus主机重发次数 5 -> 1 添加升级过程进度条显示 solve_mode_topic_handler 使用 OLD_ALL_SEL_EN 星期使能取反(下发设备0为使能,平台下发1为使能,网关做取反处理), RELAY_WEEK_STATE 取的结果都取反 MODULE_SEND_MAX_SIZE 1300 -> 1400 修复调光批量控制问题 solve_dimmer_br_topic_handler 去掉253的hard_delay_ms(200); 下发控制后,使用exec_read_slv_state_offset读取对应HR,不再读取所有的HR,提高控制结果的获取速度(大幅修改app_control.h内容) V3.2 wait net_send finish 添加100ms等待网络发送结束时间 EVENT_SEND_REPLY_BY_CMD 内mqtt主题的获取使用队列里的 at_net_send_data 内添加 clear_net_recv_buf 解决解析接收的数据包 no id 的问题 使能 USING_TIMER_1 添加机制:设备忙 忽略253 QUE_EXE_DELAY 2300 -> 500 app_recv_que内添加条件:g_app_control.step==APP_CONTROL_STEP_IDLE TMR1_OV_TMR10_IRQHandler内recv_timeout_start >= 10 改成 >=3 解决at_client内匹配尾缀的漏洞:if (index && strstr(index,client->urc_table->urc[i].cmd_suffix)), TMR1_OV_TMR10_IRQHandler内recv_timeout_start 改成 >=25 约等于80ms 上线包内 上报配置内容(暂时注释) at_app_network_step_error 连接5次不成功,等待5分钟后再重新连接 修改队列缓存大小 200 -> 300 air724_device_control 函数内添加 SET_MQTT_DISCONNECT 功能,用于升级切换连接前 断开当前MQTT at_client内的发送AT命令前都清除串口接收缓存(添加 usart_rx_clr(client_handler->usart_p);) 断开MQTT 添加AT+MIPCLOSE命令,服务器显示断开 saveenv 固定返回 saveenv OK 上线包内添加 devid 上线包内添加 enterprise 发送 EVENT_WAIT_SLV_FINISH 前添加允许条件 g_app_control.step==APP_CONTROL_STEP_WAIT_SLV_FINISH,解决处于 APP_CONTROL_STEP_WAIT_SLV_FINISH状态时无法再发送 EVENT_WAIT_SLV_FINISH 解决get_json_1fs解析name的漏洞 app_contron.h修改HR地址 , net_protocol_mqtt.c .h添加modbus内企业代码下发 net_protocol_mqtt改为使用pos偏移下标 按钮双击 执行 企业代码 和 加密ID下发 操作 modbus主从 合一到一个串口 使用宏:MODBUS_SLV_MAS_IN_ONE 添加编译目标:APP_F413_gateway_new,适配章老师画的新板子 解决shell串口 使用 485出现乱码的问题,修复json内的漏洞 解决json解析函数里的漏洞 SHELL_USART_RX_BUF_SIZE改大 550 -> 580,解决读273个HR返回551字节导致数组溢出,解析失败的问题 mqtt协议添加 enable_set 使能设置功能 enable_set和alarm_set功能功能完成 大规模修改网络app程序,提高兼容合移植性,使用宏定义 选择ETH网口或AT模块来联网,ETH的MQTT功能未实现 修复漏洞:平台下发查询 模块不存也返回成功的问题 AT+MCONNECT 60 -> 300,修改mqtt保活时间为300秒 module_adj_time添加企业代码,修改协议内容:241时钟设定内添加漏了的星期,后面的HR位置都向后偏移 eth mqtt内添加遗嘱设置 解码问题解决 NET_BUFF_SIZE 512 -> 1400 解决上报253导致连接断开的问题 加入MD5算法 解码添加 set_slv_hr_n(PROTECT_SLV,PROTECT_ALL_HR_NUM); 强制设置HR数量为PROTECT_ALL_HR_NUM(将导致业务功能的平台读取失败) 添加 modbus_w 和 modbus_r 调试功能 添加场景功能 开机 NET_4V_EN 推挽拉高 modbus主从合并到一个文件 func_modbus_mas_slv 场景包初步格式: {"t_id":1,"s_id":2,"scene":"1-0-0-4095,2-1-0-(3-2-3-4),3-0-2-8"} HR1大小 50 -> 300 (未测试) MQTT 添加每5秒连接检测 AT+MQTTSTATU at_client定时器改成usart_chk_frame 去掉clear_net_recv_buf,去掉usart_rx_clr(client_handler->usart_p) ,解决数据丢包问题 CH9120_RST 内添加1秒延时,解决ch9120版本号获取失败的问题 添加循环解析 +MSUB 数据包 at_client_get_char 内使用缓存区process_buff , 网络串口使用 USART_SendData 发送数据,解决粘包导致的丢包问题 开启CLR_PU_RX 解决查询连接状态失败的漏洞 完成 net_usart_send_data功能 解决RTC闹钟无法设置的问题 低成本485模块输出乱码问题解决(串口初始化后 添加 func_usart_485_delay_set() ) 修改延时 FUNC_USART_485_DELAY_US 30 -> 20解决printenv输出乱码 使用 AT_USING_TIMER_1 更新场景代码 优化resolution_scene_pack函数 V3.3 添加LED驱动 红闪烁:网络未连接,绿闪烁:网络连接成功 扩大mqtt队列大小为 10*(1500+40) ,DATA_POOL_SIZE 1024*15 => 1024*35 扩大mqtt队列大小为 10*(2000+40) ,DATA_POOL_SIZE 1024*35 => 1024*40 添加场景执行结束后 轮询的功能 EVENT_EXEC_SCENE_FINISH 4G模块 TCP连接前添加 AT+CIPSHUT 打开微库 使用printf 调光单独设置漏洞修复 解决场景包解析多余数据的问题 V3.4 下发控制设备 不再读取状态 DEV_CTRL_NOT_READ 解决场景包 解析漏洞 V3.4.1 初步添加16路 时控程序,未测试 V3.4.2 修复boot无法升级的问题 升级过程中 绿灯快速闪烁 升级过程中添加串口进度条显示 master0_tb_slv_hr 内初始化地址 1改成254 解决有时1地址设备无法控制的问题 V3.4.3 修复boot内问题 V3.4.4 boot跳转前 添加 关闭中断 V3.4.5 打开控制后 读取一下 V3.4.6 升级包文件大小为0 就重启 添加新功能:节假日 时控。注意:RELAY_ALL_HR_NUM改成了315 读取老的时控设备 会不会导致时控模块死机? 添加节假日包 解析程序,下发控制程序 flash spi读写添加喂狗 添加跑马灯功能,串口指令:waterfall_start app显示flash内容分布图 V3.4.7 解决升级过程中 模块上报253 导致网关死机重启的问题 上线包中的版本号 将软件版本号+硬件版本号合并上报 V3.4.8 添加屏幕modbus读取时间功能 V3.4.9 去掉get_func内的 if(p->tb_slv_hr[i].slv==0) ,解决广播下发地址0后,无法控制设备的问题 16路时控 RELAY_16_POWER_HR_START_DATA_ADDR 偏移问题解决 解决下发控制重发时间受线上数据影响的问题:修改主机重发时间 i += FUNC_MODBUS_MASTER_CHKBUS_DELAY+p->send_tout; 解决升级包文件路径缓存区太小的问题 file_path[30] -> file_path[40] 添加网络类型上报 net_type 4G V3.4.10 process_buff缓存区大小 512 -> 2048 检测连接状态,连续3次都丢失 再重连接(解决数据下发的同时在检测连接 导致的状态检测失败 引起重连) V3.4.11 添加总线串口配置企业码功能,在总线上发送: {"enterprise":201,} 应答: SAVE_OK:201 表示写入成功,SAVE_ERR: 表示写入失败