基于ARM的智能灯光控制系统(10)网络节点

基于ARM的智能灯光控制系统(10)网络节点

嵌入式开发培训(阶段2)底层系统开发
智能灯光控制系统

节点设备

络通信协议

//--head-- cmd data crc
//0x5a 0x15 0x 0x 0x

协议头部(2字节) 命令位(1字节) 数据位(1字节) 校验位(1字节) 功能
0x5a 0x15 0x10 0x11 前四位求和 查询设备在线
0x5a 0x15 0x20 0x21 前四位求和 在线
0x5a 0x15 0x30 0x31 前四位求和 设备开
0x5a 0x15 0x30 0x32 前四位求和 设备关
0x5a 0x15 0x30 0x33 前四位求和 设备自动开关

主控端网络程序(net_pro.c)

net_por.h

#ifndef __SL2000_NET_H_
#define __SL2000_NET_H_
#define  DEF_PORT  6899

int socket_init(int port);
void* client_pro(void* arg);
void* net_pro(void* arg);
int send_cmd(char  cmd, char cmd_da ,int sockfd);
int get_cmd(char *buf,char* cmd,int len);
#endif
#include <errno.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <pthread.h>   

#include "config.h"
#include "net_pro.h"

int net_user;
unsigned char net_cmd;
unsigned char net_flag;

extern struct sys_all g_dev[1];
extern struct dev_fd g_dev_fd;//系统设备文件

int socket_init(int port)
{
    int sockfd;
    struct sockaddr_in server_addr;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
            fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
            exit(1);
    }
    printf("socket...\n");
    bzero(&server_addr,sizeof(struct sockaddr_in));
    server_addr.sin_family=AF_INET;
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    server_addr.sin_port=htons(port);
    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
    {
            fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
            exit(1);
    }
    printf("bind...\n");
    if(listen(sockfd,10)==-1)
    {
            fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
            exit(1);
    }
    printf("listen...\n");

    return sockfd;
}

//protocol
//--head--  cmd  data    crc
//0x5a 0x15  0x     0x      0x
int get_cmd(char *buf,char* cmd,int len)
{
    char crc=0;
    int i;
    if(buf==NULL || cmd==NULL || len !=5 )
        return -1;
    if(buf[0] != 0x5a || buf[1] != 0x15)
        return -1;
    for(i=0;i<len-1;i++){
        crc += buf[i];
    }
    if(crc != buf[len-1])
        return -1;
    cmd[0] = buf[2];
    cmd[1] = buf[3];
    return 0;
}

int send_cmd(char  cmd, char cmd_da ,int sockfd)
{
    unsigned char buf[8];
    if(sockfd < 0)
        return -1;
    buf[0] = 0x5a;
    buf[1] = 0x15;
    buf[2] = cmd;
    buf[3] = cmd_da;
    buf[4] = buf[0] + buf[1] + buf[2] + buf[3];
    if(send(sockfd,buf,5,0)==-1){
        fprintf(stderr,"Write Error:%s\n",strerror(errno));
        return -1;
    }
    return 0;
}

void* client_pro(void* arg)
{
    int fd,*p;
    int len,index;
    int timer=0;
    unsigned char recv_buf[8],cmd[8],old_cmd;   

    p=(void*)arg;
    fd = *p;
    net_user++;
    index = net_user - 1;
    net_flag= 1;//在线
    g_dev_fd.net_fd[index] = fd;
    old_cmd = net_cmd;

    while(1){
        bzero(recv_buf,8);
        bzero(cmd,8);
        if(timer == 3){
            timer = 0;
            send_cmd(0x10, 0x11, fd);   //查询设备在线
            len = recv(fd,recv_buf,8,0);
            if(len==0 || len==-1){
                net_user--;
                close(fd);
                net_flag = 0;//下线
                g_dev_fd.net_fd[index] = -1;
                pthread_exit("0");
            }else{
                get_cmd(recv_buf,cmd, len);
                if(cmd[0]==0x20 && cmd[1]==0x21)
                    net_flag = 1;
                else
                    net_flag = 0;

                //printf("\nbuf=%x,%x,%x,%x,%x=cmd=%x,%x=\n",
                //  recv_buf[0],recv_buf[1],recv_buf[2],recv_buf[3],
                //  recv_buf[4],cmd[0],cmd[1]);
            }
        }
        if(old_cmd != net_cmd){
            old_cmd = net_cmd;
            send_cmd(0x30, old_cmd,fd);
        }
        sleep(1);
        timer++;
    }
}

