twill 安装记录

Publish: May 9, 2020 Category: WEB,小玩具 No Comments

要找一个laravel的cms,看这个start数量和文档写的都还不错,现在本地搭建环境。

先看下环境版本要求:

支持版本 推荐版本
PHP >= 7.1 7.4
Laravel >= 5.6 7
npm >= 5.7 6.13
MySQL >= 5.7 5.7
PostgreSQL >= 9.3 10

首先安装laravel

composer create-project --prefer-dist laravel/laravel baogaoban.com "6.*"

如果国内的composer比较慢,推荐使用阿里的镜像

全局设置
#设置全局composer镜像配置
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
#取消配置
composer config -g --unset repos.packagist

项目设置
#设置项目composer镜像配置
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
#取消配置
composer config --unset repos.packagist

安装twill composer包

cd baogaoban.com
composer require area17/twill:"^2.0"

安装twill

php artisan twill:install

注意:
该命令会执行数据库迁移,务必保证 .env配置文件中关于数据库的配置能正确的连接到数据库。
该命令主要有一下操作:

  1. 在 routes 目录创建一个 admin.php 文件。
  2. twill数据库迁移
  3. 发布 twill的配置文件到 config 目录
  4. 发布twill的资源文件到 admin console 界面
  5. 创建一个超级用户 (这里的邮箱和密码要记住,后面登录时候会用到)


阅读剩余部分...

Windows下Wamware在 Linux 客户机中自动装载共享文件夹

Publish: January 16, 2020 Category: 小玩具,运维 No Comments

图形界面中按下面操作:

1、使用VMware启动虚拟机,选择:菜单Player->Manage->install VMware Tools,因为我已经安装过了,所以菜单变为灰色(如果没有安装VMware Tools,请参考上面的安装链接):

2、选择:Virtual Machine Settings->Share Folders,将Disabled改为Always enabled:
我这里共享了两个目录分别如下

workspace_share
box_share

下面的脚本中会用到,下面说下挂载问题。

启用共享文件夹后,除默认位置 /mnt/hgfs 外,您还可以将共享文件夹中的一个或多个目录/子目录装载到文件系统中的任意位置。

使用 mount 命令可将所有共享、某一个共享或共享中的某个子目录装载到文件系统的任意位置。

查看共享目录

vmware-hgfsclient

装载命令语法

命令    说明
mount -t vmhgfs .host:/ /home/user1/shares    将所有共享装载到 /home/user1/shares
mount -t vmhgfs .host:/foo /tmp/foo    将名为 foo 的共享装载到 /tmp/foo
mount -t vmhgfs .host:/foo/bar /var/lib/bar    将共享 foo 中的子目录 bar 装载到 /var/lib/bar

除标准 mount 语法外,您可以使用 VMware 的特定选项。要获得“主机-客户机”文件系统选项的用法信息,请键入命令

/sbin/mount.vmhgfs -h。

安装 VMware Tools 时会向 etc/fstab 添加一个条目,用于指定共享文件夹的位置。您可以编辑该文件以更改或添加条目。例如,要在启动时自动装载,可编辑 /etc/fstab 并添加以下行:

.host:/ /mnt/hgfs vmhgfs defaults 0 0

VMware Tools 服务脚本会加载执行装载操作的驱动程序。如果装载失败,将显示一条关于装载 HGFS 共享的消息。

下面是我写init脚本实现开机自动挂载

/etc/init.d/mount-shared-path

#!/bin/bash


### BEGIN INIT INFO
# Provides:          evenvi.com
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

vmhgfs-fuse .host:/workspace_share /root/workspace_share
vmhgfs-fuse .host:/box_share /root/box_share
echo 'hello, world' >> /tmp/boot.log

ibeacon协议简单分析

Publish: November 7, 2016 Category: 小玩具 No Comments

什么是Bluetooth LE,简写BLE

