農業用温室データ監視システムの設計・導入

1 はじめに

農業用温室は農業の発展に必要な条件であり、農業用温室にハイテクを組み込むことがますます重要になっており、農業用温室データの監視により温室がインテリジェント化されます。この設計は、温室の遠隔データ監視と自動制御を実現し、温室内の環境データの巡回検出を実行し、4G技術を核として使用して遠隔データ伝送を実現し、機器をさまざまな複雑で遠隔の環境に適応させます。この設計は、ARM-Linux プラットフォームをベースに、温度、湿度、光量、二酸化炭素濃度などのセンサーと 4G テクノロジーを使用して、遠隔データ送信と機器の遠隔制御を実現し、従来の手動手法を克服し、作業負荷を軽減します。設定とシステム分析、リアルタイム 温室環境を調整し、装置の自動化と情報化を実現します。

2. スキーム設計

2.1システム要件の分析

インテリジェント温室監視システムは、温室全体の指令センターです。このシステムは、ARMV7 の I.MX6ULL+Linux オペレーティング システム ソリューションをベースとした、Linux システムをベースにしたインテリジェント温室を構築します。NXP 製 I.MX6ULL マイクロプロセッサと周辺回路、温度と湿度、光、CO2、土壌水分センサー、4G モジュールがインテリジェントな監視システムを構成します。このシステムには次のような特徴があります。

  1. 体系的な設計:このシステムは体系的な設計を採用しており、センサーの数は実際の状況に応じて調整され、さまざまなニーズに対応します。
  2. 4G モジュール無線通信: さまざまな複雑な環境に適応するため、MQTT プロトコルを介した 3G および 4G 通信でのデータ伝送を保証します。
  3. リモート監視: 4G テクノロジーに基づいて、MQTT プロトコルを使用して Alibaba Cloud に接続し、データのリモート監視を実現します。

2.2システムソフトウェア要件の分析

嵌入式系统应用中,系统安全所需必须考虑的还有两个技术条件,一个前提是整个硬件系统本身要能够确保硬件稳定而可靠,一个先决条件是保证软件系统自身的系统稳定与可靠。并且要求软件的编写时要考虑与其它硬件最大限度地的有效配合。软件的编写通常具有一种较高度的系统复杂性,而Linux嵌入式系统则是指一个完全具有系统安全性、稳定性、实时性、高可并发、的嵌入式硬件系统,其功能结构完整清晰,可移植性高,并且开源。本系统设计主要采用下述四个技术层次上的软件系统设计优化方案:

用户交互层:用户通过移动端实时监控农业温室大棚。

系统内核层:这层是各类传感器设备驱动,将驱动程序与内核一起编译,通过温室大棚中的传感器对数据进行采集。

传输层:使用4G技术通过MQTT协议连入阿里云。

采集层:负责对温室大棚数据进行实时采集。

2.3监控方案设计

本系统采用嵌入式ARM+Linux来实现温室大棚的监控,使得系统更安全稳定,并通过4G技术实现移动端与设备端双向控制。具体方案如下图所示:

图2-1 监控方案设计

3.硬件设计

3.1核心硬件设计

3.1.1 I.MX6ULL简介

このシステムは、NXP i.MX6ULL プロセッサをメインコントローラとして使用しており、I.MX6ULL は NXP が製造、開発したシングルコア CPU であり、コアチップ内に多数の機能と強力で安定した周辺インターフェイスも統合されています。I.MX6ULL は、ARMV7 命令セットに基づいたプロセッサで、非常に高性能のメモリと処理ロジック ユニットを備えています。I.MX6ULL には、さまざまな内部拡張デバイス、LCD、NAND フラッシュ メモリとフラッシュ システム、USB データ インターフェイス、UART、センサーが備わっています。インターフェース。I.MX6ULLは非常にコストパフォーマンスが高いです。

3.1.2ストレージモジュール_ _ _

このシステムは主に、ファイルやシステムプログラムコード、ユーザーデータなどを保存するために使用されるシステムの外部メインメモリとして、512MBのシステムメモリチップを備えた大容量NANDフラッシュディスクまたは高速FLASHカードを使用します。Nand-flash のデータ保存容量は十分に大きいため、大量のデータ情報をリアルタイムに保存するのに適しています。I.MX6ULL はストレージへのインターフェイスを提供し、ストレージの外部データに信号を送信します。 NAND FLASH は主にインターフェースに使用され、ルート ファイルシステムを保存するモジュールになります。

