#define LINK_ID_MAX 5
typedef struct link_s
{
int fd;
} link_t;
static link_t g_link[LINK_ID_MAX];
int HAL_AT_CONN_Init(void)
{
int link;
memset(g_link, 0, sizeof(g_link));
for (link = 0; link < LINK_ID_MAX; link++)
{
g_link[link].fd = -1;
}
char cmd0[64] = {
0};
char out0[64] = {
0};
//选择模式1.Station 2.AP 3.AP+Station
HAL_Snprintf(cmd0, sizeof(cmd0), "AT+CWMODE=%d\r\n",3);
if(at_send_cmd_wait_reply(cmd0,sizeof(cmd0),out0,sizeof(out0),"\r\n","OK\r\n",6000) < 0)
{
at_conn_hal_debug("%s %d failed", __func__, __LINE__);
return -1;
}
//选择模式断开WIFI连接
HAL_Snprintf(cmd0, sizeof(cmd0), "AT+CWQAP\r\n");
if(at_send_cmd_wait_reply(cmd0,sizeof(cmd0),out0,sizeof(out0),"\r\n","OK\r\n",6000) < 0)
{
at_conn_hal_debug("%s %d failed", __func__, __LINE__);
return -1;
}
//选择模式连接WIFI,SSID:WIFISSID Password:WIFIPassword
HAL_Snprintf(cmd0, sizeof(cmd0), "AT+CWJAP=\"%s\",\"%s\"\r\n","WIFISSID","WIFIPassword");
if(at_send_cmd_wait_reply(cmd0,sizeof(cmd0),out0,sizeof(out0),"\r\n","OK\r\n",6000) < 0)
{
at_conn_hal_debug("%s %d failed", __func__, __LINE__);
return -1;
}
inited = true;
return 0;
}
int HAL_AT_CONN_Deinit(void)
{
if (!inited)
{
return 0;
}
inited = false;
return 0;
}
int HAL_AT_CONN_Start(at_conn_t *c)
{
char cmd0[128] = {
0};
char out0[128] = {
0};
//选择TCP连接模式为多连接
HAL_Snprintf(cmd0, sizeof(cmd0), "AT+CIPMUX=%d\r\n",1);
if(at_send_cmd_wait_reply(cmd0,sizeof(cmd0),out0,sizeof(out0),"\r\n","OK\r\n",6000) < 0)
{
at_conn_hal_debug("%s %d failed", __func__, __LINE__);
return -1;
}
int link_id;
for (link_id = 0; link_id < LINK_ID_MAX; link_id++)
{
if (g_link[link_id].fd >= 0)
{
continue;
}
else
{
g_link[link_id].fd = conn->fd;
break;
}
}
//建立TCP连接
HAL_Snprintf(cmd0, sizeof(cmd0), "AT+CIPSTART=%d,\"%s\",\"%s\",%d\r\n",link_id,"TCP",conn->addr,conn->r_port);
if(at_send_cmd_wait_reply(cmd0,sizeof(cmd0),out0,sizeof(out0),"\r\n","OK\r\n",300) < 0)
{
at_conn_hal_debug("%s %d failed", __func__, __LINE__);
return -1;
}
return (int)0;
}
int HAL_AT_CONN_Close(int fd, int32_t remote_port)
{
int link_id;
link_id = fd_to_linkid(fd);
if(link_id < 0 || link_id >= LINK_ID_MAX)
{
at_conn_hal_debug("No connection found for fd (%d) in %s in %s", fd, __func__, __LINE__);
return -1;
}
char cmd0[64] = {
0};
char out0[64] = {
0};
//关闭TCP连接
HAL_Snprintf(cmd0, sizeof(cmd0), "AT+CIPCLOSE=%d\r\n",link_id);
if(at_send_cmd_wait_reply(cmd0,sizeof(cmd0),out0,sizeof(out0),"\r\n","OK\r\n",6000) < 0)
{
//at_conn_hal_debug("%s %d failed", __func__, __LINE__);
//return -1;
}
g_link[link_id].fd = -1;
return 0;
}
int HAL_AT_CONN_Send(int fd,
uint8_t *data,
uint32_t len,
char remote_ip[16],
int32_t remote_port,
int32_t timeout)
{
int link_id;
if (!data)
{
return -1;
}
link_id = fd_to_linkid(fd);
if (link_id < 0 || link_id >= LINK_ID_MAX)
{
at_conn_hal_debug("No connection found for fd (%d) in %s in %s", fd, __func__, __LINE__);
return -1;
}
char cmd0[64] = {
0};
char out0[64] = {
0};
//设置发送数据到连接link_id,数据长度为len
HAL_Snprintf(cmd0, sizeof(cmd0), "AT+CIPSEND=%d,%d\r\n",link_id,len);
if(at_send_cmd_wait_reply(cmd0,sizeof(cmd0),out0,sizeof(out0),"\r\n","OK\r\n",300) < 0)
{
at_conn_hal_debug("%s %d failed", __func__, __LINE__);
return -1;
}
//开始发送数据
if(at_send_data_wait_reply(data,len,out0,sizeof(out0),">","OK\r\n",6000) < 0)
{
at_conn_hal_debug("%s %d failed", __func__, __LINE__);
return -1;
}
HAL_SleepMs(5000);
char Prefix[64] = {
0};
HAL_Snprintf(Prefix, sizeof(Prefix), "+IPD,%d,",link_id);
//等待回复
if (at_yield(out0, sizeof(out0), Prefix, ":", AT_UART_TIMEOUT_MS) < 0)
{
return -1;
}
char mqtt_reply[256] = {
0};
char c = NULL;
int num = atoi(out0);
for(int i=0;i < num;i++)
{
//抓取回复到mqtt_reply
if (at_getc(&c,timeout) != 0)
{
return -1;
}
mqtt_reply[i] = c;
}
struct at_conn_input param;
if (g_link[link_id].fd >= 0)
{
param.fd = g_link[link_id].fd;
param.data = mqtt_reply;
param.datalen = num;
param.remote_ip = NULL;
param.remote_port = 0;
//将接收到的数据上传给MQTT协议上层
if (IOT_ATM_Input(¶m) != 0)
{
at_conn_hal_debug(" %s socket %d get data len %d fail to post to at_conn, drop it\n",__func__, g_link[link_id].fd, len);
}
}
return (int)0; }
int HAL_AT_CONN_DomainToIp(char *domain, char ip[16])
{
char cmd0[128] = {
0};
char out0[128] = {
0};
//根据域名获取IP地址
HAL_Snprintf(cmd0, sizeof(cmd0), "AT+CIPDOMAIN=\"%s\"\r\n",domain);
if(at_send_cmd_wait_reply(cmd0,sizeof(cmd0),out0,sizeof(out0),"+CIPDOMAIN:","\r\n",6000) < 0)
{
at_conn_hal_debug("%s %d failed", __func__, __LINE__);
return -1;
}
for(int i=0;i < 16;i++)
{
ip[i] = out0[i];
}
at_conn_hal_debug("IP->%s", ip);
return 0;
}
以上程序都是在测试阶段编写,比较随意,有不足之处希望批评指正。
设备端程序完善后我们可以在阿里飞燕平台的控制台上中的物联网平台上进行调试,首先我们修改自定义Topic中的get类为发布和订阅,因为在mqtt_example_at.c的调试例子中采用订阅发布这个Topic来实现。
最后我们就可以启动程序来进行飞燕平台的连接了。如果应用mqtt_example_at.c调试例子,我们需把mqtt_example_at.c中main函数修改一个名字如mqtt_example,以免与我们自己的main函数冲突,并在我们定义的main函数中调用mqtt_example。
后续还将讨论如何用微信小程序与阿里飞燕平台对接,实现微信->阿里飞燕平台->WIFI模组的整套连接方案。