当前位置: 首页 > news >正文

GB28181学习(五)——实时视音频点播(信令传输部分)

要求

  • 实时视音频点播的SIP消息应通过本域或其他域的SIP服务器进行路由、转发,目标设备的实时视音频流宜通过本域的媒体服务器进行转发;
  • 采用INVITE方法实现会话连接,采用RTP/RTCP协议实现媒体传输;
  • 信令流程分为客户端主动发起和第三方呼叫控制两种方式,本文主要介绍客户端主动发起的方式;
  • 应具有媒体流保活机制;

流程

  • 客户端主动发起
    在这里插入图片描述

流程分析:

  1. 媒体流接收者向SIP服务器发送INVITE消息,消息头域中携带Subject字段,包括视频源ID、发送方媒体流序列号、媒体流接收者ID、接收端媒体流序列号标识等参数,SDP消息体中s字段为"Play"代表实时点播;
  2. SIP服务器收到INVITE请求,通过三方呼叫控制建立媒体服务器和媒体流发送者之间的媒体连接。向媒体服务器发送INVITE消息,此消息不携带SDP消息体;
  3. 媒体服务器收到SIP服务器的INVITE请求,回复200 OK,携带SDP消息体,消息体描述了媒体服务器接收媒体流的IP、端口、媒体格式等内容;
  4. SIP服务器收到媒体服务器返回的200 OK,向媒体流发送者发送INVITE请求,请求中携带步骤3)中媒体服务器回复的200 OK响应消息体,s字段为"Play"代表实时点播,y字段描述SSRC值,f字段描述媒体参数;
  5. 媒体流发送者接收SIP服务器的INVITE请求,回复200 OK,携带SDP消息体,消息体中描述了媒体流发送者发送媒体流的IP、端口、媒体格式、SSRC字段等;
  6. SIP服务器接收媒体流发送者返回的200 OK,向媒体服务器发送ACK请求,请求中携带步骤5)媒体流发送者回复的200 OK响应消息体,完成与媒体服务器INVITE会话建立过程;
  7. SIP服务器接收媒体流发送者返回的200 OK,向媒体流发送者发送ACK请求,请求中不携带消息体,完成与媒体流发送者INVITE会话建立过程;
  8. 完成三方呼叫控制后,SIP服务器通过B2BUA代理方式建立媒体流接收者与媒体服务器之间的媒体连接,在消息1中增加SSRC值,转发给媒体服务器;
  9. 媒体服务器收到INVITE请求,回复200 OK,携带SDP消息体,消息体中描述了媒体服务器发送媒体流的IP、端口、媒体格式、SSRC等;
  10. SIP服务器将消息9转发给媒体流接收者;
  11. 媒体流接收者收到200 OK,回复ACK,完成与SIP服务器的INVITE会话建立过程;
  12. SIP服务器将消息11转发给媒体服务器,完成与媒体服务器的INVITE会话建立过程;
  13. 媒体流接收者向SIP服务器发送BYE,断开消息1、10、11建立的同媒体流接收者的INVITE会话;
  14. SIP服务器收到BYE,回复200 OK,会话断开;
  15. SIP服务器收到BYE向媒体服务器发送BYE,断开消息8、9、12建立的同媒体服务器的INVITE会话;
  16. 媒体服务器收到BYE,回复200 OK,会话断开;
  17. SIP服务器向媒体服务器发送BYE,断开消息2、3、6建立的同媒体服务器的INVITE会话;
  18. 媒体服务器收到BYE,回复200 OK,会话断开;
  19. SIP服务器向媒体流发送者发送BYE,断开消息4、5、7建立的同媒体流发送者的INVITE会话;
  20. 媒体流发送者收到BYE,回复200 OK,会话断开;

