打印
[STM32F0]

【ST资源大分享】+ STM32F051+W5100连接Yeelink上传传...

[复制链接]
1761|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 numenjian 于 2016-8-2 13:44 编辑

背景:          在新房装修前,一直计划着家里布置一套监控系统,能够实时掌控家里的状况,外加控制一些用电设备。
     然而理想是美好的,现实却(装修时实在太忙了,没顾上)。。。。。。。。
     虽然未能实现,不管怎么样,亡羊补牢,未为晚也。现在比较流行智能家居,恰好本人又是做无线监控系统的,所以就临时改变了一下方案:无线监控。

正文:
    首先说一下利用的平台:  
         软件平台:  Yeelink  (不深入探讨了,需要了解的人自己百度吧)
         硬件平台: STM32F051(还有一块F429开发板在用,过几天移植一下换过来,毕竟能用的资源比较多)+W5100(arduino开发板的网络模块)+射频模块(暂用CC2520,公司的)
    主要功能:
         目前仅做了一款温度传感器数据采集,采用的是DS18B20,监控主站主要负责无线传感器数据采集接收,并通过以太网将数据传送到Yeelink平台,无线传感器数量可以任意增加(需先软件配置),传感器数据上传间隔为12s(yeelink限制了最小间隔为10s).

                                                                                      
                                                                                                         监控主站

                                                                                                   
                                                                                                            传感器
        效果如下:
                                                                        

                                                                            主站温度                                                                                           传感器温度

       主站放在客厅,传感器放厨房(暂时只加了1台传感器),采用2.4G进行传输(发射功率4.5dBm,仅单向传输没有加入协议栈)暂时还是比较稳定的,上图是3天的稳定记录。但是ZigBee的穿透和绕射能力较弱,通过提升功率(手里还有加了PA的板子,能到+20dBm)也能覆盖一套房子,但是过大的发射功率很多人不能接受(比如辐射、功耗)。过几天准备换个频段(433MHz,刚好手里也有Sx1278、Si4463)试试全覆盖测试。

      也许有朋友比较关心代码,我也附一些吧。STM32的函数库就不分享了,官网很多,我就是用的官方例程。12864LCD、18B20这些驱动网上也很多,需要的朋友可以私信我。重点讲一下W5100是怎样连接yeelink的吧。
   W5100的驱动用的是百度来的,就w5100.c和w5100.h,一搜一堆。
   首先是IO初始化:
             这里定义了PB12~PB15,用硬件SPI2;W5100还有RST引脚需要控制;还有一个中断引脚(可以查询寄存器,不一定用)
   其次是 W5100硬件初始化:
            W5100_HARTRESET();   //强制复位        
            W5100_Init();                   //寄存器初始化,包括配置网关、IP、物理地址、重发次数
            Socket_Init(0,S0_Port,S0_DPort,S0_DIP); //socket0初始化,主要是设置目的地址(远程主机地址)
            Socket_Connect(0);       //设置为客户端模式

          到此,W5100已经能够完成作为客户端连接远程服务器了。
          需要注意的是,本机网关、IP设置需要与家里的路由器匹配,否则上不了网,传不了数据;远程主机IP必须为 42.96.164.52,端口号80   (yeelink)

   配置完成后就是在任务中添加上传函数,上传函数必须按照yeelink的固定格式,可以采用以下函数(EmbedNet论坛飞鸿踏雪大神的字符串生成方法)  
    char* Yeelink_PostString(const char *device_id,const char *sensors_id,float value)
    {
        char remote_server[] = "api.yeelink.net";
        char str_tmp[128] = {0};
        // Http内容,表单内容
        char http_content[32] = {0};
        //表头的内容
        sprintf(str_tmp,"/v1.0/device/%s/sensor/%s/datapoints",device_id,sensors_id);
        // 确定提交内容的值 例如 {"value":20。1}
        sprintf( http_content , "{\"value\":%.1f}" , value);
        // 确定 HTTP请求首部
        // 例如POST /v1.0/device/dbeacfc4943e593ebe2bcf46a684f794/1/1/datapoints/add HTTP/1.1\r\n
        sprintf( http_request , "POST %s HTTP/1.1\r\n",str_tmp);
        // 增加属性 例如 Host: api.machtalk.net\r\n
        sprintf( str_tmp , "Host: %s\r\n" , remote_server);
        strcat( http_request , str_tmp);
        // 增加密码 例如 APIKey: dbeacfc4943e593ebe2bcf46a684f794
        sprintf( str_tmp , "U-ApiKey:%s\r\n" , APIKEY);//需要替换为自己的APIKey
        strcat( http_request , str_tmp);
        strcat( http_request , "Accept: */*\r\n");
        // 增加提交表单内容的长度 例如 Content-Length:12\r\n
        sprintf( str_tmp , "Content-Length: %d\r\n" ,strlen(http_content) );
        strcat( http_request , str_tmp);
        // 增加表单编码格式 Content-Type:application/x-www-form-urlencoded\r\n
        strcat( http_request , "Content-Type: application/x-www-form-urlencoded\r\n");
        // HTTP首部和HTTP内容 分隔部分
        strcat( http_request , "\r\n");
        // HTTP负载内容
        strcat( http_request , http_content);
        return http_request;//返回生成的所需要发送的字符串指针
    }


   发送函数,在每次发送前都必须先连接( 调用Socket_Connect(0),并判断连接状态,连接成功方可发送数据),因为yeelink每次传送完数据都会主动断开连接!
    void Yeelink_SendTCPC (char *pYeelinkStr,SOCKET s)
    {        
        unsigned int  i=0;
        while(pYeelinkStr!=0x00)
        {
            Tx_Buffer=pYeelinkStr;
            i++;
        }
        S_tx_process(s,i);  //发送TxBuf[]内容                        
    }

   至此,已经能够完成基本数据上传了,需要注意的是,每个传感器上传间隔都必须设置的大于10s,否则yeelink会返回错误命令,导致数据丢失。