void* net_pro(void* arg)
{
        pthread_t pth;
        int sockfd,new_fd,sin_size;
        struct sockaddr_in client_addr;     

        printf("net server pthread start...\n");
        sockfd = socket_init(DEF_PORT);
        printf("sockfd=%d\n",sockfd);
        while(1){
            printf("accept before...\n");
            sin_size=sizeof(struct sockaddr_in);
            new_fd=accept(sockfd,(struct sockaddr*)(&client_addr),&sin_size);
            if(new_fd==-1){
                fprintf(stderr,"Accpet error:%s\n\a",strerror(errno));
                pthread_exit("0");
            }
            fprintf(stderr,"Sever from %s\n",inet_ntoa(client_addr.sin_addr));
            if(net_user<MAX_NET){
                        pthread_create(&pth,NULL,client_pro,(void*)&new_fd);
            }
        }
}

节点端网络程序(net_light.c)

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<fcntl.h
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>

#define DEV_RELAY "/dev/4418_relay"
#define DEV_PIR "/dev/4418_pir"
#define J1_OFF  0x01
#define J1_ON   0x00
#define BUF_SIZE 32
int fd_relay=-1,fd_pir = -1;

int dev_init()
{
    printf("nanoPi driver init...\n");

    fd_relay = open(DEV_RELAY,O_RDWR);
    if(fd_relay<0){
        printf("open device err\n");
        return -1;
    }

    fd_pir = open(DEV_PIR,O_RDWR);
    if(fd_pir<0){
        printf("open device err\n");
        return -1;
    }
}

int net_init(char* ip ,char* port_str)
{
    int sockfd,port;
    struct sockaddr_in server_addr;

    port = atoi(port_str);
    if(port<1024){
        printf("port error\n");
        return -1;
    }

    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
        fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
        return -1;
    }

    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(port);
    server_addr.sin_addr.s_addr=inet_addr(ip);

    if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1){
        fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
        return -1;
    }
    return sockfd;
}

void dev_sw(int sw)
{
    char da[2];
    if(sw == 3){
        read(fd_pir,da,1);
        write(fd_relay,da,1);
    }else{
        if(sw == 1)
            da[0] = J1_ON;
        if(sw == 2)
            da[0] = J1_OFF;
        write(fd_relay,da,1);
    }
    printf("==sw=%d==\n",sw);
}

//protocol
//--head--  cmd  data    crc
//0x5a 0x15  0x     0x      0x

int get_cmd(char *buf,char* cmd,int len)
{
    char crc=0;
    int i;
    if(buf==NULL || cmd==NULL || len !=5 )
        return -1;
    if(buf[0] != 0x5a || buf[1] != 0x15)
        return -1;
    for(i=0;i<len-1;i++){
        crc += buf[i];
    }
    if(crc != buf[len-1])
        return -1;
    cmd[0] = buf[2];
    cmd[1] = buf[3];
    return 0;
}

