今天我们要介绍主要内容是让设备自己发微博,不需像之前发微博的饮水机那样还需要电脑辅助;也就是说如何实现给饮水机一根网线就能让她发微博。工欲善其事,必先利其器。我们先来看一下开发环境。开发板如图1所示。
图1.W5500开发板 USB线示例
1. 开发板基本情况
a) 单片机:STM32F103RC,256K字节Flash,48K字节SRAM,2K字节EEPROM
b) 以太网控制器:W5500,SPI接口与单片机相连
c) 电源:USB供电
2. 开发工具: IAR for ARM v5.41,这是我们工程所使用的版本。如果使用不同版本的IAR,请对STM的库稍作调整。
3. 其他
a) 新浪微博用户名和密码;如若没有,就赶快给你的设备申请一个吧!
b) 一根Mini接口的USB线,如图3所示。
c) 一根网线。
d) STM32芯片的串口程序烧录工具,STM官方提供的程序名为:Flash Loader Demo,运行界面如图2所示。
图2. 程序烧录工具运行界面
熟悉完了开发环境,我们就来看一下具体的代码实现。全部代码请下载附件。
1 #include "w5500/socket.h"
2 #include "w5500/w5500.h"
#include <stdio.h>
#include <string.h>
3 #define SOCK_WEIBO 2 //the socket number is used for weibo; it can be a number between 0~7
4 #define WEIBO_SERVER "61.109.255.136" //weibo server IP address string
5 #define HTTP_PATH "/wiznet/" //HTTP path
6 #define WEIBO_ID "xxxx@xxxx.xxx" //your sina weibo ID
7 #define WEIBO_PWD "******" //your sina weibo password
char tmp_buf[512]={0x00,}; //a temp buffer to store weibo content and HTTP header
unsigned char post_weibo(char* weibo)
{
8 unsigned char weibo_server_ip[4] = {61,109,255,136}; //Weibo server IP address
9 static unsigned int any_local_port = 1000; //TCP socket local port nubmer
10 char post_data[385]={0x00,};
//weibo content (140 characters, but one Chinese character will be 2 Bytes!) + ID & Password information. If your sina weibo ID & Password are too long, please define a bigger buffer
unsigned char ret=0;
unsigned int len=0;
11 if(socket(SOCK_WEIBO,Sn_MR_TCP,any_local_port++,0)!=1) //to initialize a TCP socket
{
printf("Socket initialization failed.\r\n");
return 0;
}
else
{
12 ret=connect(SOCK_WEIBO,weibo_server_ip,80); //connect to the weibo server, default TCP port is 80
if(ret!=1)
{
printf("Connect Weibo server failed.\r\n");
return 0;
}
else
{
13 while(getSn_SR(SOCK_WEIBO)!=SOCK_ESTABLISHED); //wait for the TCP connection established!
printf("Connected with Weibo server.\r\n");
14 sprintf(post_data,"id=%s&pw=%s&cmd=update&status=%s",(char*)WEIBO_ID,(char*)WEIBO_PWD,weibo);
15 sprintf(tmp_buf,"POST %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: w5500\r\nContent-Type: application/x-www-form-urlencoded; charset=gb2312\r\nContent-Length: %d\r\n\r\n%s",(char*)HTTP_PATH,(char*)WEIBO_SERVER,strlen(post_data),post_data);
16 len=send(SOCK_WEIBO,(unsigned char*)tmp_buf,strlen(tmp_buf)); //upload your weibo content
while(1)
{
17 len=getSn_RX_RSR(SOCK_WEIBO);
if(len>0)
{
memset(tmp_buf,0x00,512);
18 len=recv(SOCK_WEIBO, (unsigned char*)tmp_buf, len); //receive the return result from weibo server
char* p=strstr(tmp_buf,(char*)"\r\n\r\n")+4; //get http payload without http header: return value
printf("%s\r\n",p);
19 disconnect(SOCK_WEIBO); //disconnect with weibo server
20 close(SOCK_WEIBO); //close the socket
21 return 1; //sucess! return 1
}
}
}
}
}
我们从头看起,第1,2行,把W5500的库和Socket库文件引用过来。第3~7行为宏定义部分,第3行是给微博选一个Socket,鉴于W5500共有8个Socket可以同时通信,这里随便选取一个没有用到的Socket就可以了,这里选的是2。第4、5行定义的是要访问的服务器地址和具体的HTTP路径,请不要更改!第6、7行是你设备的新浪微博用户名和密码,请注意,我们仅支持新浪的微博!这里要填写正确的新浪微博用户名和密码,否则无法发送。另外请放心,我们绝不会在后台保存你设备的微博密码!
第8行还是要连接的服务器IP地址,放到了一个数组里面;第9行为该Socket定义了一个本地端口号,这个数值0~65535中任取。这里我们所采用的服务器接受HTTP格式提交的数据,第10行定义的数组就是为了临时保存该格式的微博内容;你也许会问,微博最多能够接受140个字符,为什么这里要定义一个385字节的数组呢?因为这个数组不仅要保存微博内容,还有微博的账号和密码,还有,如果微博内容是汉字的话,那么一个汉字将占用2个字节,一个全是汉字的微博最大的长度将是280个字节,因此,如微博账号和密码过长的话,请适当调整该数组长度。
下面就是Socket的操作了,第11行初始化一个Socket,接着12行对服务器发出连接请求,第13行一直等待连接的建立,与服务器成功建立连接后,第14、15行负责组建带有微博的HTTP数据包,第16行负责发送。
然后接收服务器返回,第17行是读取W5500接收到的数据长度,当该长度大于零时,第18行从W5500的接收缓存中把接收到的数据读到tmp_buf中,由于接收到的数据包含了HTTP头,接下来的一行是把HTTP头去掉,我们只关心服务器的返回结果。收到了服务器的返回,说明我们和服务器的通信是成功的!但是,通信虽然成功,但是微博并不一定是百分之百发出去的,请看一下服务器返回结果的类型,如表1所示。
表1. 服务器返回值说明
最后,第19行断开与服务器的连接,之后第20行关闭Socket。与服务器通信成功,第21行返回1。
好了,代码就这么多。赶快编译,烧到单片机里面,上电,看串口调试信息:255: ok。大功告成!登陆到微博看看,刚才写进程序里面的那句话果然出现在了微博上面,如下图所示。
怎么样,是不是很简单?整合到饮水机上是不是更强大了?赶快连接到自己的设备上试一下吧!完整文章:http://blog.iwiznet.cn/?p=5945
文章评论(0条评论)
登录后参与讨论