基於智能家居場景的POALRDB性能體驗

Polardb 是阿里雲研發的一種關係型數據庫,與mysql徹底兼容,而性能又是其6倍,具備高吞吐,低延遲等特性;php

本測試經過模擬控制智能家居開關的終端場景,來體驗polardb的性能;html

一、環境搭建mysql

1.1 polardb配置nginx

首先須要購買polardb,按照處理器和內存的性能不一樣,價格也不一樣,最低的配置爲2核4G的polar.mysql.x2.medium規格,包月價格560RMB;web

購買之後,就能夠經過鏈接https://polardb.console.aliyun.com/,進入polardb控制檯進行相關的配置;選擇一個地域節點[如華東1],建立一個實例,而後選擇一個集羣列表,建立一個集羣。建立好後,能夠看到數據庫類型爲POLARDB (MySQL 5.6),付費類型和到期時間分別爲包月和一個月的長度;在建立時配置好初始帳號和密碼就可使用了;在集羣頁面,鼠標點擊右側的管理鏈接,進入集羣信息頁面,能夠看到公網聯接的地址,是用戶帳號名開始的鏈接,後面是mysql經常使用的端口號3306,記錄下這個後面鏈接用的到;sql

集羣鏈接地址 (公網) : mypolardb.mysql.polardb.rds.aliyuncs.com:3306 ,這裏個人帳號配置爲mypolardb,因此這裏以mypolardb開頭;shell

在上面的白名單列表 中,點擊後面的筆狀修改按鈕,將咱們用來鏈接數據庫的ecs 服務器地址添加到裏面;這裏個人服務器地址爲47.94.219.162.數據庫

1.2 ECS服務器配置:ubuntu

 

因爲須要在web頁面上進行結果測試,先安裝nginx服務器,使用如下命令行進行安裝:api

sudo apt-get install nginx 

安裝好後,在瀏覽器中輸入 ECS的地址[這裏測試的是:47.94.219.162],能夠看到nginx的歡迎界面,表示安裝成功;

因爲後面須要用php腳本程序開發,因此還須要安裝php,在console窗口輸入如下命令安裝:

sudo apt-get install php*

安裝好後,輸入下面的命令修改nginx的配置:

sudo vi /etc/nginx/sites-available/default

將文件中的下面四段打開:

location ~ \.php$ {

   include snippets/fastcgi-php.conf;

   fastcgi_pass unix:/run/php/php7.0-fpm.sock;

}

保存退出,而後重啓nginx:

service nginx restart

進入/var/www/html目錄,建立一個php文件,測試是否php安裝成功:

vi phpinfo.php

<?php phpinfo(); >

在瀏覽器訪問這個文件,若是能夠看到相關的php信息,則代表php安裝成功;

 

進入域名控制檯,選擇要解析的域名,點擊解析鏈接,添加一條A記錄,主機記錄起一個容易記住的名字,好比:polardb,記錄值選擇ECS的ip地址,好比:47.94.219.162,而後建立完成後,等待5分鐘,在瀏覽器訪問一下新的域名,好比polardb.xunyun17.xyz,若是一樣能看到nginx 的歡迎界面,表示域名解析成功;

 

因爲本智能家居場景使用mysql開發體驗,因此還須要在ubuntu裏,安裝mysql,運行下面的命令進行安裝:

sudo apt install mysql-client

 

安裝完mysql後,創建一個shell腳本,測試是否能夠鏈接到polardb上:

vi p.sh

mysql -h mypolardb.mysql.polardb.rds.aliyuncs.com --user=mypolardb --password=mypolardb

./p.sh

若是運行完腳本後,能夠看到mysql的提示信息,和mysql大於號提示符,表示能夠鏈接成功;

 

二、開發

首先搭建建立一個數據庫和一張表用來保存客廳和設備當前信息:

./p.sh

create database keting;

use keting;

CREATE TABLE status (devname VARCHAR(20), value int(4),changetime DATETIME);

insert into status(devname,value,changetime) values 

('TV0001',0,NOW()), 

