文档章节

yeelink在PX2上的运用(远程控制)

穿
 穿prada的008
发布于 2015/07/16 17:54
字数 1446
阅读 65
收藏 2

首先介绍yeelink,这嘛,是一个开放的云服务器平台,大家都可以去注册一个自己的账号,然后就可以使用它的服务器就是,只要你的设备能够联网,无论你人在哪里,就能从网络上控制你的设备,而它就提供各种API接口,我们只要熟悉一点tcp的编程我们就可以简单使用了,另外值得注意的一点是,yeelink也可以在微信公众号上查看,修改我们的设备,十分简便。

官网是这个,http://www.yeelink.net/ ,注册完之后我们进入用户中心就可以看到这样的界面

  

而在账户中找到我们的apikey,这个值在编程时会用到,另外在设备管理中,我们可以创建自己的设备,选择在设备里创建个自己的传感器,可选择数值型和开关型等,如下,可以在传感器的这个位置,看到设备的ID,和传感器的ID,这两个值也是需要的

  

然后我们先测试下通信是否能成功,可以使用网络助手作为一个服务器端,作为一个设备向yeelink服务器发送命令

下面两个命令中一个是发送数值到服务器,一个是从服务器获取数值,通信成功的效果如下,若通信失败的话,可以尝试重新获取下apikey的值,在账户那边可以重新获取。(记得将下面的ID值和apikey值改为自己的)

    

然后我们就可以写个tcp通信程序,并且将设备的开启加入其中了,楼主这里就简单用个GPIO口做个例子,如果想的话,我们也可以写个温度检测的程序,然后通过微信实时检测家里或某个地方的温度。

程序如下

#include<stdlib.h>

#include<stdio.h>

#include<errno.h>

#include<netdb.h>

#include<string.h>

#include<sys/types.h>

#include<netinet/in.h>

#include<sys/socket.h>

#include <fcntl.h>

#include<string.h>

#define portnumber 80//yeelink的服务器端口

#define DEVICE_NAME     "/dev/rkpx2_GPIO"//gpio的设备,提供的kernel已包含,里面定义里gpio4的1234四个引脚,这里用到1引脚

int main(int argc,char *argv[])

{         

    int sockfd//tcp进程号

    int fd//gpio的设备号

    int recdata//收到的数据长度

    char *addr//一个字符型指针,用来找数据value的位置,后面的值即是网站上按键的值

    int offset//value的长度,以便找到按键值

    char *yeelink//yeelink服务器ip地址

    char recv_data[1024]//收到数据的内存

    char flag//按键值

    yeelink="42.96.164.52"

    struct sockaddr_in server_addr

    struct sockaddr_in cilent_addr

    char send_data1[300] = "GET /v1.0/device/××××××××/sensor/×××××××/datapoints HTTP/1.1\r\nHost: api.yeelink.net\r\nContent-Length: 11\r\nU-ApiKey:××××××××××××(这里请用自己的APIKEY代替包括前面的ID)\r\n\r\n{\"value\":0}\r\n" /* 发送用到的数据 */

    struct hostent *host

        fprintf(stderr,"start")

    while(1){//循环起来,每隔5s读一次按键值

            if((host=gethostbyname(yeelink))==NULL)//获取服务器地址

            {fprintf(stderr,"gethostname Error:%s\a\n",strerror(errno))

                exit(1)

            }

        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//建立socket

            {

            fprintf(stderr,"socketError:%s\a\n")

                exit(1)}

        bzero(&server_addr ,sizeof(server_addr))//堆栈初始化,全部化为0

        server_addr.sin_family=AF_INET

        server_addr.sin_port=htons(portnumber)

        server_addr.sin_addr=*((struct in_addr *)host->h_addr)

            if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof( struct sockaddr))==-1)//申请连接

                {

                fprintf(stderr,"connect Error:%s\a\n",strerror(errno))

                exit(1)

            } 

        send(sockfd,send_data1,sizeof(send_data1),0)//将http文件头发过去

         recdata = recv(sockfd, recv_data, sizeof(recv_data), 0)//接受服务器返回的数值

        recv_data[recdata]=' '//加上结束符        

        addr = strstr(recv_data,"\"value\"")//在接受到的数据中找到按键值的位置,即value,收到数据的样式如下{“value”:key}

        offset=strlen("\"value\":")//判断value的长度,

        flag = *(addr + offset) //找到按键的值,赋值给flag

        fprintf(stderr,"the value is %c \n")

        close(sockfd)//关闭socket,记住,这里得提前关闭,不然会发生段错误。

        fd=open(DEVICE_NAME,O_RDWR)//打开GPIO设备

            if (fd==-1){

        fprintf(stderr,"open devices %s error\n",DEVICE_NAME)

    }

        if(flag=='1'){//判断flag的值,然后执行相应的操作

        ioctl(fd,1)

        fprintf(stderr,"the value is %c \n",flag)

        }

        else

        {

        ioctl(fd,0)

        fprintf(stderr,"the value is %c \n",flag)

}      

        fprintf(stderr,"please wait 5s\n")

        sleep(10)//延时10s,让实验效果更明显

        close(fd)

}

        exit(0)

}

