Pjsip note

  • pjsua的 启动参数可以这样设置 :

    前提是 服务器在 192.168.18.6 , 设置的来源是 pjsip手册:

    https://www.pjsip.org/pjsua.htm

    设置以后, 在手机上用zoiper 注册到 192.168.18.6 , 然后用pjsua 程序 先 m 命令, 再输入:

    就可以打电话到手机 , 192.168.18.5:36876 是注册以后, 在服务器看到的当前用户信息 。


     

  • pjsua 重要的结构

a) endpoint

注意每个 endpoint 维护着一个 module 数组

 

 

visual studio Common macros for build commands and properties

编译时经常能看到 这样的宏 :  $(SolutionDir)$(Configuration)\

在这个网址, 能看到所有宏的详细解释  https://docs.microsoft.com/en-us/cpp/ide/common-macros-for-build-commands-and-properties?view=vs-2017

 

但是, 如果能看到具体的路径, 当然更明确了, 那么, 怎么看到 ?  或者说,怎么把这些变量print 出来 ?

 

方法是: 项目 properties—–>Build Event—-> pre 或者 post build event 都可以 —-> command line —-> edit ——> macro 

就可以看到这些macro 的 name value pair

 

 

c Notes

  • 为什么 c 语言有static function

c++ class 有 static function 能理解, 代表不用实例化类也可以调用的函数

c 并没有类的概念, static function 是什么意思 ?

解释 : In C, functions are global by default. The “static” keyword before a function name makes it static.

Unlike global functions in C, access to static functions is restricted to the file where they are declared.

用代码说明 :

