物联网消息协议 Mosquitto 服务器在 CentOS 7 上的部署

一提到安装部署,大家都知道 yum install ,是的, 概不例外。安装这个服务程序也非常简单。

然后

# systemctl enable mosquitto

# systemctl start mosquitto

为了安全,我们需要采用认证机制。我们可以用

# mosquitto_passwd  -c mosquitto.pwd username1

来创建一个口令文件,并添加第一个用户 username1。

加密后口令和用户名就会存放到口令文件。 熟悉 Apache 的同学都会知道,这和 htpasswd 命令有点类似。

配置  /etc/mosquitto/mosquitto.conf 文件如下:

user mosquitto
bind_address 192.168.7.201
port 1883
log_dest file /var/log/mosquitto/mosquitto.log
log_type all
log_timestamp true
allow_anonymous false
password_file /etc/mosquitto/mosquitto.pwd
autosave_interval 1800
persistence true
persistence_file mosquitto.db
persistence_location /var/mosquitto/

确保 /var/mosquitto/ 和  /var/log/mosquitto/ 目录存在,并被 mosquitto 用户可写。

# systemctl restart mosquitto

# tail -f /var/log/mosquitto/mosquitto.log
可以查看 mosquitto 的日志。

如果没有日志,那么查看 /var/log/message ,看看服务是否正常启动。

为 Mosquitto 添加证书,这部分暂且略过。如果服务器部署在公网上的话,可以用 certbot 申请免费的证书,来加密消息的传送。

消息传送的测试:

发布:

# mosquitto_pub -u username -P password -p 1883 -h 192.168.7.201 -t test -m “hello 你好”

在打开的另外一个窗口用以下命令可以接收到发送的消息:

# mosquitto_sub -u username -P password -p 1883 -h 192.168.7.201 -t test

在日志里面,我们看到订阅者的连接信息:

New client connected from 192.168.7.201 as mosqsub|18652-cdh1 (c1, k60, u’username’).

18652是进程号

cdh1 是主机名

c1 是否清理 session

k60 是 KeepAlive 60s

u 后面是用户名

消息发布后,可以看到如下日志:

1501495574: Received PUBLISH from mosqpub|18653-cdh1 (d0, q0, r0, m0, ‘test’, … (12 bytes))

d0,关闭调试

q0, 默认 QOS = 0
r0, 消息是否 retain

m0, 是这个 test topic 下的第一条消息,后续消息以 m1,m2 递加。

关于具体的这些参数可以用 man  查看文档了解。

其他资源:
MQTT 各种语言上的实现
MQTT 官方标准文档

用 PHP 通过 MQTT 物联网协议实现消息传送

MQTT 是物联网的消息传送协议标准。

在 CentOS 7上常用的开源 MQTT 消息服务器就是 Mosquitto

我们用 PECL 来安装 Mosquitto 的 PHP 实现。

首先要确保 php-devel 已经安装:

# yum install -y php-devel

然后确保 mosquitto-devel 也已经安装:

#yum install -y mosquitto-devel

再用 pecl 来安装  Mosquitto-PHP

# pecl install Mosquitto-alpha

然后去  /etc/php.ini 添加一行:

extension=mosquitto.so

重启 Apache后,运行 php -i|grep mosquitto 可以看到
mosquitto
libmosquitto version => 1.4.13

表明 PHP 可以使用 mosquitto 的 MQTT 库了。

下面是用 PHP 来发送消息的示例代码 mosquitto-test.php:

<?php
2
3
4 $c = new Mosquitto\Client;
5
6 $topic = ‘test’;
7 $msg = ‘hello你好’;
8 $qos = 2;
9
10 $username = ‘username’;
11 $password = ‘Passw0rd’;
12
13 $c->setCredentials($username, $password);
14 $c->onConnect(function() use ($c) {
15 global $topic,$msg,$qos;
16 $c->publish($topic, $msg, $qos);
17 });
18
19 $host = ‘192.168.7.201’;
20
21 $c->connect($host);
22 for ($i = 0; $i < 100; $i++) {
23 // Loop around to permit the library to do its work
24 $c->loop(1);
25 }
26
27 echo “结束\n”;

