This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220:向 IFFFT 服务器发送 POST

Guru**** 2555630 points
Other Parts Discussed in Thread: ENERGIA

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/691241/cc3220-send-post-to-iffft-server

器件型号:CC3220

您好!

我正在尝试让 CC3220向 IFFFT 服务器发送帖子。

作为基础项目、我使用"配置"演示连接到互联网、使用"HttpGet "演示的一些代码向服务器发送帖子。

我必须包含"Provisioning"演示中使用的"HttpGet"演示库、以便可以使用"HttpClient"库。

我已连接到 INetrnet、我的 IFFFT 链接正常工作。

以下是我的代码:

#defineHOSTNAME"https://maker.ifttt.com"
#define REQUEST_URI "/trigger/mytrigger/with/key/myKey
#define USER_AGENT "HttpClient (ARM;TI-RTOS)"

static Int32_t sendWaterEmailTest (void)
{bremedDataFlag
= false;
Clientdata[HTTP_MIN_RECV];
int16_t HOSTNAME = 0;
如果

发送

Http_Handle

= 0、则为 Http_Handle (http_http_min_rtt)


;Http_rtt Handle = 0;Http_Handle = 0;Http_Handle = 0;Http_Handle = 0;Http_Handle = 0;Http_Handle = 0;Http_Handle = 0;Http_Handle <Http_Handle = 0;Http_Handle 创建 http 客户端句柄失败\n\r\n、statusCode);
}

ret = HttpClient_setHeader (httpClientHandle、HttpClient_HFIELD_REQ_USER_AGENT、USER_AGENT、strlen (USER_AGENT)、HttpClient_setHeader (httpClient_ILD_PERSISTENT);
if (
log_MESSAGE < 0){LOG_MESSAGE (http_REQ







= 0、http_RETOP0)、HttpREQ = 0、HttpREQ 0、Httpendr (http_REQ);(如果 HttpRET_RETHET < 0、则为0、则为0、则为0);
(http_CLIENT) 发送失败%i\n\r\n,ret);
}

if (ret != HTTP_SC_OK){log_message("httpTask:
Cannot get status %i\n\r", ret);
}

log_message("HTTP Response Status Code:%d\n\r",&);


Do {
Do {=HttpClient\r},回应



数据(\datoreLog);\n\date&tre!\n\date!\n&tre&tre!
len += ret;
}while (moreDataFlag);

log_message ("接收到%d 字节有效载荷\n\r"、len);

ret = HttpClient_ddisconnect (httpClientHandle);
if (ret<0)
{
log_message ("httpTask:disconnect failed\n"r);
}

HttpClient_destroy (httpret
);(return)

这就是我在 UART 中得到的结果:

发送 HTTP POST 请求至'https://maker.ifttt.com'
httpTask:连接失败:-2006
httpTask:发送失败-3021
httpTask:无法获取状态-3021
HTTP 响应状态代码:-3021

接收到0字节的有效载荷
httpTask:断开连接失败

是否知道它无法连接以及为何无法发送帖子?

我在 Energia 中测试了一个与 IFFFT 和 CC3220配合使用的示例项目:

#ifndef __CC3200R1M1RGC__
#include 
#endif
#include 

//您的网络名称也称为 SSID
字符 SSID[]="mySSID";
//您的网络密码
字符密码[]="myPassword";
字符服务器[]="maker.ifttt.com";

//初始化以太网客户端库
//使用要
连接的服务器的 IP 地址和端口//(端口80是 HTTP 的默认值):
WiFiClient 客户端;

int 触发器=0;

void setup(){//
初始化串行端口并等待端口打开:
Serial.begin(115200);

//尝试连接到 Wifi 网络:
serial.print ("尝试连接到网络命名为:");
//打印网络名称(SSID);
serial.println (SSID);
//连接到 WPA/WPA2网络。 如果使用开放或 WEP 网络:
WiFi.begin(ssid,密码);
while (wif.status()!= wl_connected){
//在我们等待连接
Serial.print (".");
delay (300);
}

Serial.println ("\n 您已连接到网络");
Serial.println ("等待 IP 地址"),请更改此行;

while (wifi.localip()=INADDR_NONE){
//在等待 IP 地址
Serial.print ("。")时打印点;
delay (300);
}

Serial.println ("获得\nip 地址");
//我们已连接并具有 IP 地址。
//打印 WiFi 状态。
printWifiStatus();


//启用内部上拉。
*没有引脚的情况下将悬空、该示例将不起作用*/
pinMode (PUSH2、INPUT_PULLUP);
pinMode (1、OUTPUT);
//pinMode (2、OUTPUT);
digitalWrite (1、 高电平);
// digitalWrite (2、低电平);
attachInterrupt (PUSH2、sendRequest、 下降);//每当按下按钮

时就会触发中断 Serial.println ("按下按钮!");
}

void loop (){
String IFTTT_key = myIFFFTKey ";
String IFTTT_EVENT ="myIFFFTTTTTTTTrigger";// IFTTT Maker Event Name HERE

sensortrigger = analogRead (A3);String IFTTT


= myIFTFFTTRIGGER (A3)

="1000);sensort_1pritrn (alt =

1);sensort (1prit_t)= 1);senstrigger (alt (<1);sensitle.pritruptn)= 1);sensort_t



}