3.2データ収集モジュールの設計

取得モジュールの主なタスクは、環境の温度と湿度、CO2濃度、光の強さ、土壌湿度などの環境データを収集し、データに基づいて計算を実行し、Alibaba Cloudに送信することですが、サイズと消費電力を考慮すると、適切なハードウェア デバイスを選択する必要があります。

3.2.1センサー_ _ _ _

環境温度および湿度センサー:温度および湿度検出器は、新しい統合デジタル温度センサーDHT11を採用しており、現場で温度と湿度のアナログ検出信号を直接測定し、デジタル信号に出力できるため、より使いやすくなります。技術パラメータはより正確です。

光センサー:光センサーは太陽光センサーコンポーネントで構成された光センサーで、0〜65000LXの光を電圧信号に変換できます。

土壤湿度传感器:土壤湿度传感器通过暴露的平行线的电导率测取土壤的湿度,通过A/D信号转换读取土壤湿度值。

CO2传感器:C02传感器采用SGP30,此传感器具有使用简单、高密集性的优点。

3.2.2 4G模块

4G模块采用移远EC20Mini,可以在3G与4G网络之间的无缝切换。在3G、4G网络的偏远地区也可正常工作。

4.功能效果图

4.1系统软件开发

由于目前温室开发的无线监控应用系统目前主要都实现到了监控数据实时自动无线采集与储存分析与实时智能报警处理控制及远程双向远程无线实时视频遥控通信。在我们完成了上述的硬件环境方面的一些基本软件设计及程序测试后我们接下来就将更主要和重点地是我们要去进行无线监控应用系统项目中需要的一些相关的软件环境的设计。软件系统的系统设计开发通常来说是在要实现基于的一个嵌入式开发系统的Linux开发运行的环境平台基础上进行所要求实现的工作目标的,在要完成一个嵌入式系统Linux环境平台中的开机与启动系统及文件系统数据库等的硬件设计系统建立设计好系统后,接着的将会就是进行相关的设备软件与驱动系统设计及进行相关的应用程序环境的编写。其中所有的设备驱动程序代码都是带有Linux内核标准接口功能,应是在对其的每个接口模块代码编写中也都会重新进行了编写。本系统设计文档中的设备驱动程序的设备驱动程序框架是由使用一个基于Linux平台的内核文件所提供出来的字符设备驱动框架代码所来编写及实现完成的,将其所重新编写好完成的字符设备的驱动框架代码才会与该内核文件在一起进行被编译。

4.1.1字符设备驱动框架

(1)模块的注册/注销

当驱动模块成功注册完毕后Linux系统内核将会开始为其模块分配响应的地址空间,注册模块完成配置后,使用midprobe命令来加载驱动模块,使用rmmod函数来自动卸载被加载后卸载的驱动模块,modprob使用到的命令是由module_的init()系统所调用,rmmod是使用由module_的exit()系统调用。驱动程序通过这两个函数来管理驱动模块的注册与卸载。

(2)申请设备号

在Linux系统中,每个设备都会对应由设备号,当编写驱动程序时都必须先要想内核申请设备号。

(3)添加字符设备

在Linux系统中一切皆文件,通过内核提供的cdev_add函数向 Linux 系统添加字符设备。将设备抽象化为文件。

(4)创建节点

Linux下一切皆文件,我们使用的设备都会被抽象成驱动文件也就是所谓的节点。首先要创建一个 class 类,通过函数class_create注册节点类,再通过device_create创建字符设备。

4.1.2系统调用

系统调用是用户态到内核态的转换,是用户通过系统提供的API函数访问内核的唯一方式,从而访问相应的系统资源,其关系可通过下图简单描述:

图4-1 系统调用

内核提供了一系列的服务、资源、支持一系列功能,应用程序通过调用系统调用 API 函数来使用内核提供的服务、资源以及各种各样的功能。

驱动程序中通过file_operations结构体成员来实现应用程序中C库函数的调用,具体描述如下:

