EC20 API接口问题请教

发布于 2019-11-11 15:09:54
[I/sal.skt] Socket Abstraction Layer initialize success.
[I/at.clnt] AT client(V1.2.0) on device uart3 initialize success.
[D/at.ec20] Start initializing the EC20 module
msh />[D/at.ec20] Baudrate 115200
[D/at.ec20]
[D/at.ec20] Quectel
[D/at.ec20] EC20F
[D/at.ec20] Revision: EC20CEFAGR06A10M4G
[D/at.ec20]
[D/at.ec20] Signal strength: 30 Channel bit error rate: 99
[D/at.ec20] GSM network is registered (0,1)
[D/at.ec20] GPRS network is registered (0,1)
[I/at.ec20] CHINA MOBILE
[I/at.ec20] 10.183.61.4
[D/at.ec20] EC20 IEMI number: 867394043406528
[D/at.ec20] EC20 IP address: 10.183.61.4
[D/at.ec20] EC20 primary DNS server address: 211.136.17.107
[D/at.ec20] EC20 secondary DNS server address: 211.136.20.203
[I/at.ec20] AT network initialize success!

如上所示,使用RTT加AT组件已经配对成功,通信OK,但是有个尴尬的问题是不知道怎么发送数据到相应的服务器端口,API 没有找到。不知道是哪个。查看AT组件API也没有举例说明。有点懵逼,我现在就想问一下,发送到远端的服务器应该调用哪个,接收函数应该调用哪个?


查看更多

关注者
0
被浏览
706
22 个回答
ROG
ROG 2019-11-11
AT版本使用的是V1.6
ROG
ROG 2019-11-11
老大们,不会又是用的linux那一套东西吧。直接调用socket()函数就行。高速我,让我死心
aozima
aozima 2019-11-11
不太明白楼主的意思

socket接口不好吗?

对了,socket并不是linux的哈,全名是 BSD Socket
ROG
ROG 2019-11-11
aozima 发表于 2019-11-11 17:02
不太明白楼主的意思

socket接口不好吗?


我知道啊。只是单片机上用scoket函数有点怪怪的。
我上面想表达的意思是:嗯~直接上代码吧,我在程序里面加入了AT组件,版本是1.6的,下端接入的是4G通信模块,使用串口。
我在main函数里面加入了如下内容。

int sock = socket(AF_AT, SOCK_STREAM, 0);
struct sockaddr_in serv_addr;
rt_memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(1234);
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
char str[] = "Hello World!";
write(sock, str, sizeof(str));
close(sock);

既然官方文档支持socket,不知这样操作可以不,我现在没有远程服务器,只能猜测,所以想问一下
ramboxin
ramboxin 2019-12-09
你好,搞定了吗?我也是同样问题?
ROG
ROG 2019-12-11
ramboxin 发表于 2019-12-9 14:38
你好,搞定了吗?我也是同样问题?


使用linux的那套socket机制
ROG
ROG 2019-12-11
ramboxin 发表于 2019-12-9 17:12
悬赏回复


/*
* Copyright (c) 2006-2019, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2019-07-09 MurphyZhao first version
*/

#include
#include
#include
#include

#include

#ifdef NB_TCP_DEMO
#ifdef RT_USING_SAL

#include
#include
#include "sal_tls.h"
#include "sys/time.h"
#else

#include "lwip/sockets.h"
#include "lwip/netdb.h"
#include "lwip/sys.h"
#include "lwip/inet.h"

#endif /* RT_USING_SAL */

#define LOG_TAG "demo.tcp"
#define LOG_LVL LOG_LVL_DBG
#include

#define TCP_TEST_HOST "www.rt-thread.com"
#define TCP_TEST_PORT (80u)

#define TEST_BUFSZ (1024u)

static const char *req_data = "GET /service/rt-thread.txt HTTP/1.1\r\n"
"Host: www.rt-thread.com\r\n"
"User-Agent: rtthread/4.0.1 rtt\r\n\r\n";