然后运行 php mosqitto-test.php

另外开启一个终端,用

# mosquitto_sub -h 192.168.7.201 -u username -P Passw0rd -t test

可以看到 PHP 程序发送的消息: “hello你好”.

wordpress一些常用的常量

ABSPATH :网站根目录的绝对路径
WP_CONTENT_DIR : wp-content目录的磁盘路径
WP_CONTENT_URL :wp-content目录的URL
TEMPLATEPATH : 当前主题所在目录路径
STYLESHEETPATH : 当前主题样式所在目录路径
WP_PLUGIN_DIR : 定义插件目录的磁盘路径
WP_PLUGIN_URL : 定义插件目录的URL
WP_LANG_DIR : 自定义语言包的路径
WP_POST_REVISIONS : 关闭 WordPress 版本修订功能
AUTOSAVE_INTERVAL 定义自动保存的时间

wordpress模板常用函数

WordPress基本模板文件

一套完整的WordPress模板应至少具有如下文件:

style.css : CSS(样式表)文件
index.php : 主页模板
archive.php : Archive/Category模板
404.php : Not Found 错误页模板
comments.php : 留言/回复模板
footer.php : Footer模板
header.php : Header模板
sidebar.php : 侧栏模板
page.php : 内容页(Page)模板
single.php : 内容页(Post)模板
searchform.php : 搜索表单模板
search.php : 搜索结果模板

基本条件判断

is_home() : 是否为主页
is_single() : 是否为内容页(Post)
is_page() : 是否为内容页(Page)
is_category() : 是否为Category/Archive页
is_tag() : 是否为Tag存档页
is_date() : 是否为指定日期存档页
is_year() : 是否为指定年份存档页
is_month() : 是否为指定月份存档页
is_day() : 是否为指定日存档页
is_time() : 是否为指定时间存档页
is_archive() : 是否为存档页
is_search() : 是否为搜索结果页
is_404() : 是否为 “HTTP 404: Not Found” 错误页
is_paged() : 主页/Category/Archive页是否以多页显示

模板常用的PHP函数及命令

<?php get_header(); ?> : 调用Header模板
<?php get_sidebar(); ?> : 调用Sidebar模板
<?php get_footer(); ?> : 调用Footer模板
<?php the_content(); ?> : 显示内容(Post/Page)
<?php if(have_posts()) : ?> : 检查是否存在Post/Page
<?php while(have_posts()) : the_post(); ?> : 如果存在Post/Page则予以显示
<?php endwhile; ?> : While 结束
<?php endif; ?> : If 结束<?php the_title(); ?> : 内容页(Post/Page)标题
<?php the_permalink() ?> : 内容页(Post/Page) Url
<?php the_category(’, ‘) ?> : 特定内容页(Post/Page)所属Category
<?php the_author(); ?> : 作者

其它相关函数

<?php _e(’Message’); ?> : 输出相应信息
<?php wp_register(); ?> : 显示注册链接
<?php wp_loginout(); ?> : 显示登录/注销链接
<?php timer_stop(1); ?> : 网页加载时间(秒)
<?php echo get_num_queries(); ?> : 网页加载查询量

使用 Loco Translate 插件翻译 WordPress 主题和插件

国外有很多优秀的 WordPress 插件和主题,本着拿来主义的原则,我们需要“洋为中用”,把它们翻译成中文。

翻译的方法有很多种,比较“专业”的办法,是直接在 Linux 操作系统内,把 .pot(Portable Object Template) 文件拷贝成 对应语言的 .po 文件,然后直接 vim 修改这个 .po 文件(Portable Object),然后再运行 msgfmt 命令编译成 .mo 文件( Machine Object)
下面以主题的名字 skin 为例子,skin.pot 文件在 wp-content/themes/skin/languages 下,需要先拷贝成 skin-zh_CN.po。

# msgfmt skin-zh_CN.po -o skin-zh_CN.mo

另外一种办法是在 PC 端安装一个 PoEdit 软件,加载 pot 文件之后,能选择语言,再编译成 mo  文件,把 mo文件上传到主题对应的 language 目录即可。

