modbus采集和 mqtt上报相结合,通过荔枝派(F1c100s芯片模块)实现数据采集连接阿里云物联网平台进行数据上报和下发功能。

这篇具有很好参考价值的文章主要介绍了modbus采集和 mqtt上报相结合,通过荔枝派(F1c100s芯片模块)实现数据采集连接阿里云物联网平台进行数据上报和下发功能。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#if !defined(WIN32)
#include <pthread.h>
#include <unistd.h>
#else
#include <windows.h>
#endif
#include "cJSON.h"
#include"modbusmaster.h"
#include "modbus.h"
#include "timer.h"
#define ADDRESS     "gx61WBRbBWY.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883" //更改此处地址
#define CLIENTID    "device1|securemode=3,signmethod=hmacsha1|" //更改此处客户端ID
#define TOPIC       "/sys/gx61WBRbBWY/device1/thing/event/property/post"  //发布主题
#define TOPIC1       "/sys/gx61WBRbBWY/device1/thing/service/property/set"  //发布主题
#define QOS         1
#define TIMEOUT     10000L

double temperature=0;
int temp=0;//强制转换
char * PAYLOAD;
cJSON * root;//生成的根节点/最外层
extern modbus_t *ctx;  
int g_iRunFlag = 1;
extern int timerflag;//自timer.c
//*************全局变量******************

int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)//接收云端下发的信息,然后输出打印
{printf("Recievea
message:(topic)%s,(msg)%s\n",topicName,(char*)message->payload);
    cJSON *root=cJSON_Parse(message->payload);  
 if (!root)  
    {  printf("Error before: [%s]\n",cJSON_GetErrorPtr());  
 return -1;  }else 
    {   cJSON *item=cJSON_GetObjectItem(root,"params");  
 if(item!=NULL)  
        {   cJSON *item1=cJSON_GetObjectItem(item,"temperature");  
            if(item1!=NULL) {printf("cJSON_GetObjectItem: type=%d,key is %s, value is %f\n",item1->type,item1->string,item1->valuedouble);  
            temperature=item1->valuedouble;  //赋值给valuedouble
            temp=temperature*10;
            modbus_write_register(ctx, 0,temp);
           printf("temperature is %f",temperature);
            }  }cJSON_Delete(root);  }//释放内存
     
    MQTTClient_freeMessage(&message);//清空上面旧的消息
    return 1;}
MQTTClient client;//全局变量

int Mqtt_init(void)//MQTT初始化函数
{   char *username= "device1&gx61WBRbBWY"; //添加的用户名
    char *password = "B73C52F3337CC34115D11EAF2DB14B5CC8F04662"; //添加的密码
    //初始化MQTT Client选项
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    //#define MQTTClient_message_initializer { {'M', 'Q', 'T', 'M'}, 0, 0, NULL, 0, 0, 0, 0 }
    int rc;   
    //使用参数创建一个client,并将其赋值给之前声明的client
    MQTTClient_create(&client, ADDRESS, CLIENTID,
    MQTTCLIENT_PERSISTENCE_NONE, NULL);

    // 设置回调函数,参数:句柄、传入内容、连接丢失的回调函数、消息到来的回调函数、传输完毕的回调函数
	if ((rc = MQTTClient_setCallbacks(client, NULL, NULL, msgarrvd, NULL)) != MQTTCLIENT_SUCCESS)
	{	printf("Failed to set callbacks, return code %d\n", rc);
		MQTTClient_destroy(&client);
		return -1;}

    conn_opts.keepAliveInterval = 30;//对于阿里云物联网来说要设30才能连上 
    conn_opts.cleansession = 1;
    conn_opts.username = username; //将用户名写入连接选项中
    conn_opts.password = password;//将密码写入连接选项中

     //使用MQTTClient_connect将client连接到服务器,使用指定的连接选项。成功则返回MQTTCLIENT_SUCCESS
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {   printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE); }

    // 订阅主题,参数:句柄、主题、QoS质量
    if ((rc = MQTTClient_subscribe(client, TOPIC1, QOS)) != MQTTCLIENT_SUCCESS)
    {	printf("Failed to subscribe, return code %d\n", rc);
		MQTTClient_destroy(&client);
    	return -1; }//异常返回-1
   	    return 1;}//正常返回1或0

