使用smart360的API - C语言

来源:互联网 发布:淘宝一口价能随便改吗 编辑:程序博客网 时间:2024/05/16 03:59

#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>

#define CMD_JOIN     0x01    /*连接结点*/
#define CMD_DATA     0x02    /*传输数据*/
#define CMD_REDIRECT 0x03    /*连接转向*/
#define CMD_ERROR    0xFE    /*错误(回应)*/
#define CMD_OK       0xFC    /*正确(回应)*/

#define DEV_SEND     0x01    /*发射器*/
#define DEV_RECV     0x02    /*接收器*/

/*获取appid所在的服务器*/
int get_port(char svrip[], int svrport, char dev, char appid[], char *ip, int *port)
{
    int sock_fd    = 0;
    int i          = 0;
    int recbytes   =0;
    char buf[1024] = {0};
    struct sockaddr_in s_add, c_add;
   
    sock_fd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( -1 == sock_fd )
    {
        return -1;
    }
   
    bzero ( &s_add,sizeof ( struct sockaddr_in ) );
    s_add.sin_family      = AF_INET;
    s_add.sin_addr.s_addr = inet_addr (svrip);
    s_add.sin_port        = htons ( svrport );

    if ( -1 == connect ( sock_fd, ( struct sockaddr * ) ( &s_add ), sizeof ( struct sockaddr ) ) )
    {
        return -1;
    }
   
    /*构造包,申请连接appid*/
    buf[0] = CMD_JOIN;        /*命令字*/
    buf[1] = dev;             /*设备类型*/
    strcpy(buf + 2, appid);
    write(sock_fd, buf, 18);

    if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
    {
        return -1;
    }
    buf[recbytes] = '\0';
   
    /*服务器收到申请后,会找一台与客户端最近的连接机,并返回其ip与port*/
    if(buf[0] == CMD_REDIRECT)
    {  
        for (i = 0; i < recbytes - 1; i++)
        {
            if (buf[i+1] == '_')
            {
                ip[i] = '\0';
                break;
            }
            else
            {
                ip[i] = buf[i+1];
            }
        }
        *port = atoi(buf+2+i);
    }
    else
    {
        return -1;
    }

    return 0;
}

/*发送数据到appid上*/
int send_data(char svrip[], int svrport, char appid[])
{
    int sock_fd    = 0;
    int i          = 0;
    int recbytes   = 0;
    char buf[1024] = {0};
    struct sockaddr_in s_add, c_add;

    sock_fd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( -1 == sock_fd )
    {
        return -1;
    }
   
    bzero ( &s_add,sizeof ( struct sockaddr_in ) );
    s_add.sin_family      = AF_INET;
    s_add.sin_addr.s_addr = inet_addr (svrip);
    s_add.sin_port        = htons ( svrport );

    if ( -1 == connect ( sock_fd, ( struct sockaddr * ) ( &s_add ), sizeof ( struct sockaddr ) ) )
    {
        return -1;
    }
   
    /*构造包,申请连接appid*/
    buf[0] = CMD_JOIN;        /*命令字*/
    buf[1] = DEV_SEND;        /*发送型设备*/
    strcpy(buf + 2, appid);
    write(sock_fd, buf, 18);
   
    if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
    {
        return -1;
    }

    /*收到加入appid包之后,服务器返回CMD_OK状态*/
    if((unsigned char)buf[0] == CMD_OK)
    {
        while (1)
        {
            /*不断向服务器发送一个随机数*/
            buf[0] = CMD_DATA;
            sprintf(buf + 1, "%d\n", rand());
            write(sock_fd, buf, strlen(buf));
            if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
            {
                return -1;
            }
            if((unsigned char)buf[0] != CMD_OK)
            {
                return -1;
            }
            sleep(1);
        }
    }

    return 0;
}

int main(int argc,char *argv[])
{
    char *master_ip     = argv[1];  /*服务器ip*/ 
    int master_port     = 5615;     /*服务器port*/ 
    char *appid         = argv[2];  /*APPID*/
   
    char slaver_ip[100] = {0};
    int slaver_port     = 0;

    get_port(master_ip, master_port, DEV_SEND, appid, slaver_ip, &slaver_port);
    printf("slaver: %s %d\r\n", slaver_ip, slaver_port);
    send_data(slaver_ip, slaver_port, appid);
   
    return 0;
}

#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>

#define CMD_JOIN     0x01    /*连接结点*/
#define CMD_DATA     0x02    /*传输数据*/
#define CMD_REDIRECT 0x03    /*连接转向*/
#define CMD_ERROR    0xFE    /*错误(回应)*/
#define CMD_OK       0xFC    /*正确(回应)*/

#define DEV_SEND     0x01    /*发射器*/
#define DEV_RECV     0x02    /*接收器*/

/*获取appid所在的服务器*/
int get_port(char svrip[], int svrport, char dev, char appid[], char *ip, int *port)
{
    int sock_fd    = 0;
    int i          = 0;
    int recbytes   =0;
    char buf[1024] = {0};
    struct sockaddr_in s_add, c_add;
   
    sock_fd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( -1 == sock_fd )
    {
        return -1;
    }
   
    bzero ( &s_add,sizeof ( struct sockaddr_in ) );
    s_add.sin_family      = AF_INET;
    s_add.sin_addr.s_addr = inet_addr (svrip);
    s_add.sin_port        = htons ( svrport );

    if ( -1 == connect ( sock_fd, ( struct sockaddr * ) ( &s_add ), sizeof ( struct sockaddr ) ) )
    {
        return -1;
    }
   
    /*构造包,申请连接appid*/
    buf[0] = CMD_JOIN;         /*命令字*/
    buf[1] = dev;              /*设备类型*/
    strcpy(buf + 2, appid);
    write(sock_fd, buf, 18);

    if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
    {
        return -1;
    }
    buf[recbytes] = '\0';
   
    /*服务器收到申请后,会找一台与客户端最近的连接机,并返回其ip与port*/
    if(buf[0] == CMD_REDIRECT)
    {  
        for (i = 0; i < recbytes - 1; i++)
        {
            if (buf[i+1] == '_')
            {
                ip[i] = '\0';
                break;
            }
            else
            {
                ip[i] = buf[i+1];
            }
        }
        *port = atoi(buf+2+i);
    }
    else
    {
        return -1;
    }

    return 0;
}

/*从appid中接收数据*/
int recv_data(char svrip[], int svrport, char appid[])
{
    int sock_fd    = 0;
    int i          = 0;
 int recbytes   = 0;
 char buf[1024] = {0};
 struct sockaddr_in s_add, c_add;
   
    sock_fd = socket ( AF_INET, SOCK_STREAM, 0 );
 if ( -1 == sock_fd )
 {
  return -1;
 }
   
 bzero ( &s_add,sizeof ( struct sockaddr_in ) );
 s_add.sin_family      = AF_INET;
 s_add.sin_addr.s_addr = inet_addr (svrip);
 s_add.sin_port        = htons ( svrport );

 if ( -1 == connect ( sock_fd, ( struct sockaddr * ) ( &s_add ), sizeof ( struct sockaddr ) ) )
 {
  return -1;
 }
   
    /*构造包,申请连接appid*/
    buf[0] = CMD_JOIN;       /*命令字*/
    buf[1] = DEV_RECV;       /*接收类型设备*/
    strcpy(buf + 2, appid);
    write(sock_fd, buf, 18);
 if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
 {
  return -1;
 }

    /*收到加入appid包之后,服务器返回CMD_OK状态*/
    if((unsigned char)buf[0] == CMD_OK)
    {
        while (1)
        {
            /*循环接收数据*/
            if ( -1 == ( recbytes = read ( sock_fd, buf, 1024 ) ) )
            {
                return -1;
            }
            buf[recbytes] = '\0';
            printf("%s", buf);
        }
    }

    return 0;
}

int main(int argc,char *argv[])
{
    char *master_ip     = argv[1];  /*服务器ip*/ 
    int master_port     = 5615;     /*服务器port*/ 
    char *appid         = argv[2];  /*APPID*/

    char slaver_ip[100] = {0};
    int slaver_port     = 0;
   
    get_port(master_ip, master_port, DEV_RECV, appid, slaver_ip, &slaver_port);
    printf("slaver: %s %d\r\n", slaver_ip, slaver_port);
    recv_data(slaver_ip, slaver_port, appid);
   
    return 0;
}