NPAPI和PPAPI开发

本文详细探讨了NPAPI和PPAPI这两种浏览器插件开发技术。首先介绍了开发环境,接着深入到NPAPI部分,然后转向PPAPI的讨论。在Chrome中,通过特定设置可以调试NPAPI和PPAPI插件。对于遇到的问题,如SDK示例无法加载,可以通过检查Chrome组件来解决。

NPAPI和PPAPI开发

Author: kagula

Revison: 1
Last modify date:2015-10-20


环境:

 [1]Visual Studio 2010 SP1
    Visaul Stuio  2013 Update4
 [2]Python2.7
 [3]Firefox 41.0.1
 [4]IE 11
 [5]Google chrome 45.0.2454.101 
 [6]Opera 32.0
 [7]360浏览器 7.1.1.808
 [8]nacl sdk pepper39 
 [9]windows7 SP1 64bits


关键词

   Firebreath, NPAPI, PPAPI, Web worker, Messaging System, Native Client Module, Application Structure
   Chrome Web Store, portable executable file, architecture-specific executable file 
   

前言  

    如果要实现Windows平台,跨不同浏览器插件,就需要分别实现
    ActiveX  适用浏览器IE11,因为IE11对FireBreath兼容性不是很好。
    FreBreath(NPAPI)  适用浏览器,360浏览器,Chrome 42版本以下,Opera、Firefox。
    NaCl(可分为PPAPI、NaCl、PNaCl三个等级) 适用浏览器Chrome 42版本或以上。
    ActiveX的baidu上很多,但是NPAPI和PPAPI的很不完善,所以这里仅仅介绍NPAPI和PPAPI的开发。


第一部份:NPAPI



第一个插件(NPAPI):
   firebreath是个跨浏览器插件开发工具,所以先尝试FireBreath。
Step1:
  参考资料[3]下载firebreath最新稳定版本,并解压到“D:\SDK\firebreath-FireBreath-105dcc6\”目录下
  从官网上下载firebreath-boost-1.50.0.zip
  位置参考下面摆放:
  <FB_ROOT>/src/3rdParty/boost/boost/
  <FB_ROOT>/src/3rdParty/boost/libs/


Step2:先建一个Hello工程。
 打开控制台,切换到“D:\SDK\firebreath-FireBreath-105dcc6”文件夹,
   输入命令“python fbgen.py”根据提示输入你第一个工程plugin name,plugin description,company name等信息。
   命令执行完毕后,再调用“prep2010.cmd”命令。
   python就在当前build子目录下建好了VS2010 solution,FireBreath.sln文件。
  打开sln后应该就能正确编译。如果有问题参考资料[1]。


Step3:测试插件是否正确加载。
[S3-1]IE下运行插件。
  命令行方式转到“D:\SDK\firebreath-FireBreath-105dcc6\build\bin\hello\Debug”路径下,使用“regsvr32 nphello.dll”注册控件。
  "D:\SDK\firebreath-FireBreath-105dcc6\build\projects\hello\gen"路径下打开“FBControl.htm”文件,就可以在IE中正常运行hello控件。
  如果有问题,参考资料[2]。
[S3-2]Firefox下运行插件
  我是把dll复制到“C:\Users\kagula\AppData\Roaming\Mozilla\Firefox\Profiles\ie1ypj6h.default\plugins”路径就Ok了,如果没有“plugins”目录就新建一个。
  不同的计算机Win7下,参考下面的格式就Ok了。
  “C:\Users\XXX\AppData\Roaming\Mozilla\Firefox\Profiles\XXX.default\plugins”
[S3-3]Chrome下运行
  Chrome 45 不支持NPAPI。
[S3-4]Opera下运行
  使用“regsvr32 nphello.dll”注册控件后,可以直接使用,
但是会提示“此网站使用的插件很快将不被支持”
[S3-5]360浏览器下运行
  使用“regsvr32 nphello.dll”注册控件后,可以直接使用,


