设计思路:利用MQTT协议 实现底层硬件和web实时双向通讯。
mosquito:http://mosquitto.org/files/source/
libwebsockets:https://gitee.com/woniu201/libwebsockets
安装步骤:
1.下载并编译liewevsocket
$ tar zxvf libwebsockets-1.4-chrome43-firefox-36.tar.gz
$ cd libwebsockets-1.4-chrome43-firefox-36
$ mkdir build
$ cd build
$ cmake ..(PS:apt-get install cmake 安装cmake工具)
$ make install
$ ldconfig
2.编译安装mosquito
$ wget http://mosquitto.org/files/source/mosquitto-1.4.2.tar.gz
$ tar zxvf mosquitto-1.4.2.tar.gz
$ cd mosquitto-1.4.2
更改configure.mk中
WITH_WEBSOCKETS:=no
变成(这一步是做WebSocket支持)
WITH_WEBSOCKETS:=yes
$ make
$ make install
$ cp mosquitto.conf /etc/mosquitto
编译过程可能遇到一些错误,
解决编译过程中找不到ares.h的问题:HTTP://www.cnblogs.com/xiaoerhei/p/3777157.html
mosquitoo 默认的端口是1883 websockets默认是9001
请在/etc/mosquitto/mosquitto.conf 的“Default Listener” 一节添加如下几行:
port 1883
listener 9001
protocol websockets
但是在阿里云ECS主机后台需要配置开放端口,9001端口无法开启,配置为1884.
3.添加用户且重新启动进程
$ adduser mosquitto
$ reboot
//重新启动进程
$ mosquitto -c /etc/mosquitto/mosquitto.conf -d
查看所有端口是否已经打开 netstat -anp
测试可以正常访问的!
由于多个项目需求(关于云服务器云支付等方式触发远程设备响应),之前使用过HTTPSQL轮询法,希望通过此种方法实现底层和云服务器数据交互,且大量占用服务器,只需要保持TCP连接。服务器始终保留其线程;
使用工具 HTOP 进程管理工具。(支持鼠标操作)
关于 HTOP使用方法: 百度
思路:通过linux网络编程,实现服务器和客户端一直保持连接,且服务器保留客户端唯一ID 和动态的socketfd
{中转服务器有一个map表,客户名+socket}
如果下位机有主动事件,则通过TCP协议将数据发送给终端处理 或者通过HTTP协议将数据提交到web服务器来处理
若服务器有主动事件,只可以通过TCP协议将指定数据发送到指定的ID中 (通过socketfd)(难点:ID和socketfd需要对应且动态变化(重启或者意外事件))
可以通过一个内存缓存区来存放 ID和socketfd; (如果利用内存缓冲区存放,若web服务器无法获得socket)
通过数据库存放;
使用linux C访问数据库 需要安装一个特定的包
sudo apt-get install libmysqlclient15-dev
最近项目上面需要用到刷卡系统,继而研究了一下对IC 相关的资料进行学习
项目平台 Windows 10
刷卡器 ZLG600A-T2 V1.03
上位机 QT4.8和zlg调试工具
IC卡 S50普通白卡
普通S50 IC卡存储结构:
MF1 卡分为 16 个扇区,每区有 4 块(块 0~块 3),共 64 块,按块号编址为 0~63。第 0 扇区的块 0(即
绝对地址块 0)用于存放芯片商,卡商相关代码,已经固化不可更改。其他各扇区的块 0,块 1,块 2 为数
据块,用于存贮用户数据;块 3 为各扇区控制块,用于存放密码 A,存取控制条件设置,密码 B。各区控
制块结构相同,具体如下图所示:
如果需要对其IC进行读写就需要验证秘钥AB,验证完成后可以对数据块(0~63块)进行任意读写
每个块拥有 16个字节空间,16x64=1024Bytes= 1K Bytes 即 容量为 8K 位 EEPROM;
注意:密码验证正确后,直接往第三区写数据就可以了,可以修改整个扇区的秘钥A,控制位,秘钥B,
注意控制位,因为控制位代表了新密码的权限及对数据位的控制,如果写入进去后就会把卡锁死了!
控制位 FF 07 80 69
参考文档 http://pan.baidu.com/s/1o85Id1C
SUPER TAB 工具
从http://www.vim.org/scripts/script.php?script_id=1643下载安装版。这个安装包跟先前的几个Vim插件不同,它是一个vba文件,即Vimball格式的安装包,这种格式安装包提供傻瓜式的安装插件的方法。
1)用Vim打开.vba安装包文件。
2)在Vim命令行下运行命令“UseVimball ~/.vim”。此命令将安装包解压缩到~/.vim目录。VImball安装方式的便利之处在于你可以在任何目录打开.vba包安装,而不用切换到安装目的地目录。而且不用运行helptags命令安装帮助文档。
3)在~/.vimrc文件中加入以下这行:
let g:SuperTabDefaultCompletionType="context"
CTAGS
http://www.cnblogs.com/willsonli/p/6555179.html
实验材料: 1.ESP 8266模块
2 有公网IPv4的web服务器(当然也可以通过域名访问,这里先测试通过IP地址建立TCP连接)
实验原理:
原理很简单,通过串口向ESP8266发送一系列指令,由于8266内置了TCP协议栈,我们只需要通过指令建立TCP连接,当连接建立完成后,直接发送GET/POST请求,接受到web服务器传输过来的数据链接,通过这些交互数据分析,从而实现开发板和web服务器之间的数据互换。
步骤:
1. 配置ESP为站点模式,连接到可以正常访问英特网的热点上面。
2. 配置模块为透传模式
3.建立TCP连接 IP 端口号等
4直接发送 请求查看串口返回的参数值 GET /index.html HTTP/1.1 (TCP请求可以加密)
注意事项
测试的时候 发送指令总是回复400 错误,经过查找发现由于协议中回车换行为加上引起无法提交POST请求
POST /1.php HTTP/1.1\r\nHost: 192.168.0.107\r\nConnection: keep-alive\r\nContent-Length: 34\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nfirstname=hello&lastname=123&age=123\r\n
<html>
<body>
<form action="" method="post">
Firstname: <input type="text" name="firstname" />
Lastname: <input type="text" name="lastname" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>
<?php
$con = mysql_connect("localhost","root","root");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("test", $con);
$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "1 record added";
mysql_close($con)
?>
由于是网络配置器 所以发送的数据很正常,但是通过wifi串口发送的时候 /r/n会由于ascii编码 而不是回车 继而串口发送总是失败,我利用ASCII码转HEX工具将 所有发送文件转为十六进制
然后通过十六进制 进行串口数据发送
至此通过串口芯片发送POST请求到指定云服务,实例完成。以下提供所用到的软件
软件压缩包来源:百度网盘 | 大小:MB | 提取密码: | 解压密码:www.rainfly.cn
已经过安全软件检测无毒,请您放心下载。 若链接失效可联系管理员!
使用STM32F107VC芯片配置工程的时候,出现一些报错,继而写此文档。
建立三个文件夹
文件夹CORE内包含
FW 是官方提供固件库
USER 是编译的主文件,和一些重要文件
建立keil 5工程
添加两个宏和头文件
运行后基本上没有错误和警告了,
注意事项:
1. .s启动文件选择
2.宏定义的选择
选择的文件是 startup_stm32f10x_cl.s 和 STM32F10X_CL
基于对STM32F103的手册可以看出来,具备两路IIC总线端口,其实我们不使用系统提供的IIC硬件,通过做成普通IO口来模拟ICC总线,完成对IIC总线的了解和学习。
首先是对IIC总线的工作原理进行了解:
IIC系统由一条串行数据线SDA和一条串行时钟线SCL组成。主机按一定的通信协议向从机寻址和进行信息 传输。在数据传输时,由主机初始化一次数据传输,主机使数据在SDA线上传输的同时还通过SCL线传输时钟。信息传输的对象和方向以及信息传输的开始和终 止均由主机决定。
每个器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD驱动器)或者可以接收也可以发送的器件(例如:存储器)。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。
//初始化IIC
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; 配置IIC引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
}
通过对PB10 PB11配置IO来做成对其初始化要求。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
//启动IIC
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA=1; //将SDA和SCL都拉置高电平,然后进行一定的延时
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4); //SDA产生由高电平向低电平的跳变的时候,从而产生一个启动信号
IIC_SCL=0; //锁住IIC总线
}
//终止信号
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1; //发送iic终止信号
delay_us(4); //延时产生一个控制信号
}
开篇:
已经很久未更新相关内容,由于工作原因,开始学习STM32,会将学习和工作遇到的任何问题和进展,都写下来,如果需要的伙伴可以加上书签在下面留言给我,共同探讨进步。
学习平台: 芯片:STM32F10x 库函数版本:V3.5.0 开发板:百为
由于需要马上上手,继而对于底层寄存器操作认识先行搁置,只要是已开发为主,所以采用官方提供的API接口 通过这些接口来实现对STM3210X的软件编写,
官方提供的固件库 :http://pan.baidu.com/s/1bp6bgcf
GPIO的函数和变量
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. //0-15对应的管脚号
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. //io口传输频率
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. 选择输入或输出且是否其他功能
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */
typedef enum
{
GPIO_Speed_10MHz = 1, //选择传输MHz
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
typedef enum
{ GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;
GPIO_Init(GPIOB, &GPIO_InitStructure); //设置GPIOB为初始化的IO引脚,且将GPIO_IniStructure对应刚才设置的结构体
指针所包含的 PIN SPEED MODE)初始化
GPIO_SetBits(GPIOB,GPIO_Pin_5);//置1
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //清0
还有很多复用功能,继续添加
由于笔者毕业设计用到串级控制系统,所以稍加研究了一下。
串级控制系统的基本原理
采用不止一个控制器,而且控制器间相串接,一个控制器的输出作为另‘—个控制器的设定值的系统,称为串级控制系统。串级控制系统是按其结构命名的。
例如,铝炉锅筒液位是一个重要的工艺参数。液位过低,影响产汽量,且易烧干而发生事故;液位过高,影响蒸汽质量,因此对锅筒液位府严加控制。锅简液位有多种控制方案:
(1)图5—1a所示是结水流量定值控制。该控制方案保持给水流量为定值,对于克服给水流员或压力的波动有效,但由于锅简液位是开环,因此,锅筒液位不能保持恒定。
(2)图5—1b所示是锅筒液位定值控制。该控制方案选择锅简液位作为被控变量,选择给水流量作为操纵变量。由于被控过程的滞后大,时间常数大,因此,锅筒液位控制系统的控制品质不佳。尤其当给水流量和压力波动时影响更大。
(3)锅简液位为主被控变量,给水流量为副被控变量,给水流量为操纵变量组成串级控制,如图5—1c所示。该控制方案以锅筒液位作为主被控变量,抓住了生产过程的主要矛盾;通过副被控变量组成的副回路.能够及时克服给水流量或压力的波动,大大削弱了它们
的波动对锅筒液他的影响。该控制系统投运后,取得了良好的控制效果。
图5—1中,IJ、叮分别为液位、给水流量变送器,Lc、rc分别为液位
图5。2中,主被控变量yI是串级控制系统中要保持平稳控制的主要被控变量。例如,
示例中的锅筒液位。副被控变量72是串级控制系统的辅助被控变量。例如,示例中的给水流量。通常,控制系统中的主要扰动影响首先在副被控变量反映。氏(z)和氏(‘)分别是主、副控制器的传递函数。主控制器的输出作为副控制器的设定值,组成串联连接的结构。
因此,主控制器输出QI等于副控制器的设定L o由于主控制器的输出随偏差e J而变化.即副控制器是在外部设定情况下工作,此时是随动控制。主控制器在内部设定情况下工作,因此是定值控制。示例中的液位控制器是主控制器,给水流量控制器是副控制器。rI和r2是主、副控制器的设定。G p、(‘)和G4(‘)分别是主、副被控对象传递函数。GmI(‘)和612d(‘)分别是主、副被控变量的检测变送环节传递函数。7“和yd分别是主、副被控变量的测量值。风和F2分别是进入主、副被控对象的扰动。扰动通道传递函数分别为cf2(s)和GR(‘)。把由G6(‘)、G,(‘)、c4(‘)和Gd(s)组成的控制回路称为副(控制)回路,或副环。把由氏
(s)和副回路、汽(s)和G,。l(‘)组成的控制回路称为主(控制)回路,或主环。控制系统的调节过程如下:当给水压力或流量波动时,锅筒液位还没有变化,因此,主控制器输出不变,给水流量控制器因扰动的影响,使给水流量测量值变化,按定值控制系统
的调节过程,副控制器改变控制阀开度,使给水流量稳定。与此同时,给水流量的变化也影响锅筒液位,使主控制器输出.即副控制器的设定变化,副控制器的设定和测旦的同时变化,进一步加速了控制系统克服扰动的调节过程,使主被控变量锅筒液位回复到设定值。当锅简液位和给水流量同时变化时.主控制器通过主环及时调节副控制器的设定,使给水流量变化保持锅筒液位恒定,而副控制器一方面接收主控制器的输出信号,同时、根据给水流量测量值的变化进行调节,使给水流量跟踪设定值变化,使给水流量能根据锅筒液伦及时调整,最终使锚筒液位迅速回复到设定值。
串级控制系统中有关的传递函数如下:
串级控制系统是由两个或两个以上的控制器串联连接,一个控制器输出是另一个控制器
设定。主控制回路是定值控制系统。对主控制器的输出而言,副控制回路是随动控制系统,
对进入副问路的扰动而言,副控制回路是定值控制系统。
国内域名注册商阿里云发布通知称,将对所有域名全面展开域名实名认证工作,如果在5月份还未完成域名实名认证工作,将强制暂停解析域名,使域名无法正常访问,待实名认证通过后方可恢复正常使用。
自2016年8月开始,阿里云所有新注册的网站域名都需要实名认证,完成域名所有者实名认证后才能正常使用,否则域名就会被注册局锁定。此次则涉及到老域名的实名认证,所有2016年前注册或转入的老域名也被要求实名认证。
通知原文如下:
尊敬的用户,您好!
根据《中国互联网络域名管理办法》的规定,域名注册申请者应提交真实、准确、完整的域名注册信息。
按照工信部2017年全面域名实名认证的要求,目前阿里云已接到相关注册局通知,若您的域名在规定时间内未通过实名审核,注册局将暂停解析(Serverhold),无法正常访问。待实名认证通过后方可恢复正常使用。涉及的域名包括:.com/.net /.top/.xyz/.vip /.club/.shop/.wang/.ren:
a)截止2017年5月15日,未完成实名认证的.top/.xyz/.vip/.club/.shop/.wang/.ren域名将被注册局暂停解析;
b)截止2017年5月31日,未完成实名认证的.com/.net域名将被注册局暂停解析。
请您务必按以下要求,尽快完成以上后缀域名的实名认证,以避免由于未通过实名审核而影响您网站/邮箱或网络应用的正常使用。具体如下:
1、如果您的域名属于上述域名后缀,且目前尚未完成实名认证的,请尽快提交资料完成实名认证审核。
实名认证提交的资料包括:
① 居民身份证扫描件(个人)
②公司营业执照或组织机构代码证扫描件(企业)
2、如果您的域名属于上述域名后缀,目前显示为“已实名认证”,但属于相关注册局实名认证开始时间(详见下表)之前注册的存量历史域名,请注意相关注册局将对其实名认证资料进行核验(二次复审)。
复审结果将于2017年4月1日左右更新,若复审不通过,则需要您重新提交资料进行实名认证。
请您届时留意阿里云系统通知,登录查看复审后域名的实名认证状态,并按提示操作。
3、为了配合尽快完成实名认证审核工作, 自2017年4月30日起,如果您的域名属于上述域名后缀,仍未提交实名认证或审核失败的域名,其管理功能将受到限制,届时您将不能进行新增&修改解析、DNS修改及其他相关等操作。通过实名认证后,上述限制解除。
该环境安装非常简单,这里简单记录下linux(centos环境下)的源码安装,做个记录。
平台:centos 6
环境:python 2.6
环境安装包地址:http://nodejs.cn/download/ 可以这里下载源码编译。
安装步骤:
1,安装编译代码的开发工具
yum -y groupinstall "Development Tools"
2,下载安装包。
到node官网下载,这里下载源码编译最新安装包:https://nodejs.org/dist/v6.2.0/node-v6.2.0.tar.gz
进入/usr/local/src
wget https://nodejs.org/dist/v6.2.0/node-v6.2.0.tar.gz
tar zxvf node-v6.2.0.tar.gz
cd node-v6.2.0
./configure
make
make install
3,安装模块express和forever。
现在已经安装了Node.js, 准备部署应用程序, 首先要使用Node.js的模块管理器npm安装Express middleware 和forever:
npm -g install express forever
4,建立超级链接。
ln -s /usr/local/bin/node /usr/bin/node
ln -s /usr/local/lib/node /usr/lib/node
ln -s /usr/local/bin/npm /usr/bin/npm
ln -s /usr/local/bin/node-waf /usr/bin/node-waf
ln -s /usr/local/bin/forever /usr/bin/forever
运行node -v可以看到版本说明没问题。
5,部署应用程序。
比如:
forever start app.js &
这样扔到后台运行,端口默认1337.
查看运行当中的应用:
forever list
退出应用:
forever stop 0