协议

  • 消息头域Allow字段应支持INVITE、ACK、INFO、CANCEL、OPTIONS、MESSAGE方法;
  • 消息头Content-type字段应为Content-type:application/sdp;
  • SDP文本信息包括会话名称和意图、会话持续时间、构成会话的媒体、有关接收媒体的信息;
  • 源设备在SDP协议格式消息体中包括t行,t行的开始时间和结束时间都设置为0,表示实时视音频点播;
  • SDP协议格式中o行表示本设备的设备编码,c行表示设备或系统IP地址,m行为媒体接收端口号;

SDP字段说明

  • 示例
v=0
o=xxx 0 0 IN IP4 192.168.0.107
s=Play
c=IN IP4 192.168.0.107
t=0 0
m=video 36000 RTP/AVP 96 98 97
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:98 H264/90000
a=rtpmap:97 MPEG4/90000
y=xxx
  • 说明
SDP字段说明:v字段:协议版本
o字段:-
a字段:a=rtpmap:<payload type> <encoding name>/<clock rate>  [/<encoding parameters>] 中的<encoding name>,利用该属性携带编码器厂商名称。该属性表明该流为某厂商编码器编码且是不符合gb28181规定的媒体流,符合国标的媒体流不需要该属性。
例如:a=rtpmap:96 DAHUA/90000a=rtpmap:96 HIKVISION/90000
a字段有下列格式:
a字段可携带倍数参数,用于文件下载时控制下载速度。格式: a=downloadspeed:下载倍数(整型)
a字段可携带文件大小参数,用于文件下载时的进度计算。格式: a=filesize:文件大小 (单位:Byte)
a字段可携带setup、connection作为TCP连接协商参数。 a=setup:TCP连接方式(表示本SDP发送者在建立RTP over TCP连接时是主动还是被动发起TCP连接,“active”为主动,“passive”为被动)
a字段可携带SVC参数,用于视频传输时的分辨率或者帧频控制。a=svcspace:空域编码方式 【取值整型。 0:不使用  1:1级增强  2:2级增强  3:3级增强 】  a = svctime:时域编码方式s字段:表示请求媒体流的操作类型,“Play”标识为点播请求   “Playback”标识回播请求   “Download”表示文件下载  “Talk”表示语音对讲;
u字段:u行应填写视音频文件的URL。该URL的取值有两种:简捷方式和普通方式。简捷方式直接采用产生该历史媒体的媒体源(如某个摄像头)的设备ID以及相关参数,参数用“:”分隔;普通方式采样http://储存设备ID[/文件夹]*/文件名;
m字段:描述媒体的媒体类型、端口、传输层协议、负载类型等内容。媒体类型采样“video”标识视频或者视音频混合内容,采样“audio”标识传输音频内容;传输方式采用“RTP/AVP”标识传输层协议为 RTP over UDP,采用“TCP/RTP/AVP”标识传输层协议为RTP over TCP;
t字段:当回放或者下载时,t行值为开始时间,结束时间,采样“ ”分隔;
y字段:十进制整数字符串,标识SSRC值。其中第一位为历史或者实时媒体流的标识位,0为实时,1为历史;第2位到第6位取20位SIP监控域ID之中的4-8位作为域标识;第7-10位作为域内媒体流标识,是一个与当前域内产生的媒体流SSRC值后4位不充分的四位十进制整数;
f字段:f=v/编码格式/分辨率/帧率/码率类型/码率大小  a/编码格式/码率大小/采样率    其中v表示video   a表示audio

测试

操作

  1. 注册;
    在这里插入图片描述

  2. 注册成功后,输入点播需要的参数,点击开始按钮;

在这里插入图片描述

参数分析:

  • 通道编号:视频通道编码ID,如图所示;

在这里插入图片描述

  • 设备ip
  • 设备端口
  • 本地ip
  • 本地接收port:流媒体服务器的接收端口,用作数据接收;

抓包

在这里插入图片描述

  • 截图1表示发送INVITE请求;
  • 截图2表示接收数据,数据封装格式为PS;

