问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

远程数据采集系统设计,数据传输到上位机。通过3G无线传输,传到监控中心后,怎么把数据存储SQL数据库中

发布网友 发布时间:2022-04-13 08:30

我来回答

5个回答

热心网友 时间:2022-04-13 09:59

数据中心动态库说明

1、数据类型

typedef UINT u32t;

typedef UCHAR u8t;

typedef USHORT u16t;

typedef ULONGu64t;

2、数据结构

1)用以区分标识各台DTU的数据结构

typedef struct _modem_info_t_

{

u32tm_modemId;     //Modem模块的ID号

u8tm_phoneno[12];//Modem的11位电话号码,必须以'\0'字符结尾

u8tm_dynip[4];//Modem的4位动态ip地址

u64tm_conn_time; //Modem模块最后一次建立TCP连接的时间

u64tm_refresh_time;//Modem模块最后一次收发数据的时间

} ModemInfoStruct;

2)DTU数据包的数据结构

#define MAX_RECEIVE_BUF 1450

typedef struct _modem_data_t 

{

   u32tm_modemId;     // Modem模块的ID号

   u64tm_recv_time;//接收到数据包的时间

   u8t m_data_buf[MAX_RECEIVE_BUF+1];//存储接收到的数据

   u16t m_data_len;//接收到的数据包长度

   u8t     m_data_type;          //接收到的数据包类型,

//0x01:用户数据包 

//0x02:对控制命令帧的回应

}ModemDataStruct;

以上u64t类型的时间是基于GMT时间1970年1月1日0:00:000以来的秒数指示时间值,即当前时间距1970年1月1日0点0分0秒以秒为单位的数值。在大多数语言都提供转换函数。

3、API函数说明

1)BOOL DSStartService(u16t uiListenPort);

功能:启动服务器的数据服务

参数:u16ListenPort:服务的侦听端口

返回:成功返回TRUE,失败返回FALSE;

说明:启动服务器的数据服务。启动数据服务后,服务器侦听在指定端口。

如果失败了,可以调用DSGetLastError()函数查看错误原因。

2)BOOL DSStopService(void);

功能:停止服务器的数据服务

参数:无

返回:成功返回TRUE,失败返回FALSE;

说明:停止服务器的数据服务。所有的DTU都将下线。

 如果失败了,可以调用DSGetLastError()函数查看错误原因。

3)BOOL DSGetNextData(ModemDataStruct* pDataStruct, u16t waitseconds);

功能:读取下一条DTU送上来的信息

参数:pDataStruct: 存放DTU所送上来的信息和数据的结构,读函数执行成功后,返回的数据存放到该参数指向的结构中

 waitseconds:本函数读到数据后立即返回;如果没有数据到达,则等待最长waitseconds(时间单位:秒)的时间,直到有数据到达,取值范围从0~65535,如果取值为0表明本函数将立即返回。另外,当在另一个线程中执行成功了DSStopService()后,本函数将立即返回。

返回:成功返回TRUE,失败返回FALSE;

说明:如果失败了,可以调用DSGetLastError()函数查看错误原因。

4)BOOL DSSendData(u32t modemId, u16t len, u8t * buf);

功能:向指定ID号的的DTU发送数据

参数:modemId:DTU的ID号,用以标识一个DTU

 len:待发送的数据长度(字节数),数据长度必须小于或等于1450个字节

 buf:待发送的数据

返回:成功返回TRUE,失败返回FALSE;

说明:如果失败了,可以调用DSGetLastError()函数查看错误原因。

5)BOOL DSSendControl(u32t modemId, u16t len, u8t * buf);

功能:向指定ID号的的DTU发送控制命令

参数:modemId:DTU的ID号,用以标识一个DTU

 len:待发送的控制命令长度(字节数),数据长度必须小于或等于1000个字节

 buf:待发送的控制命令帧

返回:成功返回TRUE,失败返回FALSE

说明:如果失败了,可以调用DSGetLastError()函数查看错误原因。]

6)u32t DSGetModemCount(void);

功能:取得当前在线的所有的DTU的总数

参数:无

返回:得到在线的DTU的数量