Step4:测试插件功能是否正常
 [1]hello.cpp的FB::JSAPIPtr hello::createJSAPI()函数,创建了helloAPI实例返回。
 查看helloAPI实现,
  echo方法用来示例参数传递,testEvent方法示例事件回调,testString和version示例如何存取对象的属性。
 [2]FBControl.htm文件,点击“Fire a test event”会间接调用helloAPI实例的testEvent方法,这个方法又会激活JS的test事件。
  在IE中没有反应,但是在Opera和360浏览器中测试正常。
 [3]FBControl.htm文件,点击“Activate click counter”,就多一次对插件echo事件的绑定。
    然后,再点击“Click me!”,JS会调用插件的echo方法,而插件的echo方法会调用js对echo事件的绑定function。
    在IE中依旧没有反应。
 [4]测试插件属性的存取,
  [S4-1]为FBControl.htm文件,添加一个js函数。
    function testPluginPropertyAccess()
{
alert(plugin().testString);
plugin().testString = "插件属性的默认值已经被JS修改";
alert(plugin().testString);
}
   为FBControl.htm文件,添加一个链接,可以让用户点击。
   <a href="#" onclick="javascript:testPluginPropertyAccess()">测试对属性值的修改</a> <br />
   [S4-2]修改helloAPI.h文件,在helloAPI的构造函数中添加下面的代码。
   m_testString = "Default value in c++";
   这样我们才能知道这个属性的值是来自C++代码的。
   [S4-3]然后再参考上文,测试即可。
 [Step5]验证是否能自绘区域
   一开始在"hello"项目上onWindowAttached死活不会来,后来又重建了一个firegbreath项目就好了。
   猜测是用fbgen.py新建项目时,输入的参数不对。
   下面是我的测试函数,我往plugin api里注册了“draw”函数,用来测试能否绘制html表面。
   void helloAPI::draw()
{
if (_wnd) {
HDC hDC = GetDC(_wnd->getHWND());


RECT rect;
rect.left=0,rect.top=0,rect.right=256,rect.bottom=256;


HBRUSH hbr;
hbr = CreateSolidBrush(RGB(255,0,0));
FillRect(hDC,&rect,hbr);


ReleaseDC(_wnd->getHWND(),hDC);
}
}


    具体参考“...\firebreath-FireBreath-105dcc6\examples\BasicMediaPlayer”目录下的源代码。


备注
 [1]Firebreath缺省没有连接下面两个事件:
EVENTTYPE_CASE(FB::RefreshEvent, draw, FB::PluginWindow);
EVENTTYPE_CASE(FB::WindowsEvent, onWindowEvent, FB::PluginWindow)  

第二部份:PPAPI

  Chrome插件只能使用PPAPI接口的Native Client(NaCl)方式编写,
Native Client分别有三种embed类型
  “application/x-ppapi”,平台相关,唯一能直接使用win32 api的platfrom(有功能上的限制)。  dll格式,
                                不允许通过Chrome web store分发。据说Flash就是采用第一种类型开发的。
  “application/x-nacl”, 只能通过PPAPI,平台无关,cpu相关。nexe格式,只能通过Chrome web store分发。
  “application/x-pnacl”,只能通过PPAPI,平台无关,cpu无关。pexe格式,可以不通过Chrome web store分发。  
  为了减少麻烦,建议系统只安装Visual Studo 2010版。


跟着官网先学习第一个PPAPI插件(Native Client)的开发流程
   首先参考
  《C++ Tutorial: Getting Started 》
  https://developer.chrome.com/native-client/devguide/tutorial/tutorial-part1
  建立,运行,修改自己的第一个portable native client程序,这样就先有了个概念。
  按照tutorial一步步走是没有问题了,但是
  
如何在VS中开发、调试native client程序?
你需要为nacl sdk安装vs_addin。
官网文档上说vs_addin只支持vs2010sp1和vs2012,但是经过修改能支持vs2013,但是不建议折腾。
[Step1]设置当前计算机用户变量
  NACL_SDK_ROOT环境变量为“E:\SDK\nacl_sdk\pepper_39”。
  CHROME_PATH环境变量为“C:\Program Files (x86)\Google\Chrome\Application\chrome.exe”。
[Step2]管理员权限启动控制台转到“E:\SDK\nacl_sdk\vs_addin”路径下,输入“Install”命令安装“vs_addin”。
  以后你还可以通过输入“Install  --uninstall”命令来反安装。
[FinalStep-PPAPI]现在可以转到“E:\SDK\nacl_sdk\vs_addin\examples\hello_world_gles”目录,使用VS2010打开hello_world_gles solution。
  platform从默认“NaCI32”改为“PPAPI”即可编译通过,会在当前project路径下产生win目录,win目录下会生成hello_world_gles.dll文件。
  直接按[F5]就可以Debug這個dll,在VisualStudio中进入断点。
