- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
可视化WIFI遥控搬运机器人之客户端设计
可视化WIFI遥控搬运机器人之服务器搭建
http://www.cntronics.com/rf-art/80025761
可视化WIFI遥控搬运机器人之硬件部分设计
http://www.cntronics.com/rf-art/80025732
本设计主要研究基于WIFI网络的可视化无线遥控搬运机器人,利用WIFI网络高速传输实时视频图像采集,通过机器人安装的传感器实现数据采集。采用WIFI网络通讯使得控制端多样化,可用手机,电脑等具备WIFI功能的设备进行控制。此外,还可将机器人接入Internet实现更远距离的控制。本设计在S3C6410平台上移植了Linux操作系统用于接收命令并对硬件设备进行控制,其中移植了MJPGstreamer作为视频服务器,移植了BOA服务器作为WEB服务器。本文将从硬件设计,驱动程序编写,服务器移植,服务程序编写,Android应用程序编写,Web应用程序编写等方面来讲述本设计的功能实现。
总体设计及硬件选型和电路部分:可视化WIFI遥控搬运机器人(1):硬件部分
驱动程序编写,服务器移植,服务程序编写部分:可视化WIFI遥控搬运机器人(2):服务器搭建
4 客户端程序设计
4.1 Android客户端设计
4.1.1 Android客户端软件流程图
图 4-1 Android应用程序流程图
如图4-1所示,Android端的应用程序采用多线程技术,其中一个子线程每60S向服务器发送一个获取电量的命令并根据收到的数据进行更新显示,另一个线程根据MJPEG协议来解析出图像数据并更新显示,主线程主要完成用户操控事件的监听,并根据用户的实际操控发送相应的命令给服务器并从服务器获得机器人的最新数据来实时更新。其命令的发送方式采用HTTP协议中的GET方法。
4.1.2 HTTP GET方法简介
GET方法是HTTP协议中定义的多种与服务器进行交互的方法之一,它一般用于获取/查询资源信息。该方法请求的数据会附在URL之后,并且提交的数据最多只能是1024字节,但是本设计中只需要传送命令字即可,因此采用GET方法来传送命令字与获取机器人数据信息。使用该方法来发送命令,服务器端的CGI程序可以在QUERY-STRING环境变量中非常方便的获取到客户端传送给服务器的数据,并且客户端应用程序可以在HttpResponse中获得服务器端返回的数据。
4.1.3 HTTP GET方法实现
Android应用中HTTP GET方法实现部分代码如下:
public String doGet(String url){
//参数设置
...
//创建 HttpClient 的实例
HttpClient httpClient = new DefaultHttpClient(httpParams);
// GET
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
// 使用getEntity方法获得返回结果
return EntityUtils.toString(response.getEntity());
}
...
}
4.1.4 Mjpeg协议介绍
Mjpeg即Motion JPEG。MJPEG将服务器端发送来的一张张JPG图像数据发送给客户端,客户端不断的接收图像数据并显示更新即形成了动态的图像。MJPEG在HTTP中mjpg的在http的mime type是"x-mixed-replace"。获取视频图像数据时,客户端首先发一个GET方法,如果服务器接收响应则会设置context type的boundary子属性来指明。然后服务器端开始发送图片数据,在数据头部会有图片类型以及大小信息,其中Content-Length字段指明图像数据的长度,Content-Type字段指明图像的类型其值为image/jpeg。当一帧图像数据发送完毕后,服务器端将会发送边界字符串来表示一帧图像发送结束。
[page]4.1.5 Mjpeg解析图像数据流程图
图 4-2 Mjpeg解析图像流程图
4.1.6 Mjpeg解析图像数据代码
在Android客户端需要根据Mjpeg协议来编写代码实现图像数据的解析,其中部分代码如下:
Socket server = new Socket(url.getHost(), url.getPort());
OutputStream os = server.getOutputStream();
InputStream is = server.getInputStream();
StringBuffer request = new StringBuffer();
request.append("GET " + url.getFile() + " HTTP/1.0rn");
request.append("Host: " + url.getHost() + "rn");
request.append("rn");
os.write(request.toString().getBytes(), 0, request.length());//请求返回File
StreamSplit localStreamSplit = new StreamSplit(new DataInputStream(new BufferedInputStream(is)));
Hashtable localHashtable = localStreamSplit.readHeaders();//获得文件的信息头
String str3 = (String)localHashtable.get("content-type");//获得content-type以后的数据
int n = str3.indexOf("boundary=");//定位边界字符串
Object localObject2 = "--";
if (n != -1){
localObject2 = str3.substring(n + 9);//指定到boundary子属性
str3 = str3.substring(0, n);
if (!((String)localObject2).startsWith("--"))
localObject2 = "--" + (String)localObject2;}
if (str3.startsWith("multipart/x-mixed-replace")){//判断MIME类型
localStreamSplit.skipToBoundary((String)localObject2);//定位到图像数据部分
}do{
if (localObject2 != null){
localHashtable = localStreamSplit.readHeaders();
if (localStreamSplit.isAtStreamEnd())
break;
str3 = (String)localHashtable.get("content-type");
if (str3 == null)
throw new Exception("No part content type");
}
if (str3.startsWith("multipart/x-mixed-replace")){
n = str3.indexOf("boundary=");
localObject2 = str3.substring(n + 9);//获得
localStreamSplit.skipToBoundary((String)localObject2);
}else{
byte[] localObject3 = localStreamSplit.readToBoundary((String)localObject2);
if (localObject3.length == 0)
break;
Message message = Message.obtain();
message.arg1 = 0;
message.obj = BitmapFactory.decodeByteArray(localObject3, 0, localObject3.length);
messageHandler.sendMessage(message);//显示消息
}
fps++;
try{
Thread.sleep(10L);
}catch (InterruptedException localInterruptedException){
}
[page]4.2 Web客户端设计
4.2.1 Web客户端程序流程图
如图4-3所示,WEB客户端采用AJAX技术,其功能模块大体上分为3个部分:第一部分主要是监测用户的操作并采用HTTP GET方法来发送控制命令,最后将服务器返回的信息更新显示。第二部分主要为120S定时发送获取电源电量值得命令,并将获得的数据更新显示。第三部分获取图像数据并显示。
图 4-3 WEB客户端流程图
4.2.2 AJAX技术简介
AJAX(Asynchronous Javascript + XML)即异步JavaScript和XML技术的简称,它可以实现网页异步更新。采用该方法来设计WEB应用,可以只对网页的部分内容进行更新,而不需要重新对整个页面进行加载。其工作原理如下图所示:
图 4-4 AJAX工作原理
4.2.3 图像数据显示实现
采用WEB浏览器来显示的时候只需要添加如下代码:
<img src="http://192.168.2.1:8080/?action=stream" style="width:640px; height:480px;"/>
4.2.4 利用AJAX技术实现命令发送与数据更新
XMLHttpRequest 是 AJAX 的最基础的部分,本设计中的部分代码如下:
function SendCmd(cmd)
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","./car.cgi?"+cmd,true);
xmlhttp.send();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var rec=xmlhttp.responseText;
if( rec.indexOf("PRE") == 0)
{
document.getElementById("Pressure").innerHTML="压力:"+rec.substr(4);
}
if( rec.indexOf("POW") == 0)
{
var get_power=parseFloat(rec.substr(4));
get_power=9.9*get_power/1024;
if(power == 0)
power=get_power;
if(get_power<=power && power-get_power<0.2)
{
power=get_power;
if(power>8.3)
document.getElementById("Power").innerHTML="电量:100%";
else if(power>8.2)
...
}
}
}
}
}
5 结束语
本文从硬件选型,硬件电路设计,系统移植,驱动程序移植编写,服务器搭建,服务器程序编写,以及Android客户端和Web客户端应用程序编写方面进行了较为详细的介绍。通过自己的努力,完成了最低层的硬件设计到最上层软件开发,实现了本设计的基本功能。最终用户能够通过Android客户端和Web客户端对机器人进行夹持,运输,摆放动作的控制,并且能够实时地返回机器人采集到的图像数据和传感器数据。
由于本设计基于成本的考虑,并没有采用大功率高精度的硬件设备,所以只能作为一种功能演示以及技术可行性演示。在后续的工作中还可以提升硬件设备,调整应用程序来获得更好的使用价值以及更好的用户体验。
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掑鏅悷婊冪箻楠炴垿濮€閵堝懐鐤€濡炪倖妫佸Λ鍕償婵犲洦鈷戠憸鐗堝笒娴滀即鏌涢悩鍐叉诞鐎规洘鍨块獮姗€骞囨担鐟板厞婵$偑鍊栭崝鎴﹀垂閸︻厾鐭堟い鏇楀亾婵﹥妞藉Λ鍐ㄢ槈濞嗘ɑ顥i梻浣呵归敃銈夆€﹂悜鐣屽祦闁硅揪绠戠粈瀣亜閹烘垵鈧骞婂┑鍡╂富闁靛牆妫涙晶顒傜棯閺夎法孝闁宠绉电换婵嬪炊閵娿垺瀚藉┑鐐存尰閸╁啴宕戦幘瀵哥濞达絽鍟垮ú锕傚疾椤掑嫮鍙撻柛銉e妿閳藉鏌i幒鎴犱粵闁靛洤瀚伴獮鎺楀箣濠垫劒鎮i梻浣芥閸熶即宕伴弽顓炶摕闁哄洢鍨归柋鍥ㄧ節閸偄濮堥弫鍫ユ⒒娴e懙褰掝敄閸愵喖绀夌€广儱顦闂佸憡娲﹂崹浼村礃閳ь剟姊洪棃娑掑悍濠碘€虫搐閳绘捇濡堕崱娆戠槇闂佸啿鐨濋崑鎾绘煕閺囥劌澧版い锔垮嵆濮婃椽宕崟顓犲姽缂傚倸绉崇欢姘舵偘椤斿槈鐔煎礂閻撳孩鐎梻浣告啞濞诧箓宕㈣ぐ鎺戠劦妞ゆ巻鍋撻柨鏇ㄤ簻椤繐煤椤忓懎浠梺鍝勵槹鐎笛傜昂濠碉紕鍋戦崐鏍垂閻㈡潌鍥偨缁嬭銉ッ归敐鍛棌婵炵鍔戦弻宥堫檨闁告挾鍠栭悰顕€宕橀纰辨綂闂侀潧鐗嗛幊搴g玻濞戞瑧绡€闁汇垽娼у瓭闁诲孩鍑归崢濂稿煝閹炬椿鏁婇柛鎾楀拑绱抽梻浣呵归張顒勬嚌妤e啫鐒垫い鎺戝濡垹绱掗鑲╁缂佹鍠栭崺鈧い鎺戝閳ь兛绶氬浠嬵敇閻愭鍚呴梻浣瑰濞插秹宕戦幘鍓佺<闁绘瑢鍋撻柛銊ョ埣瀵濡搁埡鍌氫簽闂佺ǹ鏈粙鎴︻敂閿燂拷 | More...
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掑鏅悷婊冪箻楠炴垿濮€閵堝懐鐤€濡炪倖妫佸Λ鍕償婵犲洦鈷戠憸鐗堝笒娴滀即鏌涢悩鍐叉诞鐎规洘鍨块獮姗€骞囨担鐟板厞婵$偑鍊栭崝鎴﹀垂閸︻厾鐭堟い鏇楀亾婵﹥妞藉Λ鍐ㄢ槈濞嗘ɑ顥i梻浣呵归敃銈夆€﹂悜鐣屽祦闁硅揪绠戠粈瀣亜閹烘垵鈧骞婂┑鍡╂富闁靛牆妫涙晶顒傜棯閺夎法孝闁宠绉电换婵嬪炊閵娿垺瀚藉┑鐐存尰閸╁啴宕戦幘瀵哥濞达絽鍟垮ú锕傚疾椤掑嫮鍙撻柛銉e妿閳藉鏌i幒鎴犱粵闁靛洤瀚伴獮鎺楀箣濠垫劒鎮i梻浣芥閸熶即宕伴弽顓炶摕闁哄洢鍨归柋鍥ㄧ節閸偄濮堥弫鍫ユ⒒娴e懙褰掝敄閸愵喖绀夌€广儱顦闂佸憡娲﹂崹浼村礃閳ь剟姊洪棃娑辨Ф闁稿寒鍣e畷鎴﹀箻鐠囨彃鍞ㄥ銈嗗姉閸犲孩绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柟闂寸绾惧鏌i幇顒佹儓闁搞劌鍊块弻娑㈩敃閿濆棛顦ョ紓浣哄Т缂嶅﹪寮诲澶婁紶闁告洦鍓欏▍锝夋⒑缁嬭儻顫﹂柛鏃€鍨垮濠氭晲婢跺﹦鐤€闂傚倸鐗婄粙鎴﹀煕閹烘垟鏀介柣鎰皺婢ф梻绱掗鐣屾噰鐎殿喖顭锋俊鎼佸煛閸屾矮绨介梻浣呵归張顒傜矙閹达富鏁傞柨鐕傛嫹闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸ゅ嫰鏌涢幘鑼妽闁稿繑绮撻弻娑㈩敃閿濆棛顦ラ梺姹囧€楅崑鎾舵崲濠靛顥堟繛鎴濆船閸擃參姊洪柅鐐茶嫰閸樻悂鏌i幒鐐差洭闁瑰箍鍨归埞鎴犫偓锝庝簽閸婄偤姊洪懖鈹e綊鎮樺顑芥瀺闁瑰墽绮埛鎺懨归敐鍛暈闁哥喓鍋炵换娑氭嫚瑜忛悾鐢碘偓瑙勬礃缁矂鍩ユ径鎰潊闁抽敮鍋撻柟绋垮暣濮婃椽宕ㄦ繝鍐槱闂佺ǹ绻戠粙鎾诲箲閵忋倕骞㈡繛鎴炵懅閸橆亪姊洪崜鎻掍簼缂佽鍟村畷宕囨喆閸曗晙绨婚棅顐㈡处閹搁箖骞楅悩鐫酣宕惰闊剚銇勯姀鈩冪妞ゃ垺顨嗛幏鍛村礈闊厾澶�
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掑鏅悷婊冪箻楠炴垿濮€閵堝懐鐤€濡炪倖妫佸Λ鍕償婵犲洦鈷戠憸鐗堝笒娴滀即鏌涢悩鍐叉诞鐎规洘鍨块獮姗€骞囨担鐟板厞婵$偑鍊栭崝鎴﹀垂閸︻厾鐭堟い鏇楀亾婵﹥妞藉Λ鍐ㄢ槈濞嗘ɑ顥i梻浣呵归敃銈夋倶濠靛鍋╅梺鍨儑闂勫嫮绱掔€n亞浠㈢€规挸妫濆铏圭磼濡搫顫嶅銈嗘⒐閻楁洖宓勫┑鐐叉▕娴滄繈鎮¢悢鍏肩厽闁哄倹瀵ч幉鎼佹煟椤撶偠瀚版い顓″劵椤﹁櫕銇勯妸銉уⅵ鐎殿噮鍋婇、姘跺焵椤掑嫮宓侀柟鐑橆殔缁秹鏌嶈閸撶喎顕i崘娴嬪牚闁割偆鍠撻崢鐢告⒑鐠団€崇仭婵犮垺枪椤e潡姊绘担铏瑰笡闁规悂绠栧畷浼村箛閺夎锕傛煕閺囥劌鐏遍柡浣稿暞閵囧嫰骞囬埡浣轰患缂備胶濮惧畷鐢垫閹惧瓨濯撮柣銈庡灠閸橈繝姊虹粙璺ㄧ闁挎洏鍨归锝嗙節濮橆厽娅滄繝銏e煐钃遍柡鍜冪秮濮婅櫣绱掑Ο鍝勵潔缂備椒鐒﹂幐鎶界嵁閹版澘绀冩い鏃囆掗幏娲⒑閼姐倕鏋戞繝銏∶嵄缂備焦菧娴滄粓鏌熺€涙ḿ绠ユ俊顖楀亾闂備胶绮笟妤呭闯閿濆宓侀悗锝庡枟閺呮繈鏌嶈閸撴稓鍒掔拠娴嬫闁靛繆妾ч幏濠氭⒑閸撴彃浜為柛鐘虫崌閸╁﹪寮撮姀锛勫幈婵犵數濮撮崐鍧楀矗閸曨剚鍙忓┑鐘插鐢盯鏌熷畡鐗堝殗闁圭厧缍婇悰顔芥償閹惧厖澹曟繝鐢靛Т濞诧箓鎮″☉銏$厱婵炴垵宕弸銈囩磼閻橀潧浠遍柡灞炬礋瀹曢亶寮撮悩鎻掝瀴缂傚倷鑳剁划顖滄崲閸繄鏆﹂柛顐f礃閸ゅ鏌涢…鎴濅簼闁绘繐绠撳濠氬磼濞嗘埈妲梺瑙勭ゴ閳ь剝绉ú顏呮櫇闁稿本鑹鹃崑宥夋⒑娴兼瑧鍒板璺烘喘瀹曟垿骞橀幇浣瑰兊濡炪倖鎸鹃崑娑㈠箺閻㈠憡鈷戦柛婵嗗濠€浼存煟閳哄﹤鐏﹂柣娑卞枛铻e〒姘煎灡鐎靛矂鏌i悩鍙夌┛鐎殿喗鎸荤粩鐔煎即閵忊檧鎷绘繛杈剧到閹诧繝骞嗛崼銉︾厽妞ゆ挾鍎愬Ο鈧Δ鐘靛仜缁绘﹢寮幘缁樻櫢闁跨噦鎷�
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗霉閿濆牊顏犵紒鈧繝鍌楁斀闁绘ɑ褰冮埀顒€顕槐鎾愁潩鏉堛劌鏋戦梺鍝勫暙閻楀嫰鍩€椤戣法绐旂€殿喕绮欓、姗€鎮欓懠鍨涘亾閸喒鏀介柨娑樺娴犙呯磼椤曞懎鐏︾€殿噮鍋婇幃鈺冪磼濡攱瀚奸梻鍌欑贰閸嬪棝宕戝☉銏″殣妞ゆ牗绋掑▍鐘炽亜閺傛娼熷ù婊勭矋閵囧嫰骞樼捄杞版勃闂佺ǹ顑冮崕鎶藉焵椤掑喚娼愭繛鍙夌矒楠炲﹪骞樼拠鑼弨婵犮垼娉涜墝闁哄閰i弻鐔兼焽閿曗偓閺嬫稓绱掗幓鎺撳仴婵﹤顭峰畷鎺戔枎閹存繂顬夐梻浣筋嚃閸犳牠鎮ラ悡搴f殾闁圭増婢橀崡鎶芥煟韫囨凹鍤欑紓宥咃躬楠炲啫饪伴崼鐔风檮婵犮垼娉涢惌鍫ュ船閻㈠憡鈷戦悹鍥ㄥ絻閸よ京绱撳鍛棦鐎规洑鍗冲浠嬵敃閵堝嫮鐟濋梻浣告惈鐞氼偊宕曢弻銉﹀亗婵炲棗绶疯ぐ鎺撳亗閹艰揪绲鹃幉鐓庘攽閻愭潙姣嗛柛銉e妿閸橀潧顪冮妶鍡橆梿鐎规洜鏁哥划锝夊籍閳ь剟骞堥妸锔剧瘈闁告侗鍣禒鈺呮⒑閸涘﹦澧柣妤冨Т椤曪綁骞橀钘変簻闂佸憡绺块崕杈╁緤閸喒鏀介柨娑樺娴滃ジ鏌涙繝鍐ㄧ伌鐎规洜顢婇妵鎰板箳閹惧瓨鐝栨俊鐐€曠换鎰版偋閸曨垰鐒垫い鎴f硶椤︼箓鏌嶇拠鏌ュ弰妤犵偞锚閻g兘宕堕懜鏁屟冣攽閿涘嫬浜奸柛濠冪墵楠炴劖銈i崘銊х崶闁瑰吋鐣崝宥夊磻閻旇褰掓偂鎼达絾鎲奸梺鎶芥敱閸ㄥ潡寮诲☉妯锋婵鐗婇弫楣冩煟鎼达紕浠涢柣鐔叉櫊瀵顓奸崼顐n€囬梻浣告啞閹搁箖宕版惔顭戞晪闁挎繂妫涚弧鈧┑顔斤供閸樿棄鈻嶉姀銈嗏拺閻犳亽鍔屽▍鎰版煙閸戙倖瀚�
婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繐霉閸忓吋缍戦柛銊ュ€婚幉鎼佹偋閸繄鐟查梺绋匡工閻栧ジ寮诲☉銏╂晝闁绘ɑ褰冩慨搴ㄦ⒑濮瑰洤鈧宕戦幘鑸靛床婵犻潧顑嗛ˉ鍫熺箾閹存繂鑸归柛鎾插嵆濮婃椽宕ㄦ繝鍛棟缂傚倸绉撮敃顏堟偘椤曗偓瀵粙濡搁敂鍓ら梻浣告啞閹稿棝宕ラ柨瀣仸缂佺粯绻傞埢鎾诲垂椤斿彞鍝楅梻渚€娼ч悧濠囧箖閸屾凹鍤曞┑鐘崇閸嬪嫰鏌i幋鐏活亪寮搁崒鐐粹拺闁告稑锕ユ径鍕煕鐎n亜顏い銈呭€垮濠氬磼濞嗘埈妲梺纭咁嚋缁绘繂鐣峰ú顏勭妞ゆ棁鍋愰敍娑㈡⒑閻熸澘鈷旂紒顕呭灦閹繝鎮㈤悡搴n啇濠电儑缍嗛崜娆撳焵椤戞儳鈧洖鐜婚崸妤€绠涢柣妤€鐗忛崢闈涱渻閵堝棙顥嗛柛瀣姍瀹曟椽鏁愰崶锝呬壕閻熸瑥瀚粈鍐╃箾閼碱剙鏋涢柣娑卞枟閹棃濡搁敃鈧惂鍕節閵忥絾纭鹃柤娲诲灦閻涱噣骞掑Δ浣叉嫽婵炶揪绲挎灙闁诡喗鍨圭槐鎺撴媴鐟欏嫬鍞夐悗娈垮枟瑜板啴銈导鏉戦唶婵犻潧娲╃欢銏$節閻㈤潧孝闁挎洏鍊濋幃褎绻濋崶銊ヤ簵闂佸搫娲ㄩ崰鍡樼濠婂牊鐓欓柡澶婄仢椤f娊鏌熼鍨汗缂佽鲸甯¢幃鈺冪驳绾應鍋撻崸妤佺厸閻忕偛澧介埥澶嬨亜椤愶絿绠炴い銏★耿閹晠宕橀崣澶屽酱闂傚倸鍊峰ù鍥敋閺嶎厼绐楁繛鎴緛缂嶆牕顭跨捄铏圭伇缂佺姵妫冮弻锝夊籍閸屾艾浠橀梺缁樺姇閿曪箓骞夌粙娆惧悑闁搞儮鏅欑粭澶愭⒑閼姐倕鏋涢柛瀣工閵嗘帗绻濆顓犲帾闂佸壊鍋呯换鍌炲汲濞嗗繆鏀介柨娑樺濞呮洜绱掓潏銊ユ诞妞ゃ垺鐟︾缓鐣岀矙閸喖寮峰┑掳鍊楁慨鐑藉磻濞戔懞鍥敍濠靛牅绨烽梻鍌欑閹测剝绗熷Δ鍛獥婵°倐鍋撻柍璇茬Ч婵偓闁靛牆妫岄幏娲煟閻樺厖鑸柛鏂胯嫰閳诲秹骞囬悧鍫㈠幍闂佸憡鍨崐鏍偓姘炬嫹