static char req_uri[128];
static int req_port;

static void nb_tcp_demo(int argc, char** argv)
{
int ret;

int sock = -1;
struct hostent *host;
struct sockaddr_in server_addr;
int bytes_received;
char *recv_data;

char ip_addr_buf[64];

if ((argc != 1) && (argc != 3))
{
LOG_E("In param error");
LOG_I("cmd: demo_tcp [ ]");
LOG_I("eg: demo_tcp");
LOG_I(" demo_tcp 127.0.0.1 8080");
return;
}

rt_memset(req_uri, 0x0, sizeof(req_uri));

if (argc == 3)
{
rt_strncpy(req_uri, argv[1], rt_strlen(argv[1]));
req_port = atoi(argv[2]);
}
else
{
rt_strncpy(req_uri, TCP_TEST_HOST, rt_strlen(TCP_TEST_HOST));
req_port = TCP_TEST_PORT;
}

LOG_I("TCP demo start");

LOG_I("Host:%s; Port:%d", req_uri, req_port);

LOG_D("will gethostbyname...");
host = gethostbyname(req_uri);
if (!host)
{
LOG_E("gethostbyname failed!");
return;
}

LOG_I("gethostbyname pass. ip addr: %s", inet_ntoa_r(*((struct in_addr *)host->h_addr_list[0]), ip_addr_buf, sizeof(ip_addr_buf)));

recv_data = rt_calloc(1, TEST_BUFSZ);
if (recv_data == RT_NULL)
{
LOG_E("calloc failed. No memory!");
return;
}

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
LOG_E("Create socket failed!");
goto __exit;
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(req_port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

if ((ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))) < 0)
{
LOG_E("Connect <%d> fail! ret:%d", sock, ret);
goto __exit;
}
LOG_I("connect <%s> success", ip_addr_buf);

ret = send(sock, req_data, strlen(req_data), 0);
if (ret <= 0)
{
LOG_E("send error, will close the socket <%d>.", sock);
goto __exit;
}
LOG_I("send success");

bytes_received = recv(sock, recv_data, TEST_BUFSZ - 1, 0);
if (bytes_received <= 0)
{
LOG_E("receive error, will close the socket <%d>.", sock);
goto __exit;
}

LOG_I("received data:\n");
for (int i = 0; i < bytes_received; i++)
{
rt_kprintf("%c", recv_data
    );
    }
    rt_kprintf("\r\n");

    __exit:
    if (recv_data)
    rt_free(recv_data);

    if (sock >= 0)
    {
    closesocket(sock);
    sock = -1;
    }

    LOG_I("TCP demo end");
    }
    #ifdef FINSH_USING_MSH
    #include
    MSH_CMD_EXPORT_ALIAS(nb_tcp_demo, demo_tcp, nbiot tcp test);
    #endif /* FINSH_USING_MSH */

    #endif /* NB_TCP_DEMO */

ROG
ROG 2019-12-11
ROG 发表于 2019-12-11 17:42


/*
* Copyright (c) 2006-2019, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2019-07-09 MurphyZhao first version
*/

#include
#include
#include
#include

#include

#ifdef NB_UDP_DEMO

#ifdef RT_USING_SAL

#include
#include
#include "sal_tls.h"
#include "sys/time.h"
#else

#include "lwip/sockets.h"
#include "lwip/netdb.h"
#include "lwip/sys.h"
#include "lwip/inet.h"

#endif /* RT_USING_SAL */

#define LOG_TAG "demo.udp"
#define LOG_LVL LOG_LVL_DBG
#include

#define TCP_TEST_HOST "114.116.144.151"
#define TCP_TEST_PORT (2010u)

#define TEST_BUFSZ (1024u)

static const char *req_data = "This message is from NB-IOT UDP Client with RT-Thread.\n";
static char req_uri[128];
static int req_port;