[FinalStep-NaCl64]platform从默认“NaCI32”改为“NaCI64”,
          project property page should be
          [General]->[Native Client]->[IndexPage of NaCl Application]->[index_newlib.html]
          [General]->[Native Client]->[Toolchain]->[newlib]
          在当前项目NaCl64\newlib\Debug路径下只生成一个hello_world_gles_64.nexe文件,所以调试针对的是这个文件。
          由于这个文件是虚拟代码(据说运行前会转成机器码)所以只能用nacl sdk带的gdb来调试。
          [F5]启动Debug,默认打开index_newlib.html页面,启动gdb控制台后就可以命令行方式调试了。
          你可能需要设置chrome启用NaCl,授权Chrome能够使用未经Chrome Web Store发布的nexe文件。
[FinalStep-PNaCl]platform从默认“NaCI32”改为“PNaCl”,会在当前项目下编译输出一个pexe文件和三个针对不同cpu的nexe文件,VS中[F5]不会进入Debug、break模式。
  
  备注:
   [1]具体参考官方vs-addin文档。  https://developers.google.com/native-client/dev/devguide/devcycle/vs-addin  
   [2]在啟動chrome調試前,勾選F12->Settins->General->Disable cache(while DevTools is open)防止html緩存。
  
如何部署pexe格式控件到chrome上?
[Step1]先检查PNaCI是否在chrome中启用(默认已经安装)
    在chrome中addressbar中使用“chrome://nacl/”查看是否允许PNaCI插件。如果没有安装相应component,可以输入“chrome://components”在compoennts页面中安装或更新。
[Step2]假设"E:\nginx-1.8.0\html"是你Web服务器的webroot路径,把“E:\SDK\nacl_sdk\pepper_39\getting_started\part1”目录下的
    hello_tutorial.nmf和hello_tutorial.pexe两个文件复制到"E:\nginx-1.8.0\html"。把“index.html”重命名为“hello_tutorial.html”并复制到webroot路径中。
    现在你的webroot路径中已经有了“hello_tutorial.nmf”、“hello_tutorial.pexe”和“hello_tutorial.html”三个文件。
[FinalStep]在chorme中输入“http://localhost:8080/hello_tutorial.html”打开pexe测试页面,测试成功。
    
如何运行vs_addin自带的hello_nacl_cpp项目?
[Step1]用vs2010打开hello_nacl_cpp项目后,修改好代码后,选择PNaCl平台编译出pexe和nexe文件。
[Step2]在“E:\SDK\nacl_sdk\pepper_39\examples”路径下新建“hello_nacl_cpp”目录。
[Step3]复制“E:\SDK\nacl_sdk\vs_addin\examples\hello_nacl_cpp\hello_nacl_cpp\PNaCl\newlib\Debug”路径下的pexe、nexe扩展名的四个文件
       到新建的“E:\SDK\nacl_sdk\pepper_39\examples\hello_nacl_cpp”路径下面。
       复制“E:\SDK\nacl_sdk\vs_addin\examples\hello_nacl_cpp\hello_nacl_cpp\index.html”文件到新的路径下。
       复制“E:\SDK\nacl_sdk\vs_addin\examples\hello_nacl_cpp\hello_nacl_cpp\PNaCl\hello_nacl_cpp.nmf”文件到新的路径下。
[Step4]修改新路径下的index.html,把embed元素中的type属性从“application/x-nacl”改为“application/x-pnacl”。
       因为PNaCl插件mime type只能为“application/x-pnacl”。
       修改新路径下的hello_nacl_cpp.nmf文件,使之支持pexe,并能从当前目录读取pexe文件,修改后的内容如下:
       {
 "files": {},
 "program": {
   "portable": {
     "pnacl-translate": {
       "url": "hello_nacl_cpp.pexe"
     }
   },
   "x86-64": {
     "url": "hello_nacl_cpp_64.nexe"
   },
   "arm": {
     "url": "hello_nacl_cpp_arm.nexe"
   },
   "x86-32": {
     "url": "hello_nacl_cpp_32.nexe"
   }
 }
}
[FinalStep-PNaCl方式]
       在控制台下启动“E:\SDK\nacl_sdk\pepper_39\examples\httpd.cmd”程序。
       在chrome中输入“http://localhost:5103/hello_nacl_cpp/”成功打开测试页面。


       
如何新建NaCl项目
在visual studio中新建C++ Empty Project
設置項目屬性為[General]->[Project Defaults]->[Configuration Type]->[Dynamic Library(.dll)]。
新建好项目后,就可以添加源代码文件开始编程。
这里没有从新的C++ Dll Empty Project开始,是因为这个wizard会引入很多win32定义导致NaCl64平台编译失败,修改起来太麻烦。


示例代码有两种风格,第一种参考“vs_addin\examples”下的hello_nacl_cpp项目,第二种参考“hello_world_gles”项目,
开发包自带的例子基本上都属于这种风格。
典型的代码如下:
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/var.h"