7)BOOL DSGetModemByPosition(u32t pos, ModemInfoStruct *pModemInfo);

功能:取得指定位置的DTU的数据;

参数:pos:DTU列表中的位置信息,0代表第一个DTU位置;

pModemInfo:指向用以保存DTU信息的数据结构;

返回:成功返回TRUE,失败返回FALSE

说明:如果失败了,可以调用DSGetLastError()函数查看错误原因。

一般来说DSGetDtuCount()和DSGetDtuByPosition()函数配合使用,用以查看当前所有DTU的信息,如下例所示:

u32tuiDtuCount;

uiDtuCount = DSGetDtuCount();

DtuInfoStructdtuInfo;

u32ti;

for (i = 0; i < uiDtuCount; i++)

{

DSGetDtuByPosition (i, &dtuInfo);

//对dtuInfo进行操作

}

8)void DSGetLastError(char *str, int nMaxBufSize);

功能:获得先前API执行时发生的错误;

参数:str:用来存放错误信息的缓冲区;

 nMaxStrSize:缓冲区的最大长度,如果错误信息的大小超过了这个值,则此函数将把错误信息的尾部截除。

返回:无

9)BOOL DSDisconnect(u32t modemId);

功能:断开指定ID号的DTU连接

参数:modemId: DTU的ID号,用以标识一个DTU

返回:成功返回TRUE,失败返回FALSE

说明:如果失败了,可以调用DSGetLastError()函数查看错误原因。

4、函数的具体使用

3)导入动态库

调用WINDOWS API函数LoadLibrary装载动态库,如下:

HMODULEDllMule;             //指向动态库的句柄

BOOL (*DSStartService)(u16t); //定义一个指向函数的地址的指针

hDllMole = LoadLibrary(“gprsdll.dll”);

If (hDllMole != NULL)    //判断调用是否成功

{

       //从动态库中取函数地址

       DSStartService = GetProcAddress(hDllMole,”DSStartService”);

       if (DSStartService != NULL)   //判断是否取到该函数地址

        {

            if ((*DSStartService)( 5001) != FALSE)  

                  MessageBox(“启动成功”);

             Else

                  MessageBox(“启动失败”);

        }

}

在程序开始时需要调用动态库,程序运行完毕后,要释放动态库,调用windows API函数FreeLibrary可释放动态库:

    FreeLibrary(hDllMole);   //TRUE-success  FALSE-failed

程序中LoadLibrary次数必须和FreeLibrary相同,每调用一次LoadLibrary,相应的应该调用一次FreeLibrary,保证每次调用后都会释放。

4)启动服务

首先从动态库中取到该函数地址,取到地址后,就可以执行该函数,如下:

BOOL (*DSStartService)(u16t);  //定义一个指向函数的地址的指针

DSStartService = (BOOL(*)(u16t))GetProcAddress(hDllMole, “DSStartService”);

if (DSStartService != NULL)

{

    (*DSStartService)( 5001);

}

5)停止服务

BOOL (*DSStopService)(void);

DSStopService = (BOOL (*)(void))GetProcAddress(hDllMole, “DSStopService”);

If (DSStopService != NULL) 

(*DSStopService)();

6)读数据

BOOL DSGetNextData(ModemDataStruct*, u16t);

DSGetNextData = 

(BOOL(*)(ModemDataStruct*, u16t))GetProcAddress(hDllMole, “DSGetNextData”);

if (DSGetNextData != Null)

if ((*DSGetNextData)(&dtudata, 100) == 0)  //dtudata为DtuDataStruct型结构

//如果没有数据最长等待100秒

{

        //处理结构dtudata中的数据

7)发送数据

BOOL DSSendData (u32t, u16t, u8t *);

DSSendData = (BOOL(*)(u32t, u16t, u8t*))GetProcAddress(hDllMole, “DSSendData”);

if (DSSendData != NULL)

{

    (*DSSendData)(nID, len, buf);

}

8)用户列表

底层服务维护一张用户列表,记录当前在线用户的信息,DSC如果想知道底层用户列表,需要调用提供的API函数:DSGetModemCount、DSGetModemByPosition