int Alink_pub(void)//cJSON打包函数
{	root =  cJSON_CreateObject();
    cJSON * params =  cJSON_CreateObject();//params里嵌套的节点
    cJSON * sys =  cJSON_CreateObject();//数组的里面的起始节点
    cJSON * Power =  cJSON_CreateObject();//数组的里面的起始节点
    cJSON * WF =  cJSON_CreateObject();//数组的里面的起始节点

    cJSON_AddItemToObject(sys, "ack", cJSON_CreateNumber(0));//数组的第一个元素
    cJSON_AddItemToObject(Power, "value", cJSON_CreateString("on"));//数组的第二个元素
    cJSON_AddItemToObject(Power, "time", cJSON_CreateNumber(1524448722000));
    cJSON_AddItemToObject(params, "Power",Power);

    cJSON_AddItemToObject(WF, "value", cJSON_CreateNumber(temperature));//数组的第二个元素
    cJSON_AddItemToObject(params, "temperature",WF);   
    cJSON_AddItemToObject(root, "id", cJSON_CreateString("123"));//根节点下添加第一个键值对
    cJSON_AddItemToObject(root, "version", cJSON_CreateString("1.0"));//根节点下添加第二个键值对
    cJSON_AddItemToObject(root, "sys", sys);//节点下添加第三个键值对, sys内嵌了一层,所以直接写它的指针
    cJSON_AddItemToObject(root, "params", params);//节点下添加第三个键值对, params内嵌了一层,所以直接写它的指针
 cJSON_AddItemToObject(root,"method",cJSON_CreateString("thing.event.property.post"));//跟节点下添加第四个键值对
    PAYLOAD=cJSON_Print(root);}
    pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//静态初始化 
    pthread_cond_t cond=PTHREAD_COND_INITIALIZER;//静态初始化
    pthread_cond_t cond2=PTHREAD_COND_INITIALIZER;//静态初始化
    
void *modbuspro(void *arg)//线程
{  modbus_init();//初始化函数
 while (1)
{   pthread_mutex_lock(&mutex);//对临界变量加锁
    pthread_cond_wait(&cond,&mutex);
    modbusmaster();    //modbusmaster,采集数据
    pthread_mutex_unlock(&mutex);
    pthread_cond_signal(&cond2); }}
void *mqttpro(void *arg)//线程
{  MQTTClient_message pubmsg = MQTTClient_message_initializer;//声明MQTTClient
    MQTTClient_deliveryToken token;//声明消息token
    int rc;
    Mqtt_init();//初始化函数

 while (1)
{   pthread_mutex_lock(&mutex);//对临界变量加锁
    pthread_cond_wait(&cond2,&mutex);
    Alink_pub();//把数据打包
    pthread_mutex_unlock(&mutex);
//*************上报部分*************
    pubmsg.payload = PAYLOAD;
    pubmsg.payloadlen = strlen(PAYLOAD);
    pubmsg.qos = QOS;
    pubmsg.retained = 0;
    
    MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
    printf("Waiting for up to %d seconds for publication of %s\n"
            "on topic %s for client with ClientID: %s\n",
            (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);//下发指令
    rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
    printf("Message with delivery token %d delivered\n", token);
    cJSON_Delete(root);//非常重要
    timerflag=0; }
    MQTTClient_disconnect(client, 10000);//断开连接
    MQTTClient_destroy(&client);}//把客户端的资源释放
  
int main(int argc, char* argv[])
{   timer_init();//定时器初始化
    pthread_t modbus,mqtt;
    pthread_create(&modbus,NULL,modbuspro,NULL);//创建线程后即执行该线程
    pthread_create(&mqtt,NULL,mqttpro,NULL);
    pthread_join(modbus,NULL);
    pthread_join(mqtt,NULL);
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);}

通过荔枝派(F1c100s芯片模块)搭载SDIO-wifi模块,写入了主函数程序。根据读取modbus模拟器的数据,反馈到阿里云物联网平台当中。图中左侧的阿里云物联网平台所显示的温度为66摄氏度,与modbus模拟器的数据是一样的,图片右侧是荔枝派(F1c100s芯片模块)的编程软件X-shell的运行过程。

实现从数据采集,到连接阿里云物联网平台进行数据上传和在阿里云物联网平台上进行数据下发功能。

f1c100s芯片,阿里云,物联网,云计算

 文章来源地址https://www.toymoban.com/news/detail-608489.html