/* Inside file1.c */
static void fun1(void)
{
  puts("fun1 called");
}
/* Iinside file2.c  */
intmain(void)
{
  fun1(); 
  getchar();
  return0;  
Now, if we compile the above code with command “gcc file2.c file1.c”, we get the error “undefined reference to `fun1’” . This is because fun1() is declared static in file1.c and cannot be used in file2.c.

  •  static variable

1) A static int variable remains in memory while the program is running. A normal or auto variable is destroyed when a function call where the variable was declared is over.

2) Static variables are allocated memory in data segment, not stack segment. See memory layout of C programs for details.

3) Static variables (like global variables) are initialized as 0 if not initialized explicitly. For example in the below program, value of x is printed as 0, while value of y is something garbage. See this for more details.

 

4) In C, static variables can only be initialized using constant literals. For example, following program fails in compilation. See this for more details.

VOIP & pjsip knowledge

  • before SIP protocol  ,  what is a protocol

以qq为例, qq的client如何在various tcp data find out qq data , 就是用qq的应用层协议识别

协议包括头部信息, 数据长度 , flow control , error control 等

一个最简单的协议例子是:

1: 单向传播, 没有flow control 和 error control

2:  假设 receiver 可以无时延的收到所有data

3: 在数据链接层 , receiver可以去掉头部信息并上传给 net 层

4: sender side , data link 层 接受data from net 层

 

  • 那么, 什么是sip 协议?  sip协议由以下几个RFC文档构成

https://www.ietf.org/rfc/rfc3261.txt  


https://tools.ietf.org/html/rfc3262

Reliability of Provisional Responses  in the Session Initiation Protocol (SIP)

说明:

sip 定义了2中response ,  final responseprovisional response ,

provisional 是临时的 , 以1开头, 比如 100 trying, 180 ringing , 一个invite 可能会有多个 provisional response , provisonal response 不是 reliable 因为没有ACK 机制, 但是,对于有的 provisional response ,又必须确保其正确传达到 client , 所以, PRACK (Provisional Response Acknowledgement) method 被用到

对于 prack 的详细解释, 见 https://www.dialogic.com/webhelp/BorderNet2020/1.0.0/WebHelp/sip_prack.htm

https://www.avaya.com/blogs/archives/2015/12/understanding-sip-prack-for-avaya-aura.html

https://www.vocal.com/sip-2/prack/

 

final   (2xx-6xx) ,一个invite 只能有1个 final response

详细见 : https://andrewjprokop.wordpress.com/2014/06/18/understanding-sip-responses/

对于 pjsip 来说, pjsip_ua  lib 实现的是rfc 3262 所描述的功能


RFC  3665  : 具体讲一个 sip callflow 的例子  SIP与SIP通话   https://tools.ietf.org/html/rfc3665

bob and alice are all sip agent

bob send register request to sip server

上图是 TLS 协议传输 register 的示例 , 在实际中, 手机zoiper一般不用 TLS

TLS 端口是 5061 ,  非 TLS 是 5060

当 zoiper 用户停用账户时 , 也会发一个 register request , 但是 :

message header —-> contact —> contact parameter : expires =0 

在通话过程中, 也就是 session already establish ,  还会发现有 invite request 出现

this is called “re-invite”  ,  see article https://tools.ietf.org/html/rfc6141


RFC 3666  :  SIP 与 PSTN callflow     https://tools.ietf.org/html/rfc3666


    • RFC 5939 :   详细解释 session description protocol (SDP)

https://tools.ietf.org/html/rfc5939


 

  • 关键字

call center  呼叫中心

asterisk

freeSwitch

kamailio

opensips

Kamailio  :  开源的sip proxy server

NAT traversal :  内网穿透

PBX  :  private branch exchange   私有交换机 ,  asterisk 就是 soft PBX ,   SIP  SERVER  指的也是 PBX

NAP : network access point

 

How to backup and restore wordpress site

  • 目标: 备份远程 bandwagong的 wordpress到本地 centos 机器, 包括articl , Pic , theme …

 

  • First backup  远程 mysql database

 

然后 ,restore 到 本地

 

  • Tools —-> export —-> all contents

and download the generated file

 

  • 在本地 centos 7 ,  先翻墙 , 再下载 wordpress最新版本, 翻墙是为了能下载

 

  • 解压到 /var/www/html/

 

  • 在 mysql 建表

Piercing77#

 

注: 如果不是第一次见表, 可直接执行:

 

  • 修改

在文件最后加上

 

重启 apache

  • 修改 /etc/hosts

加上

 

  • 这时, 在本机应该就能访问了, 如果想让同一局域网的其他PC能通过

http://192.168.3.116 的形式访问

需要

 

learn from  https://www.centos.org/forums/viewtopic.php?t=59161

  • 但是, 这样图片,视频等仍然存储在远程

是因为在 wp_posts表中, URL 仍然是远程的 ,需要手动改过来

参见: https://wpbeaches.com/updating-wordpress-mysql-database-after-moving-to-a-new-url/

 

主要是把 http://www.notesoflyang.com 改为  http://192.168.3.116 (公司局域网 IP  )

 

一共4句 sql

 

此外, 因为远程wordpress最开始是没有域名的, 所以有一部分upload image 是以远程IP而不是域名做地址的,所有, 还需要再执行一遍这4句,但是把 域名改ip

 

 

 

  • 最后, 把 /var/www/html/wordpress/wp-content/uploads 文件夹的内容从远程copy到本地即可
  • finish  backup

 

  • reference article :

how to backup wordpress without any plugin :

https://skillcrush.com/2015/04/23/backing-up-wordpress/


 

  • 如果

失败 ,解决方法是

sudo systemctl start mysqld 这种是用 systemctl 管理程序启动,
很多教程这样写: /etc/init.d/mysqld start
但是 在我的 /etc/init.d 并没有发现mysql

那就找 find / -name mysqld
发现在 /usr/sbin/mysqld
执行 /usr/sbin/mysqld start

  • 如果登陆mysql 时出现  :

注意最后的数字13

解决方法是 :

可能是因为原来的mysql:mysql 没有这个目录的权限

方法来自 :

https://serverfault.com/questions/497194/mysql-bind-on-unix-socket-permission-denied

How to use OpenVPN to make multi player play lan game for example HOMM3

  • In my VPS ,  openvpn config file in :     /etc/openvpn

似乎 ipp.txt 没有作用, 用户的ip 和 ipp.txt 指定的不同

用户的证书文件在  /etc/openvpn/easy-rsa/keys

  • download key files and install openVPN client on machine

but not , the download file is only  “client1” ‘s certificate

  • copy unzipped key file into   openVPN—>setting—>config folder     (这里只的是Windows side )  , import .openvpn file
  • 注意, 如果是多client , 就要在 server 生成 多个client 的证书,如果多client用同样的client1的证书, 那么clients 的IP 也会一样

例如, client1 所需的证书有 :

如果要再添加一个用户, 还需要 client2.crt,  client2.csr, client2.key

添加client 的步骤是 :

1   goto

2 执行

source ./vars

./build-key newclient

然后对于其中几项, 在默认值的基础上做一些修改,比如修改name

然后 keys 文件夹就会出现 newclient 的三个文件

3 用新的  newclient三个文件 和新的 TeckAndOtherNotesOfLY2018.com.ovpn 替换之前client1 的 , 给 newclient用

这样 newclient就得到了不同的ip

 

3 ,新增 client 的步骤来自 :

https://serverfault.com/questions/229116/openvpn-add-clients-without-rebuilding-all-keys


 

但是 , 发现两个client之间不能互相 ping

发现是 windows firewall 的问题 , 停用

 

  • 问题 :

server ip 是哪个?       10.10.10.1   ,   见  /etc/openvpn/openvpn.conf


怎么证明2个机器已经在同一局域网 ?   能互相ping到


怎么测试 client 的速度    ,  在 server ping  client


openvpn server 的默认端口 (如果没有在 openvpn.conf 文件指定 ) :   udp  1194

 


openvpn 客户间的通讯是否经过  server

在  openvpn.conf 文件加上

然后重启openvpn server

未确认这样是否可以加快客户机之间的传输速度 , 此方法来自

https://serverfault.com/questions/736274/openvpn-client-to-client

 


如何判断  client-to-client 是 enable 还是  not enable   ,    注释掉就是  not enable


how to restart openVPN server


how to check  logs

 

  • 参考文章

https://openvpn.net/community-resources/how-to/#pki

https://www.cnblogs.com/irockcode/p/7587424.html

 

  • 示例配置文件

come  from

https://gist.github.com/deargle/ce70b597645dc7c7c9eaec40875faaf5

同时运行多个task,带参数, 并等待所有task结束

 

来自: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskfactory.startnew?view=netframework-4.7.2

android studio 3.1 tips

  • 测试程序都放在 samsung 的 SD CARD —- >  AndroidTestProgram 目录
  • 当实现一个派生类时, 鼠标放在派生类名字上 , 按 CTRL+I ,  可以选择要 implement 的 method
  • 如果有某个类没有import , 比如  Intent , 鼠标放在名字上,  按 Alt + Enter 可以 import
  • How to debug android program  ?

how to install shadow sock client on centos 7 x86_64

1  安装 pip 工具

2 安装 shadowsock 客户端

pip install shadowsocks

 

3

 

新建配置文件:

填写以下内容


 

4 启动

nohup sslocal -c /etc/shadowsocks.json /dev/null 2>&1 &

 

5

运行 curl --socks5 127.0.0.1:1985 http://httpbin.org/ip,如果返回你的 ss 服务器 ip 则测试成功:

这里的 1985 假定是第三步的 local_port 

实际为 1080

 

6  Shadowsocks 是一个 socket5 服务,我们需要使用 Privoxy 把流量转到 http/https 上。

找到以下两句,确保没有注释掉

启动

7

配置 /etc/profile

编辑:

添加下面两句:

 

运行以下:

8  测试

 

如果能返回 html ,说明成功

注意: 这里能返回html只说明linux 代理成功, 浏览器还要另外设置代理

 

9  修改浏览器代理

for my case

firefox—>edit—>perfemence—> advance—-> connection

 

 


 

出处 :  https://brickyang.github.io/2017/01/14/CentOS-7-%E5%AE%89%E8%A3%85-Shadowsocks-%E5%AE%A2%E6%88%B7%E7%AB%AF/

 

但是有修改, privoxy 没有从源代码编译