xml分析

  1. 发送INVITE请求(107—>111)
INVITE sip:xxx@192.168.0.111:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=
Max-Forwards: 70
From: sip:xxx@192.168.0.107:5060;tag=
To: sip:xxx@192.168.0.111:5060
Contact: <sip:xxx@192.168.0.107:5060>
Call-ID: 
CSeq: 18467 INVITE
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, PRACK
Supported: 100rel
Subject: xxx:xx,xxx:xx
Content-Type: application/sdp
Content-Length:   211v=0
o=xxx 0 0 IN IP4 192.168.0.107
s=Play
c=IN IP4 192.168.0.107
t=0 0
m=video 36000 RTP/AVP 96 98 97
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:98 H264/90000
a=rtpmap:97 MPEG4/90000
y=0100000001
  1. 接收INVIE请求响应(100 Trying 111—>107)
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 192.168.0.107:5060;rport=5060;branch=
From: <sip:xxx@192.168.0.107:5060>;tag=
To: <sip:xxx@192.168.0.111:5060>
Call-ID: 
CSeq: 18467 INVITE
User-Agent: IP Camera
Content-Length: 0
  1. 接收INVITE请求响应(200 OK 111—>107)
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.107:5060;rport=5060;branch=
From: <sip:xxx@192.168.0.107:5060>;tag=
To: <sip:xxx@192.168.0.111:5060>;tag=
Call-ID: 
CSeq: 18467 INVITE
Contact: <sip:xxx@192.168.0.111:5060>
Content-Type: application/sdp
User-Agent: IP Camera
Content-Length:   187v=0
o=xxx 2243 2243 IN IP4 192.168.0.111
s=Play
c=IN IP4 192.168.0.111
t=0 0
m=video 15060 RTP/AVP 96
a=sendonly
a=rtpmap:96 PS/90000
a=filesize:0
y=0100000001
  1. 接收返回响应(107—>111)
