OPC

OPC是什么?
http://opcfoundation.cn/about/what-is-opc/index.aspx
http://blog.csdn.net/u013120247/article/details/50163147

HowToStartWithUtgard
https://openscada.atlassian.net/wiki/display/OP/HowToStartWithUtgard

控制系统经常用到的是DCS和PLC
目前常用的无线网络标准最流行的3个是ZigBee、Bluetooth和WiFi。

OPC client examples include utgard and jeasyopc
https://github.com/luoyan35714/OPC_Client

也可以不使用AccessBase方式,使用for循环轮询查看item的数值。
http://tonynju.iteye.com/blog/289929

模拟器
http://www.matrikonopc.cn/products/opc-drivers/opc-simulation-server.aspx
http://www.hifreud.com/2014/12/27/opc-1-install-MatrikonOPC-Server-for-Simulation-and-Test/
http://www.hifreud.com/2014/12/27/opc-2-what-is-opc/
http://www.hifreud.com/2014/12/27/opc-3-main-feature-in-opc/
http://www.hifreud.com/2014/12/27/opc-4-client-invoke-use-utgard/
http://www.hifreud.com/2014/12/27/opc-5-client-invode-use-JeasyOPC/

supervisor

Linux的后台进程运行有好几种方法,例如nohup,screen等,但是一个服务程序要可靠地在后台运行,就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。
Supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,能做开机启动,并监控进程状态,异常退出时能自动重启,它还提供了web管理界面。