Bluetooth Low Energy(BLE)是2010年发布的蓝牙4.0技术规范的一部分。它起源于2006年Nokia的Wibree技术,但最终被整合进了蓝牙。这是一组与传统蓝牙不同的协议,并且使用的设备上也不会向后兼容。因此,现在市面上你可以看到三种类型的设备:

  1. Bluetooth设备:只支持传统蓝牙的设备。
  2. Bluetooth Smart Ready设备:同时支持传统蓝牙和LE模式的设备。
  3. Bluetooth Smart设备:只支持LE模式的设备。

最新的手机(iPhone 4s+, SG3+)、笔记本、平板电脑等,基本上都已经支持蓝牙4.0,也就是Bluetooth Smart Ready设备。Beacon,从另一方面来说,这种设备只支持low energy protocols(LE低功耗协议),属于上面说所的“Bluetooth Smart”设备,这也是它们靠一颗纽扣电池就能运行很长时间的原因。老式设备,比如外设、汽车系统、旧手机等通常只支持传统蓝牙协议。

BLE最重要的特点当然在于它的低能耗。举个例子,一些beacon设备靠一颗微型电池就能够持续发送一个信号两年左右(这种电池一般是不可拆卸的,你可能需要在beacon停止工作之后替换一个新的beacon)。传统蓝牙和LE蓝牙使用的都是相同的波段(2.4GHz-2.4835GHz)。BLE协议的传输速率比较低,因此除了用于发现设备和做一些简单通信之外,不太适合用于传输大量的数据流。在协议条款上,LE和传统蓝牙的信号都能够覆盖到100米的范围。

阅读剩余部分...

MQTT协议分析

Publish: November 3, 2016 Category: 小玩具,编程 2 Comments

比较全面的MQTT协议分析文档

目录

使用研究

协议分析

连接和心跳

发布流程

消息流

订阅流程

使用研究:

服务端:http://mosquitto.org/download/<;;/span>

编译安装:http://blog.csdn.net/xukai871105/article/details/39252653<;;/span>

配置说明

http://cswei.blog.51cto.com/3443978/1225617<;;/span>

PHP实现

https://github.com/mgdm/Mosquitto-PHP<;;/span>

LUA实现

https://github.com/flukso/lua-mosquitto<;;/span>

译文

http://my.oschina.net/scholer/blog/296402<;;/span>

PHP环境相关

http://www.hivemq.com/blog/mqtt-client-library-encyclopedia-mosquitto-php<;;/span>

http://wingsquare.com/blog/developing-php-client-for-mqtt-using-mosquitto-php-library/<;;/span>

mqtt 遇到的错误收集:

Error: Invalid user 'mosquitto' 没有mosquitto的用户

两种解决办法:

(1)修改配置文件:mosquitto.conf ,增加登录的用户,例如当前登录用户为root

60444674196.jpeg

(1)执行命令增加当前用户:

adduser mosquitto

如下图:

75166231759.jpeg

•PINGREQ/PINGRESP 心跳

功能测试:

1) Connect

2) Disconnect

3) Subscribe

4) UnSubscribe

5) Publish QOS0,QOS1, QOS2

6) Retain 【为新来的订阅者推送那些已经存在的持久化消息】

7) Will 特性【发布遗愿】

协议分析:

先说一下整个协议的构造,整体上协议可拆分为:

固定头部+可变头部+消息体

固定头部

002110437924.png

协议头占两个字节

BYTE1

【RETAIN】0 : 保持;针对PUBLISH消息。

1 表示发送的消息一直持久保存,不受服务端重启影响,不但要发送给当前订阅者,并且以后新来的订阅者订阅了此topic name的订阅者会马上得到推送,新订阅者只会接受一次flag为1的消息。

0 仅为当前订阅者推送此消息,假如收到一个空消息体(zero_length_payload)RETAIN=1,已存在topic name的publish消息,服务器可以删除对应已被持久化的PUBLISH消息。

【Qos level】1、2 : Quality of Service服务质量,使用两个二进制表示的publish类型消息

QoS value

bit 2

