完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
首先介绍yeelink,这嘛,是一个开放的云服务器平台,大家都可以去注册一个自己的账号,然后就可以使用它的服务器就是,只要你的设备能够联网,无论你人在哪里,就能从网络上控制你的设备,而它就提供各种API接口,我们只要熟悉一点tcp的编程我们就可以简单使用了,另外值得注意的一点是,yeelink也可以在微信公众号上查看,修改我们的设备,十分简便。 官网是这个,http://www.yeelink.net/ ,注册完之后我们进入用户中心就可以看到这样的界面 而在账户中找到我们的apikey,这个值在编程时会用到,另外在设备管理中,我们可以创建自己的设备,选择在设备里创建个自己的传感器,可选择数值型和开关型等,如下,可以在传感器的这个位置,看到设备的ID,和传感器的ID,这两个值也是需要的 然后我们先测试下通信是否能成功,可以使用网络助手作为一个服务器端,作为一个设备向yeelink服务器发送命令 下面两个命令中一个是发送数值到服务器,一个是从服务器获取数值,通信成功的效果如下,若通信失败的话,可以尝试重新获取下apikey的值,在账户那边可以重新获取。(记得将下面的ID值和apikey值改为自己的) 然后我们就可以写个tcp通信程序,并且将设备的开启加入其中了,楼主这里就简单用个GPIO口做个例子,如果想的话,我们也可以写个温度检测的程序,然后通过微信实时检测家里或某个地方的温度。 程序如下 #include #include #include #include #include #include #include #include #include #include #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.1rnHost: api.yeelink.netrnContent-Length: 11rnU-ApiKey:××××××××××××(这里请用自己的APIKEY代替包括前面的ID)rnrn{"value":0}rn" /* 发送用到的数据 */ struct hostent *host fprintf(stderr,"start") while(1){//循环起来,每隔5s读一次按键值 if((host=gethostbyname(yeelink))==NULL)//获取服务器地址 {fprintf(stderr,"gethostname Error:%san",strerror(errno)) exit(1) } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//建立socket { fprintf(stderr,"socketError:%san") 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:%san",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 errorn",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 5sn") sleep(10)//延时10s,让实验效果更明显 close(fd) } exit(0) } 因为是用GPIO口的,用的是板上的GPIO4_1楼主也不好加图片,所以效果就不演示了,但是已验证可行,楼主用的使用的kernel和程序文件如下,都放压缩包里了,有兴趣可以下载过去研究下,压缩包中的文件一个是kernel,这个是支持VGA显示的,而且包含了楼主的一个GPIO驱动,在程序中会用到,一个是源码,我们可以在源码包中编译出可执行文件,最后一个是可执行文件,可以用adb工具push进板中,然后执行起来就可以了,当然,这里是楼主自己的帐号,ID ,APIKEY都是楼主帐号的,所以你们想用的话,就得修改下,只需要在程序中改这三个值便行,然后就可以使用自己帐号的设备 控制, yeelink.zip 测试时的部分图片如下,按那个开关会改变GPIO端口的值,而改变端口时,debug口也会有提示,这里也会有提示,大家可以使用这个端口电平的改变,控制灯,蜂鸣器之类的。 |
|
相关推荐
1个回答
|
|
收了,以后一定用的上,物联网的云平台
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-CAN编程示例之开发板测试
769 浏览 0 评论
该问题是用APP给芯海科技的CST92F25芯片发指令是出现的
2583 浏览 1 评论
849 浏览 0 评论
1641 浏览 1 评论
2551 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 08:53 , Processed in 0.633842 second(s), Total 74, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号