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
如何配置 自动重连的时间? int m_sleep_handler 是个文件描述符, 所以多次执行 acquire release 都没关系,以最后一次为准 A: 多次释放休眠锁,不影响系统运行 B: 不释放休眠锁,等待强制休眠
配置重连间隔参数:
设置命令 AT+CIPRECONN=【休眠】 多次释放休眠锁
// 1. 获取休眠锁,防止系统进入休眠
sleep_acquire(m_sleep_handler);
// 3. 释放休眠锁
sleep_release(m_sleep_handler);
sleep_release(m_sleep_handler);