<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>方案 &#8211; 玄元网络</title>
	<atom:link href="https://www.xyuannetwork.com/category/%E6%96%B9%E6%A1%88/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.xyuannetwork.com</link>
	<description>探索技术与创意的结合，wordpress + woocommerce 为您的个性化商店需求提供无限可能</description>
	<lastBuildDate>Wed, 08 Oct 2025 09:13:51 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://www.xyuannetwork.com/wp-content/uploads/2023/09/cropped-logo-32x32.webp</url>
	<title>方案 &#8211; 玄元网络</title>
	<link>https://www.xyuannetwork.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>新能源管理系统</title>
		<link>https://www.xyuannetwork.com/ems/</link>
					<comments>https://www.xyuannetwork.com/ems/#respond</comments>
		
		<dc:creator><![CDATA[XYuanNetwork]]></dc:creator>
		<pubDate>Wed, 08 Oct 2025 09:13:49 +0000</pubDate>
				<category><![CDATA[方案]]></category>
		<category><![CDATA[服务]]></category>
		<category><![CDATA[EMS]]></category>
		<category><![CDATA[新能源]]></category>
		<guid isPermaLink="false">https://www.xyuannetwork.com/?p=1702</guid>

					<description><![CDATA[在新能源项目的建设与运维中，设备多样化、协议复杂、运维难度高一直是行业痛点。我们团队基于客户的实际情况，深入分 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><br>在新能源项目的建设与运维中，设备多样化、协议复杂、运维难度高一直是行业痛点。我们团队基于客户的实际情况，深入分析客户的具体需求，为其提供灵活的解决方案，成功开发出新能源管理系统。该系统已成功应用于多个实际场景，帮助客户实现了对能源设备的统一接入、集中监控、智能告警与可视化管理，从而提升了管理效率并降低了运维成本。</p>



<h2 class="wp-block-heading"><br>多品牌、多协议接入</h2>



<p id="u77694647">系统兼容 <strong>Modbus、MQTT、HTTP 等协议</strong>，已适配包括：</p>



<ul class="wp-block-list">
<li>Victron Energy：<a href="https://www.victronenergy.com/" target="_blank" rel="noreferrer noopener">https://www.victronenergy.com/</a></li>



<li>Digital Matter G70</li>



<li>Epever MPPT Solar Controller</li>



<li>SmartGen Generator Controller</li>



<li>DSE Generator Controller</li>



<li>海康威视安防监控设备</li>
</ul>



<p id="ufc8ec045">实现了跨品牌、跨协议的设备互联。</p>



<p></p>



<h2 class="wp-block-heading"><br>全方位的监控与管理</h2>



<p><br><strong>实时监控</strong>：平台实时采集设备数据、随时查看设备运行状态，保障系统稳定。</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="592" src="https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123420_592-1024x592.png" alt="EMS" class="wp-image-1704" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123420_592-1024x592.png 1024w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123420_592-300x173.png 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123420_592-768x444.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123420_592-1536x887.png 1536w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123420_592-2048x1183.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><br><strong>历史数据展示</strong>：趋势分析，帮助优化运维与能源利用。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="590" src="https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123455_904-1024x590.png" alt="EMS" class="wp-image-1705" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123455_904-1024x590.png 1024w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123455_904-300x173.png 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123455_904-768x442.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123455_904-1536x885.png 1536w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_123455_904-2048x1180.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><br><strong>智能告警</strong>：异常自动推送，第一时间掌握现场情况。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="593" src="https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_131000_789-1024x593.png" alt="EMS" class="wp-image-1706" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_131000_789-1024x593.png 1024w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_131000_789-300x174.png 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_131000_789-768x445.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_131000_789-1536x890.png 1536w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/wechat_2025-09-21_131000_789-2048x1187.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>远程控制：</strong>支持对不同设备进行远程操控，指令下发</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="591" src="https://www.xyuannetwork.com/wp-content/uploads/2025/10/ScreenShot_2025-10-08_162522_387-1024x591.png" alt="" class="wp-image-1708" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/10/ScreenShot_2025-10-08_162522_387-1024x591.png 1024w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/ScreenShot_2025-10-08_162522_387-300x173.png 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/ScreenShot_2025-10-08_162522_387-768x443.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/ScreenShot_2025-10-08_162522_387-1536x887.png 1536w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/ScreenShot_2025-10-08_162522_387-2048x1182.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><br></p>



<p><strong>多端访问</strong>：Web、iOS、Android 全面覆盖，随时随地掌握能源资产。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="473" height="1024" src="https://www.xyuannetwork.com/wp-content/uploads/2025/10/c5e70f7baca1ec8d7009259e73aa639a-473x1024.webp" alt="EMS" class="wp-image-1707" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/10/c5e70f7baca1ec8d7009259e73aa639a-473x1024.webp 473w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/c5e70f7baca1ec8d7009259e73aa639a-139x300.webp 139w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/c5e70f7baca1ec8d7009259e73aa639a-768x1662.webp 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/c5e70f7baca1ec8d7009259e73aa639a-710x1536.webp 710w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/c5e70f7baca1ec8d7009259e73aa639a.webp 828w" sizes="(max-width: 473px) 100vw, 473px" /></figure>



<p></p>



<h2 class="wp-block-heading"><br>灵活的权限管理</h2>



<p><br>支持 <strong>多级多角色分级管理</strong>，满足企业从集团到分支机构的不同层级使用需求。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="591" src="https://www.xyuannetwork.com/wp-content/uploads/2025/10/image-1-1024x591.webp" alt="" class="wp-image-1709" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/10/image-1-1024x591.webp 1024w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/image-1-300x173.webp 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/image-1-768x443.webp 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/image-1-1536x887.webp 1536w, https://www.xyuannetwork.com/wp-content/uploads/2025/10/image-1-2048x1182.webp 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p id="u85171e80"><strong>我们的团队：用数字化与智能化，助力新能源资产高效运营。</strong></p>



<p id="uacf40aef">如果你也面临多设备管理、运维难题，欢迎与我们交流。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xyuannetwork.com/ems/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>微信小程序开发：低成本实现 “业务流程线上化与数字化升级” 的落地案例</title>
		<link>https://www.xyuannetwork.com/wechat-miniprogram-development/</link>
					<comments>https://www.xyuannetwork.com/wechat-miniprogram-development/#respond</comments>
		
		<dc:creator><![CDATA[XYuanNetwork]]></dc:creator>
		<pubDate>Mon, 15 Sep 2025 10:34:02 +0000</pubDate>
				<category><![CDATA[方案]]></category>
		<category><![CDATA[微信小程序]]></category>
		<guid isPermaLink="false">https://www.xyuannetwork.com/?p=1683</guid>

					<description><![CDATA[微信小程序定制开发落地案例展示，支持小程序下单、微信客服、小票打印、多规格商品、分销等功能。]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>这是我们向一位从事服装定制服务的客户提供的微信小程序定制开发的落地使用案例，主要应用于校服采购相关的业务。</p>
</blockquote>



<p><br>在服装定制行业，学生校服订购的传统流程多依赖线下手工操作，常见方式包括纸质表格填写、微信群接龙收集信息，后续还需人工统计汇总。这类操作易出现信息错漏，且人工核对耗时较长，从家长下单到工厂安排生产，常存在信息传递延迟、各环节沟通效率低的问题，对校服定制的整体进度造成影响。</p>



<p><br><strong>传统校服订购流程的主要问题</strong></p>



<p id="uc0f26f5e">传统校服订购业务流程的核心问题，在于未实现线上化与数字化，具体表现为：</p>



<ul class="wp-block-list">
<li>信息传递依赖纸质单据或人工交接，导致数据分散，易丢失，后续追溯订单详情难度较大；</li>



<li>缺乏统一的管理平台，学校、家长、工厂等各相关角色协同工作时效率不高；</li>



<li>家长遇到尺寸咨询、订单进度查询等问题，难以得到及时反馈，影响客户体验。</li>
</ul>



<p><strong><br>小程序解决方案：实现校服订购线上化与数字化</strong></p>



<p id="u8ef3c4af">针对上述问题，我们为服装定制客户开发了专属线上化工具 —— 以微信小程序为载体，重构学生校服订购流程，推动业务流程线上化与数字化升级。</p>



<p id="uc4047bc4">小程序在校服订购场景中的具体应用及优势如下：</p>



<ol class="wp-block-list">
<li><strong>家长操作便捷</strong>：依托微信生态，家长无需下载、安装、更新应用，通过微信即可直接访问小程序商城，使用后退出不占用手机内存，打消家长的使用顾虑。</li>
</ol>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="473" height="1024" src="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180913_606-473x1024.png" alt="微信小程序定制开发" class="wp-image-1686" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180913_606-473x1024.png 473w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180913_606-139x300.png 139w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180913_606-768x1662.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180913_606-710x1536.png 710w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180913_606.png 828w" sizes="(max-width: 473px) 100vw, 473px" /></figure>



<p>2. <strong>产品信息清晰呈现</strong>：小程序内可展示校服的材质规格、细节特点及高清产品图片，家长可自主查看，减少反复咨询环节。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="473" height="1024" src="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180948_326-473x1024.png" alt="小程序商城" class="wp-image-1687" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180948_326-473x1024.png 473w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180948_326-139x300.png 139w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180948_326-768x1662.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180948_326-710x1536.png 710w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_180948_326.png 828w" sizes="(max-width: 473px) 100vw, 473px" /></figure>



<p>3. <strong>客服响应及时</strong>：小程序接入微信客服，家长有问题可随时咨询，客服通过手机端微信即可回复，避免消息滞后。</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="461" height="1024" data-id="1688" src="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_174806_985-461x1024.jpg" alt="微信客服" class="wp-image-1688" style="width:346px;height:auto" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_174806_985-461x1024.jpg 461w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_174806_985-135x300.jpg 135w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_174806_985-768x1707.jpg 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_174806_985-691x1536.jpg 691w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_174806_985-921x2048.jpg 921w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_2025-09-15_174806_985-scaled.jpg 1152w" sizes="(max-width: 461px) 100vw, 461px" /></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="473" height="1024" data-id="1689" src="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250915171936_134_173-473x1024.png" alt="微信客服" class="wp-image-1689" style="width:334px;height:auto" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250915171936_134_173-473x1024.png 473w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250915171936_134_173-139x300.png 139w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250915171936_134_173-768x1662.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250915171936_134_173-710x1536.png 710w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250915171936_134_173.png 828w" sizes="(max-width: 473px) 100vw, 473px" /></figure>
</figure>



<p>4. <strong>订单统计高效准确</strong>：家长在小程序下单后，系统后台自动统计订单信息，支持导出 Excel 表格，无需人工逐条核对，减少数据处理时间。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="528" src="https://www.xyuannetwork.com/wp-content/uploads/2025/09/6-1024x528.png" alt="订单数据" class="wp-image-1690" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/09/6-1024x528.png 1024w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/6-300x155.png 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/6-768x396.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/6-1536x791.png 1536w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/6-2048x1055.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="425" src="https://www.xyuannetwork.com/wp-content/uploads/2025/09/wechat_2025-09-15_173303_238-1024x425.png" alt="订单数据导出" class="wp-image-1691" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/09/wechat_2025-09-15_173303_238-1024x425.png 1024w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/wechat_2025-09-15_173303_238-300x124.png 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/wechat_2025-09-15_173303_238-768x319.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/wechat_2025-09-15_173303_238-1536x637.png 1536w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/wechat_2025-09-15_173303_238-2048x850.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="393" height="1024" src="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250913112056_2664_27-393x1024.jpg" alt="微信收款" class="wp-image-1692" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250913112056_2664_27-393x1024.jpg 393w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250913112056_2664_27-115x300.jpg 115w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250913112056_2664_27-768x2003.jpg 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250913112056_2664_27-589x1536.jpg 589w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250913112056_2664_27-785x2048.jpg 785w, https://www.xyuannetwork.com/wp-content/uploads/2025/09/微信图片_20250913112056_2664_27-scaled.jpg 982w" sizes="(max-width: 393px) 100vw, 393px" /></figure>



<p>5. <strong>生产计划精准制定</strong>：订单需求信息从人工传递转为系统直连，工厂可依据真实订单数据制定生产计划，提升生产效率。</p>



<p>6. <strong>用户沉淀与推广优化</strong>：家长因下单、查询订单进度等需求，会主动使用小程序，高频次打开有助于沉淀高粘性精准用户。后续推广新产品时，可借助家长间的信任关系及现有流量，降低推广成本。</p>



<p><br>通过小程序，校服订购流程从线下繁琐转向线上高效，不仅解决了传统流程中的痛点，也为服装定制业务的数字化发展提供支持。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xyuannetwork.com/wechat-miniprogram-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>基于海康威视 ISUP5.0 协议完成对 NVR 设备接入的两种方案</title>
		<link>https://www.xyuannetwork.com/hikvision-isup5-python/</link>
					<comments>https://www.xyuannetwork.com/hikvision-isup5-python/#respond</comments>
		
		<dc:creator><![CDATA[XYuanNetwork]]></dc:creator>
		<pubDate>Sat, 16 Aug 2025 03:56:48 +0000</pubDate>
				<category><![CDATA[方案]]></category>
		<category><![CDATA[ISUP5.0]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[海康威视]]></category>
		<guid isPermaLink="false">https://www.xyuannetwork.com/?p=1663</guid>

					<description><![CDATA[基于 ISUP5.0 协议实现的两种集成海康威视 NVR 设备的方案：针对 PS 格式封装数据进行解析提取音视频数据实现实时预览的方案与基于流媒体服务器搭配内网穿透实现的拉流方案。]]></description>
										<content:encoded><![CDATA[
<p>两种常见的基于 ISUP5.0 实现 NVR 设备接入的方案，实现视频实时预览、回放、远程控制等功能。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="588" src="https://www.xyuannetwork.com/wp-content/uploads/2025/08/wechat_2025-08-05_180539_033-1024x588.png" alt="集成 NVR 设备的实时预览功能" class="wp-image-1671" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/08/wechat_2025-08-05_180539_033-1024x588.png 1024w, https://www.xyuannetwork.com/wp-content/uploads/2025/08/wechat_2025-08-05_180539_033-300x172.png 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/08/wechat_2025-08-05_180539_033-768x441.png 768w, https://www.xyuannetwork.com/wp-content/uploads/2025/08/wechat_2025-08-05_180539_033-1536x883.png 1536w, https://www.xyuannetwork.com/wp-content/uploads/2025/08/wechat_2025-08-05_180539_033-2048x1177.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>在安防监控领域，海康威视的产品应用广泛。海康威视的 ISUP5.0（Intelligent Service Unified Platform 5.0）为 <a href="https://www.hikvision.com/cn/products/Video-Recorder/Network-hard-disk-recorder/General-NVR/" target="_blank" rel="noopener">NVR</a>（Network Video Recorder）设备的接入提供了解决方案。因为海外设备不支持 <a href="https://zhuanlan.zhihu.com/p/393863592" target="_blank" rel="noopener">GB28181</a>，ISUP5.0 协议主要用于海外市场。</p>



<h2 class="wp-block-heading">方案一：解析海康威视录像数据提取音视频数据流​</h2>



<p>这一方案基于海康威视官方提供的 SDK 二次开发实现而来。SDK 可以在<a href="https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10" target="_blank" rel="noopener">官网</a>这里下载。</p>



<p>通过 SDK 发起预览视频请求，接收并处理数据，在官方文档中对此也有详细说明：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="801" height="655" src="https://www.xyuannetwork.com/wp-content/uploads/2025/08/image-1.png" alt="isup 视频预览流程" class="wp-image-1672" srcset="https://www.xyuannetwork.com/wp-content/uploads/2025/08/image-1.png 801w, https://www.xyuannetwork.com/wp-content/uploads/2025/08/image-1-300x245.png 300w, https://www.xyuannetwork.com/wp-content/uploads/2025/08/image-1-768x628.png 768w" sizes="(max-width: 801px) 100vw, 801px" /></figure>



<p>接收到的数据是海康威视基于 PS 格式封装过的音视频数据流，所以需要对其进行解析。</p>



<p>1. PS 流简介​</p>



<p>PS（Program Stream）流是一种将音视频信息封装在一起的格式，常用于多媒体数据的传输与存储。在海康威视的监控系统中，PS 流是一种常见的音视频复合流格式。它主要包含多个数据包，这些数据包按照特定的结构组织，以便在网络中高效传输以及在接收端进行准确解析。​</p>



<p>2. 解析步骤​</p>



<ul class="wp-block-list">
<li>检索特定的起始码，以识别 PS 数据包的开头，依此划定流的不同部分。</li>
</ul>



<ul class="wp-block-list">
<li>一旦识别出 PS 数据包，则需要从中提取 PES（分组基本流）数据包。这些数据包包含实际的音频和视频数据。</li>
</ul>



<ul class="wp-block-list">
<li>根据音频流和视频流的流标识符对它们进行区分，并从 PES 数据包中提取原始的音频和视频数据。​</li>
</ul>



<ul class="wp-block-list">
<li>如果音频数据是以 A-law 格式编码的，会将其解码为 PCM 格式。此外，还可以通过提升音量和应用清晰度增强处理来对音频进行优化（此为可选操作）。视频则为 H264。</li>
</ul>



<p>3. 代码示例（以 Python 为例）​</p>



<pre class="wp-block-code"><code>class PSParser:
    """PS流解析器"""
    def __init__(self, debug=False, enhance_audio=True):  # 默认开启音频增强
        self.is_fix_ps_file = False
        self.buffer = bytearray()  # 用于存储未处理完的数据
        self.debug = debug  # 调试模式
        self.enhance_audio = enhance_audio  # 是否增强音频
        self.VOLUME_BOOST = 1.2  # 音量提升倍数
        self.CLARITY_ENHANCE = True  # 是否增强清晰度
        
        # 常量定义
        self.SEQUENCE_END_CODE = 0x000001b7
        self.ISO_11172_END_CODE = 0x000001b9
        self.PROGRAM_STREAM_PACKET_START_CODE = 0x000001ba
        self.PROGRAM_STREAM_SYSTEM_HEADER_START_CODE = 0x000001bb
        self.PROGRAM_STREAM_MAP = 0x000001bc
        self.PRIVATE_STREAM_1 = 0x000001bd
        self.PADDING_STREAM = 0x000001be
        self.PRIVATE_STREAM_2 = 0x000001bf
        
        # 流类型定义
        self.STREAM_TYPE_VIDEO_MPEG1 = 0x01
        self.STREAM_TYPE_VIDEO_MPEG2 = 0x02
        self.STREAM_TYPE_AUDIO_MPEG1 = 0x03
        self.STREAM_TYPE_AUDIO_MPEG2 = 0x04
        self.STREAM_TYPE_PRIVATE_SECTION = 0x05
        self.STREAM_TYPE_PRIVATE_DATA = 0x06
        self.STREAM_TYPE_AUDIO_AAC = 0x0f
        self.STREAM_TYPE_VIDEO_MPEG4 = 0x10
        self.STREAM_TYPE_VIDEO_H264 = 0x1b
        self.STREAM_TYPE_VIDEO_H265 = 0x24
        self.STREAM_TYPE_VIDEO_CAVS = 0x42
        self.STREAM_TYPE_VIDEO_SVAC = 0x80
        self.STREAM_TYPE_AUDIO_AC3 = 0x81
        self.STREAM_TYPE_AUDIO_ALAW = 0x90  # A-law音频类型
        
        # 音视频流ID范围
        self.VIDEO_STREAM_MIN = 0xE0  # 视频流起始ID (0xE0-0xEF)
        self.VIDEO_STREAM_MAX = 0xEF
        self.AUDIO_STREAM_MIN = 0xC0  # 音频流起始ID (0xC0-0xDF)
        self.AUDIO_STREAM_MAX = 0xDF
        
        # 音频参数
        self.AUDIO_SAMPLE_RATE = 8000  # 采样率
        self.AUDIO_CHANNELS = 1        # 通道数
        self.AUDIO_SAMPLE_BITS = 16    # 采样位数

    def log(self, message):
        """输出调试信息"""
        if self.debug:
            print(message)

    def get_next_start_code(self, data: bytes, start_pos: int, code_type: int) -&gt; int:
        """查找下一个起始码"""
        for i in range(start_pos, len(data) - 4):
            if (data&#91;i] == 0x00 and data&#91;i + 1] == 0x00 and 
                data&#91;i + 2] == 0x01 and data&#91;i + 3] == code_type):
                return i
        return -1

    def get_next_start_code_range(self, data: bytes, start_pos: int, 
                                code_type_min: int, code_type_max: int) -&gt; int:
        """在指定范围内查找下一个起始码"""
        for i in range(start_pos, len(data) - 4):
            if (data&#91;i] == 0x00 and data&#91;i + 1] == 0x00 and 
                data&#91;i + 2] == 0x01 and 
                code_type_min &lt;= data&#91;i + 3] &lt;= code_type_max):
                return i
        return -1

    def process_stream(self, data: Union&#91;bytes, bytearray, int], buffer_size: Union&#91;DWORD, int]) -&gt; Optional&#91;StreamData]:
        """
        处理流式PS数据，返回解析出的音视频数据
        
        Args:
            data: 输入的PS流数据或指向数据的指针
            buffer_size: 码流头部或码流数据缓冲区大小（DWORD类型或整数）
            
        Returns:
            Optional&#91;StreamData]: 解析出的音视频数据，如果没有解析出数据则返回None
        """
        try:
            # 处理整数类型的data（指针）
            if isinstance(data, int):
                if data == 0:
                    return None
                
                # 获取实际的buffer_size值
                actual_buffer_size = buffer_size.value if hasattr(buffer_size, 'value') else buffer_size
                
                try:
                    # 使用ctypes从指针读取数据
                    data_ptr = cast(data, POINTER(c_char * actual_buffer_size))
                    data = bytes(data_ptr.contents)
                except Exception as e:
                    # 尝试使用string_at
                    try:
                        data = string_at(data, actual_buffer_size)
                    except Exception as e2:
                        return None
            elif not isinstance(data, (bytes, bytearray)):
                # 尝试转换为bytes
                try:
                    data = bytes(data)
                except:
                    return None
                
            # 将新数据添加到缓存
            # 检查buffer_size类型,支持DWORD和整数
            if hasattr(buffer_size, 'value'):
                actual_size = min(buffer_size.value, len(data))  # 使用buffer_size限制数据大小
            else:
                actual_size = min(buffer_size, len(data))  # 直接使用整数值
                
            self.buffer.extend(data&#91;:actual_size])
            
            # 如果数据太少，等待更多数据
            if len(self.buffer) &lt; 24:
                return None
                
            stream_data = StreamData()
            video_data = bytearray()
            audio_data = bytearray()
            pos = 0
            packet_start = 0
            
            while pos + 4 &lt;= len(self.buffer):
                # 查找PS包起始码
                pos = self.get_next_start_code(self.buffer, pos, 0xBA)
                if pos &lt; 0:
                    break
                    
                # 找到了一个完整的PS包
                if pos &gt; packet_start:
                    packet_data = self.buffer&#91;packet_start:pos]
                    # 处理PS包中的PES包
                    media_data = self._process_ps_packet_stream(packet_data)
                    if media_data.video:
                        video_data.extend(media_data.video)
                    if media_data.audio:
                        audio_data.extend(media_data.audio)
                
                packet_start = pos
                pos += 4
            
            # 保留未处理完的数据
            if packet_start &gt; 0:
                self.buffer = self.buffer&#91;packet_start:]
            
            if video_data:
                stream_data.video = bytes(video_data)
                
            if audio_data:
                # 将A-law音频数据转换为PCM
                pcm_data = AudioDecoder.alaw_to_pcm(audio_data)
                
                # 如果启用音频增强，则进行处理
                if self.enhance_audio:
                    pcm_data = AudioDecoder.enhance_audio(
                        pcm_data, 
                        volume_boost=self.VOLUME_BOOST,
                        clarity_enhance=self.CLARITY_ENHANCE
                    )
                
                stream_data.audio = pcm_data
                
            return stream_data if (stream_data.video or stream_data.audio) else None
        except Exception as e:
            if self.debug:
                print(f"Error in process_stream: {str(e)}")
            return None</code></pre>



<p>上述代码展示了一个简单的 PS 流读取示例，通过检查数据包的前几个字节来识别 PS 流的开始部分。在实际应用中，解析过程将更为复杂，需要深入分析 PS 流的格式规范，包括对视频和音频信息的深度解析。</p>



<p>4. 预览</p>



<p>当解析出音视频之后，就可以通过 websocket 或者其他方式，推送数据到前端页面进行播放，比如 <a href="https://github.com/samirkumardas/jmuxer" target="_blank" rel="noopener">JMuxer</a>、<a href="https://github.com/pkjy/pcm-player" target="_blank" rel="noopener">PCMPlayer </a>等播放器。</p>



<pre class="wp-block-code"><code>var jmuxer;
var pcmPlayer;
var ws;
var socketURL = 'ws://192.168.31.7:9999/api/v1/ws/stream/E82622073/1';
var reconnectAttempts = 0;
var maxReconnectAttempts = 5;
var reconnectInterval = 2000; // 2秒
var lastVideoTimestamp = 0;
var lastAudioTimestamp = 0;
var bufferThreshold = 3; // 减少视频缓冲帧数
var videoBuffer = &#91;];
var audioBuffer = &#91;];
var isBuffering = true;
var isPlaying = false;
var fps = 25; // 默认帧率
var frameDuration = 40; // 默认帧持续时间(ms)
var audioSampleRate = 8000; // 默认音频采样率
var audioChannels = 1; // 默认音频通道数
var syncThreshold = 30; // 进一步降低同步阈值
var baseTimestamp = 0; // 基准时间戳
var startPlayTime = 0; // 开始播放的时间
var audioQueue = &#91;]; // 音频数据队列
var maxAudioDelay = 100; // 进一步降低最大音频延迟
var audioBufferSize = 512; // 进一步减小音频缓冲区大小
var audioLatency = -500; // 预设负延迟补偿，让音频提前播放
var initialAudioDelay = 2000; // 初始音频延迟(ms)，用于预缓冲

function initPlayers() {
    if (jmuxer) {
        jmuxer.destroy();
    }
    
    jmuxer = new JMuxer({
        node: 'player',
        mode: 'video',
        flushingTime: frameDuration,
        fps: fps,
        debug: false
    });
    
    if (pcmPlayer) {
        pcmPlayer.destroy();
    }
    
    pcmPlayer = new PCMPlayer({
        inputCodec: 'Int16',
        channels: audioChannels,
        sampleRate: audioSampleRate,
        flushingTime: 20, // 减少刷新时间
        bufferSize: audioBufferSize
    });
    
    // 重置同步相关变量
    baseTimestamp = 0;
    startPlayTime = 0;
    lastVideoTimestamp = 0;
    lastAudioTimestamp = 0;
    audioQueue = &#91;];
    audioLatency = -500; // 初始化为负延迟
    isBuffering = true;
    isPlaying = false;
}

function getCurrentTime() {
    return performance.now();
}

function processVideoData(data, timestamp, isKeyFrame) {
    if (!startPlayTime &amp;&amp; isKeyFrame) {
        startPlayTime = getCurrentTime();
        baseTimestamp = timestamp;
        // 重置音频延迟补偿
        audioLatency = 0;
    }
    
    if (isBuffering) {
        videoBuffer.push({
            data: new Uint8Array(data),
            timestamp: timestamp,
            isKeyFrame: isKeyFrame
        });
        
        const hasKeyFrame = videoBuffer.some(frame =&gt; frame.isKeyFrame);
        if (videoBuffer.length &gt;= bufferThreshold &amp;&amp; hasKeyFrame) {
            isBuffering = false;
            // 按时间戳排序
            videoBuffer.sort((a, b) =&gt; a.timestamp - b.timestamp);
            for (let frame of videoBuffer) {
                jmuxer.feed({
                    video: frame.data,
                    duration: frameDuration
                });
            }
            videoBuffer = &#91;];
            isPlaying = true;
            console.log('开始播放视频');
        }
    } else {
        if (startPlayTime) {
            const relativeTimestamp = timestamp - baseTimestamp;
            const systemTime = getCurrentTime() - startPlayTime;
            const diff = relativeTimestamp - systemTime;
            
            // 调整视频播放速度
            const video = document.getElementById('player');
            if (Math.abs(diff) &gt; syncThreshold) {
                if (diff &gt; 0) {
                    // 视频超前，稍微减慢
                    video.playbackRate = 0.9; // 更激进的速度调整
                } else {
                    // 视频滞后，稍微加快
                    video.playbackRate = 1.1; // 更激进的速度调整
                }
            } else {
                video.playbackRate = 1.0;
            }
        }
        
        jmuxer.feed({
            video: new Uint8Array(data),
            duration: frameDuration
        });
    }

}

function processAudioData(data, timestamp) {
    if (!startPlayTime || !isPlaying) {
        return; // 等待视频开始播放
    }
    
    const relativeTimestamp = timestamp - baseTimestamp;
    const systemTime = getCurrentTime() - startPlayTime;
    const diff = relativeTimestamp - systemTime;
    
    // 将音频数据和时间戳加入队列
    audioQueue.push({
        data: new Int16Array(data),
        timestamp: timestamp
    });
    
    // 按时间戳排序
    audioQueue.sort((a, b) =&gt; a.timestamp - b.timestamp);
    
    // 处理音频队列
    while (audioQueue.length &gt; 0) {
        const audioData = audioQueue&#91;0];
        const audioDiff = (audioData.timestamp - baseTimestamp) - (getCurrentTime() - startPlayTime + audioLatency);
        
        if (audioDiff &gt; maxAudioDelay) {
            // 音频延迟太大，丢弃数据并增加延迟补偿
            audioQueue.shift();
            audioLatency = Math.max(-1000, audioLatency - 100); // 更激进地减少延迟补偿
            continue;
        }
        
        if (audioDiff &lt; -maxAudioDelay) {
            // 音频太滞后，跳过并减少延迟补偿
            audioQueue.shift();
            audioLatency = Math.min(0, audioLatency + 100); // 更激进地增加延迟补偿
            continue;
        }
        
        // 处理音频数据
        const samples = audioData.data;
        if (Math.abs(audioDiff) &gt; syncThreshold) {
            // 需要调整音频速度
            if (audioDiff &gt; 0) {
                // 音频超前，跳过更多样本
                const skipSamples = Math.min(Math.floor(audioDiff * audioSampleRate / 1000), samples.length / 2);
                if (skipSamples &lt; samples.length) {
                    pcmPlayer.feed(samples.slice(skipSamples));
                }
            } else {
                // 音频滞后，更激进地加快播放速度
                const speedupFactor = 1.2; // 加快20%
                const resampledLength = Math.floor(samples.length / speedupFactor);
                const resampledData = new Int16Array(resampledLength);
                
                for (let i = 0; i &lt; resampledLength; i++) {
                    const originalIndex = Math.floor(i * speedupFactor);
                    resampledData&#91;i] = samples&#91;originalIndex];
                }
                
                pcmPlayer.feed(resampledData);
            }
        } else {
            // 正常播放
            pcmPlayer.feed(samples);
        }
        
        audioQueue.shift();
    }
    
    // 限制队列长度
    if (audioQueue.length &gt; 3) { // 进一步减少队列最大长度
        audioQueue.splice(0, audioQueue.length - 3);
    }
}

function connectWebSocket() {
    if (ws &amp;&amp; ws.readyState === WebSocket.OPEN) {
        ws.close();
    }
    
    // 重置状态
    videoBuffer = &#91;];
    audioBuffer = &#91;];
    audioQueue = &#91;];
    isBuffering = true;
    isPlaying = false;
    baseTimestamp = 0;
    startPlayTime = 0;
    
    ws = new WebSocket(socketURL);
    ws.binaryType = 'arraybuffer';
    
    ws.addEventListener('open', function() {
        console.log('WebSocket connected');
        reconnectAttempts = 0;
    });
    
    ws.addEventListener('message', function(event) {
        try {
            if (typeof event.data === 'string') {
                const config = JSON.parse(event.data);
                if (config.type === 'config') {
                    fps = config.fps || fps;
                    frameDuration = Math.floor(1000 / fps);
                    audioSampleRate = config.audioSampleRate || audioSampleRate;
                    audioChannels = config.audioChannels || audioChannels;
                    initPlayers();
                    console.log(`配置更新: fps=${fps}, frameDuration=${frameDuration}ms, audioSampleRate=${audioSampleRate}, audioChannels=${audioChannels}`);
                }
                return;
            }
            
            const arrayBuffer = event.data;
            const dataView = new DataView(arrayBuffer);
            const messageType = dataView.getUint8(0);
            const timestamp = Number(dataView.getBigUint64(1, false));
            const isKeyFrame = dataView.getUint8(9) === 1;
            const dataLength = dataView.getUint32(10, false);
            const actualData = arrayBuffer.slice(14, 14 + dataLength);
            
            if (messageType === 1) {
                lastVideoTimestamp = timestamp;
                processVideoData(actualData, timestamp, isKeyFrame);
            } else if (messageType === 2) {
                lastAudioTimestamp = timestamp;
                processAudioData(actualData, timestamp);
            }
        } catch (e) {
            console.error('Error processing message:', e);
            if (e.toString().includes('decode') || e.toString().includes('NAL')) {
                console.log('重置播放器以恢复播放');
                initPlayers();
                isBuffering = true;
                videoBuffer = &#91;];
                audioBuffer = &#91;];
                audioQueue = &#91;];
            }
        }
    });
    
    ws.addEventListener('error', function(e) {
        console.error('WebSocket Error:', e);
        attemptReconnect();
    });
    
    ws.addEventListener('close', function() {
        console.log('WebSocket closed');
        if (isPlaying) {
            attemptReconnect();
        }
    });
}

function attemptReconnect() {
    if (reconnectAttempts &lt; maxReconnectAttempts) {
        reconnectAttempts++;
        setTimeout(function() {
            initPlayers();
            connectWebSocket();
        }, reconnectInterval);
    }
}

window.onload = function() {
    initPlayers();
    connectWebSocket();
};

window.onbeforeunload = function() {
    if (ws) {
        ws.close();
    }
    if (jmuxer) {
        jmuxer.destroy();
    }
    if (pcmPlayer) {
        pcmPlayer.destroy();
    }
};</code></pre>



<h2 class="wp-block-heading">方案二：直接通过 RTSP 进行拉流​</h2>



<p>1. RTSP 简介​</p>



<p><a href="https://blog.csdn.net/m0_73443478/article/details/137231316" target="_blank" rel="noopener">RTSP</a>（Real &#8211; Time Streaming Protocol）是一种应用层协议，用于控制实时媒体数据的传输，如音视频流。它允许客户端从服务器（如 NVR 设备）请求媒体流，并对媒体流的播放、暂停、快进等操作进行控制。在海康威视的监控体系中，RTSP 是一种常用的获取实时音视频流的方式。​</p>



<p>2. 拉流流程​</p>



<ul class="wp-block-list">
<li><strong>配置 NVR 设备</strong>：登录 NVR 设备的管理界面，在网络配置或视频流配置部分，确保 RTSP 服务已启用，并设置合适的端口（通常默认为 554）。同时，配置好用户名和密码，用于客户端进行身份验证。不同型号的 NVR 设备配置界面可能略有差异，但基本的配置选项类似。​</li>
</ul>



<ul class="wp-block-list">
<li><strong>确定 RTSP 地址格式</strong>：海康威视 NVR 设备的 RTSP 地址通常遵循一定的格式，例如：rtsp://username:password@nvr_ip:port/mpeg/ch33/sub/av_stream。其中，username和password是在 NVR 设备上配置的登录用户名和密码，nvr_ip是 NVR 设备的 IP 地址，port是 RTSP 服务端口，mpeg 是指定格式，ch33是要获取的视频通道号， 33 表示第一个通道， sub 指定子码流。例如，若 NVR 设备的 IP 为 192.168.1.100，用户名是 admin，密码是 123456，视频通道号为 1，RTSP 地址则为rtsp://admin:123456@192.168.1.100:554/mpeg/ch33/sub/av_stream。​</li>
</ul>



<ul class="wp-block-list">
<li><strong>客户端拉流</strong>：在客户端应用程序中，使用支持 RTSP 协议的库或组件来发起拉流请求。例如，在基于 FFmpeg 的应用中，可以使用 FFmpeg 的相关 API 函数。​</li>
</ul>



<p>3. 内网穿透实现（通过硬件设备）​</p>



<p>由于 NVR 设备可能位于内网环境中，而客户端可能需要从外网访问，此时需要进行内网穿透。一种常见的方式是使用硬件设备进行内网穿透，如使用具有内网穿透功能的路由器或专门的内网穿透硬件设备。​</p>



<ul class="wp-block-list">
<li><strong>硬件设备设置</strong>：将硬件设备连接到内网环境中，并进行相应的配置。配置过程通常需要保证设备与 NVR 设备处于同个局域网，使其能够与内网中的 NVR 设备和其他网络设备正常通信。然后，在硬件设备的管理界面中，配置内网穿透规则。例如，将 NVR 设备的 RTSP 服务端口（如 554）映射到硬件设备的公网 IP 地址的某个端口上。​</li>
</ul>



<ul class="wp-block-list">
<li><strong>端口映射与转发</strong>：硬件设备会将来自外网的针对特定端口（如映射后的端口）的请求，转发到内网中 NVR 设备的 RTSP 服务端口。这样，客户端在外网通过访问硬件设备的公网 IP 地址和映射端口，硬件设备会将请求转发给内网中的 NVR 设备，从而实现从外网访问内网中的 NVR 设备的 RTSP 流。在配置端口映射时，需要注意选择合适的公网端口，避免与其他服务端口冲突，并确保硬件设备的安全性，如设置访问密码或进行 IP 地址过滤等。​</li>
</ul>



<p>通过以上两种方案，可以基于海康威视 ISUP5.0 实现 NVR 设备的接入，满足不同场景下对 NVR 设备音视频数据获取和处理的需求。在实际应用中，需要根据具体的网络环境、业务需求和技术能力选择合适的方案，并进行合理的配置和优化。​</p>



<ul class="wp-block-list">
<li>SDK 下载地址：<a href="https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10" target="_blank" rel="noopener">https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10</a></li>



<li>JMuxer 播放器：<a href="https://github.com/samirkumardas/jmuxer" target="_blank" rel="noopener">https://github.com/samirkumardas/jmuxer</a></li>



<li>PCMPlayer 播放器：<a href="https://github.com/pkjy/pcm-player" target="_blank" rel="noopener">https://github.com/pkjy/pcm-player</a></li>
</ul>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xyuannetwork.com/hikvision-isup5-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