安装supervisor
$ sudo apt-get install supervisor
卸载supervisor
$ sudo apt-get remove supervisor
安装完成后,查看其配置文件
$ vi /etc/supervisor/supervisord.conf
查看到自定义配置存放目录为 files=/etc/supervisor/conf.d/*.conf
$ cd /etc/supervisor/conf.d
创建要自启动的服务配置
$ sudo vi service1.conf

配置解释:

[program:service1] #服务名称,在supervisor中可以用这个名字来管理该程序。
command=  #启动程序的命令
directory=/home/user1 #相当于在该目录下执行程序
autostart=true #设置随supervisor的启动而启动
autorestart=true #程序停止之后是否需要重新将其启动
startsecs=10 #重新启动时,等待的时间
startretries=36 #重启程序的次数
redirect_stderr=true #是否将程序错误信息重定向的到文件
stdout_logfile=/home/user1/%(program_name)s_log.txt #将程序输出重定向到该文件
stderr_logfile=/home/user1/%(program_name)s_err.txt #将程序错误信息重定向到该文件
numprocs = 2
numprocs_start = 8850
user = #系统用户名
process_name = 163gs-%(process_num)s

配置好后重启supervisor服务

sudo service supervisor restart

supervisorctl 是命令行管理工具,它的查数查看

supervisorctl help
supervisorctl version
default commands (type help ):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update 
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

Supervisor2.x版本有一些不同:

配置文件位置 /etc/supervisord.conf
需要在supervisord.conf尾部按示例添加服务配置
服务名称是 supervisord
sudo service supervisord restart

更多配置参考
http://supervisord.org/configuration.html
http://www.jianshu.com/p/65f31f5a4e84
http://www.jianshu.com/p/805977544d7f
http://www.linuxidc.com/Linux/2015-04/116701.htm
http://www.cnblogs.com/haoliansheng/p/6611714.html
http://www.cnblogs.com/zhangym/p/5833353.html

错误处理

报错 unix:///tmp/supervisor.sock no such file
出现上述错误的原因是supervisord并未正常启动,重新启动supervisord即可。
supervisord -c /etc/supervisor/supervisord.conf

反向代理

正向代理

代理服务器代理的是客户端,客户端知道目的服务器,也知道代理服务器。客户端主动请求代理服务器帮助访问目的服务端。

反向代理

代理服务器代理的是服务端,客户端不知道目的服务器,只知道代理服务器。代理服务器向客户端隐藏了真实的服务端。

TCP服务器

可选的TCP服务器有Mina、Netty、Twisted等,它们都是异步、事件驱动(asynchronous、event-driven)的网络编程框架。
其中MINA和Netty是基于Java语言的,Twisted是Python语言的。语言不是重点,重点的是理念。

  • 传统的BIO(Blocking IO/阻塞IO)进行网络编程时,进行网络IO读写时都会阻塞当前线程,使用BIO实现一个TCP服务器,需要对每个客户端连接开启一个线程,很多线程可能会阻塞住等待读写数据,系统资源消耗大。
  • NIO(Non-Blocking IO/非阻塞IO)或AIO(Asynchronous IO/异步IO)通过IO多路复用技术实现,不需要为每个连接创建一个线程,其底层实现使用了操作系统的一些特性如select、pool、epoll、iocp等。

Mina、Netty、Twisted一起学(一):实现简单的TCP服务器
Netty 4.x 用户指南
Netty in Action 学习
一起学Netty
netty(一) java NIO

同步阻塞I/O

Java的两个IO方法 read和write都是同步阻塞的。
阻塞指的是read和write都会阻塞线程直到读取或发送完成或异常。
同步指的是发送方和接收方是同步的,缓慢的发送和网络传输会使接收长时间阻塞,缓慢的接收和网络传输和狭小的TCP缓冲区也会使发送长时间阻塞,所以发送和接收的速度互相影响。
输入流和输出流的读和写操作都是同步阻塞的,阻塞的时间取决于对方I/O线程的处理速度和网络I/O的传输速度。

Java NIO

JDK1.4引入了新的输入/输出(NIO)库。相比jdk1.3,NIO弥补了原来同步阻塞I/O的不足,提供了高速的、面向块的I/O。
一些NIO新增的类库和概念:
1.缓冲区Buffer
在面向流的I/O中,可以将数据直接写入或读到Stream对象中。
在NIO库中,数据读写都是要经过缓冲区。缓冲区实质上是一个数组,并且一个缓冲区不仅仅是一个数组,它还提供了对数据的结构化访问以及维护读写位置(limit)等信息。
最常用的缓冲区是ByteBuffer,一个ByteBuffer提供了一组功能用于操作byte数组。包括ByteBuffer,每一种java基本类型(除了Boolean类型)都对应一种缓冲区:
ByteBuffer:字节缓冲区
CharBuffer:字符缓冲区
ShortBuffer:短整型缓冲区
IntBuffer:整形缓冲区
LongBuffer:长整型缓冲区
FloadBuffer:浮点型缓冲区
DoubleBuffer:双精度浮点型缓冲区
2.通道Channel
通道与流的不同之处在于通道是双向的,可以用于读、写或者二者同时进行,流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类)。
因为Channnel是双全工的,所以它可以比流更好地映射底层操作系统的API。在UNIX网络编程模型中,底层操作系统的通道都是双全工的,同时支持读写操作。
实际上Channel可以分为两大类:用于网络读写的SelectbleChannel和用于文件操作的FileChannel。
与Socket类和ServerSocket类相对应,NIO提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现,它们都是SelectableChannel的子类,都支持阻塞和非阻塞两种模式。
3.多路复用器Selector
多路复用器提供选择已经就绪的任务的能力。Selector会不断地轮询注册在其上的Channel,如果某个Channel上面发生读写事件,这个Channel就处于了就绪状态,处于了就绪状态的Channel会被Selector轮询出来,然后通过SelectionKey可以读取就绪Channel集合,进行后续的I/O操作。
JDK在Linux等主流操作系统上通过epoll实现,所以它并没有最大连接句柄1024/2048的限制。这意味着只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端。
Reactor反应器模式:使用单线程模拟多线程,提高资源的利用率和程序的效率,增加系统吞吐量。
Selector类似一个观察者,我们把需要探知的socketchannel告诉Selector,当有事件发生时,Selector会通知我们并传回一组SelectionKey,我们读取这些Key,会获得注册过的socketchannel,然后从这个Channel中读取数据。即主程序不用主动阻塞的等待数据,而是被通知有数据就绪。
4.AIO
JDK1.7升级了NIO类库,升级后的NIO类库被成为NIO2.0,正式提供了异步文件I/O操作,同时提供了与UNIX网络编程事件驱动I/O对应的AIO。NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供以下两种方式获取操作结果。
(1)通过java.util.concurrent.Future类来表示异步操作的结果;
(2)在异步操作的时候传入一个java.nio.channels.CompletionHandler接口的实现类作为操作完成的回调。
NIO2.0的异步套接字通道是真正的异步非阻塞I/O,对应了UNIX网络编程中的事件驱动I/O(AIO),它不需要通过多路复用器(selector)对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO的编程模型。

Base 128 Varints

Google Protobuf3

Google Protobuf 官方文档之Language Guide (proto3)
http://blog.163.com/lnsjc321@126/blog/static/5348428720154325730234/
https://developers.google.com/protocol-buffers/docs/proto3

整合nginx+tomcat

部署tomcat

到http://tomcat.apache.org/下载tomcat,下载后解压到数据盘,执行bin/startup.sh来启动tomcat。注意设置startup.sh和catalina.sh的可执行权限。

./startup.sh
./shutdown.sh

shutdown后要等一会完全关闭后再重新启动

配置nginx

在conf/vhosts下新建一个.conf文件

server {
 listen 80;
 server_name xxx.cn www.xxx.cn;
 index index.html index.htm index.jsp;
 root /xxx/tomcat-7.0.69/webapps/ROOT;
 location ~ .*\.(jsp)?$
 {
 proxy_pass http://127.0.0.1:8080; #主要在这里,设置一个代理
 }
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
 expires 30d;
 }
 location ~ .*\.(js|css)?$
 {
 expires 1h;
 }
 #伪静态规则
 #include /xxx/nginx/conf/rewrite/default.conf;
 access_log /xxx/nginx/access/xxx.log;
 }

要赋予网站文件目录执行权限 简单的可以 chomd 777 -R www目录,否则可能出现页面不正常,在浏览器开发者工具中发现找不到静态资源。但随着前后端分离,jsp已较少使用,tomcat后台只需要提供api,所以基本不需要把访问tomcat整合到nginx中了。

遇到了tomcat异常挂掉的问题

有权限问题
java.util.logging.ErrorManager: 4
java.io.FileNotFoundException: /usr/local/tomcat/logs/catalina.2017-06-11.log (Permission denied)
有内存不够的问题
[root@VM_5_53_centos logs]# service tomcat restart
Stoping Tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_92
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000eb550000, 178978816, 0) failed; error=’Cannot allocate memory’ (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 178978816 bytes for committing reserved memory.
# An error report file with more information is saved as:
# //hs_err_pid14383.log
waiting for processes to exit

mac中编译安装nginx

下载 http://nginx.org/download/nginx-1.10.2.tar.gz
解压进入目录 ./configure –with-http_auth_request_module
make
sudo make install

手动启动nginx:
sudo /usr/local/nginx/sbin/nginx

ubuntu 中编译安装nginx

下载目录 http://nginx.org/download/
wget http://nginx.org/download/nginx-1.12.0.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
unzip
apt-get update
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
cd nginx-1.9.15
./configure –with-http_ssl_module –with-http_auth_request_module –add-module=../nginx-rtmp-module-master —prefix=/etc/nginx
make
sudo make install
http://blog.csdn.net/longji/article/details/54865358
如果自启动失败,则去修改vi /etc/init.d/nginx,修改其中的路径。

#如果Nginx服务已存在则可以不要make install,否则就是覆盖安装
替换nginx二进制文件:
cp /app/nginx/sbin/nginx /app/nginx/sbin/nginx.bak
cp ./objs/nginx /app/nginx/sbin/

安装后目录介绍
nginx path prefix: “/etc/nginx”
nginx binary file: “/etc/nginx/sbin/nginx”
nginx modules path: “/etc/nginx/modules”
nginx configuration prefix: “/etc/nginx/conf”
nginx configuration file: “/etc/nginx/conf/nginx.conf”
nginx pid file: “/etc/nginx/logs/nginx.pid”
nginx error log file: “/etc/nginx/logs/error.log”
nginx http access log file: “/etc/nginx/logs/access.log”
nginx http client request body temporary files: “client_body_temp”
nginx http proxy temporary files: “proxy_temp”
nginx http fastcgi temporary files: “fastcgi_temp”
nginx http uwsgi temporary files: “uwsgi_temp”
nginx http scgi temporary files: “scgi_temp”

CentOS

CentOS

CentOS是Community ENTerprise Operating System的简称,社区企业操作系统,它是Linux操作系统的一个发行版本。CentOS也不是全新的Linux发行版,CentOS是在RHEL发布的基础上基于GPL协议将RHEL的构成克隆再现的一个Linux发行版本之一。
在Red Hat家族中有企业版的产品,Red Hat Enterprise Linux(即RHEL)是很多企业采用的Linux发行版本,需要向Red Hat付费才可以使用,并能得到付过费用的服务和技术支持和版本升级。CentOS可以像RHEL一样构筑Linux系统环境,但不需要向Red Hat付任何的产品和服务费用,同时也得不到任何有偿技术支持和升级服务。
在CentOS的全称里面我们可以看到Enterprise OS,也就是说企业系统,这个企业系统并不是企业级别的系统,而是它可以提供企业级应用所需要的要素,例如:
稳定的环境
长期的升级更新支持
保守性强
大规模的系统也能够发挥很好的性能
CentOS满足以上的要素,满足上面要素的发行版还有Fedora 。但是相比CentOS,Fedora提供更多的新的功能和软件,发布更新快等特点,这样在稳定性和管理方面就增加了很多工作。企业所需要的系统环境应该是,高效稳定的系统环境,一次构建后能够长期使用的系统环境,所以Fedora那样的频繁更新发布的系统环境并不对应企业的应用。在众多的RHEL的克隆版本中,CentOS是很出众很优秀的。
http://os.51cto.com/art/201305/392455.htm

磁盘空间用尽

df -h 发现,

/dev/mapper/vg_cloud-lv_root 已用100%,可用为0了,这是原因。

查看各目录占用磁盘大小

du -sh /* | sort -nr

占用空间大的目录

/var/spool/clientmqueue
/var/spool/mqueue
/var/log
/var/cache

du -sh *

查看邮件发送队列
mailq 或 sendmail -bp

删除所有队列
postsuper -d ALL

关闭空主机头,防止直接用ip访问,或者被别的域名恶意指向。

在nginx/conf/vhosts下新建一个xxx.conf,内容为
server {
listen 80 default;
return 500;
}

域名恶意指向有些隐患:
由于搜索引擎也会收录你的IP地址的页面,所以同一个页面搜索引擎会重复收录,造成页面的权重不如单个收录高。
假如那域名是不友善的域名,比如曾经指向非法网站,容易引发搜索引擎惩罚,连带IP受到牵连。即使域名没什么问题,但流量也会被劫持到别的域名,从而遭到广告联盟的封杀。

SSH远程登录

ssh root@ip
ssh Alias 快捷配置

vi ~/.ssh/config,输入

# 服务器1
Host 别名
    HostName IP地址
    Port 22
    User 用户名

连接时,使用ssh 别名,然后输入密码即可。

CentOS 6.5安装jdk1.8

centos上的邮件系统sendmail,可再次自主安装,会生成/etc/mail目录,安装方法可参考
http://seofangfa.com/shell/centos-sendmail.html
执行mailq命令后如果发现有很多邮件队列,可以清空/var/spool/mqueue中的文件。

/var/spool/clientmqueue目录下可能存在很多文件,删除方法

# cd /var/spool/clientmqueue
# ls | xargs rm -f

错误:ECDSA host key “ip地址” for has changed and you have requested strict checking。
清除当前机器里关于远程服务器的缓存和公钥信息

ssh-keygen -R "远程服务器ip地址"

搭建rtmp服务器

安装web环境

安装阿里云web环境一键安装包
安装前需要注意要把数据盘挂载到alidata目录上。

下载nginx-rtmp-moudle

这里下载 ,上传解压到home目录,

重新生成nginx

修改/home/sh-1.4.4/nginx/install_nginx-1.4.4.sh,在–prefix=/alidata/server/nginx \下行增加

--add-module=/home/nginx-rtmp-module-master

然后执行/install_nginx-1.4.4.sh,重新编译生成nginx文件。

停止当前nginx,用上一步生成的文件替换。

/alidata/server/nginx-1.4.4/sbin/nginx

配置rtmp应用服务

在nginx.conf中和http块同级别增加rtmp块,如下:

rtmp_auto_push on;
rtmp {
server {
listen 1935;
chunk_size 4000;

application rtmp1 {
live on;
#allow play all;
#play /home;
}
application hls1 {
live on;
hls on;
hls_path /tmp/hls;
}
}
}

针对hls,在http里面增加一个location配置

location /hls {  
            types {  
                application/vnd.apple.mpegurl m3u8;  
                video/mp2t ts;  
            }  
            root /tmp;  
            add_header Cache-Control no-cache;  
}

重新启动nginx

安装ffmpeg

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
./configure --disable-yasm
make
sudo chmod 777 /usr/local/
make install 

测试推流

 ffmpeg -re -i /home/mm.MOV -vcodec copy -acodec copy -f flv rtmp://****:1935/myapp/test
 ffmpeg -re -i /home/test.264 -vcodec copy -f flv rtmp://****:1935/myapp/test
 ffmpeg -re -i /home/my.flv -f flv rtmp://****:1935/myapp/test

 

查看文档和播放示例

nginx-rtmp-module-master下的doc、test分别提供了文档说明向导和示例,示例使用了jwplayer flash播放rtmp。
再配置一个http vhost,root指向

root /home/nginx-rtmp-module-master/test/www;

修改指向目录中的index.html文件中的file后的内容为自己发布视频的地址,然后可以访问 http://****/index.html 播放视频。