//*********
//此方法与服务器建立 HTTP 连接,并执行用户名的 GET 请求
//简单地传递标记 ID 以作为字符串进行查询。
//返回字符串:
//-返回" "如果标记 ID 已注册
//-如果标记 ID 未注册则返回"NULL"
//-如果 REST API 失败则返回"FAIL"
//
字符串 IFTTT_TRIGGER (字符串键、字符串事件){
字符串名称="";
//在发送新请求之前关闭任何连接。
//这将释放 WiFi shield
client.stop()上的套接字;

//如果连接成功:
if (client.connect (server、80)){

//这是可选的。 您可以将其他数据连同 HTTP POST 一起发送到 IFTTT,这些数据将触发操作
字符串 PostData =“{\"value1\":\"Michael Liesenberg \""、\"value2\":\"Hello\"、\"e3\":\"World!\"};

Serial.pritln ("已连接到服务器... 获取名称...");
//发送 HTTP PUT 请求:
字符串请求="POST /TRIGGER/";
请求+=
"/with/key;
请求+= KEY;
请求+=" HTTP/1.1";

Serial.printn (请求);
client.Energtln (请求);
client.println (请求);client.println ("主机:maker.ifttt.com");
client.println-1.1;User.printl1.1
client.println ("连接:关闭");
client.println ("内容类型:应用程序/json");
client.print ("内容长度:");
client.println (PostData.length ());
client.println ();
client.println (PostData);
client.println ();

}
否则{
//如果无法建立连接:
serial.println ("连接失败");
返回"失败";// REST API 失败...
}

//捕获服务器的响应。 (10秒超时)
长超时= 4000;
长 lastTime =毫秒();

while ((毫秒()-lastTime)<超时){//等待服务器的传入响应
while (client.available ()){//从服务器传入字符
c = client.read ();//读取字符
Serial.write (c);
}


Serial request.n
(完整
); //返回从服务器接收到的完整名称
return "SUCCERS";
}


void printWifiStatus(){
//打印您所连接网络的 SSID:
serial.print ("ssid:");
serial.println (WiFi.ssid ());

//打印 WiFi IP 地址:
ipaddress = WiFi.localIP ();serial.printn (wif.ssid

)

;//打印接收到的信号强度:
长 RSSI = WiFi.RSSI ();
Serial.print ("信号强度(RSSI):");
Serial.print (RSSI);
Serial.println (" dBm");
}

void sendRequest(){
if (trigger = 0){
trigger = 1;
}

谢谢、

Michael

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、

    快速浏览 http 客户端库后、我认为您需要在 httpclient.h 中增加 HttpClient_domain_BUFLEN 的值

    BTW... 在第一个代码内部、您使用 https://、在 Energia 代码中、您使用 http://

    1月
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、

    请尝试上述 Jan 提出的建议、并告知我们结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我将"https://"更改为"http://"、并将 httpclient.h 中 HttpClient_domain_BUFLEN 的大小从100增大到1000

    但仍然没有成功:

    设备已连接到互联网
    发送 HTTP POST 请求至'http://maker.ifttt.com'
    httpTask:连接失败:-2006
    httpTask:发送失败-3021
    httpTask:无法获取状态-3021
    HTTP 响应状态代码:-3021

    接收到0字节的有效载荷
    httpTask:断开连接失败

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、

    我后退了一步、使用 HttpGet 演示项目使其首先与 IFTTT 配合使用。

    因此我现在可以连接、但 sendRequest 失败了:

    正在连接到:mySSID。

    发送 HTTP POST 请求至'aker.ifttt.com '

    错误! 代码= 502、desc = httpTask:无法获取状态:

    看起来"HttpClient_sendRequest"有错误代码502。 我应该修改哪些内容才能使其正常工作?

    #define HOSTNAME "maker.ifttt.com
    #define Request_URI "/trigger/myTrigger/with/key/myKey
    #define USER_AGENT "HttpClient (ARM;TI-RTOS)" 

    RET = HttpClient_sendRequest (httpClientHandle、HTTP_METHOD_POST、Request_URI、NULL、0、0);
    如果(ret < 0){
    printError ("httpTask: send failed"、ret);
    }
    
    if (ret!= HTTP_SC_OK){
    printError ("httpTask:无法获取状态:\n"、ret);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我认为错误502是服务器端的 http 代码错误网关。 但不要问我为什么返回该代码。

    1月
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    那么、如果大家不知道、我如何将 Energia 代码转换为 CSS? 由于此代码起作用:

    if (client.connect (server、80)){
    
    //这是可选的。 您可以将其他数据连同触发操作的 HTTP POST 一起发送到 IFTTT
    字符串 PostData ="{\"value1\":\"Michael Liesenberg、\"value2\":\"Hello\"、\"value3\":\"World!\"};
    
    serial.println ("已连接到服务器... 正在获取名称...");
    //发送 HTTP PUT 请求:
    字符串请求="POST /TRIGGER/";
    请求+=事件;
    请求+="/with/key;
    请求+=密钥;
    请求+=" HTTP/1.1";
    
    serial.println (请求);
    client.println (请求);
    client.println ("主机:maker.ifttt.com");
    client.println ("用户代理:Energia/1.1");
    client.println ("连接:关闭");
    client.println ("内容类型:application/json");
    client.print ("Content-Length:");
    client.println (PostData.length());
    client.println();
    client.println (PostData);
    client.println();
    
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、我使其能够在 LAB20_WiFi 项目上与 MSP432配合使用。

    当我在 CC3220 Launchpad 上启动"sl_NetAppDnsGetHostByName"时、任务在这里挂起。

    即使我有一个任务线程、我是否也必须发送信标并在回调中处理函数?

    是否有一个有关如何执行此操作的示例?  

    以下是有效的代码:

    //带有密钥
    #define POSTHEADER "POST /trigger/myEvent/with/key/myKey
    #define HOSTHEADER "Host:maker.ifttt.com\r\n"
    #define CHEADER "Connection:keep-alive\r\n"
    #define CTHEADER "Content-Type:application/json;charset=UTF-8 \r\n\r\n #define
    CLHEADER1""Content-Length: "
    #define CLHEADER2 "\r\n"//first
    part of message
    #define DATA1L "{\"\""//
    sSecond part of message
    #define DATA1R "\"}\n\n\r\n\r\n"#define
    DATA2"\"Info\":\""从 CC3220
    发送的消息第二部分 maker.ifttt.com";
    
    
    {\""}*静态 POST_CC3220 = LaunchPad
    /***** 获取主机 IP ******** /
    int32_t status =-1;
    
    strcpy ((char *) App_CB.emailHostName、email_Server);
    //根据地址接收主机的 IP
    状态= sl_NetAppDnsGetHostByName ((signed char *) App_CB.emailHostName、
    strlen(((const char*) App_CB.emailHostName),
    (unsigned long*)&App_CB.emailDestinationIP、
    SL_AF_iNet);
    ASSERT_ON_ERROR (STATUS);
    
    
    
    
    /***** 创建连接****** /
    SlSockAddrIn_t Addr;
    
    int16_t SD = 0;
    int16_t AddrSize = 0;
    int32_t RET_val = 0;
    
    Addr.Sin_Family = SL_AF_iNet;
    Addr.sin 端口= sl_Htons (80);
    
    /*将 DestinationIP endianity 更改为 big endian */
    Addr.sin addr.s_addr = sl_Htonl (App_CB.emailDestinationIP);
    
    AddrSize = sizeof (SlSockAddrIn_t);
    
    SD = sl_Socket (sl_AF_iNet、sl_sock_stream、0);
    if (SD < 0)
    {
    log_message ("创建套接字时出错\n\r\n\r\n");
    ASSERT_ON_ERROR (SD);
    }
    
    RET_val = sl_Connect (SD、(SlSockAddr_t *)&Addr、AddrSize);
    if (ret_val < 0)
    {
    /*错误*/
    log_message("连接到服务器时出错\n\r\n\r\n");
    ASSERT_ON_ERROR (RET_val);
    }
    
    APP_CB.emailSockID = SD;
    
    /***** 发送 POST 请求******** /
    
    char acSendBuff[512];
    char acRecvbuy[1460];
    char cCLLength [200];
    char* pcBufHeaders;
    int lRetVal = 0;
    char* data ="水测试";
    
    pcBufHeaders = acSendBuff;
    
    strcpy (pcBufHeaders、POSTHEADER);
    pcBufHeaders += strlen (POSTHEADER);
    
    strcpy (pcBufHeaders、" HTTP/1.1\r\n");
    pcBufHeaders += strlen (" HTTP/1.1\r\n");
    strcpy (pcBufHeaders、HOSTHEADER);
    pcBufHeaders += strlen (HOSTHEADER);
    strcpy (pcBufHeaders、CHEADER);
    pcBufHeaders += strlen (CHEADER);
    strcpy (pcBufHeaders、"\r\n\r\n");
    
    int dataLength = strlen (DATA1L);
    dataLength += strlen (data);
    dataLength += strlen (DATA1R);
    
    strcpy (pcBufHeaders、CTHEADER);
    pcBufHeaders += strlen (CTHEADER);
    strcpy (pcBufHeaders、CLHEADER1);
    
    pcBufHeaders += strlen (CLHEADER1);
    sprintf (cCLLength、"%d"、dataLength);
    
    strcpy (pcBufHeaders、cCLLength);
    pcBufHeaders += strlen (cCLLength);
    strcpy (pcBufHeaders、CLHEADER2);
    pcBufHeaders += strlen (CLHEADER2);
    
    strcpy (pcBufHeaders、DATA1L);
    pcBufHeaders += strlen (DATA1L);
    
    strcpy (pcBufHeaders、data);
    pcBufHeaders += strlen (data);
    
    strcpy (pcBufHeaders、DATA1R);
    pcBufHeaders += strlen (DATA1R);
    int testDataLength = strlen (pcBufHeaders);
    
    //
    //将数据包发送到服务器*/
    //
    lRetVal = sl_Send (App_CB.emailSockID、acSendBuff、strlen (acSendBuff)、0);
    if (lRetVal < 0)
    {
    UART_PRINT ("开机自检失败。 错误编号:%i\n\r\n",lRetVal);
    sl_close (App_CB.emailSockID);
    返回 lRetVal;
    }
    lRetVal = sl_Recv (App_CB.emailSockID、&acRecvbuy[0]、sizeof (acRecvbuff)、0);
    if (lRetVal < 0)
    {
    UART_PRINT ("接收失败。 错误编号:%i\n\r\n",lRetVal);
    返回 lRetVal;
    }
    其他
    {
    acRecvbuff [lRetVal+1]='\0';
    UART_PRINT (acRecvbuff);
    UART_PRINT ("成功接收!\n\n\r\n\r\n");
    }
    
    
    返回0;
    } 

    我仅在连接互联网时调用此函数、如果我获得访问权限、我将执行以下操作:

    void SimpleLinkNetAppEventHandler (slNetAppEvent_t * pNetAppEvent)
    {
    switch (pNetAppEvent->ID)
    {
    案例 SL_NetApp_EVENT_IPV4_ACQUIRED:
    
    SlNetIf 初始化(0);
    SlNetIf (SLNETIF_ID_1、SLNET_IF_WIFI_NAME、(const SlNetIf Config_t *)&SlNetIfConfigWifi、SLNET_IF_WIFI_PRIO);
    SlNetSock_init (0);
    SlNetUtil_init (0);
    
    log_message("[NetApp 事件] IP 已获取:ip=%d.%d.%d.%d,"
    "网关=%d.%d.%d.%d\n",
    SL_IPV4_BYTE (pNetAppEvent->Data.IpAcquiredV4.IP、3)、
    SL_IPV4_BYTE (pNetAppEvent->Data.IpAcquiredV4.IP、2)、
    SL_IPV4_BYTE (pNetAppEvent->Data.IpAcquiredV4.IP、1)、
    SL_IPV4_BYTE (pNetAppEvent->Data.IpAcquiredV4.IP、0)、
    SL_IPV4_BYTE (pNetAppEvent->Data.IpAcquiredV4.Gateway、3)、
    SL_IPV4_BYTE (pNetAppEvent->Data.IpAcquiredV4.Gateway、2)、
    SL_IPV4_BYTE (pNetAppEvent->Data.IpAcquiredV4.Gateway、1)、
    SL_IPV4_BYTE (pNetAppEvent->Data.IpAcquiredV4.Gateway、0));
    SignalEvent (AppEvent_IP_Acquired);
    
    
    中断;
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael、

    是否可以共享 LAB20_WiFi 项目的链接?  您在谈论下面的实验吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,这是实验
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的奥斯汀:

    是否知道在我调用 sl_NetAppDnsGetHostByName 时为什么要挂起?
    我的 CC3220基础项目是"配置"、我添加了发送帖子的任务。
    但是、为什么即使我连接到互联网、它也会挂起?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    因此、我将基本项目更改为"out_for_box"演示、并添加将帖子发送到 IFTTT 的代码、它可以正常工作。
    我不知道为什么“配置”不起作用,可能是因为证书。
    只需添加一个新任务并添加上面的代码、更改事件名称和事件密钥。