原创 为您的设备添加社交网络功能

2014-1-3 17:26 1130 22 22 分类: 消费电子

今天我们要介绍主要内容是让设备自己发微博,不需像之前发微博的饮水机那样还需要电脑辅助;也就是说如何实现给饮水机一根网线就能让她发微博。工欲善其事,必先利其器。我们先来看一下开发环境。开发板如图1所示。
Image
图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所示。
Image
图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[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. 服务器返回值说明
Image
最后,第19行断开与服务器的连接,之后第20行关闭Socket。与服务器通信成功,第21行返回1。
好了,代码就这么多。赶快编译,烧到单片机里面,上电,看串口调试信息:255: ok。大功告成!登陆到微博看看,刚才写进程序里面的那句话果然出现在了微博上面,如下图所示。
Image
怎么样,是不是很简单?整合到饮水机上是不是更强大了?赶快连接到自己的设备上试一下吧!完整文章:http://blog.iwiznet.cn/?p=5945

 

文章评论0条评论)

登录后参与讨论
我要评论
0
22
关闭 站长推荐上一条 /2 下一条