Polardb 是阿里云研發(fā)的一種關(guān)系型數(shù)據(jù)庫(kù),與mysql完全兼容,而性能又是其6倍,具有高吞吐,低延遲等特性; 本測(cè)試通過模擬控制智能家居開關(guān)的終端場(chǎng)景,來體驗(yàn)polardb的性能;
本測(cè)試通過模擬控制智能家居開關(guān)的終端場(chǎng)景,來體驗(yàn)polardb的性能;
1、環(huán)境搭建
1.1 polardb配置
首先需要購(gòu)買polardb,按照處理器和內(nèi)存的性能不同,價(jià)格也不同,最低的配置為2核4G的polar.mysql.x2.medium規(guī)格,包月價(jià)格560RMB;
購(gòu)買以后,就可以通過連接https://polardb.console.aliyun.com/,進(jìn)入polardb控制臺(tái)進(jìn)行相關(guān)的配置;選擇一個(gè)地域節(jié)點(diǎn)[如華東1],創(chuàng)建一個(gè)實(shí)例,然后選擇一個(gè)集群列表,創(chuàng)建一個(gè)集群。創(chuàng)建好后,可以看到數(shù)據(jù)庫(kù)類型為POLARDB (MySQL 5.6),付費(fèi)類型和到期時(shí)間分別為包月和一個(gè)月的長(zhǎng)度;在創(chuàng)建時(shí)配置好初始賬號(hào)和密碼就可以使用了;在集群頁(yè)面,鼠標(biāo)點(diǎn)擊右側(cè)的管理連接,進(jìn)入集群信息頁(yè)面,可以看到公網(wǎng)聯(lián)接的地址,是用戶賬號(hào)名開始的連接,后面是mysql常用的端口號(hào)3306,記錄下這個(gè)后面連接用的到;
集群連接地址 (公網(wǎng)) : mypolardb.mysql.polardb.rds.aliyuncs.com:3306 ,這里我的賬號(hào)配置為mypolardb,所以這里以mypolardb開頭;
在上面的白名單列表 中,點(diǎn)擊后面的筆狀修改按鈕,將我們用來連接數(shù)據(jù)庫(kù)的ecs 服務(wù)器地址添加到里面;這里我的服務(wù)器地址為47.94.219.162.
1.2 ECS服務(wù)器配置:
由于需要在web頁(yè)面上進(jìn)行結(jié)果測(cè)試,先安裝nginx服務(wù)器,使用以下命令行進(jìn)行安裝:
sudo apt-get install nginx
安裝好后,在瀏覽器中輸入 ECS的地址[這里測(cè)試的是:47.94.219.162],可以看到nginx的歡迎界面,表示安裝成功;
由于后面需要用php腳本程序開發(fā),所以還需要安裝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
進(jìn)入/var/www/html目錄,創(chuàng)建一個(gè)php文件,測(cè)試是否php安裝成功:
vi phpinfo.php
《?php phpinfo(); 》
在瀏覽器訪問這個(gè)文件,如果可以看到相關(guān)的php信息,則表明php安裝成功;
進(jìn)入域名控制臺(tái),選擇要解析的域名,點(diǎn)擊解析連接,添加一條A記錄,主機(jī)記錄起一個(gè)容易記住的名字,比如:polardb,記錄值選擇ECS的ip地址,比如:47.94.219.162,然后創(chuàng)建完成后,等待5分鐘,在瀏覽器訪問一下新的域名,比如polardb.xunyun17.xyz,如果同樣能看到nginx 的歡迎界面,表示域名解析成功;
由于本智能家居場(chǎng)景使用mysql開發(fā)體驗(yàn),所以還需要在ubuntu里,安裝mysql,運(yùn)行下面的命令進(jìn)行安裝:
sudo apt install mysql-client
安裝完mysql后,建立一個(gè)shell腳本,測(cè)試是否可以連接到polardb上:
vi p.sh
mysql -h mypolardb.mysql.polardb.rds.aliyuncs.com --user=mypolardb --password=mypolardb
。/p.sh
如果運(yùn)行完腳本后,可以看到mysql的提示信息,和mysql大于號(hào)提示符,表示可以連接成功;
2、開發(fā)
首先搭建創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)和一張表用來保存客廳和設(shè)備當(dāng)前信息:
。/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語(yǔ)言api接口,編寫一段程序,來讀取status設(shè)備表中的設(shè)備狀態(tài):
////////////////////////////////////////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腳本調(diào)用這段代碼查詢?cè)O(shè)備狀態(tài),并且顯示在網(wǎng)頁(yè)上:查詢結(jié)果在
使用以下php代碼實(shí)現(xiàn):
if(!empty($_REQUEST[‘a(chǎn)rguments’])){
exec(‘。/mysqlv ’.$_REQUEST[‘a(chǎn)rguments’]。‘ LAMP03 1’,$result);
//print_r($result);
//echo $result[0][0]?!禸r》’;
//echo $result[0][1]?!禸r》’;
//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[‘a(chǎn)rguments’]==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》”;
打開瀏覽器運(yùn)行這個(gè)php腳本,點(diǎn)擊運(yùn)行按鈕,可以看到頁(yè)面會(huì)顯示一個(gè)設(shè)備狀態(tài)表格,包括電視,燈,窗簾是否有打開或關(guān)閉;
接下來,用c語(yǔ)言寫一個(gè)socket監(jiān)聽程序,用來監(jiān)聽后續(xù)遠(yuǎn)程設(shè)備對(duì)智能家居的更新請(qǐng)求,并實(shí)現(xiàn)狀態(tài)更新,代碼如下:
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);
服務(wù)端監(jiān)聽程序編寫好以后,就可以開始寫模擬設(shè)備端的程序:
同樣使用c語(yǔ)言的socket函數(shù)進(jìn)行編寫,將命令行的數(shù)據(jù)發(fā)往服務(wù)器端:
/* 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的數(shù)據(jù)庫(kù)調(diào)用代碼,將命令行參數(shù)更改到數(shù)據(jù)庫(kù)中:
sprintf(str_cmd,“update status set value=%d where devname=\‘%s\’”,atoi(argc[3]),argc[2]);
3、測(cè)試
當(dāng)服務(wù)器和客戶端的程序都完成后,就可以進(jìn)行測(cè)試了;首先在服務(wù)器上,用以下命令行后臺(tái)運(yùn)行監(jiān)聽程序:
。/s&
然后在本地運(yùn)行模擬設(shè)備程序,例如我們要運(yùn)行將燈打開的命令,用下面的命令行:
。/c 47.94.219.162 8266 LAMP011
如果收到服務(wù)器的回顯消息,則表示發(fā)送成功;
打開瀏覽器,運(yùn)行php腳本,點(diǎn)擊運(yùn)行按鈕,可以看到頁(yè)面出現(xiàn)了最新設(shè)備狀態(tài)的表格信息;
結(jié)論與建議:可以看到這個(gè)polardb的新型數(shù)據(jù)庫(kù),還是和mysql兼容的,操作起來也比較方便;
如果能夠像其他阿里云的產(chǎn)品也提供相關(guān)的restful api接口,將會(huì)使開發(fā)變得更方便和快捷;
4、附錄和截圖
操作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服務(wù)器監(jiān)聽的完整程序:
#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客戶端模擬設(shè)備的完整程序:
#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腳本結(jié)果顯示的完整程序;
《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”》顯示客廳狀態(tài)《/option》
《/select》
《input type=“submit” name=“Submit” value=“運(yùn)行” /》
《/form》
《/body》
《/html》
《?php
if(!empty($_REQUEST[‘a(chǎn)rguments’])){
exec(‘。/mysqlv ’.$_REQUEST[‘a(chǎn)rguments’]。‘ LAMP03 1’,$result);
//print_r($result);
//echo $result[0][0]?!禸r》’;
//echo $result[0][1]?!禸r》’;
//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[‘a(chǎn)rguments’]==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》”;
}
?》
作者:云棲社區(qū) tech君
-
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3826瀏覽量
64509 -
智能家居
+關(guān)注
關(guān)注
1928文章
9579瀏覽量
185546 -
阿里云
+關(guān)注
關(guān)注
3文章
967瀏覽量
43117
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論