ACK sip:xxx@192.168.0.111:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=
Max-Forwards: 70
From: sip:xxx@192.168.0.107:5060;tag=
To: sip:xxx@192.168.0.111:5060;tag=
Call-ID: 
CSeq: 18467 ACK
Content-Length:  0
  1. 断开连接(111—>107 由于暂未实现流媒体服务器,设备检测到数据接收端口不可用,主动断开连接
BYE sip:xxx@192.168.0.107:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.111:5060;rport;branch=
From: <sip:xxx@192.168.0.111:5060>;tag=
To: <sip:xxx@192.168.0.107:5060>;tag=
Call-ID: 
CSeq: 2 BYE
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 0
  1. 断开连接响应(107—>111)
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.111:5060;rport=5060;received=192.168.0.111;branch=
Call-ID: 
From: <sip:xxx@192.168.0.111:5060>;tag=
To: <sip:xxx@192.168.0.107:5060>;tag=
CSeq: 2 BYE
Content-Length:  0

相关文章:

GB28181学习(五)——实时视音频点播(信令传输部分)

要求 实时视音频点播的SIP消息应通过本域或其他域的SIP服务器进行路由、转发&#xff0c;目标设备的实时视音频流宜通过本域的媒体服务器进行转发&#xff1b;采用INVITE方法实现会话连接&#xff0c;采用RTP/RTCP协议实现媒体传输&#xff1b;信令流程分为客户端主动发起和第…...

单例模式(饿汉模式 懒汉模式)与一些特殊类设计

文章目录 一、不能被拷贝的类 二、只能在堆上创建类对象 三、只能在栈上创建类对象 四、不能被继承的类 五、单例模式 5、1 什么是单例模式 5、2 什么是设计模式 5、3 单例模式的实现 5、3、1 饿汉模式 5、3、1 懒汉模式 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x…...

133. 克隆图

133. 克隆图 题目-中等难度示例1. bfs 题目-中等难度 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。…...

交流耐压试验目的

试验目的 交流耐压试验是鉴定电力设备绝缘强度最有效和最直接的方法。 电力设备在运行中&#xff0c; 绝缘长期受着电场、 温度和机械振动的作用会逐渐发生劣化&#xff0c; 其中包括整体劣化和部分劣化&#xff0c;形成缺陷&#xff0c; 例如由于局部地方电场比较集中或者局部…...

使用 YCSB 和 PE 进行 HBase 性能压力测试

HBase主要性能压力测试有两个&#xff0c;一个是 HBase 自带的 PE&#xff0c;另一个是 YCSB&#xff0c;先简单说一个两者的区别。PE 是 HBase 自带的工具&#xff0c;开箱即用&#xff0c;使用起来非常简单&#xff0c;但是 PE 只能按单个线程统计压测结果&#xff0c;不能汇…...

正则表达式相关概念及不可见高度页面的获取

12.正则 概念:匹配有规律的字符串,匹配上则正确 1.正则的创建方式 构造函数创建 // 修饰符 igm// i 忽视 ignore// g global 全球 全局// m 换行 var regnew RegExp("匹配的内容","修饰符")var str "this is a Box";var reg new RegExp(&qu…...

深入学习 Redis - 分布式锁底层实现原理,以及实际应用

目录 一、Redis 分布式锁 1.1、什么是分布式锁 1.2、分布式锁的基础实现 1.2.1、引入场景 1.2.2、基础实现思想 1.2.3、引入 setnx 1.3、引入过期时间 1.4、引入校验 id 1.5、引入 lua 脚本 1.5.1、引入 lua 脚本的原因 1.5.2、lua 脚本介绍 1.6、过期时间续约问题&…...

Hive行转列[一行拆分成多行/一列拆分成多列]

场景&#xff1a; hive有张表armmttxn_tmp&#xff0c;其中有一个字段lot_number&#xff0c;该字段以逗号分隔开多个值&#xff0c;每个值又以冒号来分割料号和数量&#xff0c;如&#xff1a;A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…...

TypeScript系列之类型 string

文章の目录 背景写在最后 背景 与JavaScript不同的是&#xff0c;TypeScript使用的是静态类型&#xff0c;比如说它指定了变量可以保存的数据类型。如下面代码所示&#xff0c;如果在JavaScript中&#xff0c;指定变量可以保存的数据类型&#xff0c;会报错&#xff1a;类型注…...

【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )

文章目录 一、C 对象的动态创建和释放1、C 语言 对象的动态创建和释放 的方式2、C 语言 对象的动态创建和释放 的方式 二、代码示例 - 对象的动态创建和释放 一、C 对象的动态创建和释放 使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ; 使用 free 函数可以释放上述分配…...

AMS爆炸来袭,上线即巅峰

1.关于首发项目Antmons(AMS)空投结果 Gate.io Startup 首发项目Antmons代币AMS于Aug15th,AM 07:00开始下单&#xff0c;24小时内下单同等对待总共有15,950人下单&#xff0c;下单总价值超过1,000万美金分发系数约为0.001640495298341。根据上线规则AMS项目认购成功&#xff0c;…...

是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...

华为是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在华为做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有9.5K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节和腾…...

怒刷LeetCode的第2天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;滑动窗口 方法二&#xff1a;双指针加哈希表 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;二分查找 方法二&#xff1a;归并排序 方法三&#xff1a;分治法 第三题 题目来源 题目内容 解…...

AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测(续)

目录 车载 CAN 总线网络异常检测技术 3.1 车载 CAN 总线网络异常检测技术概述 3.1.1基于统计的异...

mojo安装

docker安装mojo 官网 https://developer.modular.com/login 很奇怪登录页面不显示 类似于网站劫持 docker 安装mojo带jupyterlab的方式 https://hub.docker.com/r/lmq886/mojojupyterlab 拉取镜像 docker pull lmq886/mojojupyterlab docker pull lmq886/mojojupyterlab:1.2 启…...