下面介绍采用 WordPress 插件 Loco Translate 在后台管理界面直接翻译的方法:

  1. 下载安装并激活插件,我们继续采用我最喜欢的 wp-cli 命令行:
    • # wp plugin install loco-translate –activate
  2. 进入管理后台,选择左边的 “Loco Translate”菜单,选择语言,可以用 WordPress 的语言,或者自己定义某个国家的语言。然后选择默认的 location:  themes/skin/language/<locale>.po,点击 “Start translating”,开始翻译。如果遇到权限问题,需要确认 language 目录对Web 服务器的运行用户可写。
  3. 接下去就是简单的翻译工作了, 在最下部的翻译窗口输入对 Source Text 的翻译。翻译完毕之后即可保存。然后刷新前台页面,既可以看到翻译已经生效。

详细的英文教程在: https://localise.biz/wordpress/plugin/beginners

在翻译窗口可以采用以下快捷键:

  • 结束并跳到下一个: Ctrl ↵
  • 下一个字符串: Ctrl ↓
  • 前一个字符串: Ctrl ↑
  • 下一个未翻译字符串: Shift Ctrl ↓
  • 前一个未翻译字符串: Shift Ctrl ↑
  • 从原始文本拷贝: Ctrl B
  • 清空翻译: Ctrl K
  • 切换模糊搜索: Ctrl U
  • 保存 PO 并编译成 MO: Ctrl S
  • 切换不可见字符: Shift Ctrl I

WordPress 命令行自动部署的完整脚本 [附中文语言包的阿里云网站更新]

前文介绍 WP CLI 自动部署的脚本有一些小缺陷,主要是需要先创建用户数据库授权,才能创建 wp-config.php,否则报 MySQL 1045 错误,也就是用户名或者密码的权限错误。

感兴趣的读者可以直接点击下载本脚本: https://download.yj777.cn/wordpress/auto-deploy/deploy-wp.sh

该脚本针对中国用户做了特别的优化。特别是中文语言包的下载,由于 GFW 的缘故,把中文语言包放置到了国内阿里云服务器。待优化的工作主要是 Apache DocumentRoot 的判定以及根据 Site URL 设置虚拟主机,还有就是 .htaccess 的创建。希望能在 V2.0 实现。

上海甬洁网络科技有限公司专注于企业的互联网转型,承接各类电子商务网站的建设,社会化媒体,特别是微信公众号的运营,微信小程序开发等;也承接中小企业的 IT 业务外包。

我们计划把 tech.yj777.cn 建设成国内 WordPress/WooCommerce 的社群。

先从下载服务开始。

#!/usr/bin/env bash
# WordPress 自动化安装
# Author: Albert Xu (albertxu AT freelamp.com)
# 创建日期: 2017-5-31
# Last Modified: 2017-6-15

# 需要配置的参数

# =========================================
APACHE_ROOT=/var/www/html

clear
echo -e “\n\t\tWordpress 自动部署系统 V1.0 (作者:徐永久 albertxu@freelamp.com)\n”
read -p “请输入站点安装目录: ” dir

WP_URL=http://localhost/report/$dir

read -p “请输入数据库名: ” DBNAME
read -p “请输入数据库用户名: ” DBUSER
# read -p “请输入数据库口令: ” DBPASS
# read -p “请输入站点 URL: ” WP_URL
echo
read -p “请输入站点名字: ” WP_TITLE
read -p “请输入站点管理员登录用户名: ” WP_ADMIN
read -p “请输入站点管理员邮箱: ” ADMIN_EMAIL
DBPASS=$(date +%s | sha256sum | base64 | head -c 32 ; echo)
WP_PASS=$(date +%s | sha256sum | base64 | head -c 10 ; echo)

WP_FOLDER=$APACHE_ROOT/$dir
# WP_FOLDER=$dir

# [ -d $WP_FOLDER ] && echo -e “\n文件夹已经存在!请尝试运行 rm -rf ${WP_FOLDER} ” && exit 1

WP=”/usr/bin/wp –allow-root –path=$WP_FOLDER”
echo -e “1. 自动下载/解压最新版本的 WordPress … \c”

