说明 :enable: 使能 ( 禁用 )AMI 协议, 如果你需要使用 AMI 接口, 请设置为 on. Manager Name: 用于登陆的用户名 Manager secret: 用于登陆的密码 Deny: 不允许登陆的 IP 地址和子网掩码 / 表示禁止所有客户端

Similar documents
OpenVox GSM 网关的 HTTP 接口 OpenVox 网关提供了丰富的外部接口用来处理客户多样化的短信服务需求, OpenVox 一直致力于更好的满足客户的需求和营造使用方便灵活的客户体验! 前期我们一直使用的 AMI 接口和目前刚完成的 API 接口一起构成了目前 OpenVox GSM

NeoGate_TG_Series_UserManual_en

bingdian001.com

Chapter #

中醫執業資格試臨床考試結果上訴聆訊的決定及裁決理由

( )1

C 1

CC213

IP505SM_manual_cn.doc

RG-NBS5816XS交换机RGOS 10.4(3)版本WEB管理手册


Ps22Pdf

ebook

路由器基本配置

C6_ppt.PDF

ebook140-8

第一章

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

C/C++ 语言 - 循环

GPRS IP MODEM快速安装说明

Practical Guide For Employment Of Foreign Domestic Helpers

epub 61-2

宏电文档

提问袁小兵:

HTC One E9+

untitled

Slide 1

untitled

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

BYOD Http Redirect convergence Client (1) 2008R2 NLB( ) (2) NLB Unicast mode switch flooding (arp ) NLB DNS Redirect 1. Round-Robin DNS DNS IP/DNS Cli

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

关于建立境内违法互联网站黑名单管理制度的通知

? 這 全 都 是 市 政 府 提 供 給 我 的 資 料 低 底 盤 公 車 計 畫 96 年 預 算 新 台 幣 4,500 萬 元 97 年 預 算 新 台 幣 1 億 6,500 萬 元 98 年 預 算 新 台 幣 3 億 2,300 萬 元, 共 有 307 台 低 底 盤 公 車,99

<4D F736F F D20D2F8D0D043444D41CEDECFDFBDD3C8EB41544DBBFAC1AACDF8D3A6D3C3BDE2BEF6B7BDB0B82DD0DEB8C4B0E62E646F63>

网工新答案

C语言的应用.PDF

软件测试(TA07)第一学期考试


untitled

CC213

Microsoft Word - RAP CHI.doc

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2

通过动态路由协议实现链路备份