static void nb_udp_demo(int argc, char** argv)
{
int ret;

int sock = -1;
struct hostent *host;
struct sockaddr_in server_addr;
char *recv_data;
int bytes_received;

char ip_addr_buf[64];

LOG_I("UDP demo start");

if ((argc != 1) && (argc != 3))
{
LOG_E("In param error");
LOG_I("cmd: demo_udp [ ]");
LOG_I("eg: demo_udp");
LOG_I(" demo_udp 127.0.0.1 8080");
return;
}

rt_memset(req_uri, 0x0, sizeof(req_uri));

if (argc == 3)
{
rt_strncpy(req_uri, argv[1], rt_strlen(argv[1]));
req_port = atoi(argv[2]);
}
else
{
rt_strncpy(req_uri, TCP_TEST_HOST, rt_strlen(TCP_TEST_HOST));
req_port = TCP_TEST_PORT;
}

LOG_I("Host:%s; Port:%d", req_uri, req_port);

LOG_D("will gethostbyname...");
host = gethostbyname(req_uri);
if (!host)
{
LOG_E("gethostbyname failed!");
return;
}

LOG_I("gethostbyname pass. ip addr: %s", inet_ntoa_r(*((struct in_addr *)host->h_addr_list[0]), ip_addr_buf, sizeof(ip_addr_buf)));

recv_data = rt_calloc(1, TEST_BUFSZ);
if (recv_data == RT_NULL)
{
LOG_E("calloc failed. No memory!");
return;
}

if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
{
LOG_E("Create socket failed!");
goto __exit;
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(req_port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

if ((ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))) < 0)
{
LOG_E("Connect <%d> fail! ret:%d", sock, ret);
goto __exit;
}
LOG_I("connect <%s> success", ip_addr_buf);

ret = send(sock, req_data, strlen(req_data), 0);
if (ret <= 0)
{
LOG_E("send error, will close the socket <%d>.", sock);
goto __exit;
}
LOG_I("send success");

bytes_received = recv(sock, recv_data, TEST_BUFSZ - 1, 0);
if (bytes_received <= 0)
{
LOG_E("receive error, will close the socket <%d>.", sock);
goto __exit;
}

LOG_I("received data:\n");
for (int i = 0; i < bytes_received; i++)
{
rt_kprintf("%c", recv_data
    );
    }
    rt_kprintf("\r\n");

    __exit:
    if (recv_data)
    rt_free(recv_data);

    if (sock >= 0)
    {
    closesocket(sock);
    sock = -1;
    }

    LOG_I("UDP demo end");
    }
    #ifdef FINSH_USING_MSH
    #include
    MSH_CMD_EXPORT_ALIAS(nb_udp_demo, demo_udp, nbiot udp test);
    #endif /* FINSH_USING_MSH */

    #endif /* NB_UDP_DEMO */
ROG
ROG 2019-12-11
ROG 发表于 2019-12-11 17:43


希望对你有帮助,这是rtt官方的人员编写的demo,你要感谢他
ramboxin
ramboxin 2019-12-12
ROG 发表于 2019-12-11 17:44
希望对你有帮助,这是rtt官方的人员编写的demo,你要感谢他


不用socket吗?
int sock = socket(AF_AT, SOCK_STREAM, 0);
struct sockaddr_in serv_addr;
rt_memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(1234);
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
char str[] = "Hello World!";
write(sock, str, sizeof(str));
close(sock);
这个不能用吗?
ramboxin
ramboxin 2019-12-12
这几天都被这个是搞晕了。一星期了毫无进展。不过发现sal_socket.c中连接的是
//#define SAL_INTERNET_HOST "link.rt-thread.org"
//#define SAL_INTERNET_PORT 8101
使用的是SOCK_DGRAM
这样初始化的跟我要的不一样啊,我要的是TCP
所以改成了
#define SAL_INTERNET_HOST "ramboxin.xiaomy.net"//我的
#define SAL_INTERNET_PORT 15500
SOCK_STREAM
可是还是通讯不了,为什么?
ramboxin
ramboxin 2019-12-12
或者能不能付费指导,谢谢
ROG
ROG 2019-12-12
ramboxin 发表于 2019-12-12 08:47
不用socket吗?
int sock = socket(AF_AT, SOCK_STREAM, 0);
struct sockaddr_in serv_addr;