图4-2 C库调用

4.2移动端应用软件开发

アプリケーションソフトウェアとして、モバイル端末はアプリケーションシステムの重要な技術コンポーネントであり、収集されたセンサーデータ情報はコンピュータで処理された後、データはデータベースAlibaba Cloudに直接アップロードされ、その後自動的にモバイル端末に転送されます。携帯端末がデータを携帯端末に転送し、センサーデータ情報を分析・表示し、データベースに同期して更新することで、温室環境情報のリアルタイムの動的保存と曲線の描画を実現します。モバイル端末は、温室環境の手動または自動調整を実現するために、遠隔閾値設定および機器制御も実行できます。

4.2.1アプリケーションソフトウェア開発ツールプラットフォーム

(1) プログラミングツール Qt は主に遠隔監視ソフトウェア開発用のプログラミングツールとして使用されており、基本的なアプリケーションの主なプログラミング言語は C++ です。Qt 開発には、次の明らかな優れた利点があります: まず、Qt は、ADO データベース、ODBC、QSLITE データベース、その他の高度なデータベース インタラクティブ アクセス テクノロジなどのテクノロジをサポートする多数の UI コントロールを統合して使用します。次に、一連の強力な機能と、効率的な相互接続 マシンのヘルプとドキュメント システムは、特定のキーワードの検索や API 関数の呼び出しなど、さまざまなヘルプや情報リソースのクイック クエリを迅速かつ便利に実行できます。

(2) データベースとして選択されたデータベース システムは、組み込み設計の軽量 qslite データベースであり、この一連のデータベースはオープン ソース、無料、合理化されており、データベースの動作メモリを比較的小さく占有します。

(3) ハードウェア部分に使用される機器は Quectel Communications 社が開発した EC204G モジュールであり、この通信モジュールを使用すると、サーバーとリモート ホスト コンピューター機器間のポイントツーポイント通信接続とバッチを自動的に実現できます。リモートショートメッセージデータパケットの送信と受信。

4.2.2遠隔監視ソフト結果の表示

(1) メインインターフェース

遠隔監視ソフトウェアは、携帯電話を通じていつでも温室の環境データを確認し、機器を遠隔制御して温室の環境を調整することができます。遠隔監視ソフトウェアはモジュール設計を採用しており、ユーザーは表示内容に応じて対応するモジュールをクリックして表示できます。主なインターフェイスは図に示すとおりです。

図 4-3 メインインターフェイス

(2) データ監視インターフェース

データモニタリングは、温室の環境データをリアルタイムに監視し、サンプリング時間は1秒であり、装置が自動的にオンになり、温室環境がしきい値設定を超えた場合、装置端末から携帯端末に装置ステータスが返されます。図に示すように、クラウド メッセージによって記録されます。

   

図 4-4 データ検出インターフェース

(3)数据分析界面

数据分析界面通过绘制曲线图来记录每日24小时的数据变量,并统计每日最高和最低的温湿度、CO2浓度、光照强度,通过图表可直观观察。

   

图4-5 数据分析界面

(4)设备控制界面

设备控制界面通过点击相应的设备图标即可开启/关闭设备,若设备开启/关闭成功,设备端会向移动端返回设备状态,有云消息记录。如图:

    

图4-6 设备控制界面

(5)阈值设定界面

移动端可远程设置阈值并同步到设备端,通过数据库保存,开启自动化后设备将通过阈值管理来实现设备自动化。当阈值设置成功,设备端会返回消息给移动端。由云消息记录设定时间。

    

图4-7 阈值设定界面

(6)其他功能界面

值班人员和地块管理以及植物百科通过qslite数据库管理,作为辅助性的功能,对大棚进行更细致化的管理和监控。如图:

     

图4-8 其他功能界面