for (u32t i = 0; i < (*DSGetModemCount)(); i++)

{

      (*DSGetModemByPosition)(i, &dtuinfo);

      //1、处理记录用户信息记录dtuinfo中的信息;

}

9)错误信息

可以通过调用DSGetLastError()函数来获得上次调用API函数失败后的具体的错误信息。

char szErrorMsg[256];

DSGetLastError(szErrorMsg, 255);

这个是厦门才茂DTU动态库文件,如果需要咨询更详细,可以直接联系厦门才茂技术,或者直接到他们网站咨询

热心网友 时间:2022-04-13 11:17

数据传到上位机应该是以数据包的格式,编程把数据包解析,存入数据库,上位机软件从数据库调用数据

热心网友 时间:2022-04-13 12:52

一般这样功能都是这样实现的:
现场会有什么传感器啊仪表什么的,把接口(串口等等)连接到DTU(GPRS模块)上,DTU会把数据送至网络上,然后上位机都会使用一款组态软件,开发工程,完成自己需要的功能,比如数据实时显示,报表啊,曲线啊或者控制现场的设备等功能,然后组态软件可以通过设置把数据存入到access或者sql中。。。就ok了!
明白?追问这个过程我知道,就是问题这个组态软件现在是自己编。例如用WINCC\RSVIEW/CITECT等我们也搞过,现在就是要自己编上位机软件,采用C#语言,基于ASP.NET,采用VS2010平台。问题现在是在VS2010中编个程序与网络连接,然后对数据进行分解每隔一段时间采集一组数据存储于数据库中呢,还是通过数据库直接和网络连接进行存储。存储的过程和操作大体是什么的啊。寻求解答,谢谢!

热心网友 时间:2022-04-13 14:43

前辈您的问题解决了吗?可以让我考一份吗?

热心网友 时间:2022-04-13 16:51

楼主 。不知道你什么时候能看到这个消息 。也不知道过了这么久的时间,你的这个程序完成的怎么样了。现在 我也在做这个。也是有很多的问题。不知道可不可以请教你。可以的话。给我发个邮件可以吗 。因为Q号。别人都加不了。179003712@qq.com.谢谢
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 win10系统还原后数据还在吗 成本少的粥的做法大全 粥有哪些做法?可以教我一下吗? 小米粥面包怎么做 米粥面包怎么做 牛奶面包粥怎么做 孩子几个月才能喝粥? 如何制作面包牛奶粥 文山洲到江西省东乡县走高速有多少公里有多少公里 临汾土门到河北曲阳县灵山镇距离 安徽池州到云南文山怎么走? 从昆明到富宁县有多少公里? 从云南文山到福建闽清怎么走 从福建厦门开普通轿车自驾游到云南大理 云南文山回江西于都走哪条高速公路最好走 文山到广南有多少公里 山西省晋城市九女仙湖景区距离河南省沁阳市的公路里程 我在海丰古隆镇尖山隧道,高铁,公司中铁五局上班,放假了拿不到工资,劳动局能给我们解决吗? 尖沙咀北京道8号到新界上水龙琛路39号有多远? 沪昆高铁曲靖段有哪些隧道 教育资源共享的平台有哪些? 你知道国内外做得比较好的公开课平台都有什么? 中国大学资源共享课的发布平台爱课程网 大学爱慕课怎么进不了上课 国内第一个精品课程集成建设式共享平台是哪个? 有什么软件可以实现精品课程资源共享?谢谢 急求 考取安全评价师好呢还是考注册安全师好? 安全评价师专业如何划分? 安全评价师三级,安全工程专业在评价机构挂靠一般能得多少钱? 安全评价 学习资料有哪些? 安全工程师考试怎么准备?是否要在网上天天听? 安全评价师考试有具体时间吗? 谢谢! 资格证书有哪些呢? 找部电视剧,大概十年前看过的 言情,女主是个电台DJ,男主是个飞行员 党课大家谈关于如何讲好党课 大学里是不是一定要上党课? 党课谁来讲有规定吗 想上党课应该怎么演讲 猫可以吃枇杷膏吗 猫吃了枇杷叶没事吧?