这里把write函数修改为send函数,即可
ROG
ROG 2019-12-12
ramboxin 发表于 2019-12-12 17:30
或者能不能付费指导,谢谢


看一下上面给你贴的源码,一个是TCP通信,一个是UDP通信,修改一下IP和端口就可以直接连接到你相应的服务器上面
ROG
ROG 2019-12-12
ramboxin 发表于 2019-12-12 17:30
或者能不能付费指导,谢谢


哈哈。不用了,我也是找他们官方索要的这个源码。当时也是搞得我直接跪了。这里涉及到linux的一些通信方式,静下心来,先看一下上面的源码,官方文档确实很差劲,这是真的,我也是翻阅文档好几遍才发现使用的linux上面的,很像但不完全是
ramboxin
ramboxin 2019-12-14
ROG 发表于 2019-12-12 18:12
哈哈。不用了,我也是找他们官方索要的这个源码。当时也是搞得我直接跪了。这里涉及到linux的一些通信方 ...


多谢,怎样才能给你悬赏,要不你答我的另外一个题目吧,随便写几句话就行。昨天终于调通了,原因是只能用域名,内网穿透的话用host = gethostbyname(req_uri);翻译的ip不对,所以一直调不对,不知道这个函数的真实面目,只能再研究了。另外,这个主动发送有了,用send函数,那么主动发送完后接收到的数据呢在哪儿存放着呢?还有就是服务器主动发送给我的数据放在哪儿呢?
ROG
ROG 2019-12-14
ramboxin 发表于 2019-12-14 08:43
多谢,怎样才能给你悬赏,要不你答我的另外一个题目吧,随便写几句话就行。昨天终于调通了,原因是只能用 ...


参见第一段代码的123行为发送函数。131行为接收函数。
ROG
ROG 2019-12-14
ramboxin 发表于 2019-12-14 08:43
多谢,怎样才能给你悬赏,要不你答我的另外一个题目吧,随便写几句话就行。昨天终于调通了,原因是只能用 ...


把你遇到的问题可以分享出来,就是帮助
ramboxin
ramboxin 2019-12-14
ROG 发表于 2019-12-14 09:41
参见第一段代码的123行为发送函数。131行为接收函数。


[qq]357393193[/qq]这个我认为是clint主动发送和接收;如果是clint被动发送和接收呢?(也就是说server是主动的)clint不知道什么时候去接收,是不是有个线程一直在跑,接收数据后放在一个buff中,接收完毕后提醒我呢?
ROG
ROG 2019-12-14
    本帖最后由 ROG 于 2019-12-14 14:45 编辑


ramboxin 发表于 2019-12-14 11:04
这个我认为是clint主动发送和接收;如果是clint被动发送和接收呢?(也就是说server是主动的)clint不知 ...

这与你协议有关了。在官方文档首页最下端有个网络示例代码https://github.com/RT-Thread-packages/network-sample,你可以研究一下。你这要多看文档啊!我就是看几遍rtt文档才敢做项目的,rtt没有你想的那么简单。
ramboxin
ramboxin 2019-12-16
ROG 发表于 2019-12-14 14:37
这与你协议有关了。在官方文档首页最下端有个网络示例代码https://github.com/RT-Thread-packages/network ...


[qq]357393193[/qq]谢谢你,基本上可以使用了。我一定要把分给你,不知道怎么给。再次感谢。我qq:357393193方便联系

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友