nginx增加支持https

生成https证书

 
 $ cd /alidata/server/nginx/conf
 $ openssl genrsa -des3 -out wwkssl.key 1024
 $ openssl req -new -key wwkssl.key -out wwkssl.csr
 $ cp wwkssl.key wwkssl.key.org
 $ openssl rsa -in wwkssl.key.org -out wwkssl.key
 $ openssl x509 -req -days 3650 -in wwkssl.csr -signkey wwkssl.key -out wwkssl.crt

增加监听443端口

修改在vhosts中原来配置好的.conf文件

 server {
 listen 80;
 listen 443 ssl;
 server_name brogrammer.cn www.brogrammer.cn;
 index index.html index.htm index.php;
 root /alidata/www/brogrammer;

 ssl_certificate /alidata/server/nginx/conf/wwkssl.crt;
 ssl_certificate_key /alidata/server/nginx/conf/wwkssl.key;

location ~ .*\.(php|php5)?$
 {
 #fastcgi_pass unix:/tmp/php-cgi.sock;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 include fastcgi.conf;
 }
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
 expires 30d;
 }
 location ~ .*\.(js|css)?$
 {
 expires 1h;
 }
 #伪静态规则
 include /alidata/server/nginx/conf/rewrite/brogrammer.htaccess;
 access_log /alidata/log/nginx/access/reading.log;
 }