class MyInstance : public pp::Instance {
public:
	explicit MyInstance(PP_Instance instance) : pp::Instance(instance)
	{}
	virtual ~MyInstance() {}


	virtual void HandleMessage(const pp::Var& var_message) {
		if (var_message.is_string())
		{
			std::string message = var_message.AsString();
			pp::Var var_reply;


			std::string reply = "echo [";
			reply.append(message);
			reply.append(" from my NaCi module");


			var_reply = pp::Var(reply);
			PostMessage(var_reply);
		}
	}
};


class MyModule : public pp::Module {
public:
	MyModule() : pp::Module() {}
	virtual ~MyModule() {}
	virtual pp::Instance* CreateInstance(PP_Instance instance) {
		return new MyInstance(instance);
	}
};


namespace pp {
	Module* CreateModule() {
		return new MyModule();
	}
}



测试dll、pexe格式的控件用的html和js可以从“hello_world_gles”例子的基础上只要做很小的修改就能测试插件有没有装载成功。
“PPAPI”平台下编译不会fire load事件在html中,导致不会提示成功装载插件的提示,但是实际上“hello_world_gles”插件已经正常运行。
你可能需要修改当前工程的[Configuration Properties]->[General]->[Native Client]->[Index Page of NaCl Application]属性指定html文件名
VS启动Debug的时候会以命令行方式传递给chrome的flags设置。
所以在VS外你要使用nexe文件,需要在Chrome浏览器中输入“chrome://flags/”启用“Native Client”,授权chrome可以使用未经chrome web store发布的native client程序。


备注:
 [1]NaCl64启动调试后,在Chrome46中装载控件会失败,导致gdb不能单步跟踪,但是Chrome43没有这个问题。


[参考资料]
https://developer.chrome.com/native-client/devguide/devcycle/debugging
https://developer.chrome.com/native-client/devguide/devcycle/building   
    
如何在vs2013中使用vs2013的native client插件
[Step1] 复制 %user%\Documents\Visual Studio 2012\Addins\ 到 %user%\Documents\Visual Studio 2013\Addins
[Step2] 复制  C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\NaCl\  到  C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\NaCl\
[FinalStep] 复制 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Platforms\ 下的以下文件夹
     ARM NaCl32 NaCl64 NaClARM PNaCl PPAPI
     到 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Platforms\
     
     C:\Users\kagula\AppData\Local\Google\Chrome\User Data
     C:\Program Files (x86)\Google\Chrome\Application


如何重新编译NaCi的ppapi_cpp?
打开Visual Studio Command Prompt然后使用下面的命令:
$ cd $NACL_SDK_ROOT\src\ppapi_cpp 
$ make TOOLCHAIN=win CONFIG=Debug 
$ make TOOLCHAIN=win CONFIG=Release 


NaCl Module如何调用Win32 API?
项目只有在“PPAPI”platform下才能直接调用win32 api,虽然能自由调用win32api,
但是调用win32 api创建新的进程,或调用C++ std对本地磁盘进行操作都会失败!
想要自由的使用win32 api只能参考下面的文档来实现,据说是唯一的解决办法。
《Native Messaging》
https://developer.chrome.com/extensions/nativeMessaging
下面解释了“PPAPI”platform的限制。
http://stackoverflow.com/questions/23472077/purpose-of-ppapi-toolchain-and-how-to-use-it?rq=1


JS如何接收来自Native Client的消息
最简单的例子是..\nacl_sdk\vs_addin\examples\hello_nacl\hello_nacl下的index.html源文件。




常见问题
Q 编译项目提示。
Error 1 error MSB6006: "C:\sdk\nacl_sdk\pepper_39\toolchain\win_x86_newlib\bin\x86_64-nacl-g++.exe" exited with code 1.
那是少了依赖库引起的,比如说,如果你用到gles2,添加“ppapi_gles2”依赖库后,问题消失。
Q 在“PPAPI”plaform下提示ppapi_cpp.obj找不到。
修改依赖项从“ppapi_cpp;ppapi;”为“ppapi_cpp.lib;ppapi.lib;”后,重新rebuild即可。
Q 运行“...\nacl_sdk\pepper_39\examples”下的例子,chrome提示“PnaclCoordinator: Compile process could not be created”

Chrome中输入“chrome://flags/”,停止“Native Client 基于 GDB 的调试 Mac, Windows, Linux, Chrome OS”项即可。

Q遇到sdk下的examples无法装载的例子

Chrome中输入“chrome://components”检查pnacI是否已经安装。