(As at 28

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

目 录 监 管 资 讯 2016 年 全 国 保 险 监 管 工 作 会 议 召 开...3 协 会 动 态 赤 峰 保 险 行 业 协 会 召 开 数 据 统 计 和 信 息 宣 传 总 结 表 彰 会 议...5 赤 峰 市 保 险 行 业 协 会 秘 书 处 召 开 2015 年 度 述 职

同 时, 采 取 提 供 新 闻 线 索 和 素 材 安 排 专 访 等 方 式 主 动 为 新 闻 媒 体 服 务, 为 采 访 报 道 活 动 创 造 便 利 条 件 建 设 网 络 信 息 发 布 平 台 2013 年 9 月 开 通 中 央 纪 委 监 察 部 网 站,2015 年 1 月

公務員服務法第13條相關解釋彙整表

资 讯 速 递 台 基 于 大 数 据 的 学 校 督 导 评 估 系 统 建 设 上 海 市 闵 行 区 人 民 政 府 教 育 督 导 室 ( 摘 要 ) 闵 行 教 育 在 深 化 教 育 改 革 探 索 管 办 评 分 离 的 背 景 下, 把 教 育 督 导 评 估 系 统 建 设 作 为

時間軸上的竹蓮記憶 學務主任 黃雅彙 我不是竹蓮國小的畢業校友 但對於身為新竹人的我來 說 仔細回想起來 似乎和竹蓮有著一種特別的緣分 對竹蓮國小最初的印象是在小學的時候 猶記得年幼的 我經過一段時日的啦啦隊舞蹈訓練後 老師便帶著我們從學 校步行到竹蓮國小來參加比賽 一踏入竹蓮校門 映入眼簾 的是黑

Microsoft Word - 临政办发6.doc

厨房小知识(四)

妇女更年期保健.doc

小儿传染病防治(上)

<4D F736F F D B875B9B5A448ADFBBADEB27AA740B77EA4E2A5555FA95EAED6A641ADD75F2E646F63>

女性青春期保健(下).doc

避孕知识(下).doc

孕妇饮食调养(下).doc

禽畜饲料配制技术(一).doc

中老年保健必读(十一).doc

怎样使孩子更加聪明健康(七).doc

i

C

D E 答 案 :C 3. 工 作 站 A 配 置 的 IP 地 址 为 /28. 工 作 站 B 配 置 的 IP 地 址 为 /28. 两 个 工 作 站 之 间 有 直 通 线 连 接, 两 台

穨CAS1042快速安速說明.doc

C/C++语言 - C/C++数据

戲劇手冊.PDF

二零零六年一月二十三日會議


A9RF716.tmp

马太亨利完整圣经注释—雅歌

二零一五年施政報告 - 施政綱領 - 第三章 扶貧及為弱勢社群提供支援

育 部 分 則 由 陳 淑 貞 委 員 及 李 兆 環 委 員 共 同 執 行, 在 此 先 感 謝 各 位 委 員 及 學 者 專 家 之 參 與 二 目 前 評 論 報 告 初 稿 之 架 構 區 分 為 對 政 府 機 關 回 應 意 見 之 觀 察 優 點 及 待 改 進 事 項, 以 及

<4D F736F F D20BACBB0B2C8ABD3EBB7C5C9E4D0D4CEDBC8BEB7C0D6CEA1B0CAAEB6FECEE5A1B1B9E6BBAEBCB C4EAD4B6BEB0C4BFB1EA2E646F63>

Transcription:

App Note VoxStack GSM Gateway API 第一部分 :OpenVox GSM Gateway AMI 接口的介绍 : 1.1: 接口简介 OpenVox 的 GSM 网关 AMI 接口允许客户端应用程序连接网关的 asterisk, 并且允许客户端通过 TCP/IP 流去发送命令和读取事件 这是非常有用的, 例如 : 你可以通过这个接口去发送 / 读取 SMS 1.2: 协议特点 : a: 你需要在发送你的命令之前创建一个连接 b: 数据包可以在任何时间双向传递 c: 如果数据包的第一行是 Action, 那么表明这个数据包是从客户端传输到 服务器 ( 即从应用程序传送到 OpenVox 的 asterisk) d: 如果第一行是 event, 或者 Response, 则表明是服务器的回复消息 ( 即 网关的 asterisk 对应用程序的响应 ) 第二部分 :OpenVox GSM 网关的 AMI 配置 : 2.1: 概述 网关和应用程序之间的链接使用的是 5038 端口 因此我们需要创建一个用户, 客户端将使用这个用户名和密码来链接 OpenVox 网关的 asterisk 2.2: 在网关上为链接创建一个用户 (WEB 界面方式 ) 用你的用户名和密码登陆网关 ( 出厂为 admin,admin) 找到 AMI 配置的地方, 路径如下 (ADVANCED Asterisk API). 配置示例 :

说明 :enable: 使能 ( 禁用 )AMI 协议, 如果你需要使用 AMI 接口, 请设置为 on. Manager Name: 用于登陆的用户名 Manager secret: 用于登陆的密码 Deny: 不允许登陆的 IP 地址和子网掩码 0.0.0.0/0.0.0.0 表示禁止所有客户端的 IP 地址和子网掩码链接 例如你的应用程序运行在 192.168. 99.1. 那么将不会被允许链接 Permit: 允许链接的 IP 地址和子网掩码 以上配置说明 除了来自于 172.16.88.44 并且子网掩码为 255.255.0.0 的链接, 其他的链接都不会被允许链接 2.2: 配置用户 ( 直接在配置文件中配置 ) 请后台登陆网关, 找到文件 /etc/asterisk/manage.conf 命令 : vi /etc/asterisk/manage.conf 你可以编辑这个文件, 保存之后重新加载配置即可 命令 :asterisk -r Core reload

2.3 : 链接 OpenVox 网关的服务器 2.3.1: 使用 telnet 链接首先你必须发送一个 Login 的动作去登陆你的 OpenVox 网关的 asterisk 服务器, 然后输入你的用户名和密码, 如下图 : 注意 : 我的网关的 IP 地址是 172.16.127.127, 你登陆的时候注意改为你的 IP 地址 2.3.2: 使用程序登陆, 示例如下 : #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/socket.h> #include<netinet/in.h> #include<unistd.h> //Login void login_fun(int sock_fd) char username[20]; char secret[20]; int login_len=0; int secret_len=0; int res = 0; char receive_buf[4096]; char login_buf[40]; memset(username,'\0',20); memset(secret,'\0',20); printf("please input your username\n"); scanf("%s",username);

printf("please input your secret\n"); scanf("%s",secret); t); memset(login_buf,'\0',40); sprintf(login_buf,"action:login\r\nusername:%s\r\nsecret:%s\r\n\r\n",username,secre login_len = strlen(login_buf); if(res = write(sock_fd,login_buf,login_len) == login_len) sleep(1); memset(receive_buf,'\0',4096); if(res = read(sock_fd,receive_buf,sizeof(receive_buf))<0) perror("login failed\n"); return; printf("%s\n",receive_buf); if(null!= strstr(receive_buf,"authentication accepted")) printf("login success\n"); int main(void) int client_socket; struct sockaddr_in client_addr; char ServerIp[20]; memset(serverip,'\0',20); printf("please input your server ip address\n"); scanf("%s",serverip);

client_socket = socket(af_inet,sock_stream,0); if(client_socket < 0) perror("create socket error\n"); return -1; client_addr.sin_family = AF_INET; client_addr.sin_port = htons(5038); client_addr.sin_addr.s_addr = inet_addr(serverip); //connect if(connect(client_socket,(struct sockaddr *)&client_addr,sizeof(client_addr))<0) perror("connect error\n"); return -1; else printf("connect to %s success\n",serverip); login_fun(client_socket); return 0; 第三部分 : 发送或者接受 SMS 概述 :OpenVox 网关扩展了 AMI 命令和 AMI 事件, 允许你能通过 AMI 接口去发送或者接受 SMS, 开发人员可以通过 AMI 接口去集成自己的应用程序用来发送或者接受 SMS 接下来我们将演示如何通过 OpenVox 网关的 AMI 接口来发送或者接受 SMS 命令介绍 : GSM send sms <span> <destination> <message> <timeout> [id] GSM send ussd <span> <destination> <message> <time out> [id] 参数说明 : span: 发送短信所使用的通道, 通俗的说就是第几张 SIM 卡 Destination: 目的地, 及需要发送到哪儿 ; Message: 短信内容 Timeout: 超时时间 Id: 命令的区别身份, 可选参数 示例 : 第一步 : 登陆网关

第二部 : 运行命令 :asterisk r 第三步 : 使用命令发送 SMS 我们使用第一个通道发送 hello world 到手机 13632919026 3.2: 使用 AMI 接口发送短信 Action: command 说明 : 执行一条 CLI 命令示例 : 第一步 : 登陆 AMI 服务器第二步 : 使用 AMI 动作发送 SMS 3.3: 使用 AMI 接口接受短信说明 : 如果网关接受到短信, 网关的 asterisk 将会向连结到该网关的客客户端报告事件 注意 : 如果你需要知道发送的状态 ( 例如 : 发送成功或者失败, 请使用参数 sync) 示例 : gsm send sync sms <span> <destination> <message> <timeout> [id] 接受短信示例 :

重要的是画框的部分 ; 2: 表示接受到短信的通道, +86.: 表示的是发送者的号码后面的是日期和短信内容 3.3: 使用程序接受和发送短信 void sendsms_fun(int sock_fd) char send_buf[4096]; char span_num[3]; char destination[12]; char message[2048]; int res; int send_len; char receive_buf[4096]; memset(send_buf,'\0',4096); memset(destination,'\0',11); memset(message,'\0',2048); memset(span_num,'\0',3); printf("please input the span you want used\n"); scanf("%s",span_num); printf("please input the destination num you want send\n"); scanf("%s",destination); printf("please input the message you want send\n"); scanf("%s",message); sprintf(send_buf,"action:command\r\ncommand:gsm send

sms %s %s %s\r\n\r\n",span_num,destination,message); send_len = strlen(send_buf); memset(receive_buf,'\0',4096); printf("%s\n",send_buf); if(res = write(sock_fd,send_buf,send_len) == send_len) sleep(1); if(res = read(sock_fd,receive_buf,sizeof(receive_buf))<0) perror("send sms error\n"); return; printf("%s\n",receive_buf); if(null!= strstr(receive_buf,"response: Follows")) printf("send SMS success\n"); int main(void) int client_socket; struct sockaddr_in client_addr; char ServerIp[20]; memset(serverip,'\0',20); printf("please input your server ip address\n"); scanf("%s",serverip); client_socket = socket(af_inet,sock_stream,0); if(client_socket < 0) perror("create socket error\n"); return -1;

client_addr.sin_family = AF_INET; client_addr.sin_port = htons(5038); client_addr.sin_addr.s_addr = inet_addr(serverip); if(connect(client_socket,(struct sockaddr *)&client_addr,sizeof(client_addr))<0) else //login perror("connect error\n"); return -1; printf("connect to %s success\n",serverip); login_fun(client_socket); //send SMS sendsms_fun(client_socket); return 0; Now use the program receive SMS. This program base on our first program. Compile command: gcc send_sms.c o send_sms void readsms_fun(int sock_fd) struct Message char sender_num[12]; char span[3]; char message_buf[4096]; char receive_time[30]; ; char receive_buf[4096]; char *receive_appdata = NULL; struct Message SMS_buf; int res; int i = 0;

char *temp = NULL; char temp_buf[1024]; while(1) sleep(1); memset(receive_buf,'\0',4096); memset(sms_buf.sender_num,'\0',12); memset(sms_buf.span,'\0',3); memset(sms_buf.message_buf,'\0',4096); memset(sms_buf.receive_time,'\0',30); memset(temp_buf,'\0',1024); if(res = read(sock_fd,receive_buf,sizeof(receive_buf))<0) else perror("read failed\n"); if((receive_appdata = strstr(receive_buf,"appdata"))!=null) printf("%s\n",receive_appdata); strcpy(temp_buf,receive_appdata); if((temp=strstr(temp_buf,"process_sms"))!=null) for(i = 0;i<13;i++) temp++; strncpy(sms_buf.span,temp,1); for(i=0;i<7;i++) temp++; strncpy(sms_buf.sender_num,temp,11); for(i =0;i<14;i++)

temp++; strncpy(sms_buf.receive_time,temp,19); for(i = 0;i<22;i++) temp++; strcpy(sms_buf.message_buf,temp); printf("span = %s\n",sms_buf.span); printf("num=%s\n",sms_buf.sender_num); printf("time = %s\n",sms_buf.receive_time); printf("message = %s\n",sms_buf.message_buf); //printf("span = %s\n",sms_buf.span); int main(void) int client_socket; struct sockaddr_in client_addr; char ServerIp[20]; memset(serverip,'\0',20); printf("please input your server ip address\n"); scanf("%s",serverip); client_socket = socket(af_inet,sock_stream,0); if(client_socket < 0) perror("create socket error\n"); return -1; client_addr.sin_family = AF_INET; client_addr.sin_port = htons(5038); client_addr.sin_addr.s_addr = inet_addr(serverip);

if(connect(client_socket,(struct sockaddr *)&client_addr,sizeof(client_addr))<0) else perror("connect error\n"); return -1; printf("connect to %s success\n",serverip); login_fun(client_socket); //sendsms_fun(client_socket); readsms_fun(client_socket); return 0;