免费https证书

https://certbot.eff.org/docs/using.html
https://segmentfault.com/a/1190000005797776
http://blog.csdn.net/andylau00j/article/details/54604415
https://www.v2ex.com/t/383032
http://blog.csdn.net/cstopery/article/details/51911298
https://certbot.eff.org/
http://www.jianshu.com/p/fb3733cd0d3b
其中

yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
提示:Loaded plugins: fastestmirror, langpacks
#fastestmirror是yum的一个加速插件,简单处理办法就是禁用这个插件
vi  /etc/yum/pluginconf.d/fastestmirror.conf   
* enabled=0  //把1改为0  
vi /etc/yum.conf
plugins=1                 #将plugins的值修改为0
再次
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
#生成证书
certbot certonly --standalone --email 'brogrammer@qq.com' -d 'www.brogrammer.cn' -d 'brogrammer.cn'

重启nginx

 $ cd /alidata/server/nginx/sbin
 $ ./nginx -s reload

修改iptables规则

将https的443端口加入到iptables防火墙中允许访问

 $ iptables -I INPUT -p tcp --dport 443 -j ACCEPT
 $ service iptables save

前端身份验证

前端身份验证功能依靠后端,根据不同形式的前端,有不同的策略:
单页应用可以内部控制授权;
多页应用可以通过http_auth_request模块验证授权;
http://www.cnblogs.com/hao-dotnet/p/3477442.html