总结
    相对于NPAPI,PPAPI开发成本高,运行速度慢,所谓sandbox安全性只不过是始皇上缴天下铁器的强盗逻辑,
唯一的亮点是PPAPI的pexe格式插件可以一处编译处处运行。
   
备注:
[1]在“...\nacl_sdk\pepper_39\examples”路径下google提供了大量的example用来帮助开发者学习PPAPI。
   参考资料[10]也有大量的pexe例子。


参考资料

[1]《跨浏览器插件框架FireBreath安装与使用之一——Windows下的插件》
http://blog.csdn.net/ubuntu64fan/article/details/7941167
[2]《Firebreath插件制作》
http://blog.csdn.net/oldmtn/article/details/46362135
[3]FireBreath Home
http://www.firebreath.org/display/documentation/FireBreath+Home
[4]《firebreath 在谷歌和火狐浏览器下的调试 以及打包》
http://www.cnblogs.com/drzhong/p/firebreath_dubug.html
[5]《Building a firefox plugin – part one》
http://colonelpanic.net/2009/03/building-a-firefox-plugin-part-one/
[6]《Introduction to Portable Native Client》
https://www.chromium.org/nativeclient/pnacl/introduction-to-portable-native-client
[7]《Distributing Your Application》
https://developer.chrome.com/native-client/devguide/distributing
[8]《Problems when develop ppapi plugins in NACL.》
https://groups.google.com/forum/embed/#!topic/native-client-discuss/hihnZnB8k0M
[9]《2DPaintingModel》
https://code.google.com/p/ppapi/wiki/2DPaintingModel
[10]《ppapi example》
https://chromium.googlesource.com/chromium/src/ppapi/+/master/examples
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 ### Home Bus 协议概述 Home Bus协议,亦被称为家庭总线协议,是由日本研发的一种专门应用于家庭自动化领域的通信标准。该协议在商用空调及其他家用电器的远程操控方面具备广泛的应用范围。借助Home Bus协议,设备之间能够达成高效的通信,使用户能够更加便利地监管家庭中的各类智能设备。 ### ECHONET协议及其背景 Home Bus协议与ECHONET协议存在紧密的联系,实际上,ECHONET代表了一种更为具体的技术规范,其目的在于为家庭自动化领域构建一个开放且统一的通信标准。ECHONET由ECHONET财团负责维护与支持,该组织致力于推动该协议的进步与标准化进程。ECHONET协议的应用范围不仅限于家庭环境,还包括了楼宇自动化以及工业自动化等多个领域。 #### ECHONET的历史版本及修订记录 - **Version 1.0**:发布于2000年3月18日,同年7月对联盟成员公开,最终于同年对公众发布。 - **Version 1.01**:在2001年5月23日,向联盟成员发布,主要进行了补充勘误工作。 - **Version 2.00**:2001年8月7日,针对联盟成员发布。此版本中将电源线A电源线B两种方式合并为单一电源线方式(基于电源线A),并对相关描述进行了调整。 - **Version 2.01**:2001年11月9日,进行了一些必要的修正,包括排版错误的修正、术语的标准化等。 - **Version 2.10**:经历预览版草案阶段后,于2002年3月7日正式对联盟成员开放。此次更新主要涉及第3部分关于状态转换的描述修改。 -...
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 依据所提供的文档材料,可以归纳出以下核心知识点: 1. **TM1668控制器**:TM1668属于一种专为驱动LED显示屏设计的专用驱动集成电路,其特别适用于驱动数码管,能够达成多路LED的驱动与控制,从而提升了显示的效率。 2. **程序简化与时序控制**:程序完成了对TM1668芯片的操作,其功能已经达到最简化程度,且时序设置正确无误。在编程过程中,确保时序的准确性至关重要,因为它直接关联到设备能否正常运作。 3. **寄存器操作**:在编程实践中,运用了 uchar、int 等数据类型来表示数据及控制位。uchar或许是一种8位无符号字符类型,用于存储数据信息。同时,还涉及到对特定位的操作,比如 & 、 >> 等,这些操作用于设定或检测数据位的状态。 4. **硬件控制位**:在代码中,设定了用于控制TM1668的硬件控制位,涵盖 STB(片选信号)、CLK(时钟信号)以及 DIO(数据输入输出信号)。这些控制位的作用在于向TM1668发送指令与数据信息。 5. **数码管显示控制**:借助一系列的 send_data 函数调用,向TM1668发送控制指令与数据,以此来调控数码管的显示状态。例如,设定显示位、挑选显示地址、将数据传输至特定的数码管显示单元等。 6. **定时器中断**:在程序设计中,应用了定时器中断(INT0_timer)来周期性地执行任务。通过设定定时器的初始值(TH0TL0),定时器在倒计时完成后会触发中断,使得程序能够以固定的频率更新数码管的显示内容。 7. **中断服务程序**:设定了一个中断服务程序,在定时器中断发生时被调用。在中断服务程序...
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,DM码(Data Matrix Code)被视为一种二维条形码规范,其功能在于储存海量信息,并在工业自动化、电子元件标记等众多场景中得到普遍应用。DM码的辨识过程是图像处理及计算机视觉学科内的核心研究方向,它涵盖了图像采集、初步处理、特征提取以及模板比对等多个环节。在VC++平台之上,借助MFC(Microsoft Foundation Classes)库开展DM码辨识能够构建一个高效的应用开发环境。 我们将探讨"自适应阈值分割"这一流程。在DM码辨识的进程中,图像的初步处理扮演着至关重要的角色,而阈值分割则是将图像实现二值化的常用手段。自适应阈值分割能够依据图像的局部属性灵活设定阈值,有效处理光照不均、对比度较低等情况。这通常涉及到计算每个像素点邻近区域内的平均灰度级别,并设定一个阈值,通过像素点自身的灰度值与其邻近区域灰度值的关联来判定其最终呈现的黑白状态。这样的方法能够确保DM码在复杂的图像背景下依然能够被精确地辨识出来。 随后,"快速定位"技术也是DM码辨识过程中的关键环节。在图像经过二值化处理后,需要迅速识别出DM码所在的位置。一种常用的方法是进行边缘检测,例如采用Canny算子或Sobel算子,这些方法能够识别出图像中的轮廓线。然后,借助矩形模板匹配,例如通过霍夫变换探测直线,并结合交点信息来确定DM码的四个顶点,从而精确获取DM码的位置信息。 在MFC框架的支持下,我们可以运用其图形设备接口(GDI+)以及OpenCV等库来实现上述功能。GDI+提供了丰富的绘图工具,能够便捷地处理图像的显示初步处理;而OpenCV则包含了大量的图像处理算法,...
标题SpringBoot博物馆综合服务管理系统的设计与实现AI更换标题第1章引言介绍博物馆综合服务管理系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述博物馆信息化管理的必要性系统开发的重要性。1.2国内外研究现状分析国内外博物馆管理系统的研究现状与存在的不足。1.3研究方法以及创新点概述本文的研究方法,并指出系统的创新之处。第2章相关理论介绍系统开发所需的相关技术理论。2.1SpringBoot框架介绍阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.2数据库技术介绍系统所采用的数据库技术,如MySQL等。2.3Web开发技术概述Web开发技术,包括前端后端技术。2.4系统安全技术介绍系统安全相关的技术,如数据加密、用户认证等。第3章系统需求分析与设计详细分析系统的需求,并给出系统的设计方案。3.1系统需求分析从功能需求、性能需求等方面对系统进行详细分析。3.2系统架构设计给出系统的总体架构设计,包括各个模块的功能划分。3.3数据库设计设计系统的数据库结构,包括表结构、字段设计等。3.4界面设计展示系统的用户界面设计,包括页面布局、交互设计等。第4章系统实现详细介绍系统的实现过程,包括各个模块的实现方法。4.1系统开发环境搭建介绍系统开发所需的软件、硬件环境及其配置方法。4.2核心功能模块实现详细介绍系统核心功能模块的实现代码逻辑。4.3系统集成与测试阐述系统各个模块的集成方法以及系统测试的过程结果。第5章系统应用与效果评估介绍系统的应用情况,并对系统的效果进行评估。5.1系统应用情况系统在博物馆中的实际应用情况。5.2系统效果评估从性能、用户满意度等方面对系统效果进行评估。5.3对比方法分析通过与其他系统对比,分析本系统的优势不足。第6章结论与展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括本文的主要研
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 在计算机硬件监控领域,掌握CPU(中央处理器)的温度状况具有核心意义,因为过高的温度水平可能会对其性能造成负面影响,甚至引发硬件层面的损坏。Intel作为全球范围内居于领先地位的CPU生产厂商,其产品在个人电脑服务器市场得到了广泛部署。本文将系统性地阐释如何借助驱动程序获取Intel CPU的温度数据,并深入分析相关技术细节。 Intel CPU内部构建了数字温度传感器(Digital Thermal Sensor,DTS),该组件负责实时追踪核心温度的变化情况。这些传感器所采集的数据能够通过系统管理接口(System Management Interface,SMI)或 ACPI(Advanced Configuration and Power Interface)机制向操作系统进行呈现。操作系统以及第三方应用程序可以通过访问这些数据来评估温度状态。 获取CPU温度的一种常规途径是借助硬件监控工具,例如HWMonitor、Core Temp等软件。此类工具多数情况下依赖于Microsoft的WMI(Windows Management Instrumentation)服务,该服务为应用程序提供了查询系统信息的标准化接口,其中包括温度数据。针对Intel CPU,WMI内置了一个名为"MSCTM"(Microsoft Core Temp Monitor)的类别,能够用于查询CPU的温度读数。 另一种技术方案涉及自主开发驱动程序或利用开源驱动库,比如lm_sensors,这是一个专门为Linux系统设计的硬件监控库。在Linux操作系统环境中,用户可以通过执行`sudo se...
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 在Android系统程序设计中,有时需要依据设备制造商或操作系统版本来达成特定功能或进行适配。 这个名为"判断android手机是华为小米魅族系统"的工具类正是为了应对此类场景而构建,它能够协助程序员识别用户设备属于华为、小米还是魅族等品牌。 该类通常会集成一系列函数,用于检测设备的制造商信息,进而明确其所属的ROM类型。 我们需要明确Android ROM的概念。 Android ROM(Read-Only Memory)指的是Android系统的固件,它包含了Android操作系统的底层组件、驱动程序以及个性化的用户界面。 不同厂商如华为(EMUI)、小米(MIUI)魅族(Flyme)会基于Android源代码进行深度开发,形成各自独有的ROM,提供了各自独有的功能用户体验。 在开发这个工具类时,程序员通常会借助Android提供的`Build`类,该类包含了关于设备的多种信息,例如设备制造商、型号、版本等。 例如,可以使用以下代码片段来获取设备制造商: ```java String manufacturer = Build.MANUFACTURER; ``` 接下来,我们可以依据`manufacturer`值来判断手机品牌。 如果为"huawei",则设备属于华为;如果为"xiaomi",则代表小米;如果为"meizu",则意味着魅族。 当然,实际应用中可能还需要考虑其他品牌,因此工具类通常会包含一个函数,如`checkBrand()`,它会遍历所有已知的品牌并进行对比: ```java public static boolean isHuawei() { return "huaw...
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 快速傅里叶变换(FFT)是一种高效的离散傅立叶变换(DFT)方法,能够将时域信号有效地转换为频域表示。这种转换方式在信号处理、图像处理、通信工程等多个领域具有广泛的应用价值,因为它能够揭示出信号的频率构成,进而辅助进行信号特征的分析。 在实际操作过程中,信号首先需要通过ADC(模拟到数字转换器)进行采样处理。依据奈奎斯特定理,采样频率应当超过信号最高频率的两倍,以此防止出现混叠现象。如果设定采样频率为Fs,信号频率为F,采样点数为N,那么FFT运算的结果将输出N个复数,每一个复数都对应一个特定的频率成分。 每一个FFT运算结果中的点的模值反映了对应频率下的信号幅度大小。比如,如果原始信号的峰值为A,那么除了直流分量(第一个点)之外的其他点的模值是A的N/2倍,而直流分量的模值则是A的N倍。此外,相位信息则表示了该频率下信号的相位状况。 FFT运算的结果呈现出对称分布的特性,通常情况下,我们只需关注其中前半部分(即小于采样频率一半的频率范围),因为这部分包含了所有正频率成分的信息。频率分辨率与采样时间呈现反比关系,若需提升频率分辨率,则必须增加采样点数或延长采样时间。 比如,当采样率为1024Hz,且采样1024个点时,频率分辨率能够达到1Hz;而如果采样持续时间为2秒,即采集2048个点,频率分辨率则可以提升至0.5Hz。计算FFT运算结果中某个频率点n(n≠1,且n≤N/2)所对应的信号表达式可以表示为An/(N/2) * cos(2πFn*t + Pn),即2*An/N * cos(2πFn*t + Pn)。对于直流分量n=1的情况,其幅度为A1/N。 以下通过一个包含直...
源码直接下载地址: https://pan.quark.cn/s/94e63eaeaefa PID 控制策略是自动控制学科中的一种基础性控制方法,其应用十分广泛,涵盖了诸如自动化装置、机器人技术、航空航天工程、化学工业流程管理等多个技术领域。该策略通过综合运用比例(P)、积分(I)以及微分(D)三个核心环节,能够对系统进行精准调控,从而确保系统展现出理想的稳定运作状态。 **一、比例系数 P** 比例系数 P 是构成 PID 控制器的基础参数,其大小直接关联到系统的反应速率。在进行参数校准时,首要步骤是暂时忽略积分与微分部分,即设定 Ti=0 Td=0。随后,应逐步提升 P 值,直至系统开始显现出周期性波动。这种波动现象表明系统对输入过于敏感,此时需要调低 P 值以抑制波动。接着,再逐步减小 P 值,直至波动完全消除。最终将 PID 的比例系数 P 设定为当前无波动状态下的 60%~70%区间,此比例能够确保系统既不会因响应过快而产生振荡,也不会因响应迟缓而积累过大的跟踪偏差。 **二、积分时间 T_i** 积分时间 T_i 决定了控制器克服稳态偏差的效能。初始阶段 T_i 应设定为一个相对较大的数值,然后逐步减小,直至系统出现周期性波动。一旦检测到波动,应反向增加 T_i,直至波动再度平息。此时记录的 T_i 值可作为 PID 参数配置的参考依据,通常将其设定为无波动状态下数值的 150%~180%范围,以此能够有效消除稳态偏差,同时维持系统的稳定性。 **三、微分时间 T_d** 微分时间 T_d 主要功能是预判系统的发展趋势,以便提前修正控制信号,进而减少过度调整周期性波动。在工程实践中,若系统的动态性能要求不高,T_d 通常可以设为零。然而,若需提升动...
源码下载地址: https://pan.quark.cn/s/4707b2ee015f DLAN(Digital Living Network Alliance)是一种数字媒体网络标准,其作用在于使得不同设备能够在局域网范围内互相传递多媒体资料,涵盖的视频、音频以及图片等数据类型。基于DLAN技术构建的电视视频投屏解决方案,为用户提供了无需物理线缆即可将移动设备、个人电脑等终端的视频资料无线传输至电视播放的便利服务。作为展示与说明的理想选择,该方案显著优化了观看感受,特别适用于家庭休闲活动或商业交流场景。 DLAN技术的关键特性在于其广泛的平台适配能力,能够兼容多种操作系统环境,例如Windows、Android、iOS以及各类智能电视的操作系统。该技术借助家庭网络中的UPnP(Universal Plug and Play)协议完成设备识别与资料共享,用户无需进行繁琐的配置,仅需保证所有设备处于同一个网络连接中,即可顺畅地完成资料的发送与接收。 在实际使用环节,DLAN电视视频投屏解决方案通常包含以下环节: 1. **设备联网**:必须确认手机、个人电脑及电视设备均接入同一无线局域网。若存在不支持无线连接的设备,可能需要借助以太网线将其与路由器相连。 2. **应用部署**:在手机或个人电脑上获取并安装相应的DLAN投屏软件。这些软件通常可以在应用商店获取,例如Google Play或Apple App Store。 3. **设备识别**:启动投屏软件后,程序将自动检测网络中具备DLAN功能的设备,包括智能电视或支持DLAN的媒体播放设备。 4. **资料选取**:在软件界面中挑选需要投屏的视频文件。这些文件既可以是本地存储的资料,亦可是在线流媒体服务的视频...
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 ADS(高级设计系统)仿真模型在电子设计自动化领域中扮演着关键角色,其核心功能在于支持射频、微波以及毫米波电路的设计与仿真工作。本主题的核心探讨内容聚焦于如何借助ADS软件执行高效的仿真操作,并深入分析与之关联的各类库资源,包括FSL库、AMTL组件库Murata库等。ADS系统是由Keysight Technologies(前身为Agilent Technologies)精心研发的一款高级设计平台,它为射频、微波及光电子领域的工程设计提供了一个全面的解决方案,涵盖了电路、系统以及电磁场等多个层面的仿真能力。在相关描述中提及的“ADS仿真模型”可能涵盖用户自行构建的模型或预置的元件库模型,这些模型能够有效模拟多样化的复杂电路特性。FSL(Foundry Services Library)库作为ADS系统中的核心构成部分,集成了多种半导体工艺的模型参数,诸如tsmc_rfcmos018_v5a.rarADS_FSL_LIBRARY_V2005AP1206.zip、ADS_FSL_LIBRARY_V2005AP0806.zip等文件可能就包含了源自TSMC(台湾积体电路制造公司)的0.18微米射频CMOS工艺的详细模型参数。这些模型参数对于在特定工艺条件下进行射频集成电路(RFIC)的设计与验证具有决定性意义。AMTL(Advanced Model Technology Library)组件库则是一套通用的微波元件模型集合,AMTL_Components_library.ZIP文件中可能收录了各类基础微波元件,例如电容、电感、晶体管等元件的模型。这些模型为设计师提供了便捷的工...
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值