int cmd_proc(char * cmd,int sockfd)
{
    char buf[8];
    buf[0] = 0x5a;
    buf[1] = 0x15;
    if(cmd == NULL || sockfd < 0)
        return -1;

    if(cmd[0] == 0x10){
        buf[2] = 0x20;
        buf[3] = 0x21;
        buf[4] = buf[0] + buf[1] + buf[2] + buf[3];
        if(send(sockfd,buf,5,0)==-1){
            fprintf(stderr,"Write Error:%s\n",strerror(errno));
        }
    }
    if(cmd[0] == 0x30){
        switch(cmd[1]){
            case 0x31://on
                dev_sw(1);
                break;
            case 0x32://off
                dev_sw(2);
                break;
            case 0x33://auto
                dev_sw(3);
                break;
        }
    }
    return 0;
}

int main(int argc, char *argv[])
{
    int sockfd = -1 ;
    int nbytes = 0;
    char recv_buf[BUF_SIZE],cmd[2]; 

    if(argc < 3){
        printf("please input server IP,PORT.\n");
        exit(0);
    }
    if( dev_init() < 0)
        exit(0);
    if( (sockfd = net_init(argv[1],argv[2])) < 0)
        exit(0);

    while(1){
        bzero(recv_buf,BUF_SIZE);
        bzero(cmd,2);
        if((nbytes=recv(sockfd,recv_buf,BUF_SIZE,0))==-1){
            fprintf(stderr,"Read Error:%s\n",recv_buf);
            exit(1);
        }
        if(nbytes >= 5){
            if(get_cmd(recv_buf,cmd,nbytes)==0)
                cmd_proc(cmd,sockfd);
        printf("\nbuf=%x,%x,%x,%x,%x=cmd=%x,%x=\n",
                recv_buf[0],recv_buf[1],recv_buf[2],recv_buf[3],
                recv_buf[4],cmd[0],cmd[1]);
        }
//      sleep(1);   

    }
    return 0;
}

原文地址:http://blog.51cto.com/91arm/2061731

时间: 2024-11-02 21:51:19

基于ARM的智能灯光控制系统(10)网络节点的相关文章

基于ARM的智能灯光控制系统(11)状态更新

基于ARM的智能灯光控制系统(11)状态更新 项目中硬件模块的开关状态,由独立的状态线程进行控制管理. 设备状态更新头文件 (sw_pro.h) #ifndef _SL2000_SW_IPC_H #define _SL2000_SW_IPC_H void* sw_pro(void* arg);//状态更新线程 void area_sw_update(void);//更新区域状态 int dev_sw_update(struct sys_dev *head);//更新设备开关状态 #endif 设

DreamHouse项目(基于ARM与ZIGBEE技术的智能家居)之项目展示

这是本人做的一次有关智能家居的项目,仅是用来参加比赛的!或者是我用来练手的吧!大概花费了我近2个月的时间来完成他,平台是建立在博创S3C2410的嵌入式的箱子上的,我觉得我唯一没有足够自信说是自己写的代码的话就是驱动部分了,毕竟当时的状态也是刚刚把单片机的知识全部学会罢了,因为这是基础中的基础,对于C语言,在校的学生普遍是没有完全掌握的,对于开发真的知识储备确实不够!好吧废话我不多说了,先讲讲我自己做的项目吧!学生的练手项目,大家应该不会来喷我吧! 上图先! 通用模块 我本人真的是没有做出来,但

基于Linux的智能家居的设计(1)

写在前面:做了半年的毕业设计,找到的工作与这个完全无关,发现自己现在有写不甘心,但是我还是在关注这方面的发展,自己的摸索和前人的帮助我完成了智能家居的一部分,希望这个能够给一些初学者 能够一些便利,毕竟技术是一个开放的,不属于某一个人的. 摘要 本课题主要目的是设计和实现一个基于Linux开发平台的智能家居系统.本系统主要使用PVC板做成的家居模型.本系统硬件使用基于ARM架构的samsung S3C6410芯片做成的OK6410开发板为手持终端,利用Zigbee实现网络通讯,并结合各种电子元器

无线LED智能照明控制系统