nginx命令

./nginx -s reload
nginx -v
nginx -V 包括查看安装的模块

部署LNMP

试用了一个月阿里云服务器,服务真不错,安装布署教程也很全,但最终我也没有积累够耐心和时间做域名备案。换一个香港的vps吧,付款后立即给了ip和密码,但没有任何预装布署和指导,没有布署经验,现搜索网上的资源又太繁杂,何不试试阿里云那套安装流程呢?

参考 阿里云服务器linux操作指南

挂载数据盘

  • 登录服务器,可以使用SecureCRT
  • 检查磁盘分区,fdisk -l
  • 对磁盘分区,用fdisk命令创建主分区
  • 格式化磁盘,mkfs .ext3 /dev/xvdb1
  • 挂载数据盘

注意,根据后面安装包的需要,挂载数据盘需要挂载到根目录下的alidata,挂载命令如下:

mount /dev/xvdb1 /alidata/
df -hp

配置开机自动挂载

vi /etc/fstab
增加或修改为 /dev/vdb1 /alidata ext3 defaults 0 0

下载安装包

下载安装包 点击这里 ,并上传到服务器的/home目录下,解压。

安装

……

数组

修改了vhosts,rewrite目录中的文件后,要重启nginx才生效。

./nginx -s reload
service nginx reload
在centos7中 sudo systemctl restart nginx

nodejs socket

UDP / Datagram Sockets 数据报套接字模块 和 Net模块

在线文档
http://shouce.qdfuns.com/nodejs/dgram.html
http://shouce.qdfuns.com/nodejs/net.html
http://www.runoob.com/nodejs/nodejs-net-module.html

var socket = dgram.createSocket('udp4');创建的udp socket有close方法,没有destroy方法。
var socket = new net.Socket();创建的tcp socket没有close方法,有destroy方法。

cocos2d-x中node.getContentSize()的问题

在android真机中测试发现,如果没有setContentSize,调用Layer,Node的子类的getContentSize()值有可能是小于等于0的,这导致程序异常。