热度 22
2014-1-3 17:26
1131 次阅读|
0 个评论
今天我们要介绍主要内容是让设备自己发微博,不需像之前发微博的饮水机那样还需要电脑辅助;也就是说如何实现给饮水机一根网线就能让她发微博。工欲善其事,必先利其器。 我们先来看一下开发环境。开发板如图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. 程序烧录工具运行界面 熟悉完了开发环境,我们就来看一下具体的代码实现。全部代码请下载附件。 CODE: SELECT ALL 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 ={0x00,}; //a temp buffer to store weibo content and HTTP header unsigned char post_weibo(char* weibo) { 8 unsigned char weibo_server_ip = {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 ={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=%spw=%scmd=updatestatus=%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(len0) { 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