bit 1

Description

0

0

0

至多一次

发完即丢弃

<=1

1

0

1

至少一次

需要确认回复

=1

2

1

0

只有一次

需要确认回复

=1

3

1

1

待用,保留位置

【DUP flag】3 打开标志

保证消息可靠传输,默认为0,只占用一个字节,表示第一次发送。不能用于检测消息重发送等。只适用于客户端或者服务端尝试重发PUBLISH、PUBREL、SUBCRIBE或UNSUBSCRIBE消息注意需要满足以下条件:当QOS>0 消息需要回复确认 此时,在可变头部需要包含消息ID。当值为1时,表示当前消息先前已经被传送过。

【Message Type】4、5、6、7 消息类型x

Mnemonic

Enumeration

Description

Reserved

0

Reserved //保留待用

CONNECT

1

Client request to connect to Server //客户端请求连接到服务端

CONNACK

2

Connect Acknowledgment //请求应答,请求连接确认

PUBLISH

3

Publish message //发布消息

PUBACK

4

Publish Acknowledgment //发布应答,发布确认

PUBREC

5

Publish Received (assured delivery part 1) //发布已接收,保证传递1

PUBREL

6

Publish Release (assured delivery part 2) //发布释放,保证传递2

PUBCOMP

7

Publish Complete (assured delivery part 3) //发布完成,保证传递3

SUBSCRIBE

8

Client Subscribe request //客户端订阅请求

SUBACK

9

Subscribe Acknowledgment //订阅应答,订阅请求

UNSUBSCRIBE

10

Client Unsubscribe request //客户端取消订阅请求

UNSUBACK

11

Unsubscribe Acknowledgment //取消订阅应答,取消订阅确认

PINGREQ

12

PING Request //ping请求

PINGRESP

13

PING Response //ping响应

DISCONNECT

14

Client is Disconnecting //客户端断开连接

Reserved

15

Reserved //保留待用

BYTE2

是用来保存接下去的变长头部+消息体的总大小的。

但是不是并不是直接保存的,同样也是可以扩展的,其机制是,前7位用于保存长度,后一部用做标识。举个例了,即如果计算出后面的大小为0的,正常保存,如果是127的,则需要二个字节保存了,将第一个字节的最大的一位置1,表示未完。然后第二个字节继续存。拿130来说,第一个字节存10000011,第二个字节存000000001,也就是0x83,0x01,把两个字节连起来看,第二个字节权重从2的8次开始。同起可以加第3个字节,最多可以加至第4个字节。故MQTT协议最多可以实现268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)将近256M的数据。可谓能伸能缩。

单个字节最大值,01111111=>0x7f=>127

时MQTT协议最多允许4个字节表示剩余长度。那么最大长度为:0xFF,0xFF,0xFF,0x7F,二进制表示为:11111111,11111111,11111111,01111111,十进制:268435455 byte=261120KB=256MB=0.25GB 四个字节之间值的范围:

Digits

From

To

1

0 (0x00)

127 (0x7F)

2

128 (0x80, 0x01)

16 383 (0xFF, 0x7F)

3

16 384 (0x80, 0x80, 0x01)

2 097 151 (0xFF, 0xFF, 0x7F)

4

2 097 152 (0x80, 0x80, 0x80, 0x01)

268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)

可变头部

固定头部仅定义了消息类型和一些标志位,一些消息的元数据,需要放入可变头部中。可变头部内容字节长度 + Playload/负荷字节长度 = 剩余长度,这个是需要牢记的。可变头部,包含了协议名称,版本号,连接标志,用户授权,心跳时间等内容,这部分和后面要讲到的CONNECT消息类型,有重复,暂时略过。

218212825500.png

这个是可变头部的全貌。

1、首先最上面的8个字节是Protocol Name(编码名),UTF编码的字符“MQIsdp”,头两个是编码名提长为6。

这里多说一些,接下去的协议多采用这种方式组合,即头两个字节表示下一部分的长,然后后面跟上内容。这里头两个字节长为6,下面跟6个字符“MQIsdp”。