mkdir ${WP_FOLDER}
[ ! -d $WP_FOLDER ] && echo “Folder not exist!” && exit 1
cd ${WP_FOLDER}
$WP core download

mysql “$DBNAME” -e “exit” 2>/dev/null
[ $? == 0 ] && echo -e “\n数据库已经存在!请尝试运行 mysql -e \”drop database ${DBNAME}\”” && exit 1

echo “2. 创建数据库账号 … ”
mysql mysql -e “grant all on ${DBNAME}.* to ${DBUSER}@localhost identified by ‘${DBPASS}’;flush privileges;”
[ $? != 0 ] && echo “创建失败! ” && exit 2

echo -e “3. 创建配置文件 …\c”
$WP core config –dbname=${DBNAME} –dbuser=${DBUSER} –dbpass=${DBPASS}
[ $? != 0 ] && echo “创建配置文件失败!” && exit 3

echo -e “4. 创建数据库 …\c”
$WP db create
[ $? != 0 ] && echo “创建失败!” && exit 4

echo -e “5. 创建实例 … \c”
$WP core install –url=$WP_URL –title=”${WP_TITLE}” –admin_user=”${WP_ADMIN}” –admin_email=”${ADMIN_EMAIL}” –admin_password=”${WP_PASS}”
[ $? != 0 ] && echo “创建 WordPress 实例 \”${WP_TITLE}\” 失败!” && exit 5

echo -e “6. 检查 站点 $WP_URL 的可用性 … \c”
TMP=/var/tmp/wp_test.out
wget -o $TMP $WP_URL
[ -z $TMP ] && echo “实例创建有问题,请检查 $WP_URL!” && rm $TMP && exit 6
rm $TMP
echo “成功”

echo “7: 其他任务, 安装激活中文语言包、主题、插件等 …”

echo -e “\t安装中文语言包 …”
# $WP core language install zh_CN –activate
LDIR=${WP_FOLDER}/wp-content/languages
[ ! -d ${LDIR} ] && mkdir ${LDIR}
cd ${LDIR}
L=core-default-4.7.5-zh_CN.zip
wget -q https://download.yj777.cn/wordpress/translation/$L
unzip -q $L
$WP language core activate zh_CN
rm $L

echo -e “\t安装主题 …”
# echo “结束: 请访问 $WP_URL 验证安装”
# $WP theme install https://downloads.wordpress.org/theme/skin.0.8.6.zip –activate
$WP theme install https://download.yj777.cn/wordpress/themes/skin.0.8.6.zip –activate

echo -e “\t安装配置插件 …”

$WP plugin delete hello
$WP plugin delete akismet

# Add and Remove Base Plugins
$WP plugin install kirki tabbed-login antispam-bee admin-menu-tree-page-view contact-form-7 advanced-custom-fields –activate

# Delete installed posts and create homepage
$WP post delete $($WP post list –post_type=’page’ –format=ids) –force
$WP post delete $($WP post list –post_type=’post’ –format=ids) –force
$WP post create –post_type=’page’ –post_title=”Home” –post_status=”publish”
$WP option update page_on_front 3
$WP option update show_on_front page

# Replace Uncategorized with a new Category as default
$WP term create category 新闻
$WP option update default_category 2
$WP term delete category 1

# Set Your Timezone – Most of you will want to change this
TIMEZONE=”Asia/Shanghai”
$WP option update timezone_string $TIMEZONE
$WP option update blogdescription “”
$WP option update date_format “Y年n月j日”
$WP option update time_format “ag:i”

# Options checkboxes the way I like them
$WP option update default_pingback_flag 0
$WP option update default_ping_status 0
$WP option update default_comment_status 0
$WP option update comment_registration 1
$WP option update comment_moderation 1
$WP option update comments_notify 0
$WP option update show_avatars 0

# 写 htaccess
# 设置 permalink
# Update rewrite (You’ll still need to resave the Settings > Permalinks Page)
# $WP rewrite structure ‘/%year%/%monthnum%/%postname%’
$WP rewrite structure ‘/%postname%/’ –hard
$WP rewrite flush –hard

