摘要: polardb 是阿里云研发的一种关系型数据库,与mysql完全兼容,而性能又是其6倍,具有高吞吐,低延迟等特性; 本测试通过模拟控制智能家居开关的终端场景,来体验polardb的性能;
本文由阿里云 mvp 洵云提供。
polardb 是阿里云研发的一种关系型数据库,与mysql完全兼容,而性能又是其6倍,具有高吞吐,低延迟等特性;
本测试通过模拟控制智能家居开关的终端场景,来体验polardb的性能;
1、环境搭建
1.1 polardb配置
首先需要购买polardb,按照处理器和内存的性能不同,价格也不同,最低的配置为2核4g的polar.mysql.x2.medium规格,包月价格560rmb;
购买以后,就可以通过连接https://polardb.console.aliyun.com/,进入polardb控制台进行相关的配置;选择一个地域节点[如华东1],创建一个实例,然后选择一个集群列表,创建一个集群。创建好后,可以看到数据库类型为polardb (mysql 5.6),付费类型和到期时间分别为包月和一个月的长度;在创建时配置好初始账号和密码就可以使用了;在集群页面,鼠标点击右侧的管理连接,进入集群信息页面,可以看到公网联接的地址,是用户账号名开始的连接,后面是mysql常用的端口号3306,记录下这个后面连接用的到;
集群连接地址 (公网) : mypolardb.mysql.polardb.rds.aliyuncs.com:3306 ,这里我的账号配置为mypolardb,所以这里以mypolardb开头;
在上面的白名单列表 中,点击后面的笔状修改按钮,将我们用来连接数据库的ecs 服务器地址添加到里面;这里我的服务器地址为47.94.219.162.
1.2 ecs服务器配置:
由于需要在web页面上进行结果测试,先安装nginx服务器,使用以下命令行进行安装:
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信息,则表明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大于号提示符,表示可以连接成功;
2、开发
首先搭建创建一个数据库和一张表用来保存客厅和设备当前信息:
./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].'
';
//echo $result[0][1].'
';
//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
电视
灯
窗帘
.$s1.
.$s2.
.$s3.
;
打开浏览器运行这个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 >>>>>\n);
exit(1);
}
selno = atoi(argc[1]);
// printf(selno:%d\n
,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
);
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!
);
*/
return 0;
}
server.c服务器监听的完整程序:
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
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 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脚本结果显示的完整程序;
小白的智能家居
小白的智能家居
显示客厅状态
阿里云双十一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/
造车大潮中,蔚来的未来到底是什么?
了解 5G 架构中的软件定义无线电和网络
以太网APL:利用切实可行的见解优化流程自动化
一文带你了解热设计
PCIE相关概念和带宽计算方法
基于智能家居场景的POALRDB性能体验
航空航天系统电力技术介绍
灵活的4mA至20mA压力传感器变送器,集成电压或电流驱动
特斯拉黑盒子的出现给智能门锁浇上了一盆冷水
苹果真的有那么厉害,纷纷引来Android制造商争先效仿
采用电荷泵的驱动电路
全面概述将人工智能市场纳入其广泛的数据库
华为新款智慧屏将带来全新的游戏体验
车联网布局,阿里领先了百度腾讯多少?
基于工业智能网关的智慧加药管理系统如何实现
SMT的几种工艺类型介绍
一加5/5T推送Oxygen 9.0系统正式版更新了UI翻新和滑动导航功能
IPC手工焊接返工返修世界冠军赛结果揭晓 中国选手张雯集获亚军
太阳能手机电池充电器的示意图
oppoR9M拆解 内部做工如何