`
xixinfei
  • 浏览: 415789 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传

阅读更多

http://blog.csdn.net/jdsjlzx/article/details/8635884

通过构造基于 HTTP 协议的传输内容实现图片自动上传到服务器功能 。如果自己编码构造 HTTP 协议,那么编写的代码质量肯定不高,建议模仿 HttpClient .zip examples\mime\ClientMultipartFormPost.java 来实现,并通过源码来进一步理解如何优雅高效地构造 HTTP 协议传输内容。

 

 

 

自己构造 HTTP 协议传输内容的想法,从何而来呢?灵感启迪于这篇博文“Android下的应用编程——用HTTP协议实现文件上传功能 ”,以前从未想过通过抓取 HTTP 请求数据格式,根据协议自己构造数据来实现数据提交。哎,Out 了。因为 Apache HttpClient 框架就是通过此方式来实现的,以前从未注意到,看来以后要多多向前人学习啊!结 果是:阅读了此框架的源码后,才知道自己编写的代码和人家相比真不是一个档次的。现在已经下定决心了,多读开源框架代码,不但可以熟悉相关业务流程,而且 还可以学到设计模式在实际业务需求中的应用,更重要的是领悟其中的思想。业务流程、实践能力、框架思想,一举三得,何乐而不为呢。^_^

 

 

 

test.html 部分源码:

 

<form action="Your_Action_Url " method="post" enctype="multipart/form-data " name="form1" id="form1">
  <p>
    <label for="upload_file"></label>
    <input type="file" name="upload_file" id="upload_file " />
  </p>
  <p>
    <input type="submit" name="action" id="action " value="upload " />
  </p>
</form>

 

通过 HttpWatch 查看抓取到的包数据格式:

 

通过 HttpWatch 查看抓取到的包数据格式

 

 

 

下面将分别通过按照 HttpWatch 抓取下来的协议格式内容构造传输内容实现文件上传功能和基于 HttpClient 框架实现文件上传功能。

 

项目配置目录Your_Project/config ,相关文件 如下:

 

actionUrl.properties 文件内容:

 

Your_Action_Url

 

formDataParams.properties 文件内容(对应 HTML Form 属性内容):

 

action =upload

 

imageParams.properties 文件内容(这里文件路径已配置死了,不好!建议在程序中动态设置,即通过传入相关参数实现。):

 

upload_file =images/roewe.jpg

 

MIMETypes.properties 文件内容(参考自 Multimedia MIME Reference ):

 

jpeg:image/jpeg
jpg:image/jpeg
png:image/png
gif:image/gif

 

 

1. 在《Android下的应用编程——用HTTP协议实现文件上传功能 》代码的基础上,通过进一步改进得到如下代码(Java、Android 都可以 run):

 

  1. /** 
  2.  * 文件名称:UploadImage.java 
  3.  * 
  4.  * 版权信息:Apache License, Version 2.0 
  5.  * 
  6.  * 功能描述:实现图片文件上传。 
  7.  * 
  8.  * 创建日期:2011-5-10 
  9.  * 
  10.  * 作者:Bert Lee 
  11.  */  
  12.   
  13. /* 
  14.  * 修改历史: 
  15.  */  
  16. public class UploadImage {  
  17.     String multipart_form_data = "multipart/form-data";  
  18.     String twoHyphens = "--";  
  19.     String boundary = "****************fD4fH3gL0hK7aI6";    // 数据分隔符  
  20.     String lineEnd = System.getProperty("line.separator");    // The value is "\r\n" in Windows.  
  21.       
  22.     /* 
  23.      * 上传图片内容,格式请参考HTTP 协议格式。 
  24.      * 人人网Photos.upload中的”程序调用“http://wiki.dev.renren.com/wiki/Photos.upload#.E7.A8.8B.E5.BA.8F.E8.B0.83.E7.94.A8 
  25.      * 对其格式解释的非常清晰。 
  26.      * 格式如下所示: 
  27.      * --****************fD4fH3hK7aI6 
  28.      * Content-Disposition: form-data; name="upload_file"; filename="apple.jpg" 
  29.      * Content-Type: image/jpeg 
  30.      * 
  31.      * 这儿是文件的内容,二进制流的形式 
  32.      */  
  33.     private void addImageContent(Image[] files, DataOutputStream output) {  
  34.         for(Image file : files) {  
  35.             StringBuilder split = new StringBuilder();  
  36.             split.append(twoHyphens + boundary + lineEnd);  
  37.             split.append("Content-Disposition: form-data; name=\"" + file.getFormName() + "\"; filename=\"" + file.getFileName() + "\"" + lineEnd);  
  38.             split.append("Content-Type: " + file.getContentType() + lineEnd);  
  39.             split.append(lineEnd);  
  40.             try {  
  41.                 // 发送图片数据  
  42.                 output.writeBytes(split.toString());  
  43.                 output.write(file.getData(), 0, file.getData().length);  
  44.                 output.writeBytes(lineEnd);  
  45.             } catch (IOException e) {  
  46.                 throw new RuntimeException(e);  
  47.             }  
  48.         }  
  49.     }  
  50.       
  51.     /* 
  52.      * 构建表单字段内容,格式请参考HTTP 协议格式(用FireBug可以抓取到相关数据)。(以便上传表单相对应的参数值) 
  53.      * 格式如下所示: 
  54.      * --****************fD4fH3hK7aI6 
  55.      * Content-Disposition: form-data; name="action" 
  56.      * // 一空行,必须有 
  57.      * upload 
  58.      */  
  59.     private void addFormField(Set<Map.Entry<Object,Object>> params, DataOutputStream output) {  
  60.         StringBuilder sb = new StringBuilder();  
  61.         for(Map.Entry<Object, Object> param : params) {  
  62.             sb.append(twoHyphens + boundary + lineEnd);  
  63.             sb.append("Content-Disposition: form-data; name=\"" + param.getKey() + "\"" + lineEnd);  
  64.             sb.append(lineEnd);  
  65.             sb.append(param.getValue() + lineEnd);  
  66.         }  
  67.         try {  
  68.             output.writeBytes(sb.toString());// 发送表单字段数据  
  69.         } catch (IOException e) {  
  70.             throw new RuntimeException(e);  
  71.         }  
  72.     }  
  73.       
  74.     /** 
  75.      * 直接通过 HTTP 协议提交数据到服务器,实现表单提交功能。 
  76.      * @param actionUrl 上传路径 
  77.      * @param params 请求参数key为参数名,value为参数值 
  78.      * @param files 上传文件信息 
  79.      * @return 返回请求结果 
  80.      */  
  81.     public String post(String actionUrl, Set<Map.Entry<Object,Object>> params, Image[] files) {  
  82.         HttpURLConnection conn = null;  
  83.         DataOutputStream output = null;  
  84.         BufferedReader input = null;  
  85.         try {  
  86.             URL url = new URL(actionUrl);  
  87.             conn = (HttpURLConnection) url.openConnection();  
  88.             conn.setConnectTimeout(120000);  
  89.             conn.setDoInput(true);        // 允许输入  
  90.             conn.setDoOutput(true);        // 允许输出  
  91.             conn.setUseCaches(false);    // 不使用Cache  
  92.             conn.setRequestMethod("POST");  
  93.             conn.setRequestProperty("Connection""keep-alive");  
  94.             conn.setRequestProperty("Content-Type", multipart_form_data + "; boundary=" + boundary);  
  95.               
  96.             conn.connect();  
  97.             output = new DataOutputStream(conn.getOutputStream());  
  98.               
  99.             addImageContent(files, output);    // 添加图片内容  
  100.               
  101.             addFormField(params, output);    // 添加表单字段内容  
  102.               
  103.             output.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);// 数据结束标志  
  104.             output.flush();  
  105.               
  106.             int code = conn.getResponseCode();  
  107.             if(code != 200) {  
  108.                 throw new RuntimeException("请求‘" + actionUrl +"’失败!");  
  109.             }  
  110.               
  111.             input = new BufferedReader(new InputStreamReader(conn.getInputStream()));  
  112.             StringBuilder response = new StringBuilder();  
  113.             String oneLine;  
  114.             while((oneLine = input.readLine()) != null) {  
  115.                 response.append(oneLine + lineEnd);  
  116.             }  
  117.               
  118.             return response.toString();  
  119.         } catch (IOException e) {  
  120.             throw new RuntimeException(e);  
  121.         } finally {  
  122.             // 统一释放资源  
  123.             try {  
  124.                 if(output != null) {  
  125.                     output.close();  
  126.                 }  
  127.                 if(input != null) {  
  128.                     input.close();  
  129.                 }  
  130.             } catch (IOException e) {  
  131.                 throw new RuntimeException(e);  
  132.             }  
  133.               
  134.             if(conn != null) {  
  135.                 conn.disconnect();  
  136.             }  
  137.         }  
  138.     }  
  139.       
  140.     public static void main(String[] args) {  
  141.         try {  
  142.             String response = "";  
  143.               
  144.             BufferedReader in = new BufferedReader(new FileReader("config/actionUrl.properties"));  
  145.             String actionUrl = in.readLine();  
  146.               
  147.             // 读取表单对应的字段名称及其值  
  148.             Properties formDataParams = new Properties();  
  149.             formDataParams.load(new FileInputStream(new File("config/formDataParams.properties")));  
  150.             Set<Map.Entry<Object,Object>> params = formDataParams.entrySet();  
  151.               
  152.             // 读取图片所对应的表单字段名称及图片路径  
  153.             Properties imageParams = new Properties();  
  154.             imageParams.load(new FileInputStream(new File("config/imageParams.properties")));  
  155.             Set<Map.Entry<Object,Object>> images = imageParams.entrySet();  
  156.             Image[] files = new Image[images.size()];  
  157.             int i = 0;  
  158.             for(Map.Entry<Object,Object> image : images) {  
  159.                 Image file = new Image(image.getValue().toString(), image.getKey().toString());  
  160.                 files[i++] = file;  
  161.             }  
  162. //            Image file = new Image("images/apple.jpg", "upload_file");  
  163. //            Image[] files = new Image[0];  
  164. //            files[0] = file;  
  165.               
  166.             response = new UploadImage().post(actionUrl, params, files);  
  167.             System.out.println("返回结果:" + response);  
  168.         } catch (IOException e) {  
  169.             e.printStackTrace();  
  170.         }  
  171.     }  

2. 基于 HttpClient 框架实现文件上传,实例代码如下:

 

  1. /** 
  2.  * 文件名称:ClientMultipartFormPost.java 
  3.  * 
  4.  * 版权信息:Apache License, Version 2.0 
  5.  * 
  6.  * 功能描述:通过 HttpClient 4.1.1 实现文件上传。 
  7.  * 
  8.  * 创建日期:2011-5-15 
  9.  * 
  10.  * 作者:Bert Lee 
  11.  */  
  12.   
  13. /* 
  14.  * 修改历史: 
  15.  */  
  16. public class ClientMultipartFormPost {  
  17.     /** 
  18.      * 直接通过 HttpMime's MultipartEntity 提交数据到服务器,实现表单提交功能。 
  19.      * @return Post 请求所返回的内容 
  20.      */  
  21.     public static String filePost() {  
  22.         HttpClient httpclient = new DefaultHttpClient();  
  23.           
  24.         try {  
  25.             BufferedReader in = new BufferedReader(new FileReader("config/actionUrl.properties"));  
  26.             String actionUrl;  
  27.             actionUrl = in.readLine();  
  28.             HttpPost httppost = new HttpPost(actionUrl);  
  29.               
  30.             // 通过阅读源码可知,要想实现图片上传功能,必须将 MultipartEntity 的模式设置为 BROWSER_COMPATIBLE 。  
  31.             MultipartEntity multiEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
  32. //            MultipartEntity multiEntity = new MultipartEntity();  
  33.               
  34.             // 读取图片的 MIME Type 类型集  
  35.             Properties mimeTypes = new Properties();  
  36.             mimeTypes.load(new FileInputStream(new File("config/MIMETypes.properties")));  
  37.               
  38.             // 构造图片数据  
  39.             Properties imageParams = new Properties();  
  40.             imageParams.load(new FileInputStream(new File("config/imageParams.properties")));  
  41.             String fileType;  
  42.             for(Map.Entry<Object,Object> image : imageParams.entrySet()) {  
  43.                 String path = image.getValue().toString();  
  44.                 fileType = path.substring(path.lastIndexOf(".") + 1);  
  45.                 FileBody binaryContent = new FileBody(new File(path), mimeTypes.get(fileType).toString());  
  46. //                FileBody binaryContent = new FileBody(new File(path));  
  47.                 multiEntity.addPart(image.getKey().toString(), binaryContent);  
  48.             }  
  49.               
  50.             // 构造表单参数数据  
  51.             Properties formDataParams = new Properties();  
  52.             formDataParams.load(new FileInputStream(new File("config/formDataParams.properties")));  
  53.             for(Entry<Object, Object> param : formDataParams.entrySet()) {  
  54.                 multiEntity.addPart(param.getKey().toString(), new StringBody(param.getValue().toString()));  
  55.             }  
  56.               
  57.             httppost.setEntity(multiEntity);  
  58. //            Out.println("executing request " + httppost.getRequestLine());  
  59.               
  60.             HttpResponse response = httpclient.execute(httppost);  
  61.             HttpEntity resEntity = response.getEntity();  
  62.               
  63. //            Out.println("-------------------");  
  64. //            Out.println(response.getStatusLine());  
  65.             if(resEntity != null) {  
  66.                 String returnContent = EntityUtils.toString(resEntity);  
  67.                 EntityUtils.consume(resEntity);  
  68.                   
  69.                 return returnContent; // 返回页面内容  
  70.             }  
  71.         } catch (IOException e) {  
  72.             e.printStackTrace();  
  73.         } finally {  
  74.             // 释放资源  
  75.             httpclient.getConnectionManager().shutdown();  
  76.         }  
  77.         return null;  
  78.     }  
  79.   
  80.     // 测试  
  81.     public static void main(String[] args) {  
  82.         Out.println("Response content: " + ClientMultipartFormPost.filePost());  
  83.     }  
  84.   

 

分享到:
评论

相关推荐

    毕设单片机实战项目基于esp8266的高考倒计时.zip

    【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    毕设工坊:专注于计算机毕业设计项目的交流与资源共享平台,涵盖各类技术文档、代码示例及实战经验分享,助力学子顺利完成学业挑战

    毕设工坊:专注于计算机毕业设计项目的交流与资源共享平台,涵盖各类技术文档、代码示例及实战经验分享,助力学子顺利完成学业挑战。

    【window 可视化nvm管理node版本 nvm-desktop】

    【window 可视化nvm管理node版本 nvm-desktop】

    《基于YOLOv8的玉器识别系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    (源码)基于microbit编程语言的mymicrobit扩展插件项目.zip

    # 基于microbit编程语言的mymicrobit扩展插件项目 ## 项目简介 这是一个基于microbit编程语言的mymicrobit扩展插件项目。该项目旨在提供额外的功能和特性,以扩展microbit编程环境。通过此插件,用户可以轻松地在MakeCode环境中进行编程,实现对micro:bit设备的更多控制和功能实现。 ## 项目的主要特性和功能 1. 扩展性提供了丰富的积木块和代码库,允许用户轻松实现复杂的编程逻辑和功能扩展。 2. 图形化编程支持通过积木块形式的图形化编程,降低编程门槛,方便初学者快速上手。 3. 实时预览提供了积木块的实时预览功能,方便用户直观地了解代码块的逻辑和功能。 4. 与MakeCode无缝集成可以直接在MakeCode环境中导入和使用,无需额外的配置和安装。 ## 安装使用步骤

    毕设单片机实战项目基于ESP8266的局域网图片刷新显示系统.zip

    【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    《基于YOLOv8的印章分析系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    p111基于django的企业员工管理系统.zip

    项目资源包含:可运行源码+sql文件 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 有任何使用上的问题,欢迎随时与博主沟通,博主看到后会第一时间及时解答。 开发语言:Python 框架:django Python版本:python3.8 数据库:mysql 5.7 数据库工具:Navicat 开发软件:PyCharm 浏览器:谷歌浏览器

    第三章-局域网-思维导图

    第三章-局域网-思维导图

    机械工程PT300机械故障仿真测试台:高校教学与科研用精密振动分析及故障诊断实验系统了您提供的规范

    内容概要:PT300机械故障综合模拟实验台由瓦仑尼安教学设备有限公司生产,旨在帮助用户深入了解振动特征知识及复杂转子振动频谱分析,实现精密振动分析和精准故障诊断。该实验台能模拟轴承故障、不平衡、不对中、设备松动、转子摩擦等多种机械故障现象,可进行不同转速下的轴承故障频率识别、转子静动平衡模拟试验、设备启停机测试等实验。设备采用高效节能ABB三相交流电动机,配备高精度转速控制和测量模块,确保运行稳定。此外,实验台还设有透明防震安全罩和互锁开关,保障实验安全。; 适合人群:高校师生、科研人员等需要学习或研究机械故障诊断相关理论知识和实践技能的人群。; 使用场景及目标:①用于高校等教育机构的教学,辅助学生理解机械故障诊断的理论知识和实践技能;②满足科研人员进行机械故障诊断算法验证、故障特征分析等科研需求。; 其他说明:PT300机械故障综合模拟实验台的每个部件均经过高精度加工,确保在不同振动状态下稳定运行。用户可根据期望分析特定部件的故障特征。设备尺寸为735mm(长)×310mm(宽)×350mm(高),保修一年,且提供免费操作指导服务。

    Android毕设实战项目基于Android+Django+sqlit3开发.zip

    【项目资源】: 适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    【光子晶体模拟】基于COMSOL弱形式PDE的三维光子晶体能带结构计算与优化:电磁场切向连续性处理及带隙分析系统设计使用COMSOL

    内容概要:本文详细介绍了使用COMSOL Multiphysics的弱形式接口对三维光子晶体进行数值模拟的方法和技巧。文章通过具体的代码示例,解释了如何构建光子晶体的介电常数分布、设置弱形式PDE、处理电磁场切向连续性、应用Floquet周期边界条件以及特征值求解等关键步骤。特别强调了弱形式接口相比传统物理场接口的优势,如灵活性和对复杂边界的处理能力。文中还分享了一些实用的经验和注意事项,如布洛赫边界条件的实现、特征值求解器参数的优化配置以及网格划分的技巧。 适合人群:具备一定电磁学和数值模拟基础的研究人员或工程师,尤其是对光子晶体仿真感兴趣的读者。 使用场景及目标:①理解并掌握COMSOL弱形式接口在光子晶体仿真中的应用;②学习如何通过弱形式设置处理复杂的电磁场问题;③提高对光子晶体能带结构和带隙特性的认识;④掌握特征值求解和网格划分的最佳实践。 阅读建议:由于本文涉及较多的具体代码和物理概念,建议读者在阅读过程中结合COMSOL软件进行实际操作,同时查阅相关电磁理论书籍以加深理解。此外,对于文中提到的一些具体参数设置和技巧,可以通过尝试不同的配置来巩固所学知识。

    (源码)基于Arduino平台的INSPTComputacion2项目.zip

    # 基于Arduino平台的INSPTComputacion2项目 ## 项目简介 INSPTComputacion2是一个基于Arduino平台的开发项目。该项目旨在通过Arduino的硬件和软件能力,实现一系列计算和交互功能。通过此项目,用户可以体验到Arduino在嵌入式系统、物联网和微控制器等领域的强大功能。 ## 项目的主要特性和功能 该项目的主要特性和功能包括但不限于以下几点 1. 嵌入式系统开发利用Arduino的硬件资源,开发嵌入式系统应用。 2. 物联网应用实现Arduino与物联网技术的结合,进行数据采集、传输和控制。 3. 交互设计通过Arduino实现人机交互,如按钮控制、LED显示等。 4. 数据处理利用Arduino进行数据处理和分析,如温度、湿度等环境数据的采集和处理。 ## 安装使用步骤 以下是在已下载本项目源码文件后的安装使用步骤 1. 确保已安装Arduino IDE软件。

    毕业设计物联网实战项目基于云且连接 Internet 的新式应用程序。 可用于建立Web应用、 IoT物联网、移动后端等。.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    毕业设计物联网实战项目基于touchgfx,调度基于freertos.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    Python数据结构-学习笔记

    Python数据结构-学习笔记

    电影在线购票系统(springboot+ssm+vue+mysql)含万字系统详细说明文档

    该系统展示了一个电影在线购票系统的结构图,系统分为前台和后台两部分。前台包括首页、影院信息、电影信息、电影资讯和个人中心等模块,主要面向普通用户,提供电影浏览、选座购票、个人账户管理等功能。后台部分由管理员通过后台模块进行操作,包括系统首页、用户管理、场次管理、时间段管理、影院信息管理、电影分类管理、电影信息管理、订单管理和个人中心等模块,用于系统的维护和管理,如用户信息维护、电影和影院信息更新、订单处理等。整个系统旨在为用户提供便捷的在线购票体验,同时确保后台管理的高效和有序。

    5G NR射频基本指标一致性自测用例

    5G NR射频一致性自测用例 由于NR射频测试场景太多,全指标自动化跑测用时太久,本表格选取了主要场景的关键指标,以便于射频工程师对产品的NR射频指标进行初步摸底。 表格每一页概况: 1、NR TDD摸底指标N77/78/79/41 2、NR FDD摸底指标N1/3//5/8/28 附录1、各频段带宽所支持的SCS 附录2、各带宽SCS的RB配置 附录3、灵敏度测试的RB配置 附录4、摸底测试信道查询 附录5、各频段频率范围

    毕业设计物联网实战项目基于STM32、ESP8266、EMQX和Android的智能家居系统.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    python开发的邮件群发工具.zip

    软件介绍: 一个永久免费且无广告的邮件群发软件,直接使用SMTP来群发邮件支持添加多个发信邮箱,一个小而美的邮件群发软件。 开发这个软件最初是打算用QQ获取某个群所有的群成员QQ,然后转换为QQ邮箱群发偷人的,结果现在发现QQ已经限制到只能是该群管理员、群主才可以获取群成员所有QQ了,所以获取群成员所有QQ邮箱的功能就没有上线了。 支持导入TXT文件一行一个邮箱、粘贴邮箱、查看邮箱列表、SMTP发信邮箱(支持多个)、管理SMTP邮箱、单个发信邮箱限制发送次数

Global site tag (gtag.js) - Google Analytics