('LAMP01',1,NOW()),

('CURN01',1,NOW()); 

 

而後經過mysql的c語言api接口,編寫一段程序,來讀取status設備表中的設備狀態:

////////////////////////////////////////query lamp device

     sprintf(str_cmd,"select value from status where devname='LAMP01'");

//printf("\n%s\n.",str_cmd);

     no_res = 0;

 

  if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

   }

    res = mysql_use_result(conn);

 if(no_res==0){

     while((row = mysql_fetch_row(res)) != NULL)

     {

//        printf("%s \n", row[0]);

   if(selno==17) printf("%s", row[0]);

 else         printf("%s\t %s\t %s", row[0],row[1],row[2]);

     }

  } 

    mysql_free_result(res);

 

     sprintf(str_cmd,"select value from status where devname='CURN01'");

//printf("\n%s\n.",str_cmd);

     no_res = 0;

 

下一步,就是用php腳本調用這段代碼查詢設備狀態,而且顯示在網頁上:查詢結果在

 使用如下php代碼實現:

 if(!empty($_REQUEST['arguments'])){

    exec('./mysqlv '.$_REQUEST['arguments'].' LAMP03 1',$result);

//print_r($result);

//echo $result[0][0].'<br>';

//echo $result[0][1].'<br>';

//echo $result[0][2];

 

if($result[0][0]==0) $s1 = 'OFF';

else $s1 = 'ON';

if($result[0][1]==0) $s2 = 'OFF';

else $s2 = 'ON';

if($result[0][2]==0) $s3 = 'OFF';

else $s3 = 'ON';

    if($_REQUEST['arguments']==17) echo "<center><table border=\"1\">

  <tr>

    <th>電視</th>

    <th>燈</th>

    <th>窗簾</th>

  </tr>

  <tr>

    <td>".$s1."</td>

    <td>".$s2."</td>

    <td>".$s3."</td>

  </tr>

</table></center>";

打開瀏覽器運行這個php腳本,點擊運行按鈕,能夠看到頁面會顯示一個設備狀態表格,包括電視,燈,窗簾是否有打開或關閉;

 

接下來,用c語言寫一個socket監聽程序,用來監聽後續遠程設備對智能家居的更新請求,並實現狀態更新,代碼以下:

   n = read(sock,buffer,255);

 if (n < 0) {

      perror("ERROR reading from socket");

      exit(1);

   }

strncpy(devname,buffer,6);

devname[6]=0;

devval=buffer[6]-'0';

memset(cmdstr,0,256);

sprintf(cmdstr,"./mysqlv 15 %s %i",devname,devval);

printf("%s.\n",cmdstr);

   system(cmdstr);

     

   printf("Here is the message: %s\n",buffer);

   n = write(sock,"I got your message",18);

 

服務端監聽程序編寫好之後,就能夠開始寫模擬設備端的程序:

一樣使用c語言的socket函數進行編寫,將命令行的數據發往服務器端:

 

   /* Now connect to the server */

   if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {

      perror("ERROR connecting");

      exit(1);

   }

   

   /* Now ask for a message from the user, this message

      * will be read by server

   */

   printf("Please enter the message: ");

   bzero(buffer,256);

   strcpy(buffer, argv[3]);

   //fgets(buffer,255,stdin);

   

   /* Send message to the server */

   n = write(sockfd, buffer, strlen(buffer));

   

   if (n < 0) {

      perror("ERROR writing to socket");

      exit(1);

   }

   

最後,還要修改咱們的mysqlv.c的數據庫調用代碼,將命令行參數更改到數據庫中:

 

 sprintf(str_cmd,"update status set value=%d  where devname=\'%s\'",atoi(argc[3]),argc[2]);

 

三、測試

當服務器和客戶端的程序都完成後,就能夠進行測試了;首先在服務器上,用如下命令行後臺運行監聽程序:

./s&

而後在本地運行模擬設備程序,例如咱們要運行將燈打開的命令,用下面的命令行:

./c 47.94.219.162 8266 LAMP011

若是收到服務器的回顯消息,則表示發送成功;

打開瀏覽器,運行php腳本,點擊運行按鈕,能夠看到頁面出現了最新設備狀態的表格信息;

 

結論與建議:能夠看到這個polardb的新型數據庫,仍是和mysql兼容的,操做起來也比較方便;

若是可以像其餘阿里雲的產品也提供相關的restful api接口,將會使開發變得更方便和快捷;

 

四、附錄和截圖

 

操做polardb 的mysqlv完整程序:

#include <mysql/mysql.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int main(int argv,char**argc)

{

    MYSQL *conn;

    MYSQL_RES *res;

    MYSQL_ROW row;

 

    char server[] = "47.98.24.120";

    char user[] = "mypolardb";

    char password[] = "mypolardb";

    char database[] = "mysql";

char str_cmd[250]; 

int no_res = 0;

int selno=0;

 

 if(argv<2) {

printf("mysqlv funcno.\n");

return 0;

}

 

    conn = mysql_init(NULL);

 

    if(!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))

    {

        printf(">>>>>>>\n");

        exit(1);

    }

selno = atoi(argc[1]);

    //    printf("selno:%d\n<br>",selno);

switch(selno){

   case 1:

     strcpy(str_cmd,"select version()");

     break;

   case 2:

     strcpy(str_cmd,"select current_date");

     break;

   case 3:

     strcpy(str_cmd,"show databases");

     break;

   case 4:

     strcpy(str_cmd,"create database keting");

     no_res = 1;

     break;

   case 5:

     strcpy(str_cmd,"drop database keting");

     no_res = 1;

     break;

   case 6:

     strcpy(str_cmd,"create database woshi");

     no_res = 1;

     break;

   case 7:

     strcpy(str_cmd,"drop database woshi");

     no_res = 1;

     break;

   case 8:

     strcpy(str_cmd,"create database chufang");

     no_res = 1;

     break;

   case 9:

     strcpy(str_cmd,"drop database chufang");

     no_res = 1;

     break;

   case 10:

     strcpy(str_cmd,"use keting");

     no_res = 1;

     break;

   case 11:

     strcpy(str_cmd,"use woshi");

     no_res = 1;

     break;

   case 12:

     strcpy(str_cmd,"use chufang");

     no_res = 1;

     break;

#if 0

   case 13:

     strcpy(str_cmd,"show tables");

     //no_res = 1;

     break;

/*table operate for keting*/

   case 14:

     strcpy(str_cmd,"CREATE TABLE prop (devname VARCHAR(20), value int(4))");

     //no_res = 1;

     break;n

#endif

   case 15:

     strcpy(str_cmd,"describe prop");

     //no_res = 1;

     break;

   case 16:

     strcpy(str_cmd,"drop table if exists prop");

     //no_res = 1;

     break;

}

if(selno==13){

     strcpy(str_cmd,"use keting");

    if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

   }

     strcpy(str_cmd,"show tables");

     no_res = 0;

 }

