基於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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章