一、协议设计概述
系统采用分层通信协议设计,用于定义 LoRa 终端节点(E22-400T22D)与 IMX6ULL 网关之间的数据结构,以及多线程间的同步与通信机制。这些定义统一放置在头文件 data_global.h 中。
二、数据结构定义
2.1 LoRa 传感器数据结构
typedef struct lora_info{
uint8_t head[3];
uint8_t type;
uint8_t node_id;
float temperature;
float humidity;
float tempMin;
float tempMax;
float humiMin;
float humiMax;
uint8_t smoke;
uint8_t infrared;
uint8_t door_magnet;
uint8_t battery;
uint32_t reserved[1];
} lora_info_t;
2.2 IMX6ULL 本地采集数据结构
typedef struct imx6ull_info{
uint8_t head[3];
uint8_t type;
uint32_t adc;
uint16_t gyrox;
uint16_t gyroy;
uint16_t gyroz;
uint16_t accx;
uint16_t accy;
uint16_t accz;
uint32_t reserved[2];
} imx6ull_info_t;
2.3 环境数据联合结构
struct env_data{
lora_info_t lora_data;
imx6ull_info_t imx6ull_data;
};
struct env_info_client_addr{
struct env_data monitor_no[MONITOR_NUM];
};
三、命令格式设计
3.1 通用指令格式
| 二进制位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| 字段含义 |
平台编号 |
平台编号 |
设备编号 |
设备编号 |
操作编码 |
操作编码 |
操作编码 |
操作编码 |
命令字节 = 平台编号 | 设备编号 | 操作编码
3.2 平台编号分配
| 平台编号 |
数值 |
说明 |
| 0号平台 |
0x00 |
LoRa 终端平台 |
| 1号平台 |
0x40 |
ARM 平台 |
| 2号平台 |
0x80 |
STM32 平台 |
| 3号平台 |
0xC0 |
保留扩展 |
3.3 设备编号与操作编码
3.3.1 LED 设备(设备编号:0x00)
| 操作编码 |
命令值 |
说明 |
| 0x00 |
0x00 |
全部关闭 |
| 0x01 |
0x01 |
全部打开 |
| 0x02 |
0x02 |
打开 LED2 |
| 0x03 |
0x03 |
打开 LED3 |
| 0x04 |
0x04 |
打开 LED4 |
| 0x05 |
0x05 |
打开 LED5 |
| 0x10 |
0x10 |
打开流水灯 |
3.3.2 蜂鸣器设备(设备编号:0x10)
| 操作编码 |
命令值 |
说明 |
| 0x00 |
0x10 |
关闭蜂鸣器 |
| 0x01 |
0x11 |
打开蜂鸣器 |
| 0x02 |
0x12 |
自动报警关闭 |
| 0x03 |
0x13 |
自动报警打开 |
3.3.3 风扇设备(设备编号:0x20)
| 操作编码 |
命令值 |
说明 |
| 0x00 |
0x20 |
关闭风扇 |
| 0x01 |
0x21 |
打开风扇 |
3.3.4 数码管设备(设备编号:0x30)
| 操作编码 |
命令值 |
说明 |
| 0x00 ~ 0x0F |
0x30 ~ 0x3F |
显示 0~F 数字 |
| 0x0F |
0x3F |
关闭数码管 |
3.4 命令封装示例
命令 = 平台编号 + 设备编号 + 操作编码
| 示例 |
平台编号 |
设备编号 |
操作编码 |
命令值 |
说明 |
| 示例1 |
0x00 |
0x20 |
0x01 |
0x21 |
风扇打开 |
| 示例2 |
0x40 |
0x10 |
0x01 |
0x51 |
蜂鸣器打开 |
| 示例3 |
0x40 |
0x30 |
0x08 |
0x78 |
数码管显示 8 |
| 示例4 |
0x40 |
0x30 |
0x0F |
0x7F |
关闭数码管 |
四、进程间通信(IPC)机制
4.1 消息队列
struct msg{
long mtype;
long msgtype;
unsigned char mtext[QUEUE_SIZE];
};
#define QUEUE_SIZE 36
int msgid;
4.2 消息类型分配
| 消息类型 |
值 |
说明 |
| LED 控制 |
1L |
LED 灯控制指令 |
| 蜂鸣器控制 |
2L |
蜂鸣器控制指令 |
| 数码管控制 |
3L |
四路 LED 灯模拟的数码管 |
| 风扇控制 |
4L |
风扇控制指令 |
| 温湿度最值设置 |
5L |
温湿度阈值设置 |
| 扩展预留 |
6L ~ 9L |
用于个人扩展 |
| GPRS 通信 |
10L |
3G 通信模块 |
4.3 共享内存
#define MONITOR_NUM 2
int shmid;
4.4 信号量
int semid;
key_t key;
五、多线程同步机制
5.1 互斥锁
pthread_mutex_t mutex_client_request;
pthread_mutex_t mutex_client_transfer;
pthread_mutex_t mutex_led;
pthread_mutex_t mutex_beep;
5.2 条件变量
pthread_cond_t cond_client_request;
pthread_cond_t cond_client_transfer;
pthread_cond_t cond_led;
pthread_cond_t cond_beep;
5.3 线程声明
pthread_t thread_led;
pthread_t thread_beep;
pthread_t thread_transfer;
pthread_t thread_request;
pthread_t thread_refresh;
六、设备文件接口
6.1 设备路径定义
#define LED_DEV "/sys/class/leds/sys-led/brightness"
#define BEEP_DEV "/sys/class/leds/beep/brightness"
#define LIGHT_DEV "/sys/class/misc/ap3216c/als"
6.2 设备控制变量
extern int led_pending;
extern unsigned char led_command;
extern int beep_pending;
extern unsigned char beep_command;
七、协议字段说明
| 字段 |
类型 |
说明 |
| head[3] |
uint8_t |
帧标识位,用于数据帧起始校验 |
| type |
uint8_t |
数据类型(0x01=ZigBee数据,0x02=本地数据) |
| tempature |
float |
温度值,单位:摄氏度 |
| humidity |
float |
湿度值,单位:%RH |
| tempMin/tempMax |
float |
温度报警阈值上下限 |
| humiMin/humiMax |
float |
湿度报警阈值上下限 |
| adc |
uint32_t |
ADC 采集值(0~4095) |
| gyrox/gyroy/gyroz |
uint16_t |
陀螺仪三轴角速度值 |
| accx/accy/accz |
uint16_t |
加速度计三轴加速度值 |
| reserved[2] |
uint32_t |
预留扩展字段 |
八、头文件完整汇总
#ifndef __DATA_GLOBAL_H__
#define __DATA_GLOBAL_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdint.h>
#include <pthread.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
#define MONITOR_NUM 2
#define QUEUE_SIZE 36
#define MSG_TYPE_LED 1L
#define MSG_TYPE_BEEP 2L
#define MSG_TYPE_NIXIE 3L
#define MSG_TYPE_FAN 4L
#define MSG_TYPE_THRESHOLD 5L
#define MSG_TYPE_LORA_CTRL 6L
#define MSG_TYPE_GPRS 10L
#define PLATFORM_LORA 0x00
#define PLATFORM_A9 0x40
#define PLATFORM_STM32 0x80
#define PLATFORM_RESERVE 0xC0
#define DEVICE_LED 0x00
#define DEVICE_BEEP 0x10
#define DEVICE_FAN 0x20
#define DEVICE_NIXIE 0x30
#define DEVICE_LORA_CTRL 0x40
#define LED_ALL_OFF 0x00
#define LED_ALL_ON 0x01
#define LED2_ON 0x02
#define LED3_ON 0x03
#define LED4_ON 0x04
#define LED5_ON 0x05
#define LED_WATERFLOW 0x10
#define BEEP_OFF 0x00
#define BEEP_ON 0x01
#define BEEP_ALARM_OFF 0x02
#define BEEP_ALARM_ON 0x03
#define FAN_OFF 0x00
#define FAN_ON 0x01
#define LORA_ARM 0x00
#define LORA_DISARM 0x01
#define LORA_REPORT 0x02
#define LORA_REBOOT 0x03
typedef struct lora_info{
uint8_t head[3];
uint8_t type;
uint8_t node_id;
float temperature;
float humidity;
float tempMin;
float tempMax;
float humiMin;
float humiMax;
uint8_t smoke;
uint8_t infrared;
uint8_t door_magnet;
uint8_t battery;
uint32_t reserved[1];
} lora_info_t;
typedef struct imx6ull_info{
uint8_t head[3];
uint8_t type;
uint32_t adc;
uint16_t gyrox;
uint16_t gyroy;
uint16_t gyroz;
uint16_t accx;
uint16_t accy;
uint16_t accz;
uint32_t reserved[2];
} imx6ull_info_t;
struct env_data{
lora_info_t lora_data;
imx6ull_info_t imx6ull_data;
};
struct env_info_client_addr{
struct env_data monitor_no[MONITOR_NUM];
};
struct msg{
long mtype;
long msgtype;
unsigned char mtext[QUEUE_SIZE];
};
#define LED_DEV "/sys/class/leds/sys-led/brightness"
#define BEEP_DEV "/sys/class/leds/beep/brightness"
#define LIGHT_DEV "/sys/class/misc/ap3216c/als"
#define LORA_UART_DEV "/dev/ttymxc2"
int msgid;
int shmid;
int semid;
key_t key;
extern int led_pending;
extern unsigned char led_command;
extern int beep_pending;
extern unsigned char beep_command;
extern int lora_cmd_pending;
extern unsigned char lora_cmd;
pthread_mutex_t mutex_client_request;
pthread_mutex_t mutex_client_transfer;
pthread_mutex_t mutex_led;
pthread_mutex_t mutex_beep;
pthread_mutex_t mutex_lora;
pthread_cond_t cond_client_request;
pthread_cond_t cond_client_transfer;
pthread_cond_t cond_led;
pthread_cond_t cond_beep;
pthread_cond_t cond_lora;
extern void *beep_pthread(void *arg);
extern void *led_pthread(void *arg);
extern void *pthread_transfer(void *arg);
extern void *pthread_request(void *arg);
extern void *pthread_refresh(void *arg);
extern void *lora_recv_pthread(void *arg);
extern void *lora_send_pthread(void *arg);
#endif
所有评论(0)