diff --git a/APP_Framework/Framework/connection/adapter_agent.c b/APP_Framework/Framework/connection/adapter_agent.c index e9c4dcb98..c54caf946 100755 --- a/APP_Framework/Framework/connection/adapter_agent.c +++ b/APP_Framework/Framework/connection/adapter_agent.c @@ -355,7 +355,7 @@ static int GetCompleteATReply(ATAgentType agent) PrivMutexObtain(&agent->lock); if (agent->receive_mode == ENTM_MODE) { if (agent->entm_recv_len < ENTM_RECV_MAX) { -#ifdef TOOL_USING_MQTT +#ifdef LIB_USING_MQTT if((res == 1) && (agent->entm_recv_len < agent->read_len)) { agent->entm_recv_buf[agent->entm_recv_len] = ch; diff --git a/APP_Framework/lib/Makefile b/APP_Framework/lib/Makefile index 5877462e4..401fe189e 100644 --- a/APP_Framework/lib/Makefile +++ b/APP_Framework/lib/Makefile @@ -18,8 +18,8 @@ ifeq ($(CONFIG_LIB_USING_LORAWAN),y) SRC_DIR += lorawan endif -ifeq ($(CONFIG_TOOL_USING_MQTT),y) - SRC_DIR += mqtt +ifeq ($(CONFIG_LIB_USING_MQTT),y) + SRC_DIR += mqtt endif include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/lib/mqtt/Kconfig b/APP_Framework/lib/mqtt/Kconfig index 1084f4f4a..b44bb1b34 100644 --- a/APP_Framework/lib/mqtt/Kconfig +++ b/APP_Framework/lib/mqtt/Kconfig @@ -1,33 +1,71 @@ menu "lib using MQTT" - menuconfig TOOL_USING_MQTT + menuconfig LIB_USING_MQTT bool "Enable support MQTT function" default n select SUPPORT_CONNECTION_FRAMEWORK select CONNECTION_ADAPTER_4G - - if TOOL_USING_MQTT - menu "MQTT connection parameter configuration." - config PLATFORM_PRODUCTKEY - string "Product Key, used to identify a product." - default "iv74vebCdJC" - config CLIENT_DEVICENAME - string "Device name, used to identify a client device." - default "D001" + if LIB_USING_MQTT + choice + prompt "Choose xiuos platform or Alibaba Cloud platform." + default ALIBABA_PLATFORM - config CLIENT_DEVICESECRET - string "Device secret, used for device authentication and data encryption." - default "d2e613c4f714b6b0774bd7b68eeceae3" - - config PLATFORM_SERVERIP - string "mqtt platform server ip." - default "101.133.196.127" + config XIUOS_PLATFORM + bool "xiuos platform." - config PLATFORM_SERVERPORT - string "mqtt platform server port." - default "1883" - endmenu + config ALIBABA_PLATFORM + bool "Alibaba cloud platform." + endchoice + + if XIUOS_PLATFORM + menu "xiuos platform mqtt connection parameter configuration." + + config CLIENTID + string "mqtt client id." + default "xidatong0001" + + config USERNAME + string "mqtt client username." + default "xiuosiot" + + config PASSWORD + string "mqtt client login passwd." + default "xiuosiot" + + config PLATFORM_SERVERIP + string "mqtt platform server ip." + default "115.238.53.59" + + config PLATFORM_SERVERPORT + string "mqtt platform server port." + default "1883" + endmenu + endif + + if ALIBABA_PLATFORM + menu "Alibaba Cloud platform mqtt connection parameter configuration." + config PLATFORM_PRODUCTKEY + string "Product Key, used to identify a product." + default "iv74vebCdJC" + + config CLIENT_DEVICENAME + string "Device name, used to identify a client device." + default "D001" + + config CLIENT_DEVICESECRET + string "Device secret, used for device authentication and data encryption." + default "d2e613c4f714b6b0774bd7b68eeceae3" + + config PLATFORM_SERVERIP + string "mqtt platform server ip." + default "101.133.196.127" + + config PLATFORM_SERVERPORT + string "mqtt platform server port." + default "1883" + endmenu + endif endif endmenu diff --git a/APP_Framework/lib/mqtt/Makefile b/APP_Framework/lib/mqtt/Makefile index b924f47d1..77fa83793 100644 --- a/APP_Framework/lib/mqtt/Makefile +++ b/APP_Framework/lib/mqtt/Makefile @@ -1,3 +1,9 @@ -SRC_FILES := platform_mqtt.c utils_hmacsha1.c +ifeq ($(CONFIG_XIUOS_PLATFORM),y) + SRC_FILES := platform_mqtt.c +endif + +ifeq ($(CONFIG_ALIBABA_PLATFORM),y) + SRC_FILES := platform_mqtt.c utils_hmacsha1.c +endif include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/APP_Framework/lib/mqtt/platform_mqtt.c b/APP_Framework/lib/mqtt/platform_mqtt.c index 91689d280..29870c2e9 100644 --- a/APP_Framework/lib/mqtt/platform_mqtt.c +++ b/APP_Framework/lib/mqtt/platform_mqtt.c @@ -24,6 +24,7 @@ #include #include #include "platform_mqtt.h" +#include "utils_hmacsha1.h" MQTT_TCB Platform_mqtt; //创建一个用于连接云平台mqtt的结构体 static struct Adapter *adapter; @@ -110,14 +111,21 @@ int MQTT_Recv(uint8_t* buf, int buflen) int MQTT_Connect(void) { uint8_t TryConnect_time = 10; //尝试登录次数 - uint8_t passwdtemp[PASSWARD_SIZE]; - - memset(&Platform_mqtt,0,sizeof(Platform_mqtt)); - sprintf(Platform_mqtt.ClientID,"%s|securemode=3,signmethod=hmacsha1|",CLIENT_DEVICENAME); //构建客户端ID并存入缓冲区 - sprintf(Platform_mqtt.Username,"%s&%s",CLIENT_DEVICENAME,PLATFORM_PRODUCTKEY); //构建用户名并存入缓冲区 - memset(passwdtemp,0,sizeof(passwdtemp)); - sprintf(passwdtemp,"clientId%sdeviceName%sproductKey%s",CLIENT_DEVICENAME,CLIENT_DEVICENAME,PLATFORM_PRODUCTKEY); //构建加密时的明文 - utils_hmac_sha1(passwdtemp,strlen(passwdtemp),Platform_mqtt.Passward,(char *)CLIENT_DEVICESECRET,strlen(CLIENT_DEVICESECRET)); //以DeviceSecret为秘钥对temp中的明文进行hmacsha1加密即为密码 + + memset(&Platform_mqtt,0,sizeof(Platform_mqtt)); +#ifdef XIUOS_PLATFORM + sprintf(Platform_mqtt.ClientID,"%s",CLIENTID); //客户端ID存入缓冲区 + sprintf(Platform_mqtt.Username,"%s",USERNAME); //用户名存入缓冲区 + sprintf(Platform_mqtt.Passward,"%s",PASSWORD); //用户名存入缓冲区 +#endif +#ifdef ALIBABA_PLATFORM + uint8_t passwdtemp[PASSWARD_SIZE]; + memset(passwdtemp,0,sizeof(passwdtemp)); + sprintf(Platform_mqtt.ClientID,"%s|securemode=3,signmethod=hmacsha1|",CLIENT_DEVICENAME); //构建客户端ID并存入缓冲区 + sprintf(Platform_mqtt.Username,"%s&%s",CLIENT_DEVICENAME,PLATFORM_PRODUCTKEY); //构建用户名并存入缓冲区 + sprintf(passwdtemp,"clientId%sdeviceName%sproductKey%s",CLIENT_DEVICENAME,CLIENT_DEVICENAME,PLATFORM_PRODUCTKEY); //构建加密时的明文 + utils_hmac_sha1(passwdtemp,strlen(passwdtemp),Platform_mqtt.Passward,(char *)CLIENT_DEVICESECRET,strlen(CLIENT_DEVICESECRET)); //以DeviceSecret为秘钥对temp中的明文进行hmacsha1加密即为密码 +#endif Platform_mqtt.MessageID = 0; //报文标识符清零,CONNECT报文虽然不需要添加报文标识符,但是CONNECT报文是第一个发送的报文,在此清零报文标识符为后续报文做准备 Platform_mqtt.Fixed_len = 1; //CONNECT报文固定报头长度暂定为1 @@ -126,7 +134,7 @@ int MQTT_Connect(void) Platform_mqtt.Remaining_len = Platform_mqtt.Variable_len + Platform_mqtt.Payload_len; //剩余长度=可变报头长度+负载长度 memset(Platform_mqtt.Pack_buff,0,sizeof(Platform_mqtt.Pack_buff)); - Platform_mqtt.Pack_buff[0] = 0x10; //CONNECT报文 固定报头第1个字节0x10 + Platform_mqtt.Pack_buff[0] = 0x10; //CONNECT报文,固定报头第1个字节0x10 do{ if((Platform_mqtt.Remaining_len/128) == 0) { @@ -281,7 +289,7 @@ int MQTT_UnSubscribeTopic(uint8_t *topic_name) Platform_mqtt.Pack_buff[Platform_mqtt.Fixed_len+0] = Platform_mqtt.MessageID/256; //报文标识符高字节 Platform_mqtt.Pack_buff[Platform_mqtt.Fixed_len+1] = Platform_mqtt.MessageID%256; //报文标识符低字节 - Platform_mqtt.MessageID++; //每用一次MessageID加1 + Platform_mqtt.MessageID++; //每用一次MessageID加1 Platform_mqtt.Pack_buff[Platform_mqtt.Fixed_len+2] = strlen(topic_name)/256; //主题长度高字节 Platform_mqtt.Pack_buff[Platform_mqtt.Fixed_len+3] = strlen(topic_name)%256; //主题长度低字节 @@ -377,7 +385,7 @@ void MQTT_PublishDataQs1(uint8_t *topic_name,uint8_t *data, uint16_t data_len) Platform_mqtt.Pack_buff[Platform_mqtt.Fixed_len+2+strlen(topic_name)] = Platform_mqtt.MessageID/256; //报文标识符高字节 Platform_mqtt.Pack_buff[Platform_mqtt.Fixed_len+3+strlen(topic_name)] = Platform_mqtt.MessageID%256; //报文标识符低字节 - Platform_mqtt.MessageID++; //每用一次MessageID加1 + Platform_mqtt.MessageID++; //每用一次MessageID加1 memcpy(&Platform_mqtt.Pack_buff[Platform_mqtt.Fixed_len+4+strlen(topic_name)],data,strlen(data)); //复制data数据 @@ -423,11 +431,14 @@ void MQTT_DealPublishData(uint8_t *data, uint16_t data_len) for(i = 1;i < 5;i++) { + //查找可变报头的长度字段,如果最高位为0表示该字节是长度字段的最后一个字节 if((data[i] & 0x80) == 0) break; } + //1代表固定报头占一个字节,i代表可变报头长度字段所占用字节数,2代表主题长度字段占2字节,cmdpos代表报文里主题名称起始位置 cmdpos = 1+i+2; + //data_len减去1+i+2就是报文中有效载荷的长度 cmdlen = data_len-(1+i+2); if(data_len <= CMD_SIZE) diff --git a/APP_Framework/lib/mqtt/platform_mqtt.h b/APP_Framework/lib/mqtt/platform_mqtt.h index 92333e9b1..c08ba3447 100644 --- a/APP_Framework/lib/mqtt/platform_mqtt.h +++ b/APP_Framework/lib/mqtt/platform_mqtt.h @@ -23,7 +23,6 @@ #define _PLATFORM_MQTT_H_ #include -#include "utils_hmacsha1.h" #define KEEPALIVE_TIME 300 //保活时间(单位s),300s #define HEART_TIME 120000 //空闲时发送心跳包的时间间隔(单位ms),120s diff --git a/Ubiquitous/XiZi_IIoT/path_kernel.mk b/Ubiquitous/XiZi_IIoT/path_kernel.mk index 2c3ec451d..f95250128 100755 --- a/Ubiquitous/XiZi_IIoT/path_kernel.mk +++ b/Ubiquitous/XiZi_IIoT/path_kernel.mk @@ -581,7 +581,7 @@ KERNELPATHS +=-I$(KERNEL_ROOT)/tool/bootloader/flash \ -I$(KERNEL_ROOT)/tool/bootloader/ota # endif -ifeq ($(CONFIG_TOOL_USING_MQTT), y) +ifeq ($(CONFIG_LIB_USING_MQTT), y) KERNELPATHS +=-I$(KERNEL_ROOT)/../../APP_Framework/lib/mqtt endif diff --git a/Ubiquitous/XiZi_IIoT/tool/bootloader/Kconfig b/Ubiquitous/XiZi_IIoT/tool/bootloader/Kconfig index c826295d4..9b694513b 100644 --- a/Ubiquitous/XiZi_IIoT/tool/bootloader/Kconfig +++ b/Ubiquitous/XiZi_IIoT/tool/bootloader/Kconfig @@ -23,7 +23,7 @@ menu "OTA function" config OTA_BY_PLATFORM bool "Through IoT management platform." - select TOOL_USING_MQTT + select LIB_USING_MQTT config OTA_BY_TCPSERVER bool "Through the public network TCP server." diff --git a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/Kconfig b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/Kconfig deleted file mode 100644 index e69de29bb..000000000 diff --git a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c index e132346e3..236d8711d 100644 --- a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c +++ b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c @@ -128,7 +128,7 @@ static uint32_t calculate_crc32(uint32_t addr, uint32_t len) * 形 参: cur_version:当前版本号,new_version:生成的新版本号 * 返 回 值: 0:生成成功,-1:生成失败 * 说 明: 为保持一致,平台通过OTA传输而来的版本号也要保持这样三段式的形式 - 版本形式为major.minor.patch,如01.02.03 + 版本形式为major.minor.patch,如001.002.003 *******************************************************************************/ static int create_version(uint8_t* cur_version, uint8_t* new_version) { @@ -739,8 +739,224 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHE #define FRAME_LEN 2048 //每帧数据的数据包长度 static uint8_t MqttRxbuf[3072]; static uint8_t FrameBuf[FRAME_LEN]; -static OTA_TCB AliOTA; +static OTA_TCB platform_ota; +#ifdef XIUOS_PLATFORM +/******************************************************************************* +* 函 数 名: PropertyVersion +* 功能描述: 向服务器上传当前设备版本信息 +* 形 参: 无 +* 返 回 值: 无 +*******************************************************************************/ +static void PropertyVersion(void) +{ + uint8_t tempdatabuff[128]; + ota_info_t ota_info; + + memset(&ota_info, 0, sizeof(ota_info_t)); + mcuboot.op_flash_read(FLAG_FLAH_ADDRESS, (void*)&ota_info, sizeof(ota_info_t)); + + memset(tempdatabuff,0,128); + sprintf(tempdatabuff,"{\"clientId\":\"%s\",\"version\":\"%s\"}",CLIENTID,ota_info.os.version); + + MQTT_PublishDataQs1("xiuosiot/ota/version",tempdatabuff,strlen(tempdatabuff)); //发送等级QS=1的PUBLISH报文 +} + + +/*-------------------------------------------------*/ +/*函数名:OTA下载数据 */ +/*参 数:size:本次下载量 */ +/*参 数:offset:本次下载偏移量 */ +/*返回值:无 */ +/*-------------------------------------------------*/ +static void OTA_Download(int size, int offset) +{ + uint8_t tempdatabuff[128]; + + memset(tempdatabuff,0,128); + sprintf(tempdatabuff,"{\"clientId\":\"%s\",\"fileId\":%d,\"fileOffset\":%d,\"size\":%d}",Platform_mqtt.ClientID,platform_ota.streamId,offset,size); + + MQTT_PublishDataQs0("xiuosiot/ota/files", tempdatabuff, strlen(tempdatabuff)); +} + +/******************************************************************************* +* 函 数 名: app_ota_by_platform +* 功能描述: 通过云平台MQTT进行升级 +* 形 参: 无 +* 返 回 值: 无 +*******************************************************************************/ +static void app_ota_by_platform(void* parameter) +{ + int datalen; + int ret = 0; + int freecnt = 0; + ota_info_t ota_info; + uint32_t heart_time = 0; + uint32_t flashdestination = DOWN_FLAH_ADDRESS; + uint8_t topicdatabuff[2][64]; + char *ptr; + + mcuboot.flash_init(); + memset(&ota_info, 0, sizeof(ota_info_t)); + mcuboot.op_flash_read(FLAG_FLAH_ADDRESS, (void*)&ota_info, sizeof(ota_info_t)); + ota_info.status = OTA_STATUS_DOWNLOADING; + UpdateOTAFlag(&ota_info); + memset(topicdatabuff,0,sizeof(topicdatabuff)); + sprintf(topicdatabuff[0],"ota/%s/update",CLIENTID); + sprintf(topicdatabuff[1],"ota/%s/files",CLIENTID); + +reconnect: + if((AdapterNetActive() == 0) && (MQTT_Connect() == 0) && MQTT_SubscribeTopic(topicdatabuff[0]) == 0 && MQTT_SubscribeTopic(topicdatabuff[1]) == 0) + { + KPrintf("Log in to the cloud platform and subscribe to the topic successfully.\n"); + PropertyVersion(); + } + else + { + KPrintf("Log in to the cloud platform failed, retry!\n"); + goto reconnect; + } + + while(1) + { + memset(MqttRxbuf,0,sizeof(MqttRxbuf)); + datalen = MQTT_Recv(MqttRxbuf, sizeof(MqttRxbuf)); + if(datalen <= 0) + { + freecnt++; + } + else if(MqttRxbuf[0] == 0x30) + { + freecnt = 0; + MQTT_DealPublishData(MqttRxbuf, datalen); + ptr = strstr((char *)Platform_mqtt.cmdbuff,topicdatabuff[0]); + if(ptr != NULL) + { + if(sscanf(ptr+strlen(topicdatabuff[0])+1,"{\"fileSize\":%d,\"version\":\"%11s\",\"fileId\":%d,\"md5\":\"%*32s\"}",&platform_ota.size,platform_ota.version,&platform_ota.streamId)==3) + { + KPrintf("ota file size:%d\r\n",platform_ota.size); + KPrintf("ota file id:%d\r\n",platform_ota.streamId); + KPrintf("ota file version:%s\r\n",platform_ota.version); + if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,platform_ota.size) != kStatus_Success) + { + KPrintf("Failed to erase target fash!\n"); + ret = -1; + break; + } + platform_ota.counter = (platform_ota.size%FRAME_LEN != 0)? (platform_ota.size/FRAME_LEN + 1):(platform_ota.size/FRAME_LEN); + platform_ota.num = 1; //下载次数,初始值为1 + platform_ota.downlen = FRAME_LEN; //记录本次下载量 + OTA_Download(platform_ota.downlen,(platform_ota.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 + } + else + { + KPrintf("Failed to get ota information!\n"); + ret = -1; + break; + } + } + + if(strstr((char *)Platform_mqtt.cmdbuff,topicdatabuff[1])) + { + memset(FrameBuf,0,sizeof(FrameBuf)); + memcpy(FrameBuf, &MqttRxbuf[datalen-platform_ota.downlen], platform_ota.downlen); + if(mcuboot.op_flash_write(flashdestination,FrameBuf,platform_ota.downlen) != kStatus_Success) + { + KPrintf("current frame[%d] flash failed.\n",platform_ota.num-1); + ret = -1; + break; + } + else + { + KPrintf("current frame[%d] is written to flash 0x%x address successful.\n", platform_ota.num -1, flashdestination); + KPrintf("Current progress is %d/%d\r\n",platform_ota.num,platform_ota.counter); + flashdestination += platform_ota.downlen; + platform_ota.num++; + } + + if(platform_ota.num < platform_ota.counter) //如果小于总下载次数 + { + platform_ota.downlen = FRAME_LEN; //记录本次下载量 + OTA_Download(platform_ota.downlen,(platform_ota.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 + } + else if(platform_ota.num == platform_ota.counter) //如果等于总下载次数,说明是最后一次下载 + { + if(platform_ota.size%FRAME_LEN == 0) //判断固件大小是否是FRAME_LEN的整数倍 + { + platform_ota.downlen = FRAME_LEN; //记录本次下载量 + OTA_Download(platform_ota.downlen,(platform_ota.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 + } + else + { + platform_ota.downlen = platform_ota.size%FRAME_LEN; //记录本次下载量 + OTA_Download(platform_ota.downlen,(platform_ota.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 + } + } + + else //下载完毕 + { + ret = 0; + break; + } + } + + } + else + { + freecnt = 0; + continue; + } + + if((freecnt >= 10) && (CalculateTimeMsFromTick(CurrentTicksGain()) - heart_time >= HEART_TIME)) //连续10次未收到数据默认为为空闲状态,需每隔一段时间发送需要发送心跳包保活 + { + heart_time = CalculateTimeMsFromTick(CurrentTicksGain()); + if(MQTT_SendHeart() != 0) //发送心跳包失败可能连接断开,需要重连 + { + KPrintf("The connection has been disconnected, reconnecting!\n"); + freecnt = 0; + heart_time = 0; + goto reconnect; + } + KPrintf("Send heartbeat packet successful!\n"); + } + } + + if(0 == ret) + { + ota_info.down.size = platform_ota.size; + ota_info.down.crc32 = calculate_crc32(DOWN_FLAH_ADDRESS, platform_ota.size); + + memset(ota_info.down.version,0,sizeof(ota_info.down.version)); + strncpy(ota_info.down.version, platform_ota.version, sizeof(ota_info.down.version)); + + memset(ota_info.down.description,0,sizeof(ota_info.down.description)); + strncpy(ota_info.down.description, "MQTT OTA bin.",sizeof(ota_info.down.description)); + + ota_info.status = OTA_STATUS_READY; + + memset(ota_info.error_message,0,sizeof(ota_info.error_message)); + strncpy(ota_info.error_message, "No error message!",sizeof(ota_info.error_message)); + + UpdateOTAFlag(&ota_info); + } + else + { + ota_info.status = OTA_STATUS_ERROR; + memset(ota_info.error_message,0,sizeof(ota_info.error_message)); + strncpy(ota_info.error_message, "Failed to download firmware to download partition!",sizeof(ota_info.error_message)); + UpdateOTAFlag(&ota_info); + } + MQTT_UnSubscribeTopic(topicdatabuff[0]); + MQTT_UnSubscribeTopic(topicdatabuff[1]); + MQTT_Disconnect(); + mcuboot.flash_deinit(); + KPrintf("ota file transfer complete,start reboot!\n"); + MdelayKTask(2000); + mcuboot.op_reset(); +} +#endif + +#ifdef ALIBABA_PLATFORM /******************************************************************************* * 函 数 名: PropertyVersion * 功能描述: 向服务器上传当前设备版本信息 @@ -768,11 +984,11 @@ static void PropertyVersion(void) /*-------------------------------------------------*/ /*函数名:OTA下载数据 */ -/*参 数:size:本次下载量 */ -/*参 数:offset:本次下载偏移量 */ +/*参 数:size:本次下载量 */ +/*参 数:offset:本次下载偏移量 */ /*返回值:无 */ /*-------------------------------------------------*/ -void OTA_Download(int size, int offset) +static void OTA_Download(int size, int offset) { uint8_t topicdatabuff[64]; uint8_t tempdatabuff[128]; @@ -781,7 +997,7 @@ void OTA_Download(int size, int offset) sprintf(topicdatabuff,"/sys/%s/%s/thing/file/download",PLATFORM_PRODUCTKEY,CLIENT_DEVICENAME); memset(tempdatabuff,0,128); - sprintf(tempdatabuff,"{\"id\": \"1\",\"params\": {\"fileInfo\":{\"streamId\":%d,\"fileId\":1},\"fileBlock\":{\"size\":%d,\"offset\":%d}}}",AliOTA.streamId,size,offset); + sprintf(tempdatabuff,"{\"id\": \"1\",\"params\": {\"fileInfo\":{\"streamId\":%d,\"fileId\":1},\"fileBlock\":{\"size\":%d,\"offset\":%d}}}",platform_ota.streamId,size,offset); MQTT_PublishDataQs0(topicdatabuff, tempdatabuff, strlen(tempdatabuff)); } @@ -838,21 +1054,21 @@ reconnect: ptr = strstr((char *)Platform_mqtt.cmdbuff,"{\"code\":\"1000\""); if(ptr != NULL) { - if(sscanf(ptr,"{\"code\":\"1000\",\"data\":{\"size\":%d,\"streamId\":%d,\"sign\":\"%*32s\",\"dProtocol\":\"mqtt\",\"version\":\"%11s\"",&AliOTA.size,&AliOTA.streamId,AliOTA.version)==3) + if(sscanf(ptr,"{\"code\":\"1000\",\"data\":{\"size\":%d,\"streamId\":%d,\"sign\":\"%*32s\",\"dProtocol\":\"mqtt\",\"version\":\"%11s\"",&platform_ota.size,&platform_ota.streamId,platform_ota.version)==3) { - KPrintf("ota file size:%d\r\n",AliOTA.size); - KPrintf("ota file id:%d\r\n",AliOTA.streamId); - KPrintf("ota file version:%s\r\n",AliOTA.version); - if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,AliOTA.size != kStatus_Success)) + KPrintf("ota file size:%d\r\n",platform_ota.size); + KPrintf("ota file id:%d\r\n",platform_ota.streamId); + KPrintf("ota file version:%s\r\n",platform_ota.version); + if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,platform_ota.size) != kStatus_Success) { KPrintf("Failed to erase target fash!\n"); ret = -1; break; } - AliOTA.counter = (AliOTA.size%FRAME_LEN != 0)? (AliOTA.size/FRAME_LEN + 1):(AliOTA.size/FRAME_LEN); - AliOTA.num = 1; //下载次数,初始值为1 - AliOTA.downlen = FRAME_LEN; //记录本次下载量 - OTA_Download(AliOTA.downlen,(AliOTA.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 + platform_ota.counter = (platform_ota.size%FRAME_LEN != 0)? (platform_ota.size/FRAME_LEN + 1):(platform_ota.size/FRAME_LEN); + platform_ota.num = 1; //下载次数,初始值为1 + platform_ota.downlen = FRAME_LEN; //记录本次下载量 + OTA_Download(platform_ota.downlen,(platform_ota.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 } else { @@ -865,37 +1081,37 @@ reconnect: if(strstr((char *)Platform_mqtt.cmdbuff,"download_reply")) { memset(FrameBuf,0,sizeof(FrameBuf)); - memcpy(FrameBuf, &MqttRxbuf[datalen-AliOTA.downlen-2], AliOTA.downlen); - if(mcuboot.op_flash_write(flashdestination,FrameBuf,AliOTA.downlen) != kStatus_Success) + memcpy(FrameBuf, &MqttRxbuf[datalen-platform_ota.downlen-2], platform_ota.downlen); + if(mcuboot.op_flash_write(flashdestination,FrameBuf,platform_ota.downlen) != kStatus_Success) { - KPrintf("current frame[%d] flash failed.\n",AliOTA.num-1); + KPrintf("current frame[%d] flash failed.\n",platform_ota.num-1); ret = -1; break; } else { - KPrintf("current frame[%d] is written to flash 0x%x address successful.\n", AliOTA.num -1, flashdestination); - KPrintf("Current progress is %d/%d\r\n",AliOTA.num,AliOTA.counter); - flashdestination += AliOTA.downlen; - AliOTA.num++; + KPrintf("current frame[%d] is written to flash 0x%x address successful.\n", platform_ota.num -1, flashdestination); + KPrintf("Current progress is %d/%d\r\n",platform_ota.num,platform_ota.counter); + flashdestination += platform_ota.downlen; + platform_ota.num++; } - if(AliOTA.num < AliOTA.counter) //如果小于总下载次数 + if(platform_ota.num < platform_ota.counter) //如果小于总下载次数 { - AliOTA.downlen = FRAME_LEN; //记录本次下载量 - OTA_Download(AliOTA.downlen,(AliOTA.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 + platform_ota.downlen = FRAME_LEN; //记录本次下载量 + OTA_Download(platform_ota.downlen,(platform_ota.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 } - else if(AliOTA.num == AliOTA.counter) //如果等于总下载次数,说明是最后一次下载 + else if(platform_ota.num == platform_ota.counter) //如果等于总下载次数,说明是最后一次下载 { - if(AliOTA.size%FRAME_LEN == 0) //判断固件大小是否是FRAME_LEN的整数倍 + if(platform_ota.size%FRAME_LEN == 0) //判断固件大小是否是FRAME_LEN的整数倍 { - AliOTA.downlen = FRAME_LEN; //记录本次下载量 - OTA_Download(AliOTA.downlen,(AliOTA.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 + platform_ota.downlen = FRAME_LEN; //记录本次下载量 + OTA_Download(platform_ota.downlen,(platform_ota.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 } else { - AliOTA.downlen = AliOTA.size%FRAME_LEN; //记录本次下载量 - OTA_Download(AliOTA.downlen,(AliOTA.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 + platform_ota.downlen = platform_ota.size%FRAME_LEN; //记录本次下载量 + OTA_Download(platform_ota.downlen,(platform_ota.num - 1)*FRAME_LEN); //发送要下载的数据信息给服务器 } } @@ -929,11 +1145,11 @@ reconnect: if(0 == ret) { - ota_info.down.size = AliOTA.size; - ota_info.down.crc32= calculate_crc32(DOWN_FLAH_ADDRESS, AliOTA.size); + ota_info.down.size = platform_ota.size; + ota_info.down.crc32 = calculate_crc32(DOWN_FLAH_ADDRESS, platform_ota.size); memset(ota_info.down.version,0,sizeof(ota_info.down.version)); - strncpy(ota_info.down.version, AliOTA.version, sizeof(ota_info.down.version)); + strncpy(ota_info.down.version, platform_ota.version, sizeof(ota_info.down.version)); memset(ota_info.down.description,0,sizeof(ota_info.down.description)); strncpy(ota_info.down.description, "MQTT OTA bin.",sizeof(ota_info.down.description)); @@ -959,6 +1175,7 @@ reconnect: MdelayKTask(2000); mcuboot.op_reset(); } +#endif int OtaTask(void) { diff --git a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.h b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.h index 48880a85c..551669d72 100644 --- a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.h +++ b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.h @@ -25,10 +25,6 @@ #define JUMP_FAILED_FLAG 0XABABABAB #define JUMP_SUCCESS_FLAG 0XCDCDCDCD -#define STARTFLAG 0x1A2B //数据帧开始信号标记 -#define DATAFLAG 0x3C4D //数据帧数据信号标记 -#define ENDTFLAG 0x5E6F //数据帧结束信号标记 -#define LENGTH 1024 //每帧数据的数据包长度 typedef enum { OTA_STATUS_IDLE = 0, // 空闲状态,没有进行OTA升级 @@ -62,6 +58,10 @@ typedef struct { #ifdef OTA_BY_TCPSERVER +#define STARTFLAG 0x1A2B //数据帧开始信号标记 +#define DATAFLAG 0x3C4D //数据帧数据信号标记 +#define ENDTFLAG 0x5E6F //数据帧结束信号标记 +#define LENGTH 1024 //每帧数据的数据包长度 /*bin包传输过程中的数据帧相关的结构体*/ typedef struct {