【探索Linux】—— 强大的命令行工具 P.8(进程地址空间)

阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…...

vue3 - Element Plus 切换主题色及el-button hover颜色不生效的解决方法

GitHub Demo 地址 在线预览 Element Plus 自定义主题官方文档 如果您想要通过 js 控制 css 变量&#xff0c;可以这样做&#xff1a; // document.documentElement 是全局变量时 const el document.documentElement // const el document.getElementById(xxx)// 获取 css 变…...

【C++面向对象侯捷】1.C++编程简介

文章目录 视频来源&#xff1a;我的百度网盘...

年龄大了转嵌入式有机会吗?

年龄大了转嵌入式有机会吗&#xff1f; 首先&#xff0c;说下结论&#xff1a;年龄并不是限制转行嵌入式软件开发的因素&#xff0c;只要具备一定的编程和电子基础知识&#xff0c;认真学习和实践&#xff0c;是可以成为优秀的嵌入式软件开发工程师的。最近很多小伙伴找我&…...

Mysql高级——索引优化和查询优化(2)

5. 排序优化 5.1 排序优化 问题&#xff1a;在 WHERE 条件字段上加索引&#xff0c;但是为什么在 ORDER BY 字段上还要加索引呢&#xff1f; 优化建议&#xff1a; SQL 中&#xff0c;可以在 WHERE 子句和 ORDER BY 子句中使用索引&#xff0c;目的是在 WHERE 子句中避免全表…...

SpringMVC的拦截器和JSR303的使用

目录 一、JSR303 二、拦截器&#xff08;interceptor&#xff09; 一、JSR303 1.1.什么是JSR303 JSR 303&#xff0c;它是Java EE&#xff08;现在称为Jakarta EE&#xff09;规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范&#xff0c;也称为Bean验证。 Bean验…...

servlet中doGet方法无法读取body中的数据

servlet中doGet方法不支持读取body中的数据。...

Ubuntu MongoDB账户密码设置

1.创建用户 在MongoDB中&#xff0c;可以使用db.createUser()方法来创建用户。该方法接受一个包含用户名、密码和角色等信息的文档作为参数。 // 连接到MongoDB数据库 mongo// 切换到admin数据库 use admin// 创建用户 db.createUser({user: "admin",pwd: "adm…...

指针进阶(3)

9. 模拟实现排序函数 这里我们使用冒泡排序算法&#xff0c;模拟实现一个排序函数&#xff0c;可以排序任意类型的数据。 这段代码可以排序整型数据&#xff0c;我们需要在这段代码的基础上进行改进&#xff0c;使得它可以排序任意类型的数据。 #define _CRT_SECURE_NO_WARN…...

信息检索与数据挖掘 | (二)布尔检索与倒排索引

文章目录 &#x1f4da;词项-文档关联矩阵&#x1f407;相关名词&#x1f407;词项-文档关联矩阵的布尔查询处理 &#x1f4da;倒排索引&#x1f407;关于索引&#x1f407;建立索引&#x1f407;基于倒排索引的布尔查询处理&#x1f407;查询优化 &#x1f4da;字典数据结构&a…...

【学习笔记】EC-Final 2022 K. Magic

最近的题都只会抄题解&#x1f605; 首先&#xff0c;操作顺序会影响答案&#xff0c;因此不能直接贪心。其次&#xff0c;因为是求贡献最大&#xff0c;所以可以考虑枚举最终哪些位置对答案产生了贡献&#xff0c;进而转化为全局贡献。 1.1 1.1 1.1 如果 [ l 1 , r 1 ) ⊆ [ …...

MySQL数据库笔记