# create a navigation bar
$WP menu create “Main Navigation”

# Create necessary Apache configs
# cd /etc/apache2/sites-available/
# sudo cp default.conf $url.conf
# sudo sed -i “s/localpress/$url/g” $url.conf
# cd ../sites-enabled/
# sudo ln -s ../sites-available/$url.conf $url.conf
# sudo service apache2 restart

# Update /etc/hosts – You’ll need to do this manually for your own machine
# sudo sed -i “s/#addmore/$url #addmore/g” /etc/hosts

# Spit out username and password details
echo “”
echo “”
echo “新站点 $WP_TITLE 已经建立”
echo “URL: $WP_URL/wp-admin/”
echo “用户名: $WP_ADMIN”
echo “口令: $WP_PASS”
echo “”

使用 Composer 安装 WordPress

编译自: https://roots.io/using-composer-with-wordpress/

原文日期:2013年8月18日

如果你用过 Node.js 的 npm,Ruby 的 Bundler,Python 的 pip,那么你一定已经知道了 PHP 的依赖包管理系统: Composer。

本文将简单介绍使用 Composer 部署 WordPress 的方法,都是干货。

直接上代码:

创建一个目录,在这个目录下创建 composer.json 文件如下:


{
"repositories": [
{
"type": "composer",
"url": "https://wpackagist.org"
}
],
"require": {
"php": ">=5.4",
"johnpbloch/wordpress": "4.8",
"fancyguy/wordpress-monolog": "dev-master",
"wpackagist-plugin/advanced-custom-fields": "*",
"wpackagist-plugin/posts-to-posts": "1.4.x"
},
"extra": {
"wordpress-install-dir": "wp"
}
}

请注意,原文的 WordPress 版本为 4.2,本文的版本已经修改为 4.8,并且已经把 http 修改成 https,否则报错。

生成这个文件, 直接运行 composer install ,即可安装 wordpress 了。

如果以后有新的版本发布, 只要直接运行 composer update 即可。

MySQL 基础命令

一、数据库操作SQL语句

1、显示服务器上当前存在什么数据库

show databases;

2、创建名称为user的数据库

create databases user;

3、删除名称为user的数据库

drop databases user;

4、选择user数据库

use user;

二、表操作SQL语句

1、显示当前数据库中存在什么表

show tables;

2、查看student表结构

describe student;

3、从student表中检索出唯一的不重复记录:

select distinct username from student;

4、更改表结构,将student表username字段的字段类型改为CHAR(25)

alter  table student change username usernamechar(25);

5、查看某张表的表头

desc student ;

6、修改表名

① rename table 原表名 to 新表名;

② alter table 原表名 rename to 新表名;

7、复制表

create table table2 select * from table1;

8、给表添加字段

alter table 表名 add  column 字段名 属性;

9、删除字段

alter table 表名 drop column 字段名

三、其它

1 获取当前时间

select now();

2 退出MySQL命令

exit(回车)

3  mysql服务的启动和停止

net start mysql

net stop mysql

4  登陆mysql

mysql -u 用户名 -p 用户密码

5 增加新用户

grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”

如,增加一个用户user1密码为password1,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:

grant select,insert,update,delete on *.* to user1@localhost Identified by “password1”;

如果你不想user1有密码,可以再打一个命令将密码去掉。

grant select,insert,update,delete on mydb.* to user1@localhost identified by “”;

相关连接:

抓取每张表的行数

用 wp-cli 自动部署 WordPress

本脚本利用 WordPress 命令行工具 wp-cli 实现了 WordPress 的自动部署,对于需要经常部署 WP 的运维会比较有用。


#!/bin/bash
# WordPress 自动化安装
# Author: Albert Xu (albertxu AT freelamp.com)
# 创建日期: 2017-5-31
# Last Modified: 2017-5-31
# 需要配置的参数
WP_FOLDER=wp_test8
WP_TITLE='Wordpress 8'
WP_ADMIN='admin'
WP_URL=http://localhost/"$WP_FOLDER"
ADMIN_EMAIL='admin@yj777.cn'
ADMIN_PASS='hello'
DBNAME=wp_test8
DBUSER=wp_test8
DBPASS=hello