LED 具有使用寿命长.光效高以及低功耗的特质,使得它在和传统照明灯具相比的时候优势明显.与此同时,近年来电力资源持续缺乏,国家一直在提倡节能环保.营造"绿色低碳"生活,LED 必将会取代传统照明产品.     LED 的半导体器件的特性,使其在智能照明控制方面有绝对的优势,可以完美实现对照明灯具的调光调色.灵活设置.分组管理.状态查询和故障报警等功能,可以更加人性化的满足使用者的要求,实现最大限度的节能,有效地降低照明工程的维护成本.LED 照明走向智慧化已经成为一个发展趋势.   

基于Linux的智能家居的设计(3)

2  硬件设计 本课题的硬件设计包括主控制器.数据传输设计.数据采集设计.控制驱动设计.显示设计,门禁设计. 2.1  主控制器 根据方案三选择S3C6410主控芯片,S3C6410是由Samsung公司推出的一款低功耗.高性价比的RSIC处理器 ,基于ARM11内核,内置强大的硬件加速,显示处理和缩放,运动视频处理,音频处理[9].这个作为智能家居的处理器是不二之选,硬件性能上完全可以实现.本设计选用的基于S3C6410的OK6410开发板.开发板上拥有如下特征[10]: (1)  12MHz

基于ARM核AT75C220在指纹识别系统中应用

纹识别技术近年来逐渐成熟,在门禁.安防和金融等方面得到了越来越广泛的应用.典型的指纹识别系统是以指纹传感器和DSP处理器为核心构成.指纹传感器采集指纹图像,DSP处理器实时实现指纹识别算法.同时,通常的指纹识别系统还具有较强的通信能力,除了具有RS485通信外,高档的指纹识别系统还要求具有以太网接口和Internet连接能力.Atmel公司新推出的智能互联网芯片AT75C220集成了ARM内核.DSP协处理器以及以太网MAC接口,用AT75C220和指纹传感器结合可构成高性能的指纹识别系统. 1

基于Linux的智能家居的设计(4)

3  开发环境的搭建 本次课题使用的开发环境比较特殊,没有一个现成的集成开发环境,需要自己一步一步的搭建开发环境,开发环境的搭建的过程十分复杂,而且如果没有这个开发环境本次课题就无法进行.因此,在进行设计时,必须要进行开发环境的搭建. 3.1  虚拟机安装和系统安装 在PC机上安装VMware workstation 10.0虚拟机,将虚拟网络改为桥接模式,在虚拟机中安装Ubuntu12.04的系统,然后安装VM-tools. 在windows下面的创建共享目录G:/share,实现window

医用物资智能存储柜医院药品智能柜控制系统定制设计

医用物资智能存储柜 医院药品智能柜 智能柜定制设计  智能柜远程监控  智能柜智能报警 医用物资智能存储柜医院药品智能柜控制系统是在智能柜控制系统领域多年定制设计研发中的延伸设计方向,总结和归纳了以前产品的优缺点和用户体验后优化完善的产品. 一.医用物资智能存储柜医院药品智能柜设计背景 医用物质和耗材关系到患者的生命安全,物资和耗材的规范化.信息化管理管理在临床护理中起着举足轻重的作用. 医用物资存储柜,医用耗材存储柜,医用药品存储柜的智能控制板系统功能包括:嵌入式处理系统:人机交互显示系统:指

基于51单片机的温度控制系统毕设

分享一下单片机毕设课程计参考资料33个,献给大四的朋友,毕业设计就不用愁了,如果有什么不懂的地方可以加群大家一起交流:813238832资料下载的地址:https://bbs.usoftchina.com/thread-208012-1-1.html 1.CDMA通信系统中的接入信道部分进行仿真与分析2.USB接口设计3.毕业设计(论文)OFDM通信系统基带数据4.电气工程系毕业设计开题报告5.电信运营商收入保障系统设计与实现6.基于51单片机的16×16点阵(滚动显示)7.基于51单片机的LE