文章目录 一、初识MySQL1.1、什么是数据库1.2、数据库分类1.3、MySQL简介 二、操作数据库2.1、操作数据库&#xff08;了解&#xff09;2.2、数据库的列类型2.3、数据库的字段属性&#xff08;重点&#xff09;2.4、创建数据库表&#xff08;重点&#xff09;2.5、数据表的类型…...

大数据之Hive(三)

分区表 概念和常用操作 将一个大表的数据按照业务需要分散存储到多个目录&#xff0c;每个目录称为该表的一个分区。一般来说是按照日期来作为分区的标准。在查询时可以通过where子句来选择查询所需要的分区&#xff0c;这样查询效率会提高很多。 ①创建分区表 hive (defau…...

让高分辨率的相机芯片输出低分辨率的图片对于像素级的值有什么影响?

很多图像传感器可以输出多个分辨率的图像&#xff0c;如果选择低分辨率格式的图像输出&#xff0c;对于图像本身会有什么影响呢&#xff1f; 传感器本身还是使用全部像素区域进行感光&#xff0c;但是在像素数据输出时会进行所谓的降采样&#xff08;down-sampling&#xff09…...

FastGPT 接入飞书(不用写一行代码)

FastGPT V4 版本已经发布&#xff0c;可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff0c;例如联网谷歌搜索&#xff0c;操作数据库等等&#xff0c;功能非常强大&#xff0c;还没用过的同学赶紧去试试吧。 飞书相比同类产品算是体验非常好的办…...

亚马逊网站托管怎么做/百度统计平台

曾几何时&#xff0c;高冷的Mac用户淡淡的嘲讽了装了XX安全卫士、安全浏览器及杀毒的低贱的Windows用户。Mac OS似乎一直自带光环&#xff0c;贴着稳定、安全的标签。然而Mac OS真的永不中毒吗&#xff1f;事实真相似乎并不那么美好。Mac OS会不会中毒当然会。首先要承认的是&a…...

洛阳专业网站设计开发制作建站公司/推广普通话手抄报简单漂亮

题图&#xff1a;https://unsplash.com/nielsenramon在OO(面向对象)编程中&#xff0c;类中的方法有多种形式&#xff1a;实例方法、静态方法、类方法、甚至还可以有抽象方法&#xff0c;本文来说说实例方法在Python中是如何工作的&#xff0c;后面再来谈其他方法。先来定义一个…...

河北平台网站建设价位/百度下载安装2019

问题&#xff1a;输入两个整数&#xff0c;请编写程序求出他们的最大公约数与最小公倍数。 一、辗转相除法 a%b&#xff0c;如果余数非0&#xff0c;就继续用除数除以余数&#xff0c;重复该过程&#xff0c;直到余数为0。此时的除数为最大公约数 #include <stdio.h> …...

贵州省网站建设/上海最新新闻事件今天国内

LM3S之boot loader学习笔记-1 彭会锋 &#xff08;首先声明&#xff0c;此系列文章编写参考了很多资料&#xff0c;其中一些内容是原版内容的引用和整理&#xff0c;并加入了一些自己的见解&#xff0c;我已经尽量标明引用部分&#xff0c;如有未全部标注部分&#xff0c;还望见…...

东莞做网站做seo优化外包网络公司/苏州网站建设哪家靠谱

话不多说&#xff0c;切入正题 1.设置一个好记的微信号 2至少设置3个紧急联系人 3开通微信支付并绑一张银行卡 4申诉找回微信密码。一定选择我不记得微信号 5.选择不记得微信号&#xff0c;填入绑定的手机号&#xff0c;等待申诉。 5a若申诉成功&#xff0c;使用微信号加新密码…...

网站建设收费标准/随州今日头条新闻

/*** ecshop jpgraph图表类库* * 利用开源的jpgraph库实现对各类型数据以图表&#xff0c;走势图的形式表现出来。* **/class cls_jpgraph{var $db null;var $ydata array();var $width 350;var $height 250;var $graph ”; //图形对象var $piegraph ”; //丙状图形var $…...