WP="/usr/bin/wp --allow-root "
echo "1. 自动下载/解压指定版本的 WordPress ..."
WP_DL="https://wordpress.org/latest.zip"
wget $WP_DL
[ -d $WP_FOLDER ] && echo "文件夹已经存在!请尝试运行 rm -rf $WP_FOLDER " && exit 1
mysql "$DBNAME" -e "exit" 2>/dev/null
[ $? == 0 ] && echo "数据库已经存在!请尝试运行 mysql -e \"drop database $DBNAME\"" && exit 1
unzip -q `basename $WP_DL`
[ $? == 0 ] && [ -d "wordpress" ] && mv wordpress $WP_FOLDER
[ ! -d $WP_FOLDER ] && echo "文件解压失败!" && exit 2


echo "2. 创建数据库 ..."
mysql -e "create database $DBNAME; grant all on $DBNAME.* to $DBUSER@localhost identified by '"$DBPASS"';flush privileges;"
[ $? != 0 ] && echo "创建数据库 $DBNAME 失败! " && rm -rf $WP_FOLDER && exit 3


echo "3. 创建配置文件 ..."
cd $WP_FOLDER
$WP core config --dbname=$DBNAME --dbuser=$DBUSER --dbpass=$DBPASS
[ $? != 0 ] && echo "创建配置文件失败!" && exit 4


echo "4. 创建实例 ..."
$WP core install --url=$WP_URL --title=$WP_TITLE --admin_user="$WP_ADMIN" --admin_email="$ADMIN_EMAIL" --admin_password="$ADMIN_PASS"
[ $? != 0 ] && echo "创建 WordPress 实例 $WP_TITLE 失败!" && exit 5


echo "5. 检查 站点 $WP_URL 的可用性 ..."
TMP=/var/tmp/wp_test.out
wget -o $TMP $WP_URL
[ -z $TMP ] && echo "实例创建有问题,请检查 $WP_URL!" && rm $TMP && exit 6
rm $TMP


echo "6. 复制 Theme 以及 Plugin ..."

此处略过具体复制语句

echo "7. 激活 Theme/Plugin ..."
$WP theme activate twentyfifteen
$WP plugin activate hello
echo "8. 更新 Option ..."
# $WP option update siteurl=adbfabd
echo "结束: 请访问 $WP_URL 验证安装"

微信小程序支付总结

该文章纪录了我在开发小程序支付过程中的具体流程

1. 申请微信支付

小程序认证后进入微信支付申请小程序的微信支付

2.配置商户信息

申请微信支付成功后,登陆商户平台(pay.weixin.qq.com)进入账户中心,设置微信商户的API Key与下载证书

3.配置Https服务器

小程序的前端是使用微信提供的框架开发,但是后台依然是开发者自己的服务器。小程序发起的是 https 请求,意味着小程序开发者必须配置 https 服务器。

4.服务端准备

获取openID

我们需要在小程序的客户端js中获取当前用户的openid,通过调用wx.login方法可以得到用户的code,然后开发者服务器使用登录凭证 code 获取 openid。

获取prepay_id和支付签名验证paySign

下载微信支付sdk,配置微信小程序信息与商户信息,放置证书到对应目录。调用微信申请支付JSAPI的方式生成一串验证信息如下:

appId:"wx3*******6"//小程序id
nonceStr:"qdpys6rdizbnpj12ahwvkf568a6c1sr9" //随机字符串
package:"prepay_id=wx2017***********3" //wx的预支付交易单
paySign:"8A7DC1A560B3B6DB0C656AC382D3E6F1"//微信签名
signType:"MD5"//签名加密
timeStamp:"1481167418"//时间戳,自1970年以来的秒数

5.小程序端发起微信支付

这里直接调用wx.requestPayment方法:

wx.requestPayment({
‘timeStamp’: timeStamp,
‘nonceStr’: nonceStr,
‘package’: package,
‘signType’: ‘MD5’,
‘paySign’: paySign,
‘success’: function (res) {
console.log(‘success’);
console.log(res);
}
});

OK,微信小程序支付完成。