yeelink.zip

2.21 KB

W5100.zip

13.43 KB

沙发
ic12580| | 2016-6-6 18:16 | 只看该作者
一看,就是搞技术的,哈哈,赞一个

使用特权

评论回复
板凳
ic12580| | 2016-6-6 18:17 | 只看该作者
楼主,你那个板子上的HR911105A,山寨的吧

使用特权

评论回复
地板
numenjian|  楼主 | 2016-6-7 08:10 | 只看该作者
ic12580 发表于 2016-6-6 18:17
楼主,你那个板子上的HR911105A,山寨的吧

可能是吧,淘宝随便买的

使用特权

评论回复
5
numenjian|  楼主 | 2016-6-7 08:11 | 只看该作者
ic12580 发表于 2016-6-6 18:16
一看,就是搞技术的,哈哈,赞一个

,闲着没事瞎捣鼓的

使用特权

评论回复
6
ic12580| | 2016-6-7 10:20 | 只看该作者
有QQ吗,加你一下。

使用特权

评论回复
7
huangqi412| | 2016-6-7 11:26 | 只看该作者
每个传感器上传间隔都必须设置的大于10s,       楼主试试多个传感器,一次能传输多个传感器么,还是说每个传感器要单独进行传输。

使用特权

评论回复
8
123654789| | 2016-6-7 11:43 | 只看该作者
huangqi412 发表于 2016-6-7 11:26
每个传感器上传间隔都必须设置的大于10s,       楼主试试多个传感器,一次能传输多个传感器么,还是说每个 ...

你真笨蛋。这样都不理解。

服务器那边为了防止单个客户端占用大量链接资源,因此限定

客户端与服务器的链接时间间隔要大于10秒。

使用特权

评论回复
9
numenjian|  楼主 | 2016-6-7 21:43 | 只看该作者
123654789 发表于 2016-6-7 11:43
你真笨蛋。这样都不理解。

服务器那边为了防止单个客户端占用大量链接资源,因此限定

不是的,客户端可以断线立即连,同一传感器数值间隔不能小于10s,不同传感器可以连续传,但是要考虑服务器回复时间

使用特权

评论回复
10
numenjian|  楼主 | 2016-6-7 21:45 | 只看该作者
huangqi412 发表于 2016-6-7 11:26
每个传感器上传间隔都必须设置的大于10s,       楼主试试多个传感器,一次能传输多个传感器么,还是说每个 ...

可以的,我现在就是两个传感器数据,不同传感器可以连续传,但是要考虑服务器回复时间(每条上传数据发送成功后服务器是回复成功命令的)

使用特权

评论回复
11
yklstudent| | 2016-6-8 07:22 | 只看该作者
也就适合自己玩玩

使用特权

评论回复
12
Larm1| | 2016-8-5 14:32 | 只看该作者
好东西,谢谢楼主分享...

使用特权

评论回复
13
wtyiyou| | 2023-11-9 20:08 | 只看该作者
谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

333

帖子

6

粉丝