hafun 4g hefangyuan socket


原文链接: hafun 4g hefangyuan socket
typedef enum
{
	SOCK_ERR_EAI			= -9,
    SOCK_INVAL_PARA			= -8,
    SOCK_ERROR				= -7,
    SOCK_PEER_NOT_REACHABLE	= -6,   // 连接失败,连接不可达
    SOCK_PEER_NO_RESPONSE	= -5,
    SOCK_CNT_RESET_BY_PEER	= -4,   // disconnect 断开连接
    SOCK_UNKNOWN_APP		= -3,
    SOCK_BUSY				= -2,
    SOCK_NO_MEMORY  		= -1,
	SOCK_SUCCESS 			= 0,   // connect 连接成功
	SOCK_ERR_CONN_PENDING 	= 1,
	
} sock_result_enum;

static uint8 g_conn_id = 1;

int _on_connect(sock_result_enum result)
{
    // 创建和断开连接的时候都会回调这个函数,根据不同的网络状态,result的值不同
    // 一般在开始创建网络的时候,这时候网络还不通,result=-6 ,当创建网络成功后 result=0 ,当网络断开时 result=-4
    // SOCK_PEER_NOT_REACHABLE	= -6,   // 连接失败,连接不可达
    // SOCK_CNT_RESET_BY_PEER	= -4,   // disconnect 断开连接
    // SOCK_SUCCESS 			= 0,   // connect 连接成功
    printf("%s %d \n",__func__,result);
    return SOCK_SUCCESS;
}

int _on_recv(const uint8 *data, int len)
{
                printf("%s %s %d\n",__func__,data,len);

        SIO_WRITE_ATCORE(data,len,1);
    return SOCK_SUCCESS;
}

int _on_send(sock_result_enum result, int len)
{
        printf("%s %d %d \n",__func__,result,len);
    return SOCK_SUCCESS;
}

int _on_close(sock_result_enum result)
{
        printf("%s %d\n",__func__,result);
    return SOCK_SUCCESS;
}

int _send_keepalive_probe(uint8 idx)
{
    	// idx 返回的是连接号
        struct timespec sys_time = {0, 0};
		
		clock_gettime(CLOCK_REALTIME, &sys_time);
		// g_sys_second = sys_time.tv_sec;
    uint8 * data = (uint8*)"ping\n";
	sock_cont_put_tail(idx,data,strlen((char *)data));

    printf("%s %d %d\n",__func__,idx,sys_time.tv_sec);
    
    return SOCK_SUCCESS;
}
// static int _cam_send_keepalive_probe(uint8 idx)
// {
//  if (m_sock_cb_cam.conn_id != idx)
//   return SOCK_ERROR;
//  _cam_sock_send_resp(CS_CODE_SUCCESS, CAM_SOCK_CMD_KEEPALIVE_REQ, NULL, 0);
//  return SOCK_SUCCESS;
// }

static sock_event_callback_struct m_socket_event_cb = {
    _on_connect, _on_recv, _on_send, _on_close, _send_keepalive_probe};

void socket_callback_init()
{

m_socket_event_cb.conn_id = g_conn_id;
    int id = sock_cont_init(
        g_conn_id,
        SOCK_TCP,
        "47.104.136.74",
        4000,   // 端口
        1, // keepalive 是否保持长链接
        1, // AT命令调用1,还是函数调用0, 当参数为1 时从AT指令中可以查看其状态。
        &m_socket_event_cb);
    char data[100];
    sprintf(data,"tcp sock_cont_init:%d\n", id);
    SIO_WRITE_ATCORE(data,100,1);
}

int get_socket_id()
{
    return g_conn_id;
}

当不使用 keepalive 错误【SOC: Ignore pack for invalid connect】

当不使用 keepalive时 可能因为网络的问题连接创建失败,这是要自己去创建连接

1,CONNECT FAIL

如何配置 自动重连的时间?
配置重连间隔参数:
设置命令 AT+CIPRECONN=,
0,1,2 断线重连间隔次数
[0],0-3600000单位:秒 等待间隔时间再发起重连

【休眠】 多次释放休眠锁

int m_sleep_handler 是个文件描述符, 所以多次执行 acquire release 都没关系,以最后一次为准

    // 1. 获取休眠锁,防止系统进入休眠
    sleep_acquire(m_sleep_handler); 
    // 3. 释放休眠锁
    sleep_release(m_sleep_handler);
    sleep_release(m_sleep_handler);

A: 多次释放休眠锁,不影响系统运行

B: 不释放休眠锁,等待强制休眠

`