到了这里,关于modbus采集和 mqtt上报相结合,通过荔枝派(F1c100s芯片模块)实现数据采集连接阿里云物联网平台进行数据上报和下发功能。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在f1c100s上移植fbtft驱动st7735s小屏幕

    内核版本5.4 在使用spi总线接上了一个小网卡,实现了我们开发板对网络的访问之后,我还想接一个小的spi屏幕 1.44寸款,来画一只小企鹅,顺便显示一些系统的调试信息。但是由于我这个开发板向外暴露出来的spi接口就两个,而且有一个已经因为串口的设置而不能使用。所以

    2024年02月10日
    浏览(42)
  • 给linux移植fbtft驱动st7735s小屏幕(f1c100s)

    内核版本5.4 在使用spi总线接上了一个小网卡,实现了我们开发板对网络的访问之后,我还想接一个小的spi屏幕 1.44寸款,来画一只小企鹅,顺便显示一些系统的调试信息。但是由于我这个开发板向外暴露出来的spi接口就两个,而且有一个已经因为串口的设置而不能使用。所以

    2024年02月10日
    浏览(44)
  • 全志F1C100s主线linux入坑记录 (4)GT911触摸移植

    百度网站 在 drivers/input/touchscreen 路径下添加gt911.c文件 修改Makefile 添加gt911.c的文件编译 drivers/input/touchscreen/Makefile 添加obj-y += gt911.o 添加I2C属性定义 到soc节点下 添加I2C引脚定义 到pio节点下 修改LCD的引脚定义,因为有两个脚被I2C占用了 添加头文件 添加gt911设备树配置 编译文

    2023年04月14日
    浏览(87)
  • 全志F1C100s主线linux入坑记录 (7)GBA模拟器移植

    百度网站 gpsp源码 解压文件 gpsp需要SDL环境我们先在bulidroot中添加SDL包 我们全选SDL路径下的所有选项 打开之前解压的 gpsp 文件夹配置Makefile 添加 buildroot 的 gcc 编译器 告知 SDL.h 位置以及 SDL 元件库位置 其实很简单在buildroot文件夹搜索 sdl-config 位置在哪里,然后在Makfike里替换

    2024年02月16日
    浏览(31)
  • 全志F1C100s主线linux入坑记录 (6)音视频播放(视频播放软解)

    百度网站 (1)下载安装声卡补丁 参考挖坑网大神提供的声音驱动以及声音卡驱动补丁文件下载文件下载 全志F1C100s声卡补丁 解压文件打上补丁 (2)配置声卡 修改设备树文件添加声卡节点 内核配置 (3)linux内核编译烧录 可以看到声卡已经挂载了 (4)使用声卡 安装alsa-u

    2024年02月07日
    浏览(56)
  • 在f1c100s芯片上移植spi网卡enc28j60的linux驱动

    我个人与全志的芯片颇有故事。在我还是一个不懂事的高中生时,我看到荔枝派的官方文档,顿时被这小小的板子给吸引住。点开文档的初见: 荔枝派Nano(下面简称Nano)是一款精致迷你的 Arm9 核心板/开发板,可用于初学者学习linux或者商用于产品开发。 Nano 在与SD卡相当的

    2024年02月11日
    浏览(64)
  • MQTT Linux使用MQTT上报温度到腾讯云

    1.打开腾讯云官网,注册并登录. 2.登录之后点击右上角的控制台点进去 3.鼠标滑到云产品,进入物联设备服务中的物联网通信 4.点击创建新产品,现在我们来创建一个上报温度产品 5.产品创建信息如下,点击确定 6.我们已经创建好了一个产品,如下,现在来创建设备。(设备

    2024年02月06日
    浏览(36)
  • Android MQTT:实现设备信息上报与远程控制

    1.1 MQTT是什么? MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,最初由IBM开发,用于连接远程设备与服务器之间的通信。它在物联网(IoT)应用中变得越来越流行,因为它具有以下特点: 轻量级协议 :MQTT是一种精简的协议,有效地减少了通信开销,适合于

    2024年02月09日
    浏览(41)
  • MQTT连接阿里云物联网上报物模型数据

    目录 1. 创建产品(物联网平台 - 产品 - 创建产品) 2. 为产品添加设备 3. 添加物模型 4. mqtt.fx连接测试 5. 调试物模型 6. 使用mqtt.fx上报温度数据  我这里再新建一个名为 \\\"Test01\\\" 的产品作为演示 选择 \\\"添加自定义功能\\\" 添加 温度 属性: 创建好后,点击 发布上线 MQTT.fx是一款基

    2024年04月12日
    浏览(48)
  • 【ESP8266】使用MQTT协议 连接华为云iotDA,实现设备属性上报

    相关资料:https://github.com/CQUPTLei/ESP8266 往期文章:【ESP8266】基础AT指令和常用WIF指令 【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构 华为云物联网平台 (IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包