if(selno==14){

     strcpy(str_cmd,"use keting");

    if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

   }

     strcpy(str_cmd,"select * from prop;");

     no_res = 0;

 }

 

if(selno==15){

     strcpy(str_cmd,"use keting");

    if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

   }

//     sprintf(str_cmd,"insert into prop(devname,value,changetime) values (\'%s\',%i,NOW())",argc[2],atoi(argc[3]));

     sprintf(str_cmd,"update status set value=%d  where devname=\'%s\'",atoi(argc[3]),argc[2]);

 

printf("\n%s\n.",str_cmd);

     no_res = 1;

 }

 

if(selno==16){

     strcpy(str_cmd,"use keting");

    if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

   }

     sprintf(str_cmd,"delete from prop where devname='my_dev'");

printf("\n%s\n.",str_cmd);

     no_res = 1;

 }

 

if(selno==17){

     strcpy(str_cmd,"use keting");

     if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

     }

////////////////////////////////////////query tv device

     sprintf(str_cmd,"select value from status where devname='TV0001'");

//printf("\n%s\n.",str_cmd);

     no_res = 0;

 

  if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

   }

    res = mysql_use_result(conn);

 if(no_res==0){

     while((row = mysql_fetch_row(res)) != NULL)

     {

//        printf("%s \n", row[0]);

   if(selno==17) printf("%s", row[0]);

 else         printf("%s\t %s\t %s", row[0],row[1],row[2]);

     }

  } 

    mysql_free_result(res);

