forked from xuos/xiuos
Modify the tcp server to send 1024 bytes each time
This commit is contained in:
parent
c6af847c73
commit
938d46d5d9
|
@ -26,12 +26,6 @@
|
|||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(CONNECTION_ADAPTER_4G) && defined(TOOL_USING_OTA)
|
||||
#define ENTM_RECV_MAX 1024
|
||||
#else
|
||||
#define ENTM_RECV_MAX 256
|
||||
#endif
|
||||
|
||||
#define REPLY_TIME_OUT 10
|
||||
|
||||
enum ReceiveMode
|
||||
|
@ -76,6 +70,7 @@ struct ATAgent
|
|||
#endif
|
||||
pthread_t at_handler;
|
||||
|
||||
#define ENTM_RECV_MAX 2048
|
||||
char entm_recv_buf[ENTM_RECV_MAX];
|
||||
uint32 entm_recv_len;
|
||||
enum ReceiveMode receive_mode;
|
||||
|
|
|
@ -67,7 +67,7 @@ CONFIG___STACKSIZE__=4096
|
|||
#
|
||||
CONFIG_RESOURCES_SERIAL=y
|
||||
CONFIG_SERIAL_USING_DMA=y
|
||||
CONFIG_SERIAL_RB_BUFSZ=128
|
||||
CONFIG_SERIAL_RB_BUFSZ=256
|
||||
CONFIG_RESOURCES_PIN=y
|
||||
|
||||
#
|
||||
|
|
|
@ -131,16 +131,18 @@ static uint32_t calculate_crc32(uint32_t addr, uint32_t len)
|
|||
static uint16_t calculate_crc16(uint8_t * data, uint32_t len)
|
||||
{
|
||||
uint16_t reg_crc=0xFFFF;
|
||||
while(len--) {
|
||||
while(len--)
|
||||
{
|
||||
reg_crc ^= *data++;
|
||||
for (int j=0;j<8;j++) {
|
||||
for(int j=0;j<8;j++)
|
||||
{
|
||||
if(reg_crc & 0x01)
|
||||
reg_crc=reg_crc >>1 ^ 0xA001;
|
||||
else
|
||||
reg_crc=reg_crc >>1;
|
||||
}
|
||||
}
|
||||
printf(" crc = [0x%x]\n",reg_crc);
|
||||
printf("crc = [0x%x]\n",reg_crc);
|
||||
return reg_crc;
|
||||
}
|
||||
|
||||
|
@ -490,7 +492,8 @@ static int ota_data_recv(struct Adapter* adapter)
|
|||
int try_times = 10;
|
||||
int frame_cnt = 0;
|
||||
|
||||
while(1) {
|
||||
while(1)
|
||||
{
|
||||
memset(&recv_msg, 0, sizeof(struct ota_data));
|
||||
ret = AdapterDeviceRecv(adapter, &recv_msg, sizeof(struct ota_data));
|
||||
if(ret >= 0 && recv_msg.header.frame_flag == 0x5A5A)
|
||||
|
@ -506,14 +509,13 @@ static int ota_data_recv(struct Adapter* adapter)
|
|||
printf("total [%d]frames [%d]Bytes crc[%x],receive successful,\n",frame_cnt,recv_msg.header.total_len,recv_msg.frame.crc);
|
||||
memset(reply, 0, 16);
|
||||
memcpy(reply, "ok", strlen("ok"));
|
||||
|
||||
AdapterDeviceSend(adapter, reply, strlen(reply));
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
frame_cnt = recv_msg.frame.frame_id;
|
||||
|
||||
if (recv_msg.frame.crc == calculate_crc16(recv_msg.frame.frame_data,recv_msg.frame.frame_len))
|
||||
if(recv_msg.frame.crc == calculate_crc16(recv_msg.frame.frame_data,recv_msg.frame.frame_len))
|
||||
{
|
||||
printf("current [%d] frame,length[%d] Bytes.\n",frame_cnt,recv_msg.frame.frame_len);
|
||||
/*写入flash待实现*/
|
||||
|
@ -529,7 +531,8 @@ send_ok_again:
|
|||
memcpy(reply, "ok", strlen("ok"));
|
||||
|
||||
ret = AdapterDeviceSend(adapter, reply, strlen(reply));
|
||||
if(ret < 0){
|
||||
if(ret < 0)
|
||||
{
|
||||
printf("send ok failed.\n");
|
||||
goto send_ok_again;
|
||||
}
|
||||
|
@ -558,7 +561,8 @@ try_again:
|
|||
}
|
||||
}
|
||||
|
||||
if(0 == ret) {
|
||||
if(0 == ret)
|
||||
{
|
||||
printf("ota file done,start application.\n");
|
||||
//传输完成需要干什么;
|
||||
}
|
||||
|
@ -593,12 +597,12 @@ void app_ota_by_4g(void)
|
|||
while(1)
|
||||
{
|
||||
memset(&recv_msg, 0, sizeof(struct ota_data));
|
||||
/* step1: Confirm the start signal of transmission*/
|
||||
/* step1:Confirm the start signal of transmission. */
|
||||
printf("waiting for start msg...\n");
|
||||
ret = AdapterDeviceRecv(adapter, &recv_msg, sizeof(struct ota_data));
|
||||
if(ret >= 0 && recv_msg.header.frame_flag == 0x5A5A)
|
||||
{
|
||||
if (0 == strncmp("aiit_ota_start",recv_msg.frame.frame_data, strlen("aiit_ota_start")))
|
||||
if(0 == strncmp("aiit_ota_start",recv_msg.frame.frame_data, strlen("aiit_ota_start")))
|
||||
{
|
||||
memset(reply, 0, 16);
|
||||
memcpy(reply, "ready", strlen("ready"));
|
||||
|
@ -610,10 +614,10 @@ send_ready_again:
|
|||
goto send_ready_again;
|
||||
}
|
||||
printf("start receive ota file.\n");
|
||||
/* step2: start receive bin file,first wait for 5s*/
|
||||
PrivTaskDelay(5000);
|
||||
/* step2:start receive bin file,first wait for 4s. */
|
||||
PrivTaskDelay(4000);
|
||||
ret = ota_data_recv(adapter);
|
||||
if (0 != ret)
|
||||
if(0 != ret)
|
||||
{
|
||||
memset(reply, 0, 16);
|
||||
memcpy(reply, "ota_restart", strlen("ota_restart"));
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
#define JUMP_FAILED_FLAG 0XABABABAB
|
||||
#define JUMP_SUCCESS_FLAG 0XCDCDCDCD
|
||||
#define LENGTH 256 //每帧数据的数据包长度
|
||||
#define LENGTH 1024 //每帧数据的数据包长度
|
||||
|
||||
typedef enum {
|
||||
OTA_STATUS_IDLE = 0, // 空闲状态,没有进行OTA升级
|
||||
|
|
|
@ -38,9 +38,9 @@
|
|||
#include <ifaddrs.h>
|
||||
|
||||
|
||||
#define PORT 7777 //socket端口号
|
||||
#define SIZE 100 //socket链接限制为100
|
||||
#define LENGTH 256 //每帧数据的数据包长度
|
||||
#define PORT 7777 //socket端口号
|
||||
#define SIZE 100 //socket链接限制为100
|
||||
#define LENGTH 1024 //每帧数据的数据包长度
|
||||
#define BIN_PATH "/home/aep05/wgz/XiZi-xidatong-arm32-app.bin" //bin包的路径
|
||||
|
||||
struct ota_header_t
|
||||
|
@ -79,16 +79,18 @@ static int clientfd[SIZE] = {0}; // 客户端的socketfd,100个元素,clientfd
|
|||
static uint16_t calculate_crc16(uint8_t * data, uint32_t len)
|
||||
{
|
||||
uint16_t reg_crc=0xFFFF;
|
||||
while(len--) {
|
||||
while(len--)
|
||||
{
|
||||
reg_crc ^= *data++;
|
||||
for (int j=0;j<8;j++) {
|
||||
for(int j=0;j<8;j++)
|
||||
{
|
||||
if(reg_crc & 0x01)
|
||||
reg_crc=reg_crc >>1 ^ 0xA001;
|
||||
else
|
||||
reg_crc=reg_crc >>1;
|
||||
}
|
||||
}
|
||||
printf(" crc = [0x%x]\n",reg_crc);
|
||||
printf("crc = [0x%x]\n",reg_crc);
|
||||
return reg_crc;
|
||||
}
|
||||
|
||||
|
@ -108,7 +110,7 @@ void sockt_init(void)
|
|||
|
||||
serverfd = socket(AF_INET,SOCK_STREAM,0);
|
||||
|
||||
if (serverfd == -1)
|
||||
if(serverfd == -1)
|
||||
{
|
||||
perror("创建socket失败");
|
||||
exit(-1);
|
||||
|
@ -121,8 +123,10 @@ void sockt_init(void)
|
|||
|
||||
/*显示当前TCP server的*/
|
||||
getifaddrs(&ifap);
|
||||
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
|
||||
if (ifa->ifa_addr->sa_family == AF_INET) {
|
||||
for(ifa = ifap; ifa != NULL; ifa = ifa->ifa_next)
|
||||
{
|
||||
if(ifa->ifa_addr->sa_family == AF_INET)
|
||||
{
|
||||
sa = (struct sockaddr_in *) ifa->ifa_addr;
|
||||
ipaddr = inet_ntoa(sa->sin_addr);
|
||||
printf("Interface: %s\tAddress: %s\n", ifa->ifa_name, ipaddr);
|
||||
|
@ -140,14 +144,14 @@ void sockt_init(void)
|
|||
exit(-1);
|
||||
}
|
||||
|
||||
if (bind(serverfd,(struct sockaddr*)&addr,sizeof(addr)) == -1)
|
||||
if(bind(serverfd,(struct sockaddr*)&addr,sizeof(addr)) == -1)
|
||||
{
|
||||
perror("绑定失败");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//监听最大连接数
|
||||
if (listen(serverfd,SIZE) == -1)
|
||||
if(listen(serverfd,SIZE) == -1)
|
||||
{
|
||||
perror("设置监听失败");
|
||||
exit(-1);
|
||||
|
@ -177,13 +181,14 @@ void ota_start_signal(int fd)
|
|||
|
||||
printf("send start signal.\n");
|
||||
ret = send(fd, &data, sizeof(data), MSG_NOSIGNAL);
|
||||
if (ret > 0){
|
||||
if(ret > 0)
|
||||
{
|
||||
printf("send %s[%d] Bytes\n",data.frame.frame_data,ret);
|
||||
}
|
||||
|
||||
memset(buf, 0, 32);
|
||||
length = recv(fd, buf, sizeof(buf), 0);
|
||||
if (length > 0 && (0 == strncmp(buf, "ready", length)))
|
||||
if(length > 0 && (0 == strncmp(buf, "ready", length)))
|
||||
{
|
||||
printf("recv buf %s length %d\n",buf,length);
|
||||
break;
|
||||
|
@ -219,17 +224,21 @@ int ota_file_send(int fd)
|
|||
int file_length = 0;
|
||||
char * file_buf = NULL;
|
||||
|
||||
if (stat(BIN_PATH, &st) == 0) {
|
||||
if(stat(BIN_PATH, &st) == 0)
|
||||
{
|
||||
//获取文件大小(以字节为单位)
|
||||
file_frame_cnt = (st.st_size%LENGTH != 0)? (st.st_size/LENGTH + 1):(st.st_size/LENGTH);
|
||||
printf("File size is %ld bytes,file frame count is %d!\n", st.st_size, file_frame_cnt);
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("get file size failed.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
file_fd = fopen(BIN_PATH, "r");
|
||||
if (NULL == file_fd){
|
||||
if(NULL == file_fd)
|
||||
{
|
||||
printf("open file failed.\n");
|
||||
return -1;
|
||||
}
|
||||
|
@ -255,7 +264,8 @@ int ota_file_send(int fd)
|
|||
send_again:
|
||||
printf("ota send current[%d] frame.\n",frame_cnt);
|
||||
length = send(fd, &data, sizeof(data), MSG_NOSIGNAL);
|
||||
if(length < 0){
|
||||
if(length < 0)
|
||||
{
|
||||
printf("send [%d] frame faile.go to send again\n",frame_cnt);
|
||||
goto send_again;
|
||||
}
|
||||
|
@ -263,7 +273,8 @@ send_again:
|
|||
recv_again:
|
||||
memset(buf, 0, 32);
|
||||
length = recv(fd, buf, sizeof(buf), 0);
|
||||
if(length < 0 ){
|
||||
if(length < 0 )
|
||||
{
|
||||
printf("[%d] frame waiting for ok timeout,receive again.\n",frame_cnt);
|
||||
goto recv_again;
|
||||
}
|
||||
|
@ -294,7 +305,7 @@ recv_again:
|
|||
}
|
||||
|
||||
/* finally,crc check total bin file.*/
|
||||
if (ret == 0)
|
||||
if(ret == 0)
|
||||
{
|
||||
printf("total send file length[%d] Bytes [%d] frames.\n",file_length,frame_cnt);
|
||||
printf("now crc check total bin file.\n");
|
||||
|
@ -305,14 +316,16 @@ recv_again:
|
|||
data.header.frame_flag = 0x5A5A;
|
||||
|
||||
file_fd = fopen(BIN_PATH, "r");
|
||||
if (NULL == file_fd){
|
||||
if(NULL == file_fd)
|
||||
{
|
||||
printf("open file failed.\n");
|
||||
return -1;
|
||||
}
|
||||
fseek(file_fd, 0, SEEK_SET);
|
||||
length = fread(file_buf,1, file_length, file_fd);
|
||||
printf("read file length = %d\n",length);
|
||||
if(length > 0) {
|
||||
if(length > 0)
|
||||
{
|
||||
data.frame.frame_id = frame_cnt;
|
||||
data.header.total_len = file_length;
|
||||
data.frame.frame_len = strlen("aiit_ota_end");
|
||||
|
@ -323,7 +336,8 @@ recv_again:
|
|||
send_end_signal:
|
||||
printf("send aiit_ota_end signal.\n");
|
||||
length = send(fd, &data, sizeof(data), MSG_NOSIGNAL);
|
||||
if(length < 0){
|
||||
if(length < 0)
|
||||
{
|
||||
printf("send end signal faile,send end signal again\n");
|
||||
goto send_end_signal;
|
||||
}
|
||||
|
@ -374,16 +388,19 @@ void* server_thread(void* p)
|
|||
int length = 0;
|
||||
|
||||
printf("pthread = %d\n",fd);
|
||||
sleep(5);
|
||||
sleep(3);
|
||||
ota_start_signal(fd);
|
||||
sleep(5);
|
||||
while(1)
|
||||
{
|
||||
ret = ota_file_send(fd);
|
||||
if (ret == 0) {
|
||||
if(ret == 0)
|
||||
{
|
||||
printf("ota file send successful.\n");
|
||||
break;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ota failed then restart the ota process */
|
||||
continue;
|
||||
}
|
||||
|
@ -410,13 +427,13 @@ void server(void)
|
|||
socklen_t len = sizeof(fromaddr);
|
||||
int fd = accept(serverfd,(struct sockaddr*)&fromaddr,&len);//调用accept进入堵塞状态,等待客户端的连接
|
||||
|
||||
if (fd == -1)
|
||||
if(fd == -1)
|
||||
{
|
||||
printf("The client connection is wrong...\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0;i < SIZE;i++)
|
||||
for(i = 0;i < SIZE;i++)
|
||||
{
|
||||
if(clientfd[i] == 0)
|
||||
{
|
||||
|
@ -429,7 +446,7 @@ void server(void)
|
|||
break;
|
||||
}
|
||||
|
||||
if (SIZE == i)
|
||||
if(SIZE == i)
|
||||
{
|
||||
//发送给客户端聊天室满了
|
||||
char* str = "Devices full";
|
||||
|
|
Loading…
Reference in New Issue