关于用stm32和ESP8266通过POST请求上传图片到贝壳物联的接口

作者:wintercoming | 更新时间:2018-10-04

已经设置ESP8266为STA模式,之后先连接路由器,并设置为单链接模式;

然后连接到贝壳物联服务器:

 #define User_ESP8266_TCPServer_IP   "www.bigiot.net"   //要连接的服务器的IP

#define User_ESP8266_TCPServer_PORT   "8181"   //要连接的服务器的端口

 

ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0);

 

//ESP8266模块连接外部服务器

//enumE:网络协议

//ip:服务器IP字符串

//ComNum:服务器端口字符串

//id:模块连接服务器的ID

//返回1:连接成功 0:连接失败

bool ESP8266_Link_Server(ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)

{

char cStr [100] = { 0 }, cCmd [120];

  switch (  enumE )

  {

case enumTCP:

sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );

break;

case enumUDP:

sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );

break;

default:

break;

  }

  if ( id < 5 )

sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);

 else

sprintf ( cCmd, "AT+CIPSTART=%s", cStr );

return ESP8266_Send_AT_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 );

}

 然后设置一下透传模式;

接下来就是进行POST请求了:打开sd卡中已有的jpg文件,读取文件数据并通过POST请求上传

/*上传数据到图片接口*/

void update_img(char *did, char *inputid, char *APIKEY)

{

char name[40];

unsigned long int file_byte;

u8 buffer[1024];

UINT  br;

//打开jpg图片

sprintf(name,"0:photo_%d.jpg",name_count);

jpgres = f_open( &jpgfsrc , (char*)name,  FA_OPEN_EXISTING | FA_READ);

//图片打开成功

if(jpgres==FR_OK)

{

//获取图片大小

file_byte=jpgfsrc.fsize;

printf("\r\nsize:%lu\r\n",file_byte);

//POST请求发送

ESP8266_USART("POST https://www.bigiot.net/pubapi/uploadImg/did/%s/inputid/%s HTTP/1.1\r\n", did, inputid);

ESP8266_USART("Host: www.bigiot.net\r\n");

ESP8266_USART("Connection: keep-alive\r\n");

ESP8266_USART("API-KEY: %s\r\n", APIKEY);

ESP8266_USART("Content-Length: %lu\r\n",file_byte);

ESP8266_USART("Content-Type: multipart/form-data; boundary=3bf1dc3ce677345d7151048c92ca3cac\r\n");

ESP8266_USART("\r\n");

ESP8266_USART("--3bf1dc3ce677345d7151048c92ca3cac\r\n");

ESP8266_USART("Content-Disposition: form-data; name=\"file\"; filename=\"ex1.jpg\"\r\n");

ESP8266_USART("\r\n");

while(1)

{

//读取jpg文件信息

jpgres = f_read(&jpgfsrc, buffer, sizeof(buffer), &br);

USART_puts(USART2, buffer);

//判断手否读取完结,若完结跳出循环 

if (jpgres || br < sizeof(buffer))

{

break;  

}

}

ESP8266_USART("\r\n");

ESP8266_USART("--3bf1dc3ce677345d7151048c92ca3cac--\r\n");

}

f_close(&jpgfsrc); //关闭文件

}

连接服务器已经成功了,这里的POST请求也是按格式写的,请求的URL(https://www.bigiot.net/pubapi/uploadImg/did//inputid/)也没有问题。可是图片接口并不能接收到数据 ,这是为什么?是因为一开始连接服务器的IP或端口不对,还是其他的原因?

求解答


评论:共2条

贝壳物联 评论于:2018-10-07 09:30:12
贝壳上传图片的接口是https端口443,8181是tcp连接端口,另外https是加密的,操作起来比较麻烦。如果不加密的http端口8080或许可行,但是贝壳物联没有提供这个。
fengguihao 回复于:2019-03-06 21:05:44
回复 @贝壳物联:请问如何在计算机使用Python测试图片接口,是否有相关代码例程,我想在计算机测试成功后一直到树莓派上。
评论支持使用[code][/code]标签添加代码
返回顶部