因为是用GPIO口的,用的是板上的GPIO4_1楼主也不好加图片,所以效果就不演示了,但是已验证可行,楼主用的使用的kernel和程序文件如下,都放压缩包里了,有兴趣可以下载过去研究下,压缩包中的文件一个是kernel,这个是支持VGA显示的,而且包含了楼主的一个GPIO驱动,在程序中会用到,一个是源码,我们可以在源码包中编译出可执行文件,最后一个是可执行文件,可以用adb工具push进板中,然后执行起来就可以了,当然,这里是楼主自己的帐号,ID ,APIKEY都是楼主帐号的,所以你们想用的话,就得修改下,只需要在程序中改这三个值便行,然后就可以使用自己帐号的设备 控制,

 yeelink.zip 

测试时的部分图片如下,按那个开关会改变GPIO端口的值,而改变端口时,debug口也会有提示,这里也会有提示,大家可以使用这个端口电平的改变,控制灯,蜂鸣器之类的。

       

现在说说程序中楼主遇到的几个错误。

1.发送过去的http文件头,在{"value":**}的前面要有两个回车,这个别漏了,这是格式要求,漏了就没法正常把值放到服务器了

2.获取服务器的值的时候,我们得在服务器中的值处理,因为他发过来的值时没有结束符的,所以我们得手动加上结束符。


© 著作权归作者所有

穿
粉丝 0
博文 51
码字总数 24172
作品 0
福州
私信 提问
用树莓派通过Java实现远程控制电灯

用树莓派通过Java实现远程控制电灯 本文章由 亓根火柴 原创,转载请注明出处:http://blog.csdn.net/qigenhuochai/article/details/17661845 传说,女娲娘娘炼就七根火柴,来帮助人类度过第一个...

亓根火柴
2014/01/02
1K
2
树莓派用Python写几个简单程序6_yeelink平台

首先先在yeelink平台上注册,获得自己的APIKEY, 创建设备及设备上传感器,读取传感器的apiurl。 例子1:上传树莓派温度数据到yeelink -> yeelink_temp.py #!/usr/bin/env python -- coding:...

RagingTyphoon
2015/08/15
324
0
PHP再学习5——RESTFul框架 远程控制LED

0.前言 去年(2013年)2月第一次接触yeelink平台,当时该平台已经运行了一些时间也吸引了不少极客。试想自己也将投身IoT(物联网)行业,就花了些时间研究了它。陆陆续续使用和研究了一年,大...

thinkyoung
2014/12/02
0
0
Rayeager PX2的GPIO控制范例

基于PX2编译的一个GPIO控制的demo apk 功能:控制GPIO_0_D4的引脚状态 备注:GPIO引脚默认为High 算是抛砖引玉吧 可以考虑用PX2的IO搞个跑马灯 考虑先用红外控制 顺带熟悉红外接口~ GpioDemo...

穿prada的008
2015/02/12
71
0
实现一个yeelink一样的服务平台

前段时间分析yeelink的服务平台,专门去注册了一个帐号,写了一些代码,现在把他记录下来。 根据yeelink的api文档能够分析出来一些url,要实现一个yeelink一样的服务平台只需要实现这个url就可...

gotham
2014/07/29
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

领域驱动中的“贫血症和失忆症”

贫血症严重危害着人类健康,并且伴随有危险的副作用。当贫血领域对象被首次提出来时,它并不是一个博得赞美的词汇,它描述的是一个缺少内在行为领域对象。奇怪的是,人们对于贫血领域对象的态...

还仙
4分钟前
2
0
条码打印软件中标签预览正常打印无反应怎么解决

在使用条码打印软件制作标签时,有客户反馈,标签打印预览正常的,但是打印无反应,咨询是怎么回事?今天针对这个情况,可以参考以下方法进行解决。 一、预览正常情况下,打印没反应 (1)在条码...

中琅软件
14分钟前
2
0
判断字符串的时候

判断字符串的时候一定把常量房前边, //报警程度 String leve = vo.getDeviceAlertDeal().getWarnLevel(); if(("0").equals(leve)) { row.add("无报警"); }else if(("1").equals(leve)) { ro......

简小姐
15分钟前
3
0
Linux maven3.6.2 install

PS:安装 maven 之前请先安装 jdk 1.安装 wget 命令(安装过就不用了) yum -y install wget 2.寻找需要的 maven 版本 https://maven.apache.org/download.cgi 3.进入 /var/local 文件夹 cd...

东方神祇
17分钟前
2
0
Tomcat源码分析二:先看看Tomcat的整体架构

Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server、Service、Connector、Container等组件,接下...

flygrk
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部