2、Protocol Version,协议版本号,v3 也是固定的。

3、Connect Flag,连接标识,有点像固定头部的。8位分别代表不同的标志。第1个字节保留。

Clean Session,Will flag,Will Qos, Will Retain都是相对于CONNECT消息来说的。

Clean Session:0表示如果订阅的客户机断线了,那么要保存其要推送的消息,如果其重新连接时,则将这些消息推送。

1表示消除,表示客户机是第一次连接,消息所以以前的连接信息。

Will Flag,表示如果客户机在不是在发送DISCONNECT消息中断,比如IO错误等,将些置为1,要求重传。并且下且的WillQos和WillRetain也要设置,消息体中的Topic和MessageID也要设置,就是表示发生了错误,要重传。

Will Qos,在CONNECT非正常情况下设置,一般如果标识了WillFlag,那么这个位置也要标识。

Will RETAIN:同样在CONNECT中,如果标识了WillFlag,那么些位也一定要标识

usename flag和passwordflag,用来标识是否在消息体中传递用户和密码,只有标识了,消息体中的用户名和密码才用效,只标记密码而不标记用户名是不合法的。

4、Keep Alive,表示响应时间,如果这个时间内,连接或发送操作未完成,则断开tcp连接,表示离线。

5、Connect Return Code即通常于CONNACK消息中,表示返回的连接情况,我可以通过此检验连接情况。

bVyoew.png

6、Topic Name,订阅消息标识,MQTT是基于订阅/发布的消息,那么这个就是消息订阅的标识,像新闻客户端里的订阅不同的栏目一样。用于区别消息的推送类别。

主要用于PUBLISH和SUBSCRIBE中。最大可支持32767个字符,即4个字节。

消息体(Playload/消息体/负荷)

消息体主要是为配合固定/可变头部命令(比如CONNECT可变头部User name标记若为1则需要在消息体中附加用户名称字符串)而存在。

CONNECT/SUBSCRIBE/SUBACK/PUBLISH等消息有消息体。PUBLISH的消息体以二进制形式对待。

请记住,MQTT协议只允许在PUBLISH类型消息体中使用自定义特性,在固定/可变头部想加入自定义私有特性,就免了吧。这也是为了协议免于流于形式,变得很分裂也为了兼顾现有客户端等。比如支持压缩等,那就可以在Playload中定义数据支持,在应用中进行读取处理。

这部分会在后面详细论述。

消息标识符/消息ID

固定头中的QoS level标志值为1或2时才会在:PUBLISH,PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE,UNSUBACK等消息的可变头中出现。

一个16位无符号位的short类型值(值不能为 0,0做保留作为无效的消息ID),仅仅要求在一个特定方向(服务器发往客户端为一个方向,客户端发送到服务器端为另一个方向)的通信消息中必须唯一。比如客户端发往服务器,有可能存在服务器发往客户端会同时存在重复,但不碍事。

可变头部中,需要两个字节的顺序是MSB(Most Significant Bit) LSB(Last/Least Significant Bit),翻译成中文就是,最高有效位,最低有效位。最高有效位在最低有效位左边/上面,表示这是一个大端字节/网络字节序,符合人的阅读习惯,高位在最左边。

bit

7

6

5

4

3

2

1

0

Message Identifier MSB

Message Identifier LSB

但凡如此表示的,都可以视为一个16位无符号short类型整数,两个字节表示。在JAVA中处理比较简单:

DataInputStream.readUnsignedShort

或者

in.read() * 0xFF + in.read();

最大长度可为: 65535

基于workmen的客户端实现:

MQTT协议--连接和心跳

截图.png

可变头部

协议名称和协议版本都是固定的。

连接标志(Connect Flags)

一个字节表示,除了第1位是保留未使用,其它7位都具有不同含义。

业务上很重要,对消息总体流程影响很大,需要牢记。

Clean Session

0