5.核心代码

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package org.kde.necessitas.ministro;
public interface IMinistro extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements org.kde.necessitas.ministro.IMinistro
{
private static final java.lang.String DESCRIPTOR = "org.kde.necessitas.ministro.IMinistro";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
 * Cast an IBinder object into an org.kde.necessitas.ministro.IMinistro interface,
 * generating a proxy if needed.
 */
public static org.kde.necessitas.ministro.IMinistro asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof org.kde.necessitas.ministro.IMinistro))) {
return ((org.kde.necessitas.ministro.IMinistro)iin);
}
return new org.kde.necessitas.ministro.IMinistro.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_requestLoader:
{
data.enforceInterface(descriptor);
org.kde.necessitas.ministro.IMinistroCallback _arg0;
_arg0 = org.kde.necessitas.ministro.IMinistroCallback.Stub.asInterface(data.readStrongBinder());
android.os.Bundle _arg1;
if ((0!=data.readInt())) {
_arg1 = android.os.Bundle.CREATOR.createFromParcel(data);
}
else {
_arg1 = null;
}
this.requestLoader(_arg0, _arg1);
reply.writeNoException();
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements org.kde.necessitas.ministro.IMinistro
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
/**
* Check/download required libs to run the application
*
* param callback  - interface used by Minsitro service to notify the client when the loader is ready
* param parameters
*            parameters fields:
*                 * Key Name                   Key type         Explanations
*                   "sources"                  StringArray      Sources list from where Ministro will download the libs. Make sure you are using ONLY secure locations.
*                   "repository"               String           Overwrites the default Ministro repository. Possible values: default, stable, testing and unstable
*                   "required.modules"         StringArray      Required modules by your application
*                   "application.title"        String           Application name, used to show more informations to user
*                   "qt.provider"              String           Qt libs provider, currently only "necessitas" is supported.
*                   "minimum.ministro.api"     Integer          Minimum Ministro API level, used to check if Ministro service compatible with your application. Current API Level is 3 !
*                   "minimum.qt.version"       Integer          Minimim Qt version (e.g. 0x040800, which means Qt 4.8.0, check http://qt-project.org/doc/qt-4.8/qtglobal.html#QT_VERSION)!
*/
@Override public void requestLoader(org.kde.necessitas.ministro.IMinistroCallback callback, android.os.Bundle parameters) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeStrongBinder((((callback!=null))?(callback.asBinder()):(null)));
if ((parameters!=null)) {
_data.writeInt(1);
parameters.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
mRemote.transact(Stub.TRANSACTION_requestLoader, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
}
static final int TRANSACTION_requestLoader = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
/**
* Check/download required libs to run the application
*
* param callback  - interface used by Minsitro service to notify the client when the loader is ready
* param parameters
*            parameters fields:
*                 * Key Name                   Key type         Explanations
*                   "sources"                  StringArray      Sources list from where Ministro will download the libs. Make sure you are using ONLY secure locations.
*                   "repository"               String           Overwrites the default Ministro repository. Possible values: default, stable, testing and unstable
*                   "required.modules"         StringArray      Required modules by your application
*                   "application.title"        String           Application name, used to show more informations to user
*                   "qt.provider"              String           Qt libs provider, currently only "necessitas" is supported.
*                   "minimum.ministro.api"     Integer          Minimum Ministro API level, used to check if Ministro service compatible with your application. Current API Level is 3 !
*                   "minimum.qt.version"       Integer          Minimim Qt version (e.g. 0x040800, which means Qt 4.8.0, check http://qt-project.org/doc/qt-4.8/qtglobal.html#QT_VERSION)!
*/
public void requestLoader(org.kde.necessitas.ministro.IMinistroCallback callback, android.os.Bundle parameters) throws android.os.RemoteException;
}
/* AUTO-GENERATED FILE. DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found. It
 * should not be modified by hand.
 */

package org.qtproject.example.untitled;

public final class R {
  public static final class array {
    public static final int bundled_libs=0x7f010000;
    public static final int load_local_libs=0x7f010001;
    public static final int qt_libs=0x7f010002;
    public static final int qt_sources=0x7f010003;
  }
  public static final class layout {
    public static final int splash=0x7f020000;
  }
  public static final class string {
    public static final int fatal_error_msg=0x7f030000;
    public static final int ministro_needed_msg=0x7f030001;
    public static final int ministro_not_found_msg=0x7f030002;
    public static final int unsupported_android_version=0x7f030003;
  }
}
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"android-build-debug.apk","fullName":"debug","baseName":"debug"},"path":"android-build-debug.apk","properties":{}}]
[{"outputType":{"type":"MERGED_MANIFESTS"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"android-build-debug.apk","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"org.qtproject.example.untitled","split":"","minSdkVersion":"21"}}]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.qtproject.example.untitled"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="21"
        android:targetSdkVersion="28" />

    <!--
         The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
         Remove the comment if you do not require these default permissions.
    -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!--
         The following comment will be replaced upon deployment with default features based on the dependencies of the application.
         Remove the comment if you do not require these default features.
    -->

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true" />

    <application
        android:name="org.qtproject.qt5.android.bindings.QtApplication"
        android:debuggable="true"
        android:extractNativeLibs="true"
        android:hardwareAccelerated="true"
        android:label="untitled" >
        <activity
            android:name="org.qtproject.qt5.android.bindings.QtActivity"
            android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
            android:label="untitled"
            android:launchMode="singleTop"
            android:screenOrientation="unspecified" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <!-- Application arguments -->
            <!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ -->
            <!-- Application arguments -->

            <meta-data
                android:name="android.app.lib_name"
                android:value="untitled" />
            <meta-data
                android:name="android.app.qt_sources_resource_id"
                android:resource="@array/qt_sources" />
            <meta-data
                android:name="android.app.repository"
                android:value="default" />
            <meta-data
                android:name="android.app.qt_libs_resource_id"
                android:resource="@array/qt_libs" />
            <meta-data
                android:name="android.app.bundled_libs_resource_id"
                android:resource="@array/bundled_libs" />
            <!-- Deploy Qt libs as part of package -->
            <meta-data
                android:name="android.app.bundle_local_qt_libs"
                android:value="1" />

            <!-- Run with local libs -->
            <meta-data
                android:name="android.app.use_local_qt_libs"
                android:value="1" />
            <meta-data
                android:name="android.app.libs_prefix"
                android:value="/data/local/tmp/qt/" />
            <meta-data
                android:name="android.app.load_local_libs_resource_id"
                android:resource="@array/load_local_libs" />
            <meta-data
                android:name="android.app.load_local_jars"
                android:value="jar/QtAndroid.jar:jar/QtAndroidBearer.jar" />
            <meta-data
                android:name="android.app.static_init_classes"
                android:value="" />
            <!-- Used to specify custom system library path to run with local system libs -->
            <!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
            <!-- Messages maps -->
            <meta-data
                android:name="android.app.ministro_not_found_msg"
                android:value="@string/ministro_not_found_msg" />
            <meta-data
                android:name="android.app.ministro_needed_msg"
                android:value="@string/ministro_needed_msg" />
            <meta-data
                android:name="android.app.fatal_error_msg"
                android:value="@string/fatal_error_msg" />
            <meta-data
                android:name="android.app.unsupported_android_version"
                android:value="@string/unsupported_android_version" />
            <!-- Messages maps -->


            <!-- Splash screen -->
            <!--
                 Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation,
                 then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and
                 use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you
                 are done populating your window with content.
            -->
            <!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / -->
            <!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / -->
            <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
            <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
            <!-- Splash screen -->


            <!-- Background running -->
            <!--
                 Warning: changing this value to true may cause unexpected crashes if the
                          application still try to draw after
                          "applicationStateChanged(Qt::ApplicationSuspended)"
                          signal is sent!
            -->
            <meta-data
                android:name="android.app.background_running"
                android:value="false" />
            <!-- Background running -->


            <!-- auto screen scale factor -->
            <meta-data
                android:name="android.app.auto_screen_scale_factor"
                android:value="false" />
            <!-- auto screen scale factor -->


            <!-- extract android style -->
            <!--
                 available android:values :
                * default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons
                * full - useful QWidget & Quick Controls 1 apps
                * minimal - useful for Quick Controls 2 apps, it is much faster than "full"
                * none - useful for apps that don't use any of the above Qt modules
            -->
            <meta-data
                android:name="android.app.extract_android_style"
                android:value="default" />
            <!-- extract android style -->
        </activity>

        <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->

    </application>

</manifest>

6.参考论文

目录

1绪论

1.1课题背景及研究意义

1.2选题的目的及意义

2温室监控系统的方案设计

2.1系统需求分析

2.2系统软件需求分析

2.3监控方案设计

3系统硬件设计

3.1核心硬件设计

3.1.1 I.MX6ULL简介

3.1.2储存模块

3.2数据采集模块设计

3.2.1传感器

3.2.2 4G模块

4搭建嵌入式开发平台

4.1软件系统需求分析和流程设计

4.2搭建交叉编译环境

4.2.1交叉编译环境简介

4.2.2交叉编译工具安装

4.3 TFTP和NFS服务搭建

4.3.1 TFTP和NFS作用

4.3.2 TFTP服务器搭建

4.3.3 NFS服务器搭建

4.4 Bootloader移植

4.4.1 Bootloader的选择

4.4.2 U-boot的配置和移植

4.4.3配置bootcmd和bootargs环境变量

4.5 Linux内核裁剪和移植

4.5.1内核简介

4.5.2内核的裁剪和移植

4.6根文件系统搭建

4.6.1根文件系统简介

4.6.2 BusyBox构建根文件系统

5系统软件及应用软件

5.1系统软件开发

5.1.1字符设备驱动框架

5.1.2系统调用

5.2 モバイルアプリケーションソフトウェアの開発

5.2.1 アプリケーション ソフトウェア開発ツールとプラットフォーム

5.2.2 遠隔監視ソフト結果の表示

結論は

参考文献

7. まとめ

施設農業における温室環境の最適化に伴い、インテリジェントな温室システム監視機器および機器管理は、将来的には世界の他の多くの関連国の共通の重要な研究およびホットスポットとなるでしょう。この主題は、主に最新の ARM マイクロプロセッサと 4G テクノロジーに基づいて、新世代のインテリジェントな温室環境監視装置システムを設計および開発します。このシステムは、これまでの伝統的なフィールドバス技術を排除しました。今日の高度な高周波技術を採用しており、我が国の近代的施設農業生産の新たな発展により適しています。また、4G テクノロジーにより、遠隔の山岳地帯や複雑な環境における機器のアプリケーションの制限が取り除かれます。

論文の主な研究結果は以下のとおりです。

(1) この章では、我が国における現在の農業用温室システムの実際の監視と適用、温室制御システムの基本的なソフトウェアとハ​​ードウェアの要件、機能指標の選択、および温室制御システムの全体的な機能設計の特徴について詳細に議論および分析します。制御システム 組み込みオペレーティング システムの最も一般的なアプリケーションが分析および比較され、このアプリケーション システムの目標を実現するために、組み込みオペレーティング システムまたは Linux オペレーティング システムが主流のオペレーティング システムとして選択されます。

(2) ソフトウェアおよびハードウェアの選択、USB ディスク ブート、Linux システム カーネルお​​よびルート ディレクトリ ファイル システムを含むソフトウェア、Qt モバイル ターミナル アプリケーション開発。ハードウェア面では、無線モバイル通信機能を実現する無線監視機器や4Gモジュール、センサーなどに適した開発ボードを選択する必要があります。

(3) 組み込み開発プラットフォームの構築に成功し、u-boot の移植、カーネルの移植と起動プロセス、およびルート ファイル システムの構築を導入しました。

(4) デバイス制御側は、Linux オペレーティング システムのカーネルで提供されるキャラクタ デバイス ドライバ フレームワークを使用して、対応するバージョンのキャラクタ デバイス ドライバのセットを作成し、上位アプリケーション プログラムにインターフェイス機能を提供し、アプリケーション プログラムは自動的にこのインターフェース機能を通じてセンサーデータを読み取り、4G テクノロジーを通じてセンサーデータを Alibaba Cloud に直接かつ自動的にアップロードできます。

(5)モバイル端末はデータの遠隔監視を正常に完了し、データベースの確立を実現し、機器の遠隔手動または自動管理を実現し、データクエリと曲線表示を実現します。

このシステムは、温室の遠隔情報収集、照会、統計・グラフ、設備の自動化制御などの業務を実現します。より強力な機能はまだ完成していません。

好き、好き、コレクション、私信への注目 著者コミュニケーション

おすすめ

転載: blog.csdn.net/lf21qp/article/details/131498871