////////////////////////////////////////query lamp device

     sprintf(str_cmd,"select value from status where devname='LAMP01'");

//printf("\n%s\n.",str_cmd);

     no_res = 0;

 

  if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

   }

    res = mysql_use_result(conn);

 if(no_res==0){

     while((row = mysql_fetch_row(res)) != NULL)

     {

//        printf("%s \n", row[0]);

   if(selno==17) printf("%s", row[0]);

 else         printf("%s\t %s\t %s", row[0],row[1],row[2]);

     }

  } 

    mysql_free_result(res);

 

     sprintf(str_cmd,"select value from status where devname='CURN01'");

//printf("\n%s\n.",str_cmd);

     no_res = 0;

  

 

 

}

//printf("finish! \n");

 

 

    if(mysql_query(conn, str_cmd))

     {

        printf("<<<<<<<\n");

        exit(1);

   }

    res = mysql_use_result(conn);

 if(no_res==0){

   if(selno==14)

     printf("DEVICE VALUE TIMESTAMP<br>");

     while((row = mysql_fetch_row(res)) != NULL)

     {

//        printf("%s", row[0]);

if(selno==17) printf("%s\t ", row[0]);

 else       printf("%s\t %s\t %s", row[0],row[1],row[2]);

     }

  } 

    mysql_free_result(res);

    mysql_close(conn);

/* 

    printf("finish! \n");

    printf("finish! <br>");

 */

    return 0;

}

 

 

server.c服務器監聽的完整程序:

#include <stdio.h>

#include <stdlib.h>

 

#include <netdb.h>

#include <netinet/in.h>

 

#include <string.h>

 

void doprocessing (int sock);

 

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

   int sockfd, newsockfd, portno, clilen;

   char buffer[256];

   struct sockaddr_in serv_addr, cli_addr;

   int n, pid;

   

   /* First call to socket() function */

   sockfd = socket(AF_INET, SOCK_STREAM, 0);

   

   if (sockfd < 0) {

      perror("ERROR opening socket");

      exit(1);

   }

   

   /* Initialize socket structure */

   bzero((char *) &serv_addr, sizeof(serv_addr));

   portno = 8266;//5001;

   

   serv_addr.sin_family = AF_INET;

   serv_addr.sin_addr.s_addr = INADDR_ANY;

   serv_addr.sin_port = htons(portno);

   

   /* Now bind the host address using bind() call.*/

   if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {

      perror("ERROR on binding");

      exit(1);

   }

   

   /* Now start listening for the clients, here

      * process will go in sleep mode and will wait

      * for the incoming connection

   */

   

   listen(sockfd,5);

   clilen = sizeof(cli_addr);

   

   while (1) {

      newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

      if (newsockfd < 0) {

         perror("ERROR on accept");

         exit(1);

      }

      

      /* Create child process */

      pid = fork();

      if (pid < 0) {

         perror("ERROR on fork");

         exit(1);

      }

      

      if (pid == 0) {

         /* This is the client process */

         close(sockfd);

         doprocessing(newsockfd);

         exit(0);

      }

      else {

         close(newsockfd);

      }

   } /* end of while */

}

void doprocessing (int sock) {

   int n;

   char buffer[256];

   char cmdstr[256];

   char devname[10];

   int devval=0;

   bzero(buffer,256);

   n = read(sock,buffer,255);

 if (n < 0) {

      perror("ERROR reading from socket");

      exit(1);

   }

strncpy(devname,buffer,6);

devname[6]=0;

devval=buffer[6]-'0';

memset(cmdstr,0,256);

sprintf(cmdstr,"./mysqlv 15 %s %i",devname,devval);

printf("%s.\n",cmdstr);

   system(cmdstr);

     

   printf("Here is the message: %s\n",buffer);

   n = write(sock,"I got your message",18);

   

   if (n < 0) {

      perror("ERROR writing to socket");

      exit(1);

   }

if(buffer[0]=='z') exit(1);

}

 

client.c客戶端模擬設備的完整程序:

#include <stdio.h>

#include <stdlib.h>

 

#include <netdb.h>

#include <netinet/in.h>

 

#include <string.h>

 

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

   int sockfd, portno, n;

   struct sockaddr_in serv_addr;

   struct hostent *server;

   

   char buffer[256];

   

   if (argc < 3) {

      fprintf(stderr,"usage %s hostname port devsw\n", argv[0]);

      exit(0);

   }

   portno = atoi(argv[2]);

   

   /* Create a socket point */

   sockfd = socket(AF_INET, SOCK_STREAM, 0);

   

   if (sockfd < 0) {

      perror("ERROR opening socket");

      exit(1);

   }

   server = gethostbyname(argv[1]);

   

   if (server == NULL) {

      fprintf(stderr,"ERROR, no such host\n");

      exit(0);

   }

   

   bzero((char *) &serv_addr, sizeof(serv_addr));

   serv_addr.sin_family = AF_INET;

   bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);

   serv_addr.sin_port = htons(portno);

   

   /* Now connect to the server */

   if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {

      perror("ERROR connecting");

      exit(1);

   }

   

   /* Now ask for a message from the user, this message

      * will be read by server

   */

   printf("Please enter the message: ");

   bzero(buffer,256);

   strcpy(buffer, argv[3]);

   //fgets(buffer,255,stdin);

   

   /* Send message to the server */

   n = write(sockfd, buffer, strlen(buffer));

   

   if (n < 0) {

      perror("ERROR writing to socket");

      exit(1);

   }

   

   /* Now read server response */

   bzero(buffer,256);

   n = read(sockfd, buffer, 255);

   

   if (n < 0) {

      perror("ERROR reading from socket");

      exit(1);

   }

   printf("%s\n",buffer);

   return 0;

}

 

p.php腳本結果顯示的完整程序;

 

<html>

<head>

    <title>小白的智能家居</title>

</head>

<body>

    <?php

        if(!empty($results)){

        //    echo $results;

        }

    ?>

    <center>小白的智能家居</center>

 

 

    <form method="post" action="">

<select name="arguments">

  <option value ="17" selected="selected">顯示客廳狀態</option>

</select>

<input type="submit" name="Submit" value="運行" />

</form>

 

</body>

</html>

<?php

if(!empty($_REQUEST['arguments'])){

    exec('./mysqlv '.$_REQUEST['arguments'].' LAMP03 1',$result);

//print_r($result);

//echo $result[0][0].'<br>';

//echo $result[0][1].'<br>';

//echo $result[0][2];

 

if($result[0][0]==0) $s1 = 'OFF';

else $s1 = 'ON';

if($result[0][1]==0) $s2 = 'OFF';

else $s2 = 'ON';

if($result[0][2]==0) $s3 = 'OFF';

else $s3 = 'ON';

    if($_REQUEST['arguments']==17) echo "<center><table border=\"1\">

  <tr>

    <th>電視</th>

    <th>燈</th>

    <th>窗簾</th>

  </tr>

  <tr>

    <td>".$s1."</td>

    <td>".$s2."</td>

    <td>".$s3."</td>

  </tr>

</table></center>";

}

 

?>


阿里雲雙十一1折拼團活動:滿6人,就是最低折扣了!
【滿6人】1核2G雲服務器99.5元一年298.5元三年 2核4G雲服務器545元一年 1227元三年
【滿6人】1核1G MySQL數據庫 119.5元一年
【滿6人】3000條國內短信包 60元每6月
參團地址:http